Repository navigation
docs: Muse using a home residential-IP browser via the switchboard - #8
Merged
thepagent merged 8 commits intoOct 26, 2026
Conversation
thepagent
approved these changes
Oct 26, 2026
This was referenced Oct 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Muse's built-in browser runs in Muse's own environment: it shows that environment's network address and holds none of the user's logins. This adds
docs/reference-architecture-muse-home-browser.md, a reference for the use case Muse browses from a home residential IP, with the home browser profile's cookies, instead of its built-in browser.The home computer is outbound-only and Muse cannot enter the home network, so neither can reach the other.
openab-sbis where they meet: the home computer dials/vm/attach, Muse callsPOST /mcp/<computer>, and the per-caller allowlist limits Muse to browser tools.The doc covers the problem, roles (Muse as caller vs.
muse-vmas computer), components, call flow,openab-sb.tomlwith a browser-only allowlist, theoab-instance-mcp --switchboard … --upstream browser=…invocation, exposure options, verification and trust/risk.Architecture
flowchart LR subgraph cloud["Cloud"] muse["Muse agent<br/>remote MCP client<br/>Bearer client token"] grok["Grok Bot<br/>remote MCP client<br/>own Bearer token"] dots["OpenAI Dots<br/>remote MCP client<br/>own Bearer token"] duet["Claude Duet<br/>remote MCP client<br/>own Bearer token"] end subgraph edge["Switchboard host (you run it)"] front["TLS front<br/>tailscale serve (PoC)<br/>or a public tunnel"] sb["openab-sb<br/>POST /mcp/macmini<br/>allowlist: browser_* only"] front --> sb end subgraph home["Home — outbound only"] subgraph mac["macmini (logged-in Aqua session)"] imcp["oab-instance-mcp<br/>--switchboard … --switchboard-profile desktop<br/>--upstream browser=…"] pw["Playwright MCP :8794<br/>loopback"] chromium["Chromium (headed)<br/>persistent profile"] imcp -- "loopback MCP" --> pw --> chromium end end muse -- "HTTPS, Bearer" --> front grok -- "HTTPS, Bearer" --> front dots -- "HTTPS, Bearer" --> front duet -- "HTTPS, Bearer" --> front imcp == "WSS /vm/attach<br/>dialled by macmini<br/>Bearer computer secret" ==> frontBoth sides dial out; nothing at home listens. Calls flow Muse → switchboard → macmini → Playwright MCP → Chromium, so the browser acts from the home residential IP with that profile's cookies and sessions.
Checked against source
Switchboard.clientservesserver.scoped(to: profile)with upstreams kept, so--switchboard-profile desktopcarries the 15browser_*tools (ToolProfile.desktopBrowserTools).--switchboardexists only in the Swift daemon; the Linux Rust node (poc/reverse-attach-linux) has no switchboard mode. The doc says so.Not verified
Authorizationheader is stated as a prerequisite, not confirmed.openab-sb check.Callers
Muse is the worked example. Grok Bot, OpenAI Dots and Claude Duet are drawn as additional callers (own
[[client]]token and allowlist each). Not yet checked: that each can add a remote MCP server with a customAuthorizationheader.PoC deployment (as observed)
The switchboard runs on its own tailnet host, p1 (Ubuntu, systemd), and is published by
tailscale serveon port 443, tailnet only. The Mac mini is just an outbound-only computer: it dialswss://to p1 and nothing at home listens.flowchart LR muse["Muse<br/>client: muse<br/>Bearer token<br/>client-only tailnet member"] owner["Owner CLI / Connect<br/>client: pahud<br/>allowlist: * on *"] subgraph p1["p1 (Linux, tailnet)"] ts["tailscale serve<br/>https :443 (tailnet only)<br/>→ 127.0.0.1:8796"] subgraph svc["systemd: openab-sb.service (openab-sb)"] sb["openab-sb 0.2.0<br/>127.0.0.1:8796<br/>POST /mcp/macmini<br/>GET /vm/attach"] end ts --> sb end subgraph mini["Pahud's Mac mini (outbound only)"] subgraph imp["LaunchAgent dev.openab.instance-mcp (oab-instance-mcp)"] imcp["oab-instance-mcp 0.8.0<br/>--switchboard wss://p1.‹tailnet›.ts.net/vm/attach<br/>--switchboard-profile desktop<br/>--upstream browser=…:8794"] end subgraph pwp["LaunchAgent dev.openab.instance-mcp.pw-mcp (Playwright MCP)"] pw["Playwright MCP<br/>127.0.0.1:8794"] chromium["Chromium (headed)<br/>persistent profile<br/>home residential IP"] pw --> chromium end imcp -- "loopback MCP" --> pw end muse -- "HTTPS p1.‹tailnet›.ts.net/mcp/macmini<br/>Bearer (via Muse CONNECT proxy)" --> ts owner -- "same route" --> ts imcp == "WSS /vm/attach<br/>dialled by macmini<br/>Bearer computer secret" ==> ts chromium -- "outbound web traffic" --> web[("Websites<br/>see the home IP")]What Muse can call is the intersection of two filters:
oab-instance-mcpprofiledesktop(computer ceiling)sys_info,screenshot,mouse,key,osascript, and 15browser_*(20, plusvm_status= 21 as seen by the owner client)[[client]] museallowlist inopenab-sb.tomlsys_info,screenshot, and 8 browser tools:browser_navigate,browser_snapshot,browser_click,browser_type,browser_press_key,browser_wait_for,browser_tabs,browser_take_screenshotvm_status(always present) = 11, as listed by Muse on 2026-10-26 (before the move to p1)Observed on the p1 deployment:
openab-sbisactiveunder systemd; the Mac mini attached after theURL change;
/readyz/macminiis 200;/computersshowsmacminiasattachedandready; the ownerclient's
tools/listthrough p1 returns 21 tools. A first request to a newtailscale servehostname can hang while the certificate is issued.
Two things the move surfaced. The computer needs to resolve the
*.ts.netname: the Mac mini hadTailscale DNS (MagicDNS) off until it was turned on. And Muse can only call hosts its owner has
registered, so the new host needs a new registered connection.
Not verified: a public front with a Cloudflare certificate, and "residential" in the strictest sense (the
address is on the same consumer-ISP ASN as the Mac mini, which is an inference, not a proof). Note
screenshotcaptures the whole desktop, not only the browser.Muse results (2026-10-26)
Reported by Muse from its connector docs and a live check against this PoC:
*.ts.netcertificate is accepted.muse.exec) with a credential registered by the owner for specificapi_hosts; the model sees only a surrogate token. Moving the switchboard to another host needs a new registered connection.:8445today.tools/listreturned 11 tools in 0.24 s;sys_infoworked (macOS 15.7.4,accessibility=false);mousewas refused by switchboard policy ("not allowed for muse on macmini"), not as "unknown tool"; screenshots of about 0.9 MB arrived intact.Muse results against p1 (2026-10-26)
Reported by Muse after the switchboard moved to p1 and the owner registered the new host:
tools/list: 11 tools, nomouse,key,execorbrowser_evaluate.mouseis refused by policy as a normal tool result; the server stays connected.screenshot(whole desktop) 2.7 s, JPEG 1920x1080, about 165 KB;browser_take_screenshot0.8 s, PNG about 7.5 KB. Both intact.browser_navigate2.7 s to 10.9 s; first manualinitialize17 s. Nothing over the stock template's 45 s.