meat · Rust · Responses API · Kitty graphics
meat
A reverse coding agent. meat serves an OpenAI-compatible API and opens a terminal where you answer each request: think out loud, reply, call tools on the client's machine and end the turn, while their agent waits on an open stream. Behind your panel, through the glass, sits the person you are talking to — reading their own screen backwards.
meat # tailnet:8437 · model "meat" · token from the state file
meat --model my-id --bind 0.0.0.0 --port 8437
meat --funnel # and on the public internet, via tailscale funnel
meat connect # a pi models.json and a curl line to hand over
A conversation
Through the glass

With Kitty graphics (kitty, Ghostty, WezTerm — and inside tmux) the pane is a view from inside the monitor. The person is a 3D model — sculpted from signed distance fields, meshed, and rasterized and shaded in software every frame — sitting at their desk with their hands on the keys, lit by their screen and a desk lamp. The glass between you curves at the edges, splits colour at the rim and carries fingerprints, a sheen and their coding agent, mirrored and glowing. Your own UI floats on the glass in frosted cards, with the person behind it. They lean in to read, sharp and close; when they sit back to wait they drift out of focus. Their posture follows the conversation: waiting, impatient with their chin on a fist, on their phone, reading your reply, watching tools run, pleased when you finish, hands in their hair when they cancel. Rooms and people are seeded per conversation.
Answering a turn
A request opens a turn on its conversation's tab. The draft box has two modes, thinking and responding; every ⏎ sends what you typed as a live delta and empties the box, so the client sees an agent streaming. Tools come from the request: pick one, fill a form generated from its schema, stage it, and call a batch — the response ends with function calls, the client runs them, and the results come back on a new request, matched by call id. Press F3 for auto-flush, which makes typing append-only and sends each word as you finish it, so you stream like a model. F4 dictates through the tools stt CLI: with auto-flush on, your words go straight to the client; with it off, they land at the cursor and wait for ⏎.


| i ⏎ | write — also between turns: drafts are kept for the next one |
| ⏎ ⇧⏎ M-⏎ | send the draft; with a line break |
| ⇥ | thinking ↔ responding |
| ^⏎ ^D | send and end the turn (staged tools are called instead) |
| t T E | tool picker · call staged tools · edit a staged call |
| e D | end the turn · decline it (the client sees an error) |
| M-1…9 | tabs, one per conversation |
The draft box is vim-modal by default (esc normal, esc again leaves), with readline keys while inserting.
The shadow
Every turn is also forwarded, for one turn, to a helper model — by default gpt-6-luna through pi's GitHub Copilot login. Its thinking, reply and tool calls appear above your draft. Send any part as-is, pull it into your draft to edit, stage its calls into the picker, or accept its whole turn with a. When you go your own way, the shadow follows: it reads your reasoning, never repeats a call that already has a result, and picks up a half-written reply mid-sentence.
- Auto-draft copies chosen parts into your drafts and staged tools as they arrive.
- Autopilot streams chosen parts onwards as the shadow produces them — thinking, reply, tool calls, end of turn. All four on is passthrough: the client is simply talking to the model.
- Per tab, from o; ! toggles full autopilot.


Without graphics

- Any client.
POST /v1/responsesstreaming or not, the Responses WebSocket mode withprevious_response_id,POST /v1/chat/completionsandGET /v1/models, behind a bearer token. - Tabs. Conversations are told apart by prompt cache key, session headers or their opening; several can be open at once, within limits.
- Inspectable.
meat ctl state,screen,action,sceneover an owner-only socket;--headlessserves without a terminal. - Token. From a state file (a sops-nix secret link works),
$MEAT_TOKENor--token.