The workspace persists
Installed tools, cloned repositories, half-finished work. It is still there tomorrow, and after a restart, and after it moves to a different machine.
Managed Baton nodes — the same node model, the same protocol, and the same snapshot format as the one on your laptop. An agent that has to answer at 3am should not be running on a machine that closes at 6pm.
A container that gets scheduled, does a job and disappears is a workload. What Baton runs is the other thing: a stateful workspace with weeks of accumulated context, its own identity, and a human who occasionally takes the keyboard.
Installed tools, cloned repositories, half-finished work. It is still there tomorrow, and after a restart, and after it moves to a different machine.
baton attach sales-agent and what appears is Claude Code or Codex exactly as it looks locally. Same command whether the node is on your laptop, your server, or ours.
The runtime, the filesystem, the workspace and the terminal are yours. We operate the host — that is the whole of what is being sold.
Anyone running agents in production has to answer for credentials, network egress, isolation and audit. Here is how this model answers them — and in one case, why the question does not arise.
Authorisation between your network and this service is two keypairs, each side holding only the other's public half. Nothing secret crosses the boundary in either direction, so there is no secret in flight to intercept and none at rest to leak.
Runtime specs declare secrets by name, never by value — MODEL_API_KEY, not the key. A snapshot excludes tokens and PKI material by name.
A runtime spec states what network access it needs. The host enforces it — and a spec asking for something the host cannot enforce is refused rather than silently downgraded.
That refusal is the load-bearing half. A platform that quietly grants less than you asked for has told you nothing, and you will find out from an incident.
Every host publishes what it can actually do through the standard capability contract, and the CLI reads it. A laptop that cannot do process checkpoint reports false; so does a managed host that cannot.
The vocabulary is public and it is the same everywhere, so "hardened" is a claim you can check rather than a word on a page.
Managed workspaces run in microVMs — each one gets its own guest kernel rather than a slice of a shared one. Our hosts declare isolation.microvm; a laptop running the open edition declares isolation.container.
Same node model, same verbs, same snapshot format. The driver underneath is a property of the host, not a different kind of Baton — and a self-hosted machine can declare the same thing we do.
Every action resolves to one specific key that one specific person added, with the scopes it was granted visible wherever it is listed. Revocation is deleting that key, and it takes effect immediately — verification happens at time of use, so there is no issued token to outlive the record.
Baton is open source and Apache-2.0. Hosting a node here creates no second node model and no private Baton API — enforced by the repository, not by intention. Where a managed host can do more than a laptop, it says so through the same capability contract everyone else uses.
A snapshot carries your work and your logins, and never an identity. Sixteen assertions say so — step 17b of the acceptance run — including that an archive carrying an identity is refused outright and that a clone gets the work but a different certificate. That proves state is portable. Carrying it onto a different runtime is a separate assertion, and it is being built rather than claimed.
An OCI image plus a workspace volume, carried by whichever runtime driver the host declares. Those two are what moves, and both are standard — nothing here is a proprietary format you would have to convert out of. What does not move is the running state underneath, and it never needed to.
No cloud-only verb, no cloud-only field, no cloud-only artifact format, and no branch on where a node happens to run. If we need a capability, it is available to any provider you configure — or it does not exist.
Isolating a single agent is where this problem starts, not where it ends. The moment you have five, they need names, addresses, a way to hand work to each other — and eventually a way to reach agents that are not yours.
nike.coder@batoncloud.org — one identity, many addresses, many endpoints. Move the agent to another machine and the address follows it.
Two organisations' agents connect once, at the network level, and every agent inside shares that trust. The traffic goes directly between them; we help them find each other and then get out of the way.
Publish a workspace template or a skill and any Baton operator can install it by name. Browse what is there →
Managed capacity is not open for sign-up yet, and nothing here takes payment. Tell us what you would run and we will write when there is something real to try.