How it works¶
You don't need this page to use Allocus. It's here because "just say deploy this to allocus" is the kind of promise that ought to come with a look under the lid — and because a handful of things that seem arbitrary (why you build locally, why there's no SSH key, why a deploy takes a moment to land) make immediate sense once you see the shape.
When you say "deploy this to allocus", Claude isn't doing anything magic. It runs the
same allocus CLI you can run yourself, which drives a small and fairly boring
pipeline.
flowchart LR
subgraph laptop["Your laptop"]
cli["allocus CLI<br/>(or Claude skill)"]
end
subgraph cp["Allocus control plane"]
api["deploy broker"]
reg["container registry<br/>(your private namespace)"]
end
subgraph box["Your box (a VM)"]
agent["allocus-agent"]
traefik["Traefik<br/>(HTTPS edge)"]
app["your app<br/>container"]
end
cli -- "1. build + push image" --> reg
cli -- "2. deploy request (API key)" --> api
api -- "3. queue instruction" --> agent
agent -- "4. pull image" --> reg
agent -- "5. run container" --> app
traefik -- "6. route + TLS" --> app
Three properties of that picture are the whole design:
- You never touch the box directly. No SSH key, no VM address to look after. Deploys are brokered — the control plane is the only thing that talks to your box.
- The box pulls; nothing is pushed at it. Your box reaches out and asks whether there's work. That's why its management surface can stay completely closed, and it's a network fact rather than a promise — see can anyone log into my box.
- HTTPS is already working. Your box holds a wildcard certificate for
*.<you>.allocus.dev, issued while the box is being provisioned rather than on first request. Every app you deploy is TLS-valid immediately, with no per-app certificate wait.
A deploy, step by step¶
sequenceDiagram
autonumber
participant You as You / Claude
participant CLI as allocus CLI
participant Reg as Registry
participant CP as Control plane
participant Agent as Box agent
participant Traefik
You->>CLI: allocus deploy
CLI->>CLI: docker buildx build --platform linux/amd64
CLI->>Reg: push image (immutable git-SHA tag)
CLI->>CP: deploy request (API key + app + SHA)
CP->>CP: resolve your box, queue instruction
Note over Agent: agent polls for work
Agent->>CP: any instructions?
CP-->>Agent: deploy <app> @ <SHA>
Agent->>Reg: pull image
Agent->>Agent: run container (compose up)
Agent->>Traefik: register route <app>.<you>.allocus.dev
Traefik-->>You: https://<app>.<you>.allocus.dev is live
Agent->>CP: report result
1. Build, on your machine¶
allocus deploy reads your allocus.yaml — for a simple app, just a name and a
port — and builds the Dockerfile in your repo.
Boxes run linux/amd64, so the CLI always cross-builds for that target even on an Apple-Silicon laptop. The image is tagged with your current git SHA, which is what makes every deploy immutable and every rollback exact.
Why your machine and not ours? Two reasons that both benefit you. Your box spends
its memory running your apps instead of competing with a build, which matters a lot on a
2 GB machine. And your Docker build context — your source, your .env files, whatever
else is in the directory — never leaves your control except as a finished image.
The cost is that you need Docker with Buildx locally, and the CLI checks for it up front rather than failing halfway through.
2. Push, to your own registry namespace¶
The image goes to your own private namespace in the Allocus container registry. The CLI fetches short-lived registry credentials for this, so there is no registry login for you to create, store, or rotate.
3. Broker¶
The CLI hands the control plane an app name and an image SHA, authenticated with your API key. The control plane looks up your box and queues an instruction for it.
This indirection is the reason you never need your box's address or a credential to it. It's also why your API key is worth protecting: it's the one thing that identifies you to the broker, and anyone holding it can deploy to your box.
4–5. Pull and run, on your box¶
Your box's agent polls every five seconds, so it picks the instruction up almost immediately, and then:
- fetches that app's secrets on a separate request, so secret values never ride inside a deploy instruction and never appear in the stored deploy record,
- writes them and the pinned image tag to the app's
.env, readable only by root, - pulls the image using the box's own auto-rotated registry credential,
- brings the containers up, and waits for the healthcheck to pass before calling the deploy a success.
If it's the app's first deploy, the agent creates it from scratch. There's no separate "add an app" step, and nothing to click.
That health gate is why allocus deploy --wait can tell you what went wrong instead of
just "queued" — see when something's wrong.
6. Route and TLS¶
Traefik, the edge proxy on your box, picks up the new container and starts routing
<app>.<you>.allocus.dev to it over HTTPS. The subdomain is claimed the first time you
deploy that app; you never touch DNS and never wait for a certificate.
What Claude adds on top¶
Almost nothing, deliberately. Before running allocus deploy, the skill:
- writes a
Dockerfileif your repo doesn't have one, - writes an
allocus.yaml— the app'snameandport, or a wholeservices:stack if you have a database, - runs the deploy and tells you the URL.
Everything after that is the pipeline above. You can watch it happen, and you can do it by hand at any point without losing anything.
Why it's built this way¶
| Choice | What it buys you |
|---|---|
| One VM per developer | "One price = one box" is exact. Overloading your box is your own problem, so there are no shared-cluster quotas to argue with and no noisy neighbour. |
| Brokered deploys, no SSH, no IPs | You never hold a credential to a machine, and there's no attack surface on the box for you to keep patched. |
| Immutable git-SHA tags | Deterministic deploys, and a rollback that reruns the identical image rather than rebuilding and hoping. |
| Build on your machine | Your box's memory goes to running apps; your build context stays local. |
| Secrets fetched separately | A stored deploy record can be kept for history without ever containing a secret value. |
| Wildcard HTTPS, pre-issued | Every app is TLS from its first request, with zero certificate work and no first-deploy wait. |
What happens when something is down¶
Worth knowing, because the answer is better than you'd expect from a one-person platform:
If the control plane is down — Traefik and your running containers are entirely self-contained on your box. Your apps keep serving traffic. You can't deploy, roll back, or fetch logs until it's back, but nothing that's already live is affected.
If your box goes quiet — the dashboard shows it as stale or offline, and the
apps on it stop answering, because that's where they run. Deploys queue rather than
failing, and run when it returns.
If your box's disk is lost — you redeploy from your git SHAs, which is quick, and you lose anything that only existed in a volume, which is not. That asymmetry is the reason backups are your job and the reason the docs keep saying so.