isore

module
v0.0.0-...-5744d19 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2026 License: MIT

README ยถ

isore

isore overlays your running web app so you can click any element, say what's wrong in plain language, and hand it off โ€” your coding agent picks the notes up over MCP, fixes them, and your browser shows the progress live.

Built with Go MCP server MIT License PRs welcome

Contents

Why isore

Design review is a game of telephone. You spot something off โ€” a button a few pixels low, a heading crammed against a card, text too faint to read โ€” and then you describe it: a screenshot pasted into Slack, a ticket, a paragraph explaining which paragraph you mean. The agent that could fix it in seconds never sees what you saw.

isore closes that loop. Flag the element itself, in the running app, in plain language. isore captures the boring context for you โ€” the CSS selector, the element's dimensions, a screenshot โ€” and hands the whole batch to your coding agent. You watch the fixes land live.

How it works

isore stands up a reverse proxy in front of your dev server and injects a small overlay, built in a Shadow DOM so it can't collide with your app's styles โ€” WebSockets and your dev server's HMR stream pass through untouched.

You point at any element, drop a note, and let them queue up. One hand off sends the batch to your agent over MCP; it reads each note โ€” with the selector, dimensions, and a screenshot โ€” fixes the code, and marks it done.

Badges track every note live โ€” flagged โ†’ working โ†’ fixed โ€” and the page reloads itself once the agent rebuilds.

Install

go install github.com/joaomdsg/isore/cmd/isore@latest

Get started

1. Register isore with your agent, once, from your project directory:

claude mcp add isore -- isore mcp

2. Ask your agent to start isore in front of your dev server:

"start isore in front of my app on :3000 and fix my notes as I hand them off"

That's all the setup there is. The MCP server ships its own instructions to the agent, so it already knows the loop: stand up the proxy, open the annotated app in a driven browser, wait for your hand-offs, fix each note, and reload your page when the build is done. A window opens showing your app with the overlay ready.

3. Toggle the overlay, flag what's off, and hand it off. Badges turn amber while the agent works and green with a summary when it's done โ€” then the page refreshes itself.

The annotation workflow

Every note carries its own state, shown as a badge pinned to the element and a row in the overlay's inbox:

Badge State Meaning
๐Ÿ”ด flagged You left a note; not yet handed off.
๐ŸŸ  working Handed off โ€” the agent is on it. The overlay is frozen.
๐ŸŸข fixed Done, with a one-line summary. The page reloads on rebuild.

The overlay walks a simple path:

  1. Point โ€” toggle on; every element highlights as your cursor passes over it, with a devtools-style label showing its selector and size.
  2. Note โ€” click it and say what's off in plain language. isore auto-captures the selector, dimensions, and a screenshot.
  3. Queue โ€” flag as many as you want; they stack up numbered in the inbox.
  4. Hand off โ€” one tap sends the whole batch to your agent over MCP. The overlay freezes so nothing collides mid-fix.
  5. Fixed โ€” badges turn green with a summary; the overlay thaws and the page refreshes.

MCP tools

Your agent doesn't just read your notes โ€” it gets the browser.

๐ŸŽฎ Control

Tool Description
start_proxy Stand up the injecting proxy and open your browser. Start here; call again to move ports.
reload_page Refresh your tabs after a rebuild (needs start_proxy first).

๐Ÿ“ Notes

Tool Description
list_notes List the current notes and their state.
mark_working Badge turns amber; the overlay freezes.
mark_fixed Badge turns green; your summary shows in the overlay.

Hand-offs aren't an MCP tool โ€” the agent receives them by running the isore subscribe CLI as a single persistent background listener that streams every dispatched batch over one open SSE connection.

๐Ÿ‘€ Eyes

Tool Description
get_screenshot The element PNG captured at hand-off.
browser_screenshot Capture the live page or an element to verify a fix.

โœ‹ Hands

Tool Description
browser_eval Run JS โ€” read computed styles/state, click, type, drive the UI.
browser_html The live DOM.
browser_navigate Go to a URL.
browser_console Logs, warnings, and errors.

The proxy runs inside the isore mcp server โ€” no second process to manage. For the element screenshots captured on every hand-off it attaches to your browser if one is running, otherwise it launches its own headless Chromium.

Configuration

Notes are written to isore-out/notes.json; every command takes -out to change the store path. isore can also attach to a browser you already have open and drive it:

