<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: frog404</title>
    <description>The latest articles on DEV Community by frog404 (@frog404).</description>
    <link>https://dev.to/frog404</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4007658%2F802e1aa8-58a6-4c4d-8a8a-d6fbc9795738.png</url>
      <title>DEV Community: frog404</title>
      <link>https://dev.to/frog404</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frog404"/>
    <language>en</language>
    <item>
      <title>Playwright can test Chrome extensions. So why does my AI agent still need my help?</title>
      <dc:creator>frog404</dc:creator>
      <pubDate>Mon, 20 Jul 2026 07:44:45 +0000</pubDate>
      <link>https://dev.to/frog404/playwright-can-test-chrome-extensions-so-why-does-my-ai-agent-still-need-my-help-1jpf</link>
      <guid>https://dev.to/frog404/playwright-can-test-chrome-extensions-so-why-does-my-ai-agent-still-need-my-help-1jpf</guid>
      <description>&lt;h2&gt;
  
  
  What happens when you let an AI write a browser extension
&lt;/h2&gt;

&lt;p&gt;I've been building Chrome extensions with AI coding agents — Claude Code, Cursor, whatever. Writing the code is the fast part. The problem is everything after.&lt;/p&gt;

&lt;p&gt;"Build it, load it into the browser, open the popup, click the button, check the console."&lt;/p&gt;

&lt;p&gt;That part? All me. Every time. The agent can write the code, but it can't see what the code looks like on screen. It can't click anything. It can't read the logs. So the human becomes the agent's eyes and hands.&lt;/p&gt;

&lt;p&gt;At first I accepted this as the cost of doing business. Then I hit the UI-polishing phase and it turned into hell. Every "move that button 20px right" or "make the font 14px" meant: build → load → screenshot → paste it into chat → "how's this?" → agent edits code → build → load → screenshot. Forever.&lt;/p&gt;

&lt;p&gt;And this isn't just a Chrome extension problem. Electron apps, VSCode extensions — anything with a UI that doesn't open in a normal browser tab has the same failure mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Just use Playwright" — okay, let's talk about that
&lt;/h2&gt;

&lt;p&gt;For a normal web app, sure. Playwright opens the page, screenshots it, clicks things. Tell your agent "verify it with Playwright" and it does.&lt;/p&gt;

&lt;p&gt;Playwright supports Chrome extensions too — there are official docs, and they work. But the setup is nothing like a regular page. You need &lt;code&gt;launchPersistentContext&lt;/code&gt; to load the extension, extract the extension ID dynamically from the Service Worker URL, then navigate to &lt;code&gt;chrome-extension://{id}/popup.html&lt;/code&gt;. Popups have a different lifecycle from normal pages, and MV3 Service Workers get suspended when idle — Playwright handles most restarts transparently these days, but it's still one more extension-specific concern the agent has to account for.&lt;/p&gt;

&lt;p&gt;As test code written by a human, this is all fine. Follow the docs and it works.&lt;/p&gt;

&lt;p&gt;The problem is asking an &lt;em&gt;agent&lt;/em&gt; to do it. All I want to say is "build and check it." Instead, the agent has to write Playwright setup code, understand extension-specific context management, write a test, run it, and parse the output. That's a lot of machinery for "does the button look right?"&lt;/p&gt;

&lt;p&gt;Electron is similar. Playwright has (experimental) Electron support — &lt;code&gt;electron.launch&lt;/code&gt; gets you basic UI automation. But native OS dialogs like &lt;code&gt;dialog.showOpenDialog()&lt;/code&gt; live outside the DOM, so you need to inject mocks. Want to observe IPC between main and renderer? Build your own instrumentation. And Electron bugs &lt;em&gt;love&lt;/em&gt; to hide on the far side of IPC, so seeing only the window is half a verification.&lt;/p&gt;

&lt;p&gt;VSCode extensions have a different official testing path entirely. The standard setup uses &lt;code&gt;@vscode/test-electron&lt;/code&gt; to launch an Extension Development Host — VSCode itself is an Electron app, so you &lt;em&gt;can&lt;/em&gt; drive the window through Playwright's Electron support, but commands, notifications, output channels, and the Problems panel all need VSCode-specific integration on top.&lt;/p&gt;

&lt;p&gt;So: every platform has good primitives, and agent-facing tools like Playwright MCP already cover driving regular browser pages. What I couldn't find was a single agent-facing interface that covered Chrome extension lifecycle management (build, reload, Service Workers, content scripts), Electron IPC, &lt;em&gt;and&lt;/em&gt; VSCode-specific operations under one operation model.&lt;/p&gt;

