Reference chat extension thin shell iframe
chrome-extension-forge-chat/ (installed unpacked on Mac, Vector, etc.) is a thin shell: sidepanel.html just holds a full-bleed <iframe> pointed at the live launcher app (config.js sets FORGE_CHAT_URL, panel.js wires it in). There is no bundled launcher.js in the extension directory anymore.
The server serves /ui directly from sites/justinsforge.com/chat/ via a FastAPI StaticFiles mount (forge_session_launcher_api.py), with middleware forcing Cache-Control: no-cache, must-revalidate on / and /ui*. So editing launcher.js and having the service pick it up (it reads from disk per request, no restart even required for static content) makes the change live immediately for any fresh navigation of that URL.
Why it can still look stale: an already-open side panel keeps its iframe document alive in memory. It won't repull launcher.js just because the server changed underneath it, same as any other browser tab. Closing/reopening the panel is usually enough, EXCEPT Chrome partitions the HTTP cache for cross-origin iframes by the embedding extension's id, and that id is pinned (manifest.json "key"), so it survives even a full remove+reinstall of the extension. A normal top-level browser tab hitting the same URL is unaffected (different cache partition) and shows the fresh version, which is the telltale sign this is the bug, not a deploy problem. Fixed 2026-07-06 in panel.js: the iframe src now gets a ?v=<Date.now()> cache-buster appended on every panel open, forcing a real network fetch each time regardless of partition state.
Note: panel.js/config.js/manifest.json/background.js themselves ARE part of the bundled extension shell (unlike launcher.js), so changes to those DO need the normal chrome://extensions reload (unpacked) or re-download+reinstall (zip build) to reach an installed copy.
Supersedes [[reference_chat_extension_unpacked_no_autoupdate]] (deleted), which described the pre-thin-shell architecture where launcher.js was bundled into the extension zip and genuinely needed a re-download per machine.
[Claude Code]