
Sixty containers on one server
One bare-metal box runs dozens to hundreds of Hoody containers. KSM and BTRFS dedup make the marginal cost near zero.
You kicked off a forty-minute agent before leaving the office. Now you're on the train. The agent streams its trace to a pipe path; you curl the same URL from your phone and watch state messages drift by. When the loop ends, hoody-notifications buzzes you. Two URLs and a buzz — no SDK, no dashboard, no polling.
Live tail above, push notification below — same phone, same agent. The trace is the running monologue you glance at; the notification is the full stop. You don't have to choose which one to wire up: both come from the agent, both land on the device that's already in your pocket.
Your agent's loop pipes each event into a path with PUT. From the train, you GET the same path in a terminal app. Lines land as they happen — no five-second refresh, no "last updated" stamp. You glance at the screen, see the agent is alive, and put the phone away.
When the outer loop finishes, the agent's last call hits hoody-notifications with a one-line summary. Your phone vibrates. You don't unlock — you read the banner, and you know the run completed before you even pull into the next station.
Hoody Pipe carries the live tail; hoody-notifications carries the buzz. The agent treats them like any other HTTP call — a PUT and a POST, no SDK in between.
The agent runs on a server you set up before you left. While you're moving, your phone is the only client in the loop. The agent does all the work; the phone does all the watching.
Inside the loop, every event — think, tool_use, result — is piped to a single path. The pipe streams to whoever is reading; if no one is reading yet, the path holds open for up to five minutes.
PUT https://agent-pipe.…hoody.com/api/v1/pipe/agent-traceOpen a terminal on the phone. curl -N the path. The trace prints as it lands — no SSE plumbing, no broker, no app to install. Close the tab when you don't want to look anymore.
$ curl -N https://agent-pipe.…hoody.com/api/v1/pipe/agent-traceWhen the outer loop returns, the agent posts a one-line summary to hoody-notifications. Your phone gets the system push from there — same buzz as a calendar reminder, no app required.
POST /notify ["summary":"billing-reconcile-7","body":"completed in 41:08"]Two HTTP paths and a third for the buzz. The agent doesn't know your phone exists; it just speaks HTTP. The phone doesn't know the agent's container; it just opens a URL.
You don't read every word. You scan three tokens: a thought, a call, a result. If they're moving, the agent is alive. If they stop, you check the time on the next push.
Why the agent picked this tool, what it expects back, where it might branch. Reading these on a train is reading the agent's mind in real time — one line per reasoning step.
[think] reconcile invoices for julThe exact function and arguments the agent decided to invoke. One line per call, in the order they fired. No SDK abstraction, no opaque ID — just the wire-level request.
[tool_use] sql.exec("SELECT …")Row counts, durations, status codes — the things the next [think] line will reason about. When the outer loop finishes, the final result lands on the wire and hoody-notifications buzzes the phone in your pocket.
[result] 412 rows · 88 msYour phone is the agent's status bar.
No dashboard. No app. No SDK shipped to the device. The agent runs on a server, the status lives on your phone, and the only thing in between is HTTP. You can switch trains, switch carriers, lose signal for two stops — when you reconnect, the next [result] line keeps printing.
Watching a long-running agent has historically meant a SaaS, a dashboard tab, or a custom webhook + bot. None of that survives the question "what if I just curl it from my phone?".
Pipe the trace, post the buzz. Your phone is the agent's status bar — no app required.