&lt;p&gt;The primitives already existed. What was missing was a unified development loop an agent could call without rebuilding the platform-specific setup every time.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  KamoX: hide the platform mess behind a local HTTP API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/iwabuchi404/kamox" rel="noopener noreferrer"&gt;KamoX&lt;/a&gt; is a local HTTP API server. It's not a Playwright replacement — think of it as a layer that wraps Playwright and each platform's native tooling behind endpoints an agent can hit with &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /rebuild&lt;/code&gt; — build and reload&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /check-ui&lt;/code&gt; — screenshot + DOM info + console errors, in one call&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /playwright/element&lt;/code&gt; — click buttons, fill forms&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /logs&lt;/code&gt; — retrieve logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;/check-ui&lt;/code&gt; returns the screenshot path &lt;em&gt;plus&lt;/em&gt; the page title, body text, HTML, console logs, and page errors as text. So even an agent that can't look at images can reason about UI state from the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"loaded"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"screenshot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/project/.kamox/screenshots/popup_1234567890.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Popup Title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"bodyText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"logs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"performance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"loadTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical agent loop looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# after editing code, rebuild&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/rebuild

&lt;span class="c"&gt;# check the UI (keepOpen leaves the popup up)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/check-ui &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"keepOpen": true}'&lt;/span&gt;

&lt;span class="c"&gt;# click a button in the open popup&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/playwright/element &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"pageType": "popup", "selector": "#save-btn", "action": "click"}'&lt;/span&gt;

&lt;span class="c"&gt;# read the logs&lt;/span&gt;
curl http://localhost:3000/logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why HTTP instead of MCP?
&lt;/h3&gt;

&lt;p&gt;A deliberate choice. I picked HTTP as the core interface because it's easy to inspect, easy to script, and callable from any agent that can run shell commands and reach localhost — plus the same API works from plain scripts and CI, not just agents. Requests and responses are trivially debuggable by a human with &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An MCP adapter could be layered on top later, but the underlying platform API doesn't need to depend on any particular client protocol. For a local dev server, plain HTTP is the simplest possible integration surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a plugin architecture?
&lt;/h3&gt;

&lt;p&gt;Chrome extensions, Electron apps, and VSCode extensions launch differently and debug differently. But what the agent &lt;em&gt;wants&lt;/em&gt; is identical: build, look at the screen, press a button, read the logs.&lt;/p&gt;

&lt;p&gt;So the core owns the common API, and platform-specific dirt lives in plugins: waking idle Service Workers and reading their logs via CDP (Chrome), IPC monitoring and native-dialog mocks (Electron), command execution and Problems-panel access (VSCode).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kamox chrome &lt;span class="nt"&gt;--auto-build&lt;/span&gt;
kamox electron &lt;span class="nt"&gt;--entryPoint&lt;/span&gt; main.js
kamox vscode &lt;span class="nt"&gt;--project-path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command starts the server; the agent takes it from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;The biggest shift: I can now say "hit localhost:3000 and check your work."&lt;/p&gt;

&lt;p&gt;Before, every CSS tweak meant me building, opening the browser, screenshotting, and pasting. Now the agent runs &lt;code&gt;/rebuild&lt;/code&gt;, pulls a screenshot and DOM info from &lt;code&gt;/check-ui&lt;/code&gt;, clicks through with &lt;code&gt;/playwright/element&lt;/code&gt; if something looks off, grabs errors from &lt;code&gt;/logs&lt;/code&gt;, and fixes its own code. Just eliminating the screenshot-and-paste ritual changed how the whole loop feels.&lt;/p&gt;

&lt;p&gt;It's not perfect, and I'd rather be upfront about that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KamoX opens &lt;code&gt;popup.html&lt;/code&gt; as a regular page. DOM and visuals are verifiable, but real-toolbar-popup behaviors like focus handling and auto-close aren't reproduced.&lt;/li&gt;
&lt;li&gt;"Is this design actually good?" is still a human call.&lt;/li&gt;
&lt;li&gt;Extension permissions and platform-specific sharp edges still exist.&lt;/li&gt;
&lt;li&gt;KamoX is a local development tool — don't expose its HTTP port to untrusted networks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I no longer spend hours acting as my agent's eyes and hands, and on UI-heavy work the difference is obvious.&lt;/p&gt;

&lt;p&gt;There's also &lt;code&gt;kamox guide&lt;/code&gt;, which prints an LLM-optimized API reference you can point your CLAUDE.md or .cursorrules at, and scenario files for defining preconditions. Honestly though, 90% of usage is &lt;code&gt;/rebuild&lt;/code&gt; + &lt;code&gt;/check-ui&lt;/code&gt; + &lt;code&gt;/logs&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; kamox
kamox chrome &lt;span class="nt"&gt;--auto-build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chrome extension, Electron, and VSCode modes are implemented (VSCode mode is currently tested mainly on Windows). MIT licensed.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/iwabuchi404/kamox" rel="noopener noreferrer"&gt;https://github.com/iwabuchi404/kamox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>playwright</category>
      <category>electron</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an AI-friendly knowledge base so coding agents stop forgetting project context</title>
      <dc:creator>frog404</dc:creator>
      <pubDate>Thu, 02 Jul 2026 13:49:58 +0000</pubDate>
      <link>https://dev.to/frog404/i-built-an-ai-friendly-knowledge-base-so-coding-agents-stop-forgetting-project-context-onc</link>
      <guid>https://dev.to/frog404/i-built-an-ai-friendly-knowledge-base-so-coding-agents-stop-forgetting-project-context-onc</guid>
      <description>&lt;p&gt;I have 20+ personal projects. Every time I start a new AI session, I have to re-explain the project structure, what was decided last time, and what to do next. Switching between Claude Code, Codex, and other tools makes it worse — the context doesn't follow.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/iwabuchi404/context-mixer" rel="noopener noreferrer"&gt;&lt;strong&gt;ContextMixer&lt;/strong&gt;&lt;/a&gt; to fix this: a knowledge base where AI agents search, read, and update project documents through MCP or REST API, and humans review them in a web UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not Notion / Obsidian / local Markdown?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Local Markdown + Git&lt;/strong&gt; worked for CLI agents but couldn't be accessed from chat-based tools like Claude.ai.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notion&lt;/strong&gt; had MCP support, but fetching pages was slow and token-heavy. Its rich block structure is great for humans but inefficient for AI access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; is local-first, which rules out chat-based access.&lt;/p&gt;

&lt;p&gt;I needed something accessible from both chat and CLI, lightweight for AI, and editable by humans. Nothing fit, so I built my own. It runs on Cloudflare Workers + D1 + R2, entirely within the free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive retrieval
&lt;/h2&gt;

&lt;p&gt;The core design idea: agents choose how much to read.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;View&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;meta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;title + summary&lt;/td&gt;
&lt;td&gt;tens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;outline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;heading structure&lt;/td&gt;
&lt;td&gt;hundreds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;section&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;one specific section&lt;/td&gt;
&lt;td&gt;hundreds–thousands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;entire document&lt;/td&gt;
&lt;td&gt;all&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A typical flow for "check the auth design":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. list_docs(collection_id)        → document list with metadata
2. get_doc(doc_id, view="outline") → heading structure
3. get_doc(doc_id, view="section", section="Auth") → just what's needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three API calls, but hundreds of tokens instead of thousands. Most queries resolve at &lt;code&gt;meta&lt;/code&gt; → &lt;code&gt;section&lt;/code&gt; without ever reading the full document.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Cortex: structuring project memory
&lt;/h2&gt;

&lt;p&gt;ContextMixer is a generic container. The structure is up to you.&lt;/p&gt;

&lt;p&gt;I keep four documents per project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;context&lt;/strong&gt; — current phase, recent work, unresolved issues, handoff notes for the next session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spec&lt;/strong&gt; — confirmed goals, requirements, tech stack (nothing tentative)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;decisions&lt;/strong&gt; — design choices with reasoning, including rejected alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;notes&lt;/strong&gt; — library pitfalls, bug workarounds, implementation tips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I call this pattern &lt;strong&gt;AI Cortex&lt;/strong&gt;. The agent reads &lt;code&gt;context&lt;/code&gt; at session start and updates it at the end. The next session picks up where the last one left off.&lt;/p&gt;

&lt;p&gt;The biggest win: I no longer re-explain previous sessions. The agent reads &lt;code&gt;context&lt;/code&gt; and resumes. &lt;code&gt;decisions&lt;/code&gt; also helps — "why did we drop Vue?" is answered by the document, not by me repeating myself.&lt;/p&gt;

&lt;p&gt;But letting AI write to a knowledge base has risks. Without rules, agents write tentative ideas into &lt;code&gt;spec&lt;/code&gt;, create unconfirmed decisions, or duplicate documents. Writing permissions aren't enough — you need writing &lt;em&gt;rules&lt;/em&gt;. In my setup, CLAUDE.md specifies things like "don't write to &lt;code&gt;decisions&lt;/code&gt; without user confirmation" and "search before creating new documents." Still a work in progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Karpathy's LLM Wiki
&lt;/h2&gt;

&lt;p&gt;After I started building ContextMixer, I came across Karpathy's LLM Wiki pattern — where an LLM builds and maintains a structured wiki from raw sources instead of doing RAG lookups every time.&lt;/p&gt;

&lt;p&gt;It resonated, but the use cases differ. LLM Wiki is a research library: accumulate and organize what you've read. ContextMixer is a project whiteboard: manage ongoing work across sessions, tools, and access points.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;📦 &lt;a href="https://github.com/iwabuchi404/context-mixer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://context-mixer.frog404.work" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;br&gt;
📄 &lt;a href="https://frog404.work/projects/context-mixer/" rel="noopener noreferrer"&gt;Project page (detailed design notes)&lt;/a&gt;&lt;br&gt;
📝 &lt;a href="https://zenn.dev/frogworks404/articles/50e2c51734b523?locale=en" rel="noopener noreferrer"&gt;Japanese article on Zenn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI agents don't need to remember everything. They need a good place to read from.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>cloudflarechallenge</category>
    </item>
  </channel>
</rss>
