Your agents build the apps. We keep them running.
Use the agent you already have. agent.cloud runs the app, rehearses risky releases on a branch of production, and asks you before the first release and before your data changes.
- Claude Code
- Cursor
- Codex
- GitHub Copilot
- Gemini CLI
- Windsurf
- Cline
- Zed
- OpenCode
- Warp
- Aider
- Amp
- Goose
- and anything with a terminal
Your agent moves fast.
Production stays calm.
- agc up · done
Work on a mirror
Your agent works on a masked mirror of production, on localhost: real shapes, no real people.
- agc ship · skippedrehearsedcheck failed
Rehearse the release
Releases with checks, database changes or a worker run first on a fresh branch of production. If a check fails, production keeps what was live.
- your OK · skippedapproved in the sessionnot reached
A person decides
The first release and every database change wait for you. Code-only releases go on their own.
- live · donekept v6
Live, and on record
Every live release is a commit in the app's private GitHub repo, and production is watched every minute.
- Command
- agc ship -m "Waitlist offersWaitlist tableFaster checkout"
- State
- LiveStopped
Code only, and this app lets agents release code on their own.
A database change, rehearsed first. Approved by rc, in the session.
Production keeps serving v6.
$ agc ship -m "Waitlist offers" { "ok": true, "command": "ship", "outcome": "live", "data": { "app": "campfire", "version": "v6", "url": "https://campfire.agent.cloud", "decision": { "human": false, "reason": "Code only, and this app lets agents release code on their own." } }, "next": [{ "cmd": "agc status", "why": "see production and your mirrors" }], "receipt": { "id": "rcp_7f3a…" } }
$ agc ship -m "Waitlist table" { "ok": false, "command": "ship", "outcome": "waiting_approval", "decision": { "id": "apr_51e", "in_session": true, "word": "kpvx", "summary": "Adds the table waitlist. A database change needs a person. Expires in 24 h.", "choices": ["approve", "decline"] }, "next": [{ "cmd": "agc approve apr_51e --word kpvx", "why": "only once the person says approve" }], "receipt": { "id": "rcp_b21e…" } }
$ agc ship -m "Faster checkout" { "ok": false, "command": "ship", "outcome": "failed", "data": { "checks": [{ "name": "never overbooked", "ok": false, "rows": 1 }] }, "error": { "code": "ship.check_failed", "message": "Invariant 'never overbooked' returned 1 row on the rehearsal (expected none)." }, "next": [{ "cmd": "agc check", "why": "rerun the checks after the fix" }], "receipt": { "id": "rcp_9c04…" } }
Problems arrive with fixes.
- sentinel · every minute
It notices first.
Server errors, slow responses, crashes and new kinds of error open an incident, often before anyone reports it.
- agc capsule
Your agent sees what happened.
The failed requests, the error, where in the code, and the releases around it. No logs pasted into chat.
- agc up · at 14:02
Production, as it was.
A masked copy of production from that moment, on the agent's machine. Real shapes, no real people.
- agc ship · fix
The fix comes with a check.
The agent adds a check that fails without the fix, and ships them together through the same rehearsal.
- held
And stays fixed.
That check is held: no agent can weaken or remove it without a person.
500s on POST /api/bookings since v6
TypeScript or Python.
No Dockerfile.
TypeScript, end to end
A React and Vite UI, one Node 24 server, Postgres through DATABASE_URL, and migrations as plain SQL files. agent.cloud builds it with npm.
Python for the server
FastAPI or any ASGI app on Python 3.12, installed by uv from uv.lock. agent.cloud builds the image and your UI, and explains Python's crashes in plain words.
[[check.invariant]] # SQL that must return no rows name = "never overbooked" sql = "SELECT c.id FROM camps c JOIN bookings b ON b.camp_id = c.id AND b.status = 'confirmed' GROUP BY c.id, c.capacity HAVING count(*) > c.capacity" [[check.smoke]] # HTTP steps, in order name = "twenty parents race for the last spot" steps = [ "POST /api/camps {name: 'Race {run}', capacity: 1} -> 201 as camp", "POST /api/camps/{camp.id}/bookings {email: 'p{i}@example.test'} -> 201|409 x20", ]
Every release with a worker is rehearsed twice: once calm, once while we kill the worker mid-job. And no existing row may disappear in a migration.
Your code on GitHub
Every release is a commit in a private repo. Take it to your own GitHub any time.
Production, explained
Requests, server errors and p95 response time per release, for you. Your agent gets the incident and what happened.

Got an idea? Ship it today.
A revenue dashboard that emails my team a summary every morning, with yesterday against plan