isore -url http://localhost:3000
Flag Default Description
-url http://127.0.0.1:3000/ App URL to open and annotate directly.
-out isore-out/notes.json Where notes and screenshots are stored.
-debug-port 9222 CDP port exposed to the isore mcp browser tools.
-chrome auto-detect Path to a specific browser executable.

Browser โ†” proxy is plain HTTP + SSE; the overlay reconciles authoritative note state on every reconnect, so a dropped stream (tab closed, proxy restarted) heals itself.

FAQ

Does it change my app's styling? No. The overlay lives in a Shadow root; badges and outlines that attach to your elements use scoped rules. Your app renders exactly as it would without isore.

Does it work with hot reload? Yes โ€” HMR and WebSocket traffic pass through the proxy untouched.

What if I don't have Chrome/Chromium? isore falls back to your default browser and tells the agent to suggest installing one for the fully-driven experience.

Which agents are supported? Any MCP client. Setup shown here uses Claude Code (claude mcp add).

Contributing

Issues and PRs are welcome. If you're building on the MCP surface, pin a commit โ€” the note schema may still evolve between versions.

License

MIT.

If isore saves you time, drop it a โญ โ€” it helps others find it.

Star isore on GitHub ย ย 

Directories ยถ

Path Synopsis
cmd
demo command
Command demo serves the isore e2e fixture app (internal/demoapp) as a plain dev server, for annotating manually via `isore mcp` + start_proxy or for pointing integration tests at a real page instead of an inline HTML literal.
Command demo serves the isore e2e fixture app (internal/demoapp) as a plain dev server, for annotating manually via `isore mcp` + start_proxy or for pointing integration tests at a real page instead of an inline HTML literal.
isore command
Command isore dispatches to its subcommands: `mcp` runs the MCP server (whose start_proxy tool fronts the user's dev server with the annotation overlay and drives a real Chromium for the browser_* tools), and `subscribe` is a long-lived CLI listener that streams dispatched annotations from the proxy's SSE stream โ€” run as a single background command so the agent is notified of every dispatch without holding a blocking tool call.
Command isore dispatches to its subcommands: `mcp` runs the MCP server (whose start_proxy tool fronts the user's dev server with the annotation overlay and drives a real Chromium for the browser_* tools), and `subscribe` is a long-lived CLI listener that streams dispatched annotations from the proxy's SSE stream โ€” run as a single background command so the agent is notified of every dispatch without holding a blocking tool call.
internal
browser
Package browser gives the MCP agent the actual browser: screenshots, JS evaluation, DOM reads, navigation, and console output โ€” attached to the user's visible Chromium (harness mode) or an owned headless one (proxy mode).
Package browser gives the MCP agent the actual browser: screenshots, JS evaluation, DOM reads, navigation, and console output โ€” attached to the user's visible Chromium (harness mode) or an owned headless one (proxy mode).
demoapp
Package demoapp is a small, static fixture app used both to try isore out manually (cmd/demo) and, later, to drive real e2e tests against a page with stable, named elements instead of an inline HTML literal.
Package demoapp is a small, static fixture app used both to try isore out manually (cmd/demo) and, later, to drive real e2e tests against a page with stable, named elements instead of an inline HTML literal.
fonts
Package fonts embeds the brand typeface files (WOFF2) so the proxy can serve them without a network fetch or a separate asset pipeline.
Package fonts embeds the brand typeface files (WOFF2) so the proxy can serve them without a network fetch or a separate asset pipeline.
notes
Package notes holds the annotation domain: the Note record dispatched by the browser overlay and the pure operations the store and MCP server apply to collections of them.
Package notes holds the annotation domain: the Note record dispatched by the browser overlay and the pure operations the store and MCP server apply to collections of them.
proxy
Package proxy is the injecting reverse proxy between the user's browser and their dev server: it plants the overlay into HTML, accepts note dispatches over HTTP, and pushes agent activity and reloads back over SSE.
Package proxy is the injecting reverse proxy between the user's browser and their dev server: it plants the overlay into HTML, accepts note dispatches over HTTP, and pushes agent activity and reloads back over SSE.
serve
Package serve holds the MCP tool handlers, kept free of MCP SDK types so the tool logic is testable; cmd/isore adapts them onto the SDK.
Package serve holds the MCP tool handlers, kept free of MCP SDK types so the tool logic is testable; cmd/isore adapts them onto the SDK.
store
Package store persists notes to a JSON file shared between the harness process (writes dispatches) and the MCP server process (reads, marks fixed).
Package store persists notes to a JSON file shared between the harness process (writes dispatches) and the MCP server process (reads, marks fixed).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL