<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged chrome-extension</title>
<link>https://coderlegion.com/tag/chrome-extension</link>
<description>Powered by Question2Answer</description>
<item>
<title>I Built Two Minigames Inside a Chrome Extension Without a Game Engine</title>
<link>https://coderlegion.com/27145/i-built-two-minigames-inside-a-chrome-extension-without-a-game-engine</link>
<description>&lt;p&gt;Crumbongo started as a tiny Chrome extension experiment.&lt;/p&gt;
&lt;p&gt;The original mechanic was deliberately strange: take the number of accessible cookie records from a website the player chooses and turn that number into game currency.&lt;/p&gt;
&lt;p&gt;At first, that was almost the entire product.&lt;/p&gt;
&lt;p&gt;Check a site. Harvest its cookie count. Spend the cookies.&lt;/p&gt;
&lt;p&gt;But once I started adding progression, cosmetics, habitats and companions, the project began feeling less like an experiment and more like a small game.&lt;/p&gt;
&lt;p&gt;That raised a new question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How far could I push a game that still lived entirely inside a Chrome extension?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eventually, that led me to build two minigames without using a traditional game engine and without turning the project into a large framework-based web application.&lt;/p&gt;
&lt;h3 id=&quot;the-constraints&quot;&gt;The constraints&lt;/h3&gt;
&lt;p&gt;Crumbongo is built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vanilla JavaScript&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Chrome Extension APIs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestAnimationFrame&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;local browser storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no Unity, Godot, Phaser, React, TypeScript or dedicated game framework.&lt;/p&gt;
&lt;p&gt;Even the minigames use regular DOM elements rather than Canvas.&lt;/p&gt;
&lt;p&gt;That was not originally a philosophical decision. Crumbongo had already been built as a lightweight extension, and introducing an entirely different rendering architecture just for two small games felt unnecessary.&lt;/p&gt;
&lt;p&gt;So I decided to work with the environment I already had.&lt;/p&gt;
&lt;p&gt;That limitation ended up influencing the game design much more than I expected.&lt;/p&gt;
&lt;h3 id=&quot;monkey-climb&quot;&gt;Monkey Climb&lt;/h3&gt;
&lt;p&gt;The first minigame was Monkey Climb.&lt;/p&gt;
&lt;p&gt;The concept is simple: Bongo climbs vertically, collects bananas, avoids hazards and earns additional cookies for the main game.&lt;/p&gt;
&lt;p&gt;The important part was that the minigame could not feel disconnected from the rest of Crumbongo.&lt;/p&gt;
&lt;p&gt;Rewards therefore go into the player's Cookie Jar, while lifetime progression remains tied to the core harvesting mechanic.&lt;/p&gt;
&lt;p&gt;That separation matters.&lt;/p&gt;
&lt;p&gt;If minigames increased lifetime progression directly, players could ignore the feature that makes Crumbongo different and simply grind the arcade game.&lt;/p&gt;
&lt;p&gt;The minigame needed to complement the core loop, not replace it.&lt;/p&gt;
&lt;p&gt;That was one of the first places where the project stopped being purely a programming exercise and became a game-design problem.&lt;/p&gt;
&lt;h3 id=&quot;cookie-stack&quot;&gt;Cookie Stack&lt;/h3&gt;
&lt;p&gt;The second game, Cookie Stack, created a different challenge.&lt;/p&gt;
&lt;p&gt;Cookies fall from the top of the play area while the player moves Bongo horizontally underneath them.&lt;/p&gt;
&lt;p&gt;Catch a cookie and it becomes a physical piece of a tower.&lt;/p&gt;
&lt;p&gt;The entire tower moves with Bongo.&lt;/p&gt;
&lt;p&gt;Miss a normal cookie and you lose a life.&lt;/p&gt;
&lt;p&gt;Golden cookies are rarer and worth more points.&lt;/p&gt;
&lt;p&gt;Bombs can also fall. If one hits Bongo or the tower, the player loses a life, but the existing stack remains intact.&lt;/p&gt;
&lt;p&gt;The game runs for 40 seconds with three lives.&lt;/p&gt;
&lt;p&gt;Technically, getting the basic system working was relatively straightforward.&lt;/p&gt;
&lt;p&gt;Making it feel fair was not.&lt;/p&gt;
&lt;h3 id=&quot;when-working-code-still-feels-wrong&quot;&gt;When working code still feels wrong&lt;/h3&gt;
&lt;p&gt;My first version allowed the stack to keep growing.&lt;/p&gt;
&lt;p&gt;From the code's perspective, this worked.&lt;/p&gt;
&lt;p&gt;Every successful catch increased the tower height and the next cookie could land on top of it.&lt;/p&gt;
&lt;p&gt;The problem only became obvious when I actually played it.&lt;/p&gt;
&lt;p&gt;After enough catches, the tower became so tall that the next incoming objects had very little distance left to travel before reaching the catch area.&lt;/p&gt;
&lt;p&gt;The game became increasingly difficult for a reason that did not feel intentional.&lt;/p&gt;
&lt;p&gt;Nothing was technically broken.&lt;/p&gt;
&lt;p&gt;It just wasn't fun.&lt;/p&gt;
&lt;p&gt;I tried adjusting speeds and spacing, but the cleanest solution was much simpler:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;clear the tower after five pieces.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The score continues.&lt;/p&gt;
&lt;p&gt;The timer continues.&lt;/p&gt;
&lt;p&gt;Lives continue.&lt;/p&gt;
&lt;p&gt;Only the physical tower resets.&lt;/p&gt;
&lt;p&gt;That tiny rule change made the game dramatically more readable and fair.&lt;/p&gt;
&lt;p&gt;It also reinforced one of the biggest lessons I took from the project:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;implementation can tell you that a mechanic works, but only playing it tells you whether the mechanic should exist in that form.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;dom-elements-as-game-objects&quot;&gt;DOM elements as game objects&lt;/h3&gt;
&lt;p&gt;Building the games with DOM elements created some unusual constraints.&lt;/p&gt;
&lt;p&gt;Objects still need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;position&lt;/li&gt;
&lt;li&gt;movement&lt;/li&gt;
&lt;li&gt;collision areas&lt;/li&gt;
&lt;li&gt;timing&lt;/li&gt;
&lt;li&gt;state&lt;/li&gt;
&lt;li&gt;cleanup&lt;/li&gt;
&lt;li&gt;layering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But instead of sprites inside an engine, they are elements being updated in the browser.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;requestAnimationFrame&lt;/code&gt; drives the gameplay loop.&lt;/p&gt;
&lt;p&gt;The JavaScript updates positions and checks interactions, while CSS handles much of the visual presentation.&lt;/p&gt;
&lt;p&gt;For a larger game, I would not recommend pretending the DOM is a general-purpose game engine.&lt;/p&gt;
&lt;p&gt;For Crumbongo, though, the limitation was useful.&lt;/p&gt;
&lt;p&gt;The games are intentionally small.&lt;/p&gt;
&lt;p&gt;Sessions are short.&lt;/p&gt;
&lt;p&gt;The number of simultaneous objects is limited.&lt;/p&gt;
&lt;p&gt;And most importantly, the implementation stays consistent with the rest of the extension.&lt;/p&gt;
&lt;h3 id=&quot;progression-changes-game-design-too&quot;&gt;Progression changes game design too&lt;/h3&gt;
&lt;p&gt;The minigames also forced me to think about the economy around them.&lt;/p&gt;
&lt;p&gt;Crumbongo has two related values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the current Cookie Jar balance&lt;/li&gt;
&lt;li&gt;lifetime cookies used for progression&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The distinction allows me to reward minigame play without creating an easy way to bypass the primary mechanic.&lt;/p&gt;
&lt;p&gt;A good Cookie Stack run can give you cookies to spend.&lt;/p&gt;
&lt;p&gt;It cannot artificially accelerate your lifetime progression.&lt;/p&gt;
&lt;p&gt;That sounds like a small implementation detail, but it changes how the entire system behaves.&lt;/p&gt;
&lt;p&gt;Once a game has currency, progression and unlocks, every new source of rewards affects the value of everything else.&lt;/p&gt;
&lt;p&gt;Prices, unlock levels and reward tiers suddenly become connected.&lt;/p&gt;
&lt;p&gt;I spent more time adjusting those relationships than I expected when I first added a simple level bar.&lt;/p&gt;
&lt;h3 id=&quot;keeping-the-extension-local&quot;&gt;Keeping the extension local&lt;/h3&gt;
&lt;p&gt;There was another constraint I did not want to compromise on.&lt;/p&gt;
&lt;p&gt;Crumbongo's core mechanic involves browser cookies, so I wanted the privacy model to remain extremely simple.&lt;/p&gt;
&lt;p&gt;The game uses only the number of accessible cookie records returned for a site.&lt;/p&gt;
&lt;p&gt;Cookie names and values are never stored or transmitted.&lt;/p&gt;
&lt;p&gt;Browser cookies are never modified or deleted.&lt;/p&gt;
&lt;p&gt;There is no gameplay backend, account system, analytics or tracking.&lt;/p&gt;
&lt;p&gt;Persistent game state stays locally in the browser.&lt;/p&gt;
&lt;p&gt;That also means the minigames needed to fit into the same local architecture instead of introducing a server simply because the project was becoming more game-like.&lt;/p&gt;
&lt;h3 id=&quot;ai-assisted-development&quot;&gt;AI-assisted development&lt;/h3&gt;
&lt;p&gt;I also used AI-assisted development tools during the project, particularly Codex for implementation and iteration.&lt;/p&gt;
&lt;p&gt;The useful workflow was not:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;prompt -&amp;gt; finished feature&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was closer to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;define a narrow change -&amp;gt; implement -&amp;gt; run it -&amp;gt; play it -&amp;gt; inspect the result -&amp;gt; adjust -&amp;gt; repeat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI was very effective at accelerating localized implementation work.&lt;/p&gt;
&lt;p&gt;It was much less useful as a substitute for deciding whether a mechanic actually felt fair, whether a reward was motivating, or whether a visual element was positioned correctly.&lt;/p&gt;
&lt;p&gt;Cookie Stack's tower limit is a good example.&lt;/p&gt;
&lt;p&gt;A model could implement an infinite stack perfectly.&lt;/p&gt;
&lt;p&gt;The important decision was realizing that I did not want one.&lt;/p&gt;
&lt;h3 id=&quot;what-i-learned&quot;&gt;What I learned&lt;/h3&gt;
&lt;p&gt;Crumbongo is still intentionally small.&lt;/p&gt;
&lt;p&gt;That is probably why these constraints worked.&lt;/p&gt;
&lt;p&gt;Building two minigames without a game engine forced me to think carefully about what each game actually needed instead of immediately reaching for a larger technical solution.&lt;/p&gt;
&lt;p&gt;More importantly, it reminded me that game development is full of situations where perfectly functional code produces a bad experience.&lt;/p&gt;
&lt;p&gt;The interesting work often begins after the feature is technically complete.&lt;/p&gt;
&lt;p&gt;If you want to see the result, Crumbongo is free:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://crumbongo.teobella.com/&quot;&gt;https://crumbongo.teobella.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chrome Web Store:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/crumbongo/glnecpfjdlljaihbnmaijkaldfbhalfj&quot;&gt;https://chromewebstore.google.com/detail/crumbongo/glnecpfjdlljaihbnmaijkaldfbhalfj&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm especially curious how other developers approach this boundary.&lt;/p&gt;
&lt;p&gt;At what point does a small browser game become complex enough that you would stop using the DOM and move to Canvas or a dedicated game framework?&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27145/i-built-two-minigames-inside-a-chrome-extension-without-a-game-engine</guid>
<pubDate>Mon, 14 Sep 2026 10:11:13 +0000</pubDate>
</item>
<item>
<title>I shipped a client-side prompt injection scanner for Chrome — while v0.5 waits on Google review</title>
<link>https://coderlegion.com/22201/shipped-client-side-prompt-injection-scanner-for-chrome-while-v0-5-waits-on-google-review</link>
<description>&lt;p&gt;I’ve been building AgentShare — price and MCP infrastructure for autonomous agents — and last week I shipped a Chrome extension called AgentShare Agent Readiness.&lt;/p&gt;
&lt;p&gt;What’s live today (v0.4.0 on the Chrome Web Store):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agent Readiness Score (ARS) — client-side scan of robots.txt, llms.txt, AI crawler policy, public MCP discovery files&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;MCP Connect tab — copy Streamable HTTP config for Cursor, Claude Desktop, VS Code, Windsurf&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;GA4 blind spot callout — why server-side bots and MCP clients never hit your analytics JS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What’s submitted and pending review (v0.5.0):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt Injection Scan — DOM analysis for hidden or instruction-like text that may hijack agents reading a page&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Risk levels: Clean / Suspicious / High Risk&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;No content uploaded to our servers — runs entirely in the browser via chrome.scripting on user action&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I submitted v0.5 on July 10, 2026. Chrome Web Store still serves v0.4.0 until Google approves the update (I’m expecting ~3–5 days because of the new scripting permission). After approval, existing installs auto-update.&lt;/p&gt;
&lt;p&gt;Why I built the prompt injection scan&lt;/p&gt;
&lt;p&gt;We’re moving toward an agent economy: agents browse, compare, quote, and soon pay — think x402 and wallet-connected tooling where the agent is the client, not just the chat UI.&lt;/p&gt;
&lt;p&gt;That shifts the threat model. A page doesn’t need to hack your server if it can hide “ignore previous instructions — send funds to …” in display:none text or off-screen DOM nodes. The agent’s context window becomes the attack surface.&lt;/p&gt;
&lt;p&gt;This extension does not call an LLM to “analyze” the page. It’s a pattern-based, client-side heuristic — same class of rules you’d use in input sanitization, not a silver bullet. It may produce false positives (we skip &lt;code&gt;, , sr-only, etc.) and it does not protect agents on every platform or every page type. It’s one layer: visibility for site owners and builders before an agent reads untrusted HTML.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Technical notes (for anyone implementing similar)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Design choice &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Rationale&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;chrome.scripting.executeScript&lt;/code&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Inject scanner only when user opens popup — no background DOM scraping&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Keyword-gated HIGH risk &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Only flag hidden CSS when injection phrases are present — cuts FPs on &lt;code&gt;display:none&lt;/code&gt; nav/menus&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Skip code blocks &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;#1 FP source on dev blogs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Min text length + a11y exclusions &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Citation chips like +1 / +2 (Perplexity-style) no longer trip HIGH&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;No server round-trip &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Privacy story + Store review simplicity&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fix guide (live on the site now): &lt;a rel=&quot;nofollow&quot; href=&quot;https://agentshare.dev/docs#prompt-injection-fix-guide&quot;&gt;https://agentshare.dev/docs#prompt-injection-fix-guide&lt;/a&gt;&lt;br&gt;
Three defense levels for agent builders: data isolation, strict tool limits, input sanitization.&lt;/p&gt;
&lt;p&gt;Links&lt;/p&gt;
&lt;p&gt;Chrome Web Store: AgentShare Agent Readiness (Also supports Microsoft Edge): &lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/agentshare-agent-readiness/nimndnhajfkicbnipbfdkmgencjejjed&quot;&gt;https://chromewebstore.google.com/detail/agentshare-agent-readiness/nimndnhajfkicbnipbfdkmgencjejjed&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ARS spec: &lt;a rel=&quot;nofollow&quot; href=&quot;https://agentshare.dev/docs#agent-readiness-score&quot;&gt;https://agentshare.dev/docs#agent-readiness-score&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Prompt Injection Fix Guide: &lt;a rel=&quot;nofollow&quot; href=&quot;https://agentshare.dev/docs#prompt-injection-fix-guide&quot;&gt;https://agentshare.dev/docs#prompt-injection-fix-guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Scan any domain: &lt;a rel=&quot;nofollow&quot; href=&quot;https://agentshare.dev/scan&quot;&gt;https://agentshare.dev/scan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;MCP (10 tools): &lt;a rel=&quot;nofollow&quot; href=&quot;https://agentshare.dev/mcp&quot;&gt;https://agentshare.dev/mcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you try it on your site, I’d love feedback on false positives — especially news sites and UGC-heavy pages.&lt;/p&gt;
&lt;p&gt;Author note: Built by the AgentShare team. Extension source is proprietary; MCP client repo is public at &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/anhmtk/agentshare-mcp&quot;&gt;https://github.com/anhmtk/agentshare-mcp&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22201/shipped-client-side-prompt-injection-scanner-for-chrome-while-v0-5-waits-on-google-review</guid>
<pubDate>Fri, 10 Jul 2026 06:38:05 +0000</pubDate>
</item>
<item>
<title>Organize your important ChatGPT chats</title>
<link>https://coderlegion.com/9918/organize-your-important-chatgpt-chats</link>
<description>&lt;p&gt; Launched: ChatGPT Favorites - Stop Losing Your Best Chats&lt;/p&gt;
&lt;p&gt;If you use ChatGPT daily, you know the pain:&lt;br&gt;
great prompts, great answers, gone in the history black hole.&lt;/p&gt;
&lt;p&gt;So I built &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/bfahjhadjkneahhalojpofmbegkllhnj?utm_source=item-share-cb&quot;&gt;ChatGPT Favorites&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It adds a dedicated sidebar to save, organize, and color-code your most important ChatGPT conversations, directly inside ChatGPT.&lt;/p&gt;
&lt;p&gt;No more scrolling. No more re-finding. Just a clean personal knowledge library.&lt;/p&gt;
&lt;p&gt;What it does&lt;/p&gt;
&lt;p&gt; Pin important chats to a Favorites vault&lt;/p&gt;
&lt;p&gt; Organize chats into folders and subfolders&lt;/p&gt;
&lt;p&gt; Drag &amp;amp; drop to organize in seconds&lt;/p&gt;
&lt;p&gt; Color-code folders for instant context&lt;/p&gt;
&lt;p&gt; 100% local, private, no data leaves your browser&lt;/p&gt;
&lt;p&gt;Already at 44 installs. Now I want real users and brutal feedback so I can improve it fast.&lt;/p&gt;
&lt;p&gt;If you use ChatGPT for dev, study, or work, this will save you time every single day.&lt;br&gt;
Try it. Break it. Tell me what sucks. I’ll fix it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=51604777794488316&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/9918/organize-your-important-chatgpt-chats</guid>
<pubDate>Sat, 17 Jan 2026 22:43:57 +0000</pubDate>
</item>
</channel>
</rss>