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.