Docs

Local-first control plane. The page is hosted. The gateway, the token, and the agent transcripts stay on your machines, except what the agents themselves send to their providers.

Install

Install and connect the gateway from Download. The short version: Node 20+, npm install && npm run build && npm start inside host/, then paste the token from the host machine's setup page into the product in Chrome.

Longer notes live in the repository:

Threat model

Loopback

In Chrome, this site calls http://127.0.0.1:8787 on the computer where you opened the page. Chrome asks before it allows that. The gateway then sees a connection from this machine, the same as its own page at http://127.0.0.1:8787/app/. Profile administration that the gateway limits to the local machine still means this machine, because the TCP peer is this machine.

Deny the permission, or use a browser other than Chrome, and the page cannot read the gateway over loopback. Firefox and Safari use the tailnet address below, or the gateway's own page. That address is one you open. This site does not send you there. See Download.

Tailscale

By default the gateway listens on loopback and this machine's Tailscale addresses. A phone or another laptop on your tailnet connects to the gateway directly. This website does not join your tailnet, does not tunnel traffic, and does not relay API calls. Do not expose port 8787 to the public internet.

For this site in any browser, the gateway can also answer at https://<machine>.<tailnet>.ts.net through tailscale serve (setup steps). Tailscale terminates TLS on your machine and passes the request to a separate gateway port, serveBindPort, which listens on 127.0.0.1 only. Because every request on that port arrives from loopback, the gateway does not use the address to decide who is calling:

Turning on HTTPS publishes the machine name in public Certificate Transparency logs. Pick a name you don't mind being public first. Keep Funnel off.

Token

The gateway requires Authorization: Bearer with the host token. An empty token authorizes nobody. The token is shown at http://127.0.0.1:8787/setup on the host machine only. This site cannot read that page. You paste the token. It is stored in localStorage on https://clankerspanker.tech.

Live updates trade that token for a single-use ticket (POST /ws/ticket) and open the socket with ?ticket=. The long-lived token is not put in the WebSocket URL. The host terminal is not served from this origin. Its link opens the gateway's own terminal page on this computer, and the token is posted there, not here.

Clear the token from Settings on a browser you no longer trust. Rotating it is done on the host machine, from the setup page, and then each client is updated.

What never gets uploaded

Loading this site contacts the static host. That host sees an ordinary page view: IP address, user agent, and URL. Prompts, transcripts, files, tool output, profile secrets, and the host token are not sent there. Those requests go to your gateway. Agents send to their providers only what they already send when you run them yourself.

A script on this origin

Anyone who can change the production bundle, or inject a script into it, can read a pasted token and call the gateway while this page is open and Chrome still allows loopback. Production deploys come from the repository's main branch after review. Do not paste a host token into a *.vercel.app preview. A preview is a different origin: it does not see the production token, and the gateway does not allow that origin to read its API.

There is no second gateway and no company account on this site. The Mac app, the Linux app, and the phone keep talking to the gateway directly.