{"_id":"@empir3hq/empir3-bridge","_rev":"3-8467ced4c8cbd506625c91c4a3e2de16","name":"@empir3hq/empir3-bridge","dist-tags":{"latest":"0.4.0"},"versions":{"0.3.72":{"name":"@empir3hq/empir3-bridge","version":"0.3.72","keywords":["claude","claude-code","mcp","browser","desktop-automation","automation","chrome","cdp","computer-use","mcp-server","ai-tools","local-first"],"author":{"name":"Empir3"},"license":"MIT","_id":"@empir3hq/empir3-bridge@0.3.72","maintainers":[{"name":"empir3hq","email":"vincent@empir3.com"}],"homepage":"https://github.com/empir3hq/empir3-bridge","bugs":{"url":"https://github.com/empir3hq/empir3-bridge/issues"},"bin":{"empir3-bridge":"src/launch.js","empir3-bridge-mcp":"src/mcp-entry.js"},"dist":{"shasum":"fb8adfe44f03cdc2eff035332216ebdf4c6d2b29","tarball":"https://registry.npmjs.org/@empir3hq/empir3-bridge/-/empir3-bridge-0.3.72.tgz","fileCount":115,"integrity":"sha512-brAxqUhRrxN5DyVgATJ0I+U31XvYWxqhnexCSAEg9QZ2Dir2vyi1zAWMsNlXfL21bpdeodTqU6gy4zK4HNJ9Qw==","signatures":[{"sig":"MEUCIQCqfprGnluKrF++H1H53jMRWVyZ9wx8f1n7B+4Rk5nN0QIgF3b12UQ3K5vM/bsFTBpX5mkwXcvrcxVx11UfbJtMR2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5073714},"main":"./src/cli.ts","engines":{"node":">=18.0.0"},"gitHead":"ec94bccf0ffd480d7d269e1aa404e5e19777f69d","scripts":{"cli":"tsx src/cli.ts","mcp":"tsx src/mcp-server.ts","kill":"node src/launch.js --kill","test":"node scripts/run-tests.mjs","scale":"node scripts/scale.js","start":"node src/launch.js","status":"node src/launch.js --status","build:mcp":"esbuild src/mcp-server.ts --bundle --platform=node --target=node18 --format=cjs --outfile=dist/mcp-server.cjs --external:@modelcontextprotocol/sdk --external:zod","smoke:live":"node scripts/smoke-live-bridge.mjs","desktop:dev":"npm --prefix desktop-shell start","desktop:make":"npm --prefix desktop-shell run make","desktop:test":"npm --prefix desktop-shell run verify","build:release":"node build/build.js","build:windows":"node build/build.js","desktop:smoke":"npm --prefix desktop-shell run smoke","desktop:stage":"npm --prefix desktop-shell run stage","headless:make":"node headless-package/scripts/build-package.cjs","release:check":"node build/build.js --check","certify:bridge":"node scripts/certify-bridge.mjs","headless:smoke":"node headless-package/scripts/smoke-package.cjs","smoke:headless":"node scripts/smoke-headless.mjs","test:bootstrap":"node scripts/bootstrap-e2e.mjs","desktop:install":"npm --prefix desktop-shell install","desktop:package":"npm --prefix desktop-shell run package","headless:verify":"npm --prefix headless-package run verify","smoke:companion":"node scripts/check-companion-surface.mjs","desktop:artifacts":"npm --prefix desktop-shell run artifacts","desktop:mcp-smoke":"npm --prefix desktop-shell run smoke:mcp-package","publish:downloads":"node scripts/publish-downloads.mjs","smoke:calibration":"node scripts/smoke-calibration-workflow.mjs","test:bootstrap-go":"cd build/bootstrap-go && go test ./...","desktop:accept-live":"npm --prefix desktop-shell run accept:live","desktop:package-smoke":"npm --prefix desktop-shell run smoke:package","desktop:verify-package":"npm --prefix desktop-shell run verify:package","desktop:artifacts:index":"npm --prefix desktop-shell run artifacts:index --","desktop:verify-signatures":"npm --prefix desktop-shell run verify:signatures","release:signing-preflight":"node scripts/release-signing-preflight.mjs","desktop:update-smoke:linux":"npm --prefix desktop-shell run smoke:update:linux","desktop:update-smoke:macos":"npm --prefix desktop-shell run smoke:update:macos","desktop:installer-smoke:linux":"npm --prefix desktop-shell run smoke:installer:linux","desktop:installer-smoke:macos":"npm --prefix desktop-shell run smoke:installer:macos","desktop:installer-smoke:windows":"npm --prefix desktop-shell run smoke:installer:windows"},"_npmUser":{"name":"empir3hq","email":"vincent@empir3.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.34","fast-uri":"^3.1.5","ip-address":"^10.2.0","@hono/node-server":"^2.0.5","express-rate-limit":"^8.5.2"},"repository":{"url":"git+https://github.com/empir3hq/empir3-bridge.git","type":"git"},"_npmVersion":"11.13.0","description":"Local-first browser and desktop control bridge for AI agents using MCP.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.21.0","tsx":"^4.20.0","zod":"^3.25.76","node-pty":"^1.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@types/ws":"^8.18.1","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/empir3-bridge_0.3.72_1786203969943_0.03788704749377714","host":"s3://npm-registry-packages-npm-production"}},"0.3.130":{"name":"@empir3hq/empir3-bridge","version":"0.3.130","keywords":["claude","claude-code","mcp","browser","desktop-automation","automation","chrome","cdp","computer-use","mcp-server","ai-tools","local-first"],"author":{"name":"Empir3"},"license":"MIT","_id":"@empir3hq/empir3-bridge@0.3.130","maintainers":[{"name":"empir3hq","email":"vincent@empir3.com"}],"homepage":"https://github.com/empir3hq/empir3-bridge","bugs":{"url":"https://github.com/empir3hq/empir3-bridge/issues"},"bin":{"empir3-bridge":"src/launch.js","empir3-bridge-mcp":"src/mcp-entry.js"},"dist":{"shasum":"cde39c7c29b3920d6d8c1bc3c43e5c322d3cad65","tarball":"https://registry.npmjs.org/@empir3hq/empir3-bridge/-/empir3-bridge-0.3.130.tgz","fileCount":201,"integrity":"sha512-gyTAYwKLA7jud3280WdQX8H10JNfrBl+Sm3P/GlKfvXIaRxCc1eUP271LURcFAfl+ph7Tnsay204uJ2jOR/Zxg==","signatures":[{"sig":"MEQCIEJEVIUfFObK6uN+nOSdBK09b45t79D29r0KFueTQWawAiAydAfVti7I4xDuoyIqgK3aXzB/oFG9nV+UN+iykGXIJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFvfJ/UsccfxU4/zgVbFN2n8AEe1xXD49olQYYkWOtcAAiEA4uyWhMgGq5TurYeDsB+3hgKdHlcOyGc7QZaAElrQNA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5988104},"main":"./src/cli.ts","engines":{"node":">=18.0.0"},"gitHead":"9986ad86daa397c43e11de844fc9659c611cf4ec","scripts":{"cli":"tsx src/cli.ts","mcp":"tsx src/mcp-server.ts","kill":"node src/launch.js --kill","test":"node scripts/run-tests.mjs","scale":"node scripts/scale.js","start":"node src/launch.js","status":"node src/launch.js --status","build:mcp":"esbuild src/mcp-server.ts --bundle --platform=node --target=node18 --format=cjs --outfile=dist/mcp-server.cjs --external:@modelcontextprotocol/sdk --external:zod","smoke:live":"node scripts/smoke-live-bridge.mjs","agents:sync":"node scripts/sync-agent-docs.mjs","desktop:dev":"npm --prefix desktop-shell start","stress:grok":"node scripts/stress-grok-concurrency.mjs","agents:check":"node scripts/sync-agent-docs.mjs --check","desktop:make":"npm --prefix desktop-shell run make","desktop:test":"npm --prefix desktop-shell run verify","build:payload":"node build/build.js --payload-only","build:release":"node build/build.js","build:windows":"node build/build.js","desktop:smoke":"npm --prefix desktop-shell run smoke","desktop:stage":"npm --prefix desktop-shell run stage","headless:make":"node headless-package/scripts/build-package.cjs","release:check":"node build/build.js --check","certify:bridge":"node scripts/certify-bridge.mjs","headless:smoke":"node headless-package/scripts/smoke-package.cjs","smoke:headless":"node scripts/smoke-headless.mjs","test:bootstrap":"node scripts/bootstrap-e2e.mjs","desktop:install":"npm --prefix desktop-shell install","desktop:package":"npm --prefix desktop-shell run package","headless:verify":"npm --prefix headless-package run verify","publish:payload":"node scripts/publish-downloads.mjs --payload-only","smoke:companion":"node scripts/check-companion-surface.mjs","desktop:artifacts":"npm --prefix desktop-shell run artifacts","desktop:mcp-smoke":"npm --prefix desktop-shell run smoke:mcp-package","publish:downloads":"node scripts/publish-downloads.mjs","smoke:calibration":"node scripts/smoke-calibration-workflow.mjs","test:bootstrap-go":"cd build/bootstrap-go && go test ./...","desktop:accept-live":"npm --prefix desktop-shell run accept:live","stress:grok-boundary":"node scripts/stress-grok-refresh-boundary.mjs","desktop:package-smoke":"npm --prefix desktop-shell run smoke:package","smoke:browser-actions":"node scripts/verify-browser-actions.mjs","desktop:verify-package":"npm --prefix desktop-shell run verify:package","desktop:artifacts:index":"npm --prefix desktop-shell run artifacts:index --","release:promote-desktop":"node scripts/promote-desktop-channel.mjs","desktop:verify-signatures":"npm --prefix desktop-shell run verify:signatures","release:signing-preflight":"node scripts/release-signing-preflight.mjs","desktop:update-smoke:linux":"npm --prefix desktop-shell run smoke:update:linux","desktop:update-smoke:macos":"npm --prefix desktop-shell run smoke:update:macos","desktop:installer-smoke:linux":"npm --prefix desktop-shell run smoke:installer:linux","desktop:installer-smoke:macos":"npm --prefix desktop-shell run smoke:installer:macos","desktop:installer-smoke:windows":"npm --prefix desktop-shell run smoke:installer:windows"},"_npmUser":{"name":"empir3hq","email":"vincent@empir3.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.34","fast-uri":"^3.1.5","ip-address":"^10.2.0","@hono/node-server":"^2.0.5","express-rate-limit":"^8.5.2"},"repository":{"url":"git+https://github.com/empir3hq/empir3-bridge.git","type":"git"},"_npmVersion":"11.13.0","description":"Local-first browser and desktop control bridge for AI agents using MCP.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.21.0","tsx":"^4.20.0","zod":"^3.25.76","node-pty":"^1.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@types/ws":"^8.18.1","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/empir3-bridge_0.3.130_1789427450393_0.6078246356209354","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"@empir3hq/empir3-bridge@0.4.0","bin":{"empir3-bridge":"src/launch.js","empir3-bridge-mcp":"src/mcp-entry.js"},"bugs":{"url":"https://github.com/empir3hq/empir3-bridge/issues"},"dist":{"shasum":"51916074d1274971fbc4691b3d82a777ee65d562","tarball":"https://registry.npmjs.org/@empir3hq/empir3-bridge/-/empir3-bridge-0.4.0.tgz","fileCount":207,"integrity":"sha512-/aQXj7aNpL92JQKNPvbOSis9kAgHoHE50Si9LAGf1g1hJKXQbbllacefR7Z26AF4JO+T8c7TCYG5W+V7FnRUeQ==","signatures":[{"sig":"MEQCIGi4yjn8fPZC+EBF4jqcsI0P/UkzvTz5EpNJaX9qBOS5AiAo+IG7Ohgs1U4Ds90DEftS2BaFJcyTkTc1ywIf5MuWLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID8ilku6e1JMQhaljxgFM27ic8fBzUCNAueyIq5Vlky+AiBMqpDRkEknVh+p9vK2ZxgwJ4H6+2PW2D2xsu7nHXNGSg=="}],"unpackedSize":4447610},"main":"./src/cli.ts","name":"@empir3hq/empir3-bridge","author":{"name":"Empir3"},"engines":{"node":">=18.0.0"},"gitHead":"02f1b3f83d5d3c23b8841829d2eac5e11afc73c3","license":"MIT","scripts":{"cli":"tsx src/cli.ts","mcp":"tsx src/mcp-server.ts","kill":"node src/launch.js --kill","test":"node scripts/run-tests.mjs","scale":"node scripts/scale.js","start":"node src/launch.js","status":"node src/launch.js --status","build:mcp":"esbuild src/mcp-server.ts --bundle --platform=node --target=node18 --format=cjs --outfile=dist/mcp-server.cjs --external:@modelcontextprotocol/sdk --external:zod","smoke:live":"node scripts/smoke-live-bridge.mjs","agents:sync":"node scripts/sync-agent-docs.mjs","desktop:dev":"npm --prefix desktop-shell start","stress:grok":"node scripts/stress-grok-concurrency.mjs","agents:check":"node scripts/sync-agent-docs.mjs --check","desktop:make":"npm --prefix desktop-shell run make","desktop:test":"npm --prefix desktop-shell run verify","build:payload":"node build/build.js --payload-only","build:release":"node build/build.js","build:windows":"node build/build.js","desktop:smoke":"npm --prefix desktop-shell run smoke","desktop:stage":"npm --prefix desktop-shell run stage","headless:make":"node headless-package/scripts/build-package.cjs","release:check":"node build/build.js --check","certify:bridge":"node scripts/certify-bridge.mjs","headless:smoke":"node headless-package/scripts/smoke-package.cjs","smoke:headless":"node scripts/smoke-headless.mjs","test:bootstrap":"node scripts/bootstrap-e2e.mjs","desktop:install":"npm --prefix desktop-shell install","desktop:package":"npm --prefix desktop-shell run package","headless:verify":"npm --prefix headless-package run verify","publish:payload":"node scripts/publish-downloads.mjs --payload-only","smoke:companion":"node scripts/check-companion-surface.mjs","desktop:artifacts":"npm --prefix desktop-shell run artifacts","desktop:mcp-smoke":"npm --prefix desktop-shell run smoke:mcp-package","publish:downloads":"node scripts/publish-downloads.mjs","smoke:calibration":"node scripts/smoke-calibration-workflow.mjs","test:bootstrap-go":"cd build/bootstrap-go && go test ./...","desktop:accept-live":"npm --prefix desktop-shell run accept:live","stress:grok-boundary":"node scripts/stress-grok-refresh-boundary.mjs","desktop:package-smoke":"npm --prefix desktop-shell run smoke:package","smoke:browser-actions":"node scripts/verify-browser-actions.mjs","desktop:verify-package":"npm --prefix desktop-shell run verify:package","desktop:artifacts:index":"npm --prefix desktop-shell run artifacts:index --","release:promote-desktop":"node scripts/promote-desktop-channel.mjs","desktop:verify-signatures":"npm --prefix desktop-shell run verify:signatures","release:signing-preflight":"node scripts/release-signing-preflight.mjs","desktop:update-smoke:linux":"npm --prefix desktop-shell run smoke:update:linux","desktop:update-smoke:macos":"npm --prefix desktop-shell run smoke:update:macos","desktop:installer-smoke:linux":"npm --prefix desktop-shell run smoke:installer:linux","desktop:installer-smoke:macos":"npm --prefix desktop-shell run smoke:installer:macos","desktop:installer-smoke:windows":"npm --prefix desktop-shell run smoke:installer:windows"},"version":"0.4.0","_npmUser":{"name":"empir3hq","email":"vincent@empir3.com"},"homepage":"https://github.com/empir3hq/empir3-bridge","keywords":["claude","claude-code","mcp","browser","desktop-automation","automation","chrome","cdp","computer-use","mcp-server","ai-tools","local-first"],"overrides":{"qs":"^6.15.2","hono":"^4.12.34","fast-uri":"^3.1.5","ip-address":"^10.2.0","@hono/node-server":"^2.0.5","express-rate-limit":"^8.5.2"},"repository":{"url":"git+https://github.com/empir3hq/empir3-bridge.git","type":"git"},"_npmVersion":"11.13.0","description":"Local-first browser and desktop control bridge for AI agents using MCP.","directories":{},"maintainers":[{"name":"empir3hq","email":"vincent@empir3.com"}],"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.21.0","tsx":"^4.20.0","zod":"^3.25.76","node-pty":"^1.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@types/ws":"^8.18.1","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/empir3-bridge_0.4.0_1789622020236_0.55885808372122"}}},"time":{"created":"2026-08-08T15:46:09.756Z","modified":"2026-09-17T05:13:40.533Z","0.3.72":"2026-08-08T15:46:10.175Z","0.3.130":"2026-09-14T23:10:50.606Z","0.4.0":"2026-09-17T05:13:40.370Z"},"bugs":{"url":"https://github.com/empir3hq/empir3-bridge/issues"},"author":{"name":"Empir3"},"license":"MIT","homepage":"https://github.com/empir3hq/empir3-bridge","keywords":["claude","claude-code","mcp","browser","desktop-automation","automation","chrome","cdp","computer-use","mcp-server","ai-tools","local-first"],"repository":{"url":"git+https://github.com/empir3hq/empir3-bridge.git","type":"git"},"description":"Local-first browser and desktop control bridge for AI agents using MCP.","maintainers":[{"name":"empir3hq","email":"vincent@empir3.com"}],"readme":"# Empir3 Bridge\r\n\r\n### Your AI subscriptions, finally working as a team.\r\n\r\nConnect an AI agent to a dedicated Chrome browser, local tools and, on Windows, desktop apps. Use the local console to choose which abilities to enable. You can use Bridge with a standalone MCP client or pair it with your Empir3 team.\r\n\r\nBridge can also call the AI CLIs you have installed and signed into, including Codex, Grok, Gemini and Claude. Each provider's subscription limits, supported authentication methods and charges still apply. Optional API providers and media tools can incur usage charges; Bridge does not make them free.\r\n\r\nBrowser actions use page observations and verified targets. Windows desktop tools add native window controls, screenshots and mouse/keyboard input. Read back the result after an action: sending input alone does not prove that the app accepted it.\r\n\r\n**Three ways to drive it — MCP, CLI, or WebSocket.** MCP for the agents you talk to, CLI for your terminal and scripts, or WebSocket via [empir3.com](https://empir3.com) for paired remote control. Same engine behind all three — pick the door that fits.\r\n\r\n![Illustrated example: an agent delegates to Codex and Gemini, then uses the Bridge browser](assets/demo-orchestration.svg)\r\n\r\n<sub>One prompt, the whole team — Codex on your OpenAI seat, Gemini on your Google seat, the browser on this machine, all in one thread. ([how it's wired ↓](#architecture))</sub>\r\n\r\n![One agent in any MCP client delegates through the local Empir3 Bridge to your Codex, Grok, Gemini, and Claude seats — plus a dedicated Chrome and a scoped region of your desktop](assets/orchestration-hero.svg)\r\n\r\nEmpir3 Bridge turns any MCP client (Claude Code, Codex, Cursor, …) into an agent that can:\r\n\r\n1. **Run several AI tools from one chat.** Ask an agent to delegate to installed, authenticated CLIs and collect their results. Check `cli_status` first for each CLI's actual availability and authentication state.\r\n2. **Drive Chrome with a separate profile.** Browser tools use Bridge's dedicated Chrome profile. Its cookies, logins and history are separate from your everyday Chrome profile. Observe the page, select an exact tab and verify each action's result.\r\n3. **Operate your desktop** — DPI-aware mouse and screenshots across multiple monitors, with per-display click calibration.\r\n4. **Generate images and video** — 40+ models through the Higgsfield CLI, discovered at runtime.\r\n5. **Build one agent from several computers.** A desktop can lend the Brain, a laptop can lend Whisper as Ears, and a GPU box can lend Kokoro as Mouth plus ComfyUI as Imagination. Empir3 routes each ask to the selected machine automatically; private endpoint addresses and keys stay on that Bridge.\r\n\r\nThe Bridge runs on your machine and binds its control servers to `127.0.0.1`. Cloud models, websites and paired Empir3 requests still use the network. Write-capable controls start disabled. Enable only the abilities you need; **Release control** stops active input, and Permissions lets you disable capabilities.\r\n\r\n<img align=\"right\" width=\"92\" src=\"assets/zara-accent.png\" alt=\"Zara, one of the Empir3 agents\">\r\n\r\nIt's the same bridge pattern used inside [Empir3](https://empir3.com), open-sourced so developers can use it directly. Empir3 pairing is optional: local MCP use works without an account, and the remote relay only turns on after you explicitly pair this PC.\r\n\r\nIt all runs from one local console — what's connected, which capabilities are enabled, and a live log of every action the agent takes:\r\n\r\n![The 0.4.0 local console showing connection status, permissions and recent activity](assets/bridge-console-hero.jpg)\r\n\r\n### One prompt, the whole team moving\r\n\r\n> *\"Have Codex scaffold the API, Gemini review the diff, then open the dashboard in a real browser and screenshot it for me.\"*\r\n\r\nWith those CLIs configured, the agent can ask Codex to write, Gemini to review and the Bridge browser to capture the result. Availability and quotas come from your providers; the Bridge returns a failure when a requested tool cannot run.\r\n\r\n## Why It's Different\r\n\r\nPlenty of tools let an agent click around a browser. Almost none let your agents work *together*. That's the whole point of the bridge:\r\n\r\n- **CLI delegation.** `cli_status` reports installed tools and their current authentication state. `cli_run` invokes the selected CLI and returns its result. Provider limits or service changes can still prevent a run.\r\n- **A dedicated browser.** Bridge's Chrome profile keeps task logins separate from your personal browser. Windows can show a visible browser; headless hosts can use browser tools without a display. Website compatibility still needs to be checked for the task.\r\n- **Chat from a trusted local surface.** Browser chat and agent replies live on the Bridge's localhost dashboard, outside the JavaScript world of websites Chrome displays. A hostile page cannot submit a message as you or read the agent's replies. Use snapshots, element refs, screenshots, and the native ghost cursor to point at the page without lending that page the control channel.\r\n- **A visible desktop focus area.** Drag a box around the area you want the agent to work on. Supported screenshots and observations default to that area. The focus box is a convenience, not an operating-system sandbox: explicit captures and other enabled tools can have broader access. The default focus expires after 30 minutes without use; close or release it when finished.\r\n- **Native Windows input.** Desktop tools map observed controls to screen coordinates and send mouse or keyboard input. Foreground-window and target guards refuse input when the selected target changes. Verify the resulting page or field before continuing.\r\n- **Visible and governed by default.** Read-only out of the box; a click-through overlay + ghost cursor show what's being targeted; action receipts, per-capability lend toggles, and one-click revoke keep the human in control.\r\n\r\nPlus the table stakes: accessibility-ref interaction, multi-monitor desktop control, a safe `/desktop-test` harness, and a tray app with signed payload updates and version status.\r\n\r\n### Orchestrate the CLIs you already pay for\r\n\r\nOpen **API & CLIs** to inspect supported CLI installations and sign-in status. Enable sharing for each tool you want your Empir3 agents to use. CLI availability, provider plans and usage limits vary.\r\n\r\n![The 0.4.0 API & CLIs pane showing the test machine's detected tools and sharing controls; your installations and sign-in states may differ](assets/api-clis-real.jpg)\r\n\r\n<sub>Installation paths are masked in this screenshot for privacy. Status and sharing controls are shown as captured.</sub>\r\n\r\n### One agent, several of your computers\r\n\r\nInstall and pair the Bridge on each machine, give every device a recognizable\r\nname, then add the ability that computer is willing to lend. A provider can be\r\na chat model, speech-to-text service, text-to-speech service, or image engine.\r\nThe Bridge includes native wires for Whisper, Kokoro, AUTOMATIC1111, ComfyUI,\r\nand OpenAI-compatible speech/image APIs.\r\n\r\nIn Agent Builder, choose a machine for Brain, Ears, Mouth, and Imagination—or\r\nchoose **Any of my machines** when the same provider/model is offered by more\r\nthan one device. An exact pin never drifts: if that computer goes offline, the\r\nrequest names the unavailable device and stops without substituting another\r\nmachine or a cloud service. Large images and videos move through a bounded,\r\nsingle-use upload grant instead of being forced into a WebSocket frame.\r\n\r\n### A browser with its own profile\r\n\r\nBrowser tools drive Bridge's dedicated Chrome profile and do not attach to your everyday Chrome profile. This separation does not restrict other capabilities you enable, such as desktop input, file access or shell commands. Review those permissions separately.\r\n\r\n![Browser-profile separation: everyday Chrome and Bridge Chrome keep separate logins, cookies and history](assets/browser-privacy.svg)\r\n\r\n### Chat with the agent from the trusted dashboard\r\n\r\nOpen `http://localhost:3006/` or use **Chat** in the desktop toolbar. The chat\r\nsurface is served by the local Bridge and cannot be inspected or driven by the\r\nwebsite in the controlled Chrome tab. Standalone mode talks to the connected\r\nlocal MCP client; paired mode can talk to your Empir3 team.\r\n\r\nVersion 0.3.72 retired the former page-injected chat panel. Injecting a\r\ncredentialed control panel into arbitrary website JavaScript created the wrong\r\ntrust boundary: a hostile page could imitate the user. Page context now comes\r\nfrom explicit snapshots, element refs, screenshots, and scoped desktop tools.\r\n\r\n### You choose what it sees on your desktop\r\n\r\nDrag a box around the app you want help with. Supported screenshots and snapshots default to that area. Close the box or use **Release control** when finished. Use Permissions to control broader desktop, file and shell access; the box does not replace those settings.\r\n\r\n![Selecting a desktop focus area: a green rectangle marks the region used by default for supported captures](assets/desktop-select-region.jpg)\r\n\r\n## Install\r\n\r\n**Point your agent at this repo and tell it to install.** Claude Code, Codex, Cursor — any agent with a terminal — will clone it, install dependencies, and start the bridge from source in about a minute. Or do it yourself with the [60-second Quickstart](#60-second-developer-quickstart) below. It runs entirely on your machine — no account required.\r\n\r\n> **Signed packages are distributed from [empir3.com/download](https://empir3.com/download) for Windows, macOS, and desktop Linux, plus a lightweight Linux server/VPS package.** Windows packages use Authenticode signing, macOS packages use Developer ID signing, Apple notarization, and stapling, and Linux packages are authenticated by the signed release manifest. Installed packages update through the same signed release channel.\r\n\r\nProvider APIs, local LLM endpoints, CLI subscriptions, pairing, and MCP are cross-platform. The full native desktop-automation surface (UIA snapshot, pointer overlay, calibration, and native screenshot grids) remains Windows-only; unsupported capabilities fail explicitly on macOS and Linux.\r\n\r\n## 60-Second Developer Quickstart\r\n\r\nClone it, install, and run — about sixty seconds:\r\n\r\n```bash\r\ngit clone https://github.com/empir3hq/empir3-bridge\r\ncd empir3-bridge\r\nnpm install\r\nnpm start\r\n```\r\n\r\nOr install the current public package from npm:\r\n\r\n```bash\r\nnpm install -g @empir3hq/empir3-bridge\r\nempir3-bridge            # starts the bridge + Chrome  (empir3-bridge --status / --kill to manage)\r\n```\r\n\r\nOpen the dashboard:\r\n\r\n```text\r\nhttp://localhost:3006\r\n```\r\n\r\nThen add the bridge to a Claude Code project with `.mcp.json`. Using the\r\npublished package requires no local clone:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"empir3-bridge\": {\r\n      \"type\": \"stdio\",\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"-p\", \"@empir3hq/empir3-bridge\", \"empir3-bridge-mcp\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nOr point it at a local clone:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"empir3-bridge\": {\r\n      \"type\": \"stdio\",\r\n      \"command\": \"npx\",\r\n      \"args\": [\"tsx\", \"<path-to-bridge>/src/mcp-server.ts\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nTry a browser task:\r\n\r\n```text\r\nUse the browser bridge to open example.com and take a screenshot.\r\n```\r\n\r\nOr put the headline to work — one agent driving another, using a CLI you already pay for:\r\n\r\n```text\r\nUse cli_status to see which CLIs are ready, then use cli_run to have Gemini summarize this README.\r\n```\r\n\r\n## What You Get\r\n\r\n### Orchestrate Other AI CLIs (4 tools)\r\n\r\nUse the coding CLIs you're already signed into from your connected agent. Toggle sharing in **API & CLIs**; the CLI runs locally with its configured provider authentication. Your provider's plan and limits apply.\r\n\r\n- `cli_status` — installed/shared/authentication state, with blockers where known. Call this first, then check the actual run result.\r\n- `cli_run` — run a lent CLI (`codex` / `grok` / `gemini` / `claude`) with a prompt and get its text back. `mode:\"text\"` returns the answer read-only; `mode:\"agentic\"` lets it write files in a working dir. Pass `background:true` for long runs.\r\n- `cli_runs`, `cli_run_status` — list invocations and poll a background run to completion, each with a saved transcript path.\r\n\r\nExample prompt: *\"Use cli_run to have Codex scaffold the endpoint, then have Gemini review the diff.\"* One agent, multiple models, your seats — no keys handed out.\r\n\r\n### Browser Control\r\n\r\nStart with the [operating guide](docs/AGENT_GUIDE.md): discover, select an exact target, observe, act and verify. Use `bridge_control_catalog`, `bridge_control_activate`, `bridge_control_observe` and `bridge_control_run` for this loop. Tool availability depends on the installed version, platform and permissions; use live discovery rather than a fixed count.\r\n\r\n- `browser_tab_state`, `browser_tab_open`, `browser_tab_focus`, `browser_tab_close` — work with the exact tab you own.\r\n- `browser_dialog` — inspect and respond to an alert, confirmation or prompt using its returned dialog ID.\r\n\r\n- `browser_status`, `browser_navigate`, `browser_refresh`\r\n- `browser_screenshot`, `browser_snapshot`, `browser_text`\r\n- `browser_click`, `browser_click_ref`, `browser_click_xy`\r\n- `browser_type`, `browser_type_ref`, `browser_press`, `browser_scroll`\r\n- `browser_highlight`, `browser_evaluate`\r\n\r\n### Desktop Control\r\n\r\n- `desktop_app` — discover, launch and inspect supported applications.\r\n- `desktop_window` — list windows and manage the exact observed window, including resize and off-screen recovery on Windows.\r\n\r\nMouse and screenshot primitives:\r\n\r\n- `desktop_monitors`, `desktop_cursor_position`\r\n- `desktop_screenshot` — supports `region:{x,y,width,height}` for native-res crops and `grid:true` to overlay a coordinate grid on the saved image (useful for vision-coord targeting on CEF/Electron apps where UIA is blind)\r\n- `desktop_screenshot_zoom` — zoomed-in slice of the desktop for fine pointing\r\n- `desktop_click`, `desktop_hover`, `desktop_drag`\r\n\r\nUI Automation snapshots (Windows):\r\n\r\n- `desktop_snapshot` — enumerate visible interactive elements via UIA; returns refs `d0..dN`\r\n- `desktop_snapshot_som` — set-of-marks overlay variant for vision models\r\n- `desktop_click_ref`, `desktop_hover_ref` — operate on snapshot refs instead of pixel coords\r\n- `desktop_overlay` — toggle click-through labeled-box overlay over the snapshot\r\n\r\nAgent-focus region (a visible default capture area; permissions still govern access):\r\n\r\n- `desktop_select_region` — user drags a rectangle; subsequent screenshot/snapshot calls auto-scope to it (30-min TTL). A click-through chip anchored to the region tells the user focus is active.\r\n- `desktop_release_focus`, `desktop_focus_status`\r\n- `desktop_focus_grid` — overlay a labeled coordinate grid on the focused region\r\n- `desktop_click_cell`, `desktop_pointer_cell` — click or move to a named grid cell (e.g. `B3`)\r\n\r\nOn-screen pointer hint (a visible cursor agents can show before clicking):\r\n\r\n- `desktop_pointer_show`, `desktop_pointer_move`, `desktop_pointer_pulse`, `desktop_pointer_hide`, `desktop_pointer_status`\r\n\r\nPointer calibration (correct for per-display offset between OS cursor and rendered visuals):\r\n\r\n- `desktop_calibrate_pointer`, `desktop_calibration_status`, `desktop_pick_point`\r\n\r\nBrowser-page → physical-screen clicks (drive the bridge's own Chrome page with real OS-level input):\r\n\r\n- `page_to_screen` — inspect-only: resolve a page element (CSS selector, snapshot ref, or `cssX,cssY`) to its physical virtual-screen pixel, the calibrated click coordinate, the content-window origin, and devicePixelRatio. Use it to verify where a click will land before firing one.\r\n- `desktop_click_page` — a real OS-level mouse click on an element in the bridge's own Chrome page, mapped page→screen (content-window origin + DPR + per-display calibration). Use it for trusted-event-gated, drag-handle, and native-feel widgets that ignore synthetic clicks.\r\n- `desktop_pointer_page` — show the click-through ghost cursor on a page element (visual-only, no click).\r\n\r\nDesktop tools use DPI-aware physical virtual-screen coordinates. Multi-monitor layouts with negative coordinates are supported.\r\n\r\n### Trusted Chat & Recording (6 tools)\r\n\r\nThe Bridge keeps chat on its localhost dashboard rather than exposing messages\r\nto arbitrary page scripts.\r\n\r\n- `browser_chat`, `browser_read_chat` — post to and read trusted local chat.\r\n- `browser_record_start`, `browser_record_stop`, `browser_play`, `browser_recordings` — record a flow of clicks/types/scrolls and replay it later.\r\n\r\n### Reliability And Safety (6 tools)\r\n\r\n- `bridge_tool_advisor` — agent asks \"what tool should I use for X?\", bridge answers with the right one and shows current safety state\r\n- `bridge_reliability_status`, `bridge_reliability_smoke`, `bridge_action_log`\r\n- `bridge_safety_status`, `bridge_revoke_control`\r\n\r\nThese are there so an agent can diagnose the bridge before taking action, and so the user can see or revoke write-capable controls.\r\n\r\n### Generative Media & Custom Models (5 tools)\r\n\r\nThe bridge is also a thin gateway to image/video generation and any custom model you have logged in locally. Configure them once in the welcome console (`http://localhost:3006/welcome`, **API & CLIs** pane):\r\n\r\n- `higgsfield_models` — list the available Higgsfield models (40+, typed `image` / `video` / `text`) so the agent picks a valid id at runtime instead of guessing from a hard-coded list.\r\n- `higgsfield_status`, `higgsfield_list`, `higgsfield_generate` — generate via the Higgsfield CLI; `higgsfield_generate` is self-documenting (an unknown model id returns the live catalog). Output lands in `~/.empir3-bridge/artifacts/higgsfield/`.\r\n- `custom_llm` — generic dispatcher for a supported cloud API key or any OpenAI-compatible endpoint you've configured (Ollama, LM Studio, vLLM, your own server). Routes by `provider` slug; registered once at least one API or custom provider exists.\r\n\r\nThe **API Providers** section matches Empir3's key-backed text providers:\r\nAnthropic, DeepSeek, Google AI, Groq, Mistral AI, Moonshot AI, OpenAI,\r\nOpenRouter, Perplexity, xAI, and z.ai. A key is tested before it is saved and\r\nthe provider's available chat models are discovered. Native Anthropic and\r\nGemini calls and OpenAI-compatible calls all execute locally through the Bridge.\r\n\r\nWhen the Bridge is paired with Empir3, either a supported API provider or a\r\ncustom provider can appear in Agent Builder under **My Bridge**. Turn on\r\n**Available to my Empir3 agents**, then choose one of its models for an agent.\r\nOnly the provider name, model list, and availability cross the relay. The API\r\naddress and key stay on this computer, and an offline Bridge route stops instead\r\nof silently switching to a paid Empir3 model.\r\n\r\nFor field-by-field setup examples, private-network guidance, testing steps, and\r\ncommon troubleshooting questions, see the [Empir3 Bridge User Guide](docs/USER_GUIDE.md).\r\n\r\nThe **API & CLIs** pane contains the sharing controls for the [CLI orchestration tools](#orchestrate-other-ai-clis-4-tools). Each row shows installation and authentication status, plus an action or manual command supported by that host. See [docs/AGENT_GUIDE.md](docs/AGENT_GUIDE.md) for the full integration model.\r\n\r\n## Control And Trust Model\r\n\r\nEmpir3 Bridge is powerful software. Treat it like a local automation driver, not a passive browser extension.\r\n\r\n- Local MCP mode is the default. The bridge listens on `127.0.0.1`, launches a dedicated Chrome profile, and exposes tools only to local clients configured to talk to it.\r\n- Paired Empir3 mode is opt-in. Pairing stores a bridge token locally and opens a websocket relay to Empir3 so approved remote agents can send commands to this PC.\r\n- Local permissions are still enforced. Read, write, execute, desktop, eval, recording, handler-family, and CLI-lending controls live on the device and can be toggled from the welcome console.\r\n- Browser-origin writes are nonce-gated. Browser WebSockets fail closed by role: native CLI clients must have no browser `Origin`, trusted control clients must come from the exact localhost dashboard origin, and the retired overlay role is rejected.\r\n- The tray is part of the safety surface. It shows the running version, relay/account state, update status, logs, and quick actions for reconnect, sign-out, uninstall, and clean quit.\r\n- Sensitive outputs stay local by default: screenshots, recordings, logs, transcripts, generated artifacts, provider keys, and bridge auth live in local data paths listed below.\r\n\r\n## Safety Model\r\n\r\nEmpir3 Bridge is a control surface, so the default posture is conservative.\r\n\r\n- Read tools are on by default.\r\n- Navigation tools are on by default.\r\n- Page interaction tools are off by default.\r\n- Desktop mouse tools are off by default.\r\n- JavaScript eval is off by default.\r\n- Recording and replay tools are off by default.\r\n- Empir3 relay is off until this PC is paired.\r\n\r\nOpen the welcome console:\r\n\r\n```text\r\nhttp://localhost:3006/welcome\r\n```\r\n\r\nCheck current control state:\r\n\r\n```bash\r\nnpx tsx src/cli.ts safety-status\r\n```\r\n\r\n## Release Builds\r\n\r\nWindows release artifacts are built from this repository:\r\n\r\n```bash\r\nnpm run build:windows\r\n```\r\n\r\nThat writes artifacts under `build/dist/`:\r\n\r\n- `Empir3Setup.exe`\r\n- `bridge-payload-vX.Y.Z.tar.gz`\r\n- `bridge-payload-vX.Y.Z.sig`\r\n- `bridge-version.json`\r\n- `empir3-bridge.crx`\r\n- `empir3-bridge-update.xml`\r\n\r\nThe payload version comes from `package.json`. Keep the tray label, manifest, download metadata, and release notes tied to that version. See `docs/RELEASE.md`.\r\n\r\nDisable all write-capable tools immediately:\r\n\r\n```bash\r\nnpx tsx src/cli.ts revoke-control\r\n```\r\n\r\nThe dashboard also shows a visible `Control Safety` card and has a `Revoke Write Control` button.\r\n\r\nRead the full safety notes in [docs/SAFETY.md](docs/SAFETY.md).\r\n\r\n## Test The Bridge Safely\r\n\r\nThe bridge ships with a local test harness for click, hover, and drag accuracy:\r\n\r\n```text\r\nhttp://localhost:3006/desktop-test\r\n```\r\n\r\nOr open it from the CLI:\r\n\r\n```bash\r\nnpx tsx src/cli.ts desktop-test\r\n```\r\n\r\nThis page gives agents safe targets for desktop hover, click, and drag tests without moving your real windows around. See [docs/TESTING.md](docs/TESTING.md).\r\n\r\n## Use Standalone From CLI\r\n\r\n```bash\r\nnpx tsx src/cli.ts status\r\nnpx tsx src/cli.ts navigate \"https://example.com\"\r\nnpx tsx src/cli.ts snapshot\r\nnpx tsx src/cli.ts click-ref \"e5\"\r\nnpx tsx src/cli.ts click-xy 500 320\r\nnpx tsx src/cli.ts type-ref \"e3\" \"hello\"\r\nnpx tsx src/cli.ts screenshot\r\nnpx tsx src/cli.ts text\r\nnpx tsx src/cli.ts desktop-monitors\r\nnpx tsx src/cli.ts desktop-screenshot all\r\nnpx tsx src/cli.ts reliability-smoke\r\n```\r\n\r\nRun with no args for the full command list.\r\n\r\n## Architecture\r\n\r\n```mermaid\r\nflowchart LR\r\n  A[\"Claude Code / Codex / MCP Client\"] -->|stdio| B[\"MCP Server (auto-launched on first client connect)\"]\r\n  C[\"CLI / HTTP Client\"] --> D[\"HTTP Wrapper :3006\"]\r\n  B --> D\r\n  D --> E[\"CDP Bridge :9867\"]\r\n  E --> F[\"Chrome with dedicated profile\"]\r\n  D --> G[\"Trusted local dashboard :3006\"]\r\n  D --> H[\"Desktop tools on host OS\"]\r\n  D --> I[\"CLI orchestration + media (cli_run → lent Codex/Grok/Gemini/Claude, higgsfield_*, custom_llm)\"]\r\n  D -.-> J[\"Optional Empir3 relay websocket\"]\r\n```\r\n\r\nThe MCP server is a thin stdio shim. On the first connection from a Claude Code / Codex / Cursor client it boots the HTTP wrapper and the CDP bridge if they aren't already running, so you don't have to babysit two processes — installing the `.mcp.json` block is enough.\r\n\r\nCore files:\r\n\r\n- `src/launch.js`: starts and stops the bridge process group.\r\n- `src/bridge.ts`: talks to Chrome through CDP.\r\n- `src/server.ts`: HTTP/WebSocket wrapper, dashboard, settings, safety, desktop tools.\r\n- `src/mcp-server.ts`: MCP tool server.\r\n- `src/cli.ts`: scriptable local CLI.\r\n\r\n## Local-Only Network Defaults\r\n\r\nThe bridge binds its wrapper and CDP HTTP server to `127.0.0.1` by default. Chrome remote debugging is also launched with `--remote-debugging-address=127.0.0.1`.\r\n\r\nThis means the bridge is intended for local agents on your machine, not LAN or internet access. Paired Empir3 mode uses an outbound websocket to Empir3; it does not expose the local bridge as a public server.\r\n\r\nThe bridge uses a per-launch nonce for browser-origin HTTP mutations. WebSocket roles are stricter: browser pages cannot claim the native CLI role, only the exact localhost dashboard origin can claim the control role, and no in-page overlay role exists.\r\n\r\n## Data Locations\r\n\r\n- Chrome profile: `~/.empir3-bridge/profile/`\r\n- Chat config (mode, API-provider keys/sharing, per-tool toggles): `~/.empir3-bridge/config.json`\r\n- Bridge auth token after Empir3 pairing: `%APPDATA%\\Empir3\\bridge-auth.json` on Windows, `~/.empir3/Empir3/bridge-auth.json` on macOS/Linux\r\n- Bridge settings (permissions, device name, home directory, handlers, custom providers): `%APPDATA%\\Empir3\\bridge-settings.json` on Windows, `~/.empir3/Empir3/bridge-settings.json` on macOS/Linux\r\n- Current per-launch bridge nonce: `~/.empir3-bridge/nonce`\r\n- Conversation transcripts: `~/.empir3-bridge/conversations/`\r\n- Lent-CLI run transcripts (`cli_run`): `~/.empir3-bridge/cli-runs/`\r\n- Generated artifacts (e.g. Higgsfield images): `~/.empir3-bridge/artifacts/`\r\n- Screenshots and action feedback: `./feedback/`\r\n- Recordings: `./recordings/`\r\n\r\n`feedback/` and `recordings/` are gitignored.\r\n\r\n## Troubleshooting\r\n\r\n### Higgsfield CLI: `npm install -g @higgsfield/cli` fails\r\n\r\nThe package is **`@higgsfield/cli`** (scoped). The older unscoped `higgsfield-cli` is gone from npm. Its `node install.js` postinstall downloads the Higgsfield Go binary, so install it **without** `--ignore-scripts` (that would leave you with a wrapper and no binary).\r\n\r\nTwo common Windows failures:\r\n\r\n- **`running scripts is disabled on this system` / `UnauthorizedAccess`** — PowerShell's execution policy (default `Restricted` on a fresh box) is blocking npm's `npm.ps1` shim. This blocks *any* `npm` command, not just Higgsfield. Fix it once — no admin needed:\r\n\r\n  ```powershell\r\n  Set-ExecutionPolicy -Scope CurrentUser RemoteSigned\r\n  ```\r\n\r\n  — or just run the install from **Command Prompt (cmd)** instead of PowerShell. The welcome console's **Install** button already runs installs via `cmd`, so it never hits this; the wall only bites manual PowerShell installs.\r\n\r\n- **Old guidance said to use `--ignore-scripts` + a manual `tar.exe` extraction** — that was a workaround for the dead unscoped package's broken tar postinstall. Don't do it for `@higgsfield/cli`; a plain install just works.\r\n\r\nAfter install the CLI is on `PATH` (`%APPDATA%\\npm\\higgsfield.cmd`) and the welcome console's **API & CLIs** pane picks it up. The bridge probe (`higgsfield_status`) reports an actionable error if anything's missing.\r\n\r\n### MCP client says \"Connected\" but no `browser_*` / `desktop_*` tools appear\r\n\r\nThree known causes:\r\n\r\n- `node_modules/` missing in the bridge repo — run `npm install`.\r\n- `zod` resolved to v4 (the MCP SDK silently fails tool registration). The repo pins `zod ^3.25` — make sure your lockfile didn't override it.\r\n- The path in your `.mcp.json` contains a space. `npx tsx` ESM loader splits at the first space and crashes without a useful error.\r\n\r\n### Chrome won't launch the dedicated profile\r\n\r\nKill any existing instance with `npm run kill`, then `npm start -- --fresh`. The profile lives at `~/.empir3-bridge/profile/` — deleting it is non-destructive (just re-logs you out of bridge tabs).\r\n\r\n## Fresh Runs And Parallel Bridges\r\n\r\nFresh launch:\r\n\r\n```bash\r\nnpm start -- --fresh\r\n```\r\n\r\nStop the bridge:\r\n\r\n```bash\r\nnpm run kill\r\n```\r\n\r\nStatus:\r\n\r\n```bash\r\nnpm run status\r\n```\r\n\r\nParallel bridge example:\r\n\r\n```bash\r\nEMPIR3_PW_PORT=3106 \\\r\nEMPIR3_BRIDGE_HTTP_PORT=9967 \\\r\nEMPIR3_CDP_PORT=9322 \\\r\nEMPIR3_BRIDGE_PROFILE=$HOME/.empir3-bridge/profile-test \\\r\nEMPIR3_BRIDGE_LABEL=TEST \\\r\nnpm start\r\n```\r\n\r\nDrive it:\r\n\r\n```bash\r\nBRIDGE_URL=http://localhost:3106 npx tsx src/cli.ts status\r\n```\r\n\r\n## Use With Empir3\r\n\r\nThe bridge is useful by itself. Empir3 is what happens when you put a team around it.\r\n\r\nWith Empir3, Vincent coordinates specialist agents that can work through the same bridge: research, browser work, app checks, design review, and implementation loops. The bridge is the local control plane. Empir3 is the collaborative AI team.\r\n\r\nPairing is optional and will stay opt-in. No Empir3 account is required to use this repo. If you pair, the bridge stores a local token, reports this device to Empir3, and opens an outbound relay websocket. Sign out from the tray or welcome console to remove the local pairing token and return to local-only use.\r\n\r\nTry Empir3 at [empir3.com](https://empir3.com).\r\n\r\n## Contributing\r\n\r\nWe welcome bug reports, smoke-test notes, and PRs. Start with:\r\n\r\n- [CONTRIBUTING.md](CONTRIBUTING.md)\r\n- [SECURITY.md](SECURITY.md)\r\n- [docs/TESTING.md](docs/TESTING.md)\r\n\r\nUseful local checks:\r\n\r\n```bash\r\nnpx tsc --noEmit\r\nnpm run build:mcp\r\nnpm test\r\nnpm pack --dry-run\r\n```\r\n\r\n## Project Status\r\n\r\nPre-1.0. The bridge is used heavily in Empir3 development and is being shaped into a clean standalone OSS product. Expect rapid iteration around install, cross-platform polish, and safety UX.\r\n\r\n## License\r\n\r\nMIT. See [LICENSE](LICENSE).\r\n","readmeFilename":"README.md"}