context-attachment-manager
Codex and Claude Code plugin (works in Claude Desktop): choose which past images go to the model with your next message. Unchecked images become placeholders, the conversation goes on, and requests st
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Let AI agents drive your real, signed-in Chrome over your Tailscale network.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗tailbrowser lets AI agents control a real Chrome browser through your Tailscale network (tailnet). You select the pages that the agents can use, or you give them the full browser.
Website: tailbrowser.nesin.io
Chrome + extension ──ws──► relay :8787 ◄──ws── agents (CLI / MCP / npx)
(Mac mini etc.) (any tailnet box)
The browser and popup frames in the video are real captures from the extension and the relay.
Do this step one time, on a computer in your tailnet. You can use the computer that runs Chrome.
npx tailbrowser relay # or: node agent/tailbrowser.mjs relay
The relay does these steps automatically:
On the computer that runs Chrome, do these steps:
chrome://extensions.extension/ folder.ws://<relay-ip>:8787 in Relay URL. Then click Save & connect.Run snippets from any computer in your tailnet:
npx tailbrowser -e 'await page.goto("https://example.com"); console.log(await page.title())'
npx tailbrowser -e 'state.hits = await page.$$eval("a", as => as.map(a => a.textContent))'
npx tailbrowser session list
You do not have to set environment variables or session IDs. The CLI finds the relay automatically. It also keeps one session for each computer.
Add this configuration to your MCP client:
{
"mcpServers": {
"tailbrowser": {
"command": "npx",
"args": ["-y", "tailbrowser@latest", "--mcp"]
}
}
}
The server has one tool, execute. The tool keeps the session between calls. Snippets can use these names: page, context, state, pages(), snapshot(), screenshot(), newPage(). To use a specific relay, set TAILBROWSER_HOST.
tailbrowser relay [--port 8787] [--bind ip] [--token x] [--allow ips] start the relay
tailbrowser discover find a relay on the tailnet and save it
tailbrowser -e 'code' run a snippet in the default session
tailbrowser -s 2 -e 'code' run a snippet in a specific session
tailbrowser -e 'code' --new run a snippet in a new session
tailbrowser session new|list|reset
tailbrowser scope | health
tailbrowser --mcp run the MCP server (stdio)
tailbrowser has these security controls:
127.0.0.1.--bind sets a different address. If you use --bind 0.0.0.0 or a LAN address, devices outside your tailnet can connect. In this case, always use --token or --allow.--token.--allow. For example: --allow 100.101.102.103,100.64.0.0/10.newPage() only in Entire browser mode. In the other modes, the relay returns a TB_SCOPE error.The relay can operate without supervision for many weeks:
TB_ERR or TB_TIMEOUT error immediately.curl <relay>/health shows the relay status.The extension stays connected when Chrome is in the background. You do not have to configure this:
Use these commands:
npm test # run the stability tests (relay, fake extension, headless Chromium)
npm run test:extension # load the real extension into Chromium and test it
npm run smoke # run a quick Playwright demo through the relay
npm run build:icons # make the PNG icons from the SVG files in extension/icons/
npm run video # capture real footage, then render media/tailbrowser.mp4
npm run build:og # render the social preview image, media/og-image.png
The product website is in website/. It is one static page with no build step. Cloudflare Pages publishes it to tailbrowser.nesin.io, with website as the build output directory and no build command. npm run video, npm run build:icons and npm run build:og update the files in website/assets/.
agent/fake-extension.mjs simulates the extension with a real headless Chromium. This lets you test the relay without a Chrome window.
The tests find Chromium through CHROME_BIN or the Playwright browser cache (PLAYWRIGHT_BROWSERS_PATH). For test:extension, you must have a full Chromium build. The headless shell cannot load extensions.
relay/
relay.mjs start point: configuration, HTTP and WebSocket server, banner
config.mjs flags, environment, bind address, --allow filter
auth.mjs token checks and the internal key
extension-link.mjs connection to the extension (requests, responses, target events)
cdp-bridge.mjs /cdp/:id: gives Playwright a browser-level CDP session
sandbox.mjs sessions and snippet execution
http-api.mjs HTTP endpoints: /health /scope /session /execute /json/version
agent/
tailbrowser.mjs CLI
tailbrowser.mcp.mjs MCP server (stdio)
client.mjs HTTP client for the relay (used by the CLI, the MCP server and the library)
discover.mjs finds the relay: environment, then cache, then tailnet scan
config.mjs reads and writes ~/.tailbrowser/config.json
index.mjs programmatic API
fake-extension.mjs test replacement for the extension
lib/ functions that the relay and the agent both use
extension/ MV3 extension: service worker, popup, keep-alive document, icons
website/ product website (static, published to tailbrowser.nesin.io)
media/ product video and the files that make it
The relay design follows Playwriter: the /extension and /cdp/:id endpoint split and the single execute tool with sticky sessions.