tade — tade away: the control room, on a phone you paired

blog /

Tade Away: the control room, on a phone you paired

Agents run for hours, and nobody should have to sit with them. Tade Away puts the control room on a phone you paired, served by the Tade window itself.

The Tade project·9 min read·awayagentssafety

An agent that runs for three hours spends most of them not needing you, and then one minute needing you badly: it wants to run npm i stripe@15, and it waits. That minute is the reason people stay at the laptop, and it is a poor reason.

Tade Away is the control room above your agents, from a phone or another machine you paired at it. The window on your own machine serves it, to devices you let in one at a time, and to nobody else. Inside Tade it is called the away view, which is what the panels below say.

It is on Tade’s main and not in tade-sh 0.1.1, which is what npm installs today and was packed on 2 October. Until a release carries it, the way to it is the source rows at the foot of Install.

Why it exists

A run that takes the afternoon is ordinary now, and what it needs from a person is small and badly timed: an approval, a sentence of direction, a yes to work that arrived from outside. None of it needs a keyboard. Until now, all of it needed you at one.

The usual answers are both worse than the problem. Leaving the lid open and walking back to look is a person polling. An SSH session and tmux on a phone put ANSI rows on a 390-pixel screen, and that is a terminal you can type anything into, from anywhere, as you.

So Tade Away is a page and not a terminal, and it is built round one question: is anything waiting for me. Nothing on it types into an agent. What you say goes through Tade, and what you do is one of a short list of acts the page names.

What it is

Tade’s away view on a laptop and then a phone: the overview with what needs you and its presses, the agent waiting on npm i stripe@15 with Allow and Deny and its screen, two plans with their steps, the morning’s spend against each plan’s limits, and three phones

It opens on every project at once: what needs you, what is working, what is queued, how the checks stand, what the morning cost and the plan limit that runs out first. Under that is the work that wants somebody, with the presses that device was granted right on the card — Allow, Deny, Done, Set aside, Tell. Down the side is each project’s agents and its queue, hung as a tree of what waits on what, and Tade is docked at the foot. An agent’s page opens on what it is doing now, with its checks, branch, spend and plan beside it. On a phone the same pages sit behind a tab bar, and the middle of the bar raises the conversation with Tade.

The picture is not a screenshot. Tade draws it the way it draws its own window: the page’s own code, run over a made-up morning, with the page’s own stylesheets, laid out by the browser you are reading this in.

What it is not is a cloud dashboard. There is no account, no relay and no tunnel. The listener is in the window’s own process, so close Tade and nothing is listening, and a bookmark tapped then is the browser’s own connection error rather than an empty control room. A sleeping laptop serves nothing either, and the page says so instead of going blank:

Unreachable since 11:07. The machine may be asleep, or Tade may be closed. What is below is the last thing this device was told — not what is happening now.

How it works

A device is let in at the machine

away-a-device-asking · paneldrawn by Tade
A phone at the door: what it calls itself, where it came from, that a yes grants full access and any of it can be unticked, the minute it has, and the same a and d that answer a tool call.

The window draws a code. The phone scans it, names itself and asks, and the answer is a keypress at the machine — a or d, the same keys that allow or deny what an agent asks. The code carries a ticket that lasts ninety seconds and is spent the moment it is presented, so a replay finds nothing; the ticket is in the code’s fragment, so a typed address cannot pair at all. On a computer, the link under the code does what scanning does.

The line at the foot of that panel is the one nobody wants to write: an agent on this machine could pair itself. Agents run as you and nothing sandboxes them. What stands against it is that the panel lists every device there is, every act is journalled under the device that took it, and Disconnect everything needs no network.

What each device may do is decided per device

away-acting-granted · paneldrawn by Tade
Three devices: whether each is connected now, where it paired from and when, what it reads, and a box per thing it may do, ticked where it was granted.

A yes is full access, and the card says so before you press it: every project, everything the page can read and everything it can do. Each row then takes back what you did not mean, a box at a time — answer and steer, stop agents, close projects, talk to Tade, change settings, see screens, read settings — and full access turns the lot on or off at once. Two devices are two decisions: the kitchen screen can read names and counts while your phone answers agents.

With every box empty a device still reads the names of your projects, the names and states of their tasks, the counts, and how fresh it all is. That is enough to answer the question the page exists for, which is the test of whether it is the right floor.

Granted, a device can answer what an agent is waiting on, tell a running agent something, hold, release or reorder queued work, set a task aside or pick it back up, write a note, add a line to what a task’s agent is told, mark work finished with two presses, and approve a request a rule here already allowed. With boxes of their own it can stop or reopen an agent — never start a new one — and close or reopen a project. That is twelve acts, each naming its target and the state it expects, and the window checks that state again at the moment of acting.

What no device can do in any configuration: change who can reach Tade or what a device may do, read a credential, run a command, start an agent that never ran, push, merge, overrule a check or publish a workflow. Those are not switches that happen to be off. There is no route for any of them.

The live view

The page is live: one stream from the window, advanced on its own beat of about two seconds, and the header says live · as of 14:00:04 so nobody has to guess how old a number is. With nobody looking, the beat builds nothing.

An agent’s screen is its own grant — see screens — and it is the last lines of that agent’s terminal, read only while somebody has the page open. Machine paths, the keys Tade holds and anything shaped like a credential are taken out of it. Anything else an agent printed is not, which is why the box is there.

Talking to Tade

A device granted it can talk to Tade from the same page, and the window says what that means in one paragraph rather than leaving it to be guessed:

A message from a paired device reaches the same conversation you type into, and is never your own words: it cannot authorise a setting change, however it is phrased, and nothing it says reaches a line you said.

While Tade answers one, its tools are narrowed in code to reading that device’s own view of your work plus the few acts it was granted, and every other tool it holds is refused — including the harness’s own shell. A closed list is what makes free text to a model safe, and a paragraph asking the model to behave is not. The device’s words stay in the transcript at the machine, marked as that device’s.

Notifications

Put on a phone’s home screen, the page can be told when something wants you. Every notification goes through the push service that phone’s browser chose — Apple’s, Google’s, Mozilla’s — which sees that something was sent, when and how big, and cannot read it: it is encrypted to a key the browser keeps.

One thing wanting you is named, as in api-v2 wants your answer, when the device may read titles and Get work names in them is on, which it is by default. Several are a count and never a list of names. Turn that setting off and every notification is a count. They are sent by the window on its own beat, so a closed window or a sleeping machine sends nothing, and nothing is caught up: a window that comes back says what is true now rather than six things about last night.

The protocol is tested against a stand-in for the push service. Delivery to a real phone is a manual check, and nothing in the repository records it being done yet.

The security model, in plain words

  • Nothing is served unless you turn it on. The switch is off until you press it, and off means no listener at all. On, the listener lives in the window and answers this machine alone until you choose otherwise.
  • A session belongs to the host it was made on. The address a device paired at is compared byte for byte, so the same machine under another name, or on another port, is a new pairing rather than a session that wandered over.
  • Acting needs this machine or an https name you trusted. That is asked again at every act. A plain-HTTP address on your wifi reads and nothing more, whatever was granted — a phone granted everything and carried onto somebody else’s network does nothing until it is back. No forwarded header is ever read: a proxy is trusted by being named, never by what it writes.
  • Every act is journalled under its device. The refused ones too, and every turn of a conversation, so who did this always has an answer that is not the owner.

How to try it

Turn it on. Settings › Away view › Serve the away view. It applies as you press it, and the code appears under the switch. The strip at the foot of the window says remote off until then and remote 1 once a device has a page open, and pressing it brings you back to this switch.

settings-away-on · paneldrawn by Tade
The switch, on: the code and the link to open on this machine under it, the devices, then who may reach it, the port and the trusted hostnames.

tade web on writes the same setting from a shell, and says it takes effect the next time Tade starts — the window does not watch its config file, so the switch is the quicker of the two. The rest of the shell’s half reads:

tade web                 # what is on, where it listens, who is paired
tade web devices         # every device, and what it may read
tade web revoke --all    # disconnect every one of them; needs no network

Scan the code. Name the device on its own screen, then press a at the machine. On this machine, open the link under the code instead. At home, Who can reach it: lan puts the page on your wifi — in plain HTTP, which anybody on that wifi can read, and so read-only whatever else is on.

Take it with you over Tailscale. This is the way to reach it from somewhere else, and it is a smaller surface than lan:

tailscale serve localhost:7654

That gives the phone https on your tailnet while Tade keeps listening on this machine alone. Put the tailnet name in Settings › Away view › Trusted hostnames — Tade answers only its own addresses and the names listed there, and an https name listed there is the only origin off this machine that may act. The code then points at that name, so scan it again and the phone pairs there, with a session bound to the address it will keep using.

What moved since the switches post

The away view, and the switches in front of it is the long version of every setting, and it is true as of 12 October. Three things have moved since. A yes at pairing grants everything and the rows take it back, where it used to grant reading and nothing else. The switches under the first are on and apply as they change, each still nothing to a device until that device is granted it. And there are twelve acts, not eight: stopping and reopening an agent and closing and reopening a project each arrived with a box of their own.

What has not moved is the shape. The window serves it, a person at the machine lets each device in, and the list of what a device may do is a closed one.

blog← oldernewer →The Tade project│2026-10-14│9 min│top