After maxing out my T3 Code setup, I built t3-fleet-gateway, a small always-on gateway (MIT) that lets me code with Grok Bot on my phone and have the work happen on my own machines.
Try it #
Setup is two prompts. Grok Bot runs in the cloud, so the gateway needs a public HTTPS URL. It only listens on localhost. I expose it with Tailscale Funnel, but any tunnel (Cloudflare Tunnel, ngrok) works.
Give this to a coding agent on the always-on machine that runs T3 Code:
Set up https://github.com/boundsj/t3-fleet-gateway on this machine by
following its README. Enroll this machine's T3 Code server as a host
and add these projects: <your projects>. Run the gateway as a service
and expose it over HTTPS with <your tunnel>. Make sure `doctor` passes.
Then give me the public /mcp URL. When I connect each Grok bot, mint
a one-time approval code for it.
Then make one Grok bot per project and give each one this:
Connect to my T3 fleet gateway at https://<your public URL>/mcp.
You own the <project> project. Set up a 15-minute routine that checks
only <project>'s jobs, keeps your place in the feed between checks,
and stays quiet unless a job needs an answer, is ready for review,
or failed.
Each bot opens the gateway’s approval page. Ask the agent from the first step for a code (they expire after 15 minutes) and choose Operate. I stagger the routines a few minutes apart so they don’t all check at once.
How it works #
The gateway is an MCP server to Grok Bot, with OAuth 2.1 sign-in, and an MCP client to the T3 Code server on each machine.
Grok Bot (xAI cloud, long-running)
| HTTPS + OAuth 2.1, one URL
v
t3-fleet-gateway (Mac mini, always on)
| SQLite job ledger, one T3 credential per host
+--> T3 Code on the Mac mini
+--> T3 Code on the M3 (next)
|
+--> worktree + fleet/<job> branch + thread
T3 exposes about 80 raw tools per machine; the gateway exposes fleet_status plus eight work_* tools. Grok names a project and a task; the gateway picks the host, creates a worktree, a fleet/<job> branch and a T3 thread, and follows the job. work_feed returns what changed since Grok’s last check. Grok’s tokens never reach T3 and T3’s credentials never leave the gateway.
One project, one bot #
jobs adopt registers a long-lived T3 thread, a project Chief of Staff (CoS), as that project’s front door, and allowWorkStart: false makes it the only way in. Grok sends it instructions with work_continue. The CoS plans, delegates to its own subagents (Opus implements, Fable reviews) and reports back. Each project gets one conversation in Grok and one thread in T3.
Say I ask the Crumb Exchange bot (a toy prediction market for sandwich questions) for a resting-orders panel. The instruction lands in the CoS thread in T3, and Grok relays the summary when the CoS is done.
Status #
This is v0.1. Starting, following, continuing and cancelling a job are confirmed live; answering questions, approvals and failed runs are unconfirmed. Approvals happen only in T3 itself, so unattended projects need the auto or full-access runtime mode.
This project also tests T3’s own MCP server, and I’m filing issues as I go, like #16906 (Grok Bot couldn’t call T3’s tools directly because of an empty 400) and #17030 (no way to read the newest items of a thread).