Hosted harness for Claude Code & Codex

You decide. It grinds.

Zozo works your backlog while you sleep: grilling vague ideas into issues, pausing to ask when a decision is genuinely yours, and merging nothing without your approval. One dedicated machine, your own credentials, an append-only record of everything it did.

Join the waitlist See the loop

$40 / $50 / $60 per month before tax · 14-day trial on Standard · no inference markup, ever

thread_01JZ7K · issue #214 retry failed webhook deliveries
running
Zozo Dashboard showing a Thread's live journal while a Run streams
Runs in flight
3 / 5
Frontier
11 ready
Needs attention
1 clarification
Opened overnight
4 pull requests

One night, end to end

You went to bed. It kept going.

Not a cron job that fires blind, and not an agent that guesses. A loop that runs unattended, hands back only the sliver that needed a human, and resumes the second you answer.

11:58pm · paused

One question, from bed

Mid-dispatch it hit a decision that wasn't written down anywhere: not in the issue, not in the docs, not derivable from the code. It stopped and asked instead of guessing.

zozo
retries can duplicate a delivery. dedupe by event id, or accept at-least-once?
you
dedupe by event id
12am – 6am · running

Runs, journaled

Every step, command, and diff appended to a journal as it happens. Morning review is reading, not archaeology.

00:00 resumed · your answer applied
01:12 webhook-dedupe tests green
03:26 blocker on #209 closed → #213 unblocked itself
05:47 branch pushed · checks running
7:04am · completed

Yours to merge

A pull request with the whole trail behind it: the question, your answer, every test run. Nothing merged itself unless you told it to.

✓ PR #214 Retry failed webhook deliveries
31 checks passed
awaiting your review

Why not just run it yourself

You stop being the session it runs on.

Inside a single task you don't need this. A terminal running Claude Code is plenty capable, and that was never the question. The question is attention. A terminal agent needs you sitting there: deciding what's next, re-entering context every time you come back, watching so you notice when it's stuck. You are the thread it runs on. You supply the continuity, the sequencing and the recovery, with your own presence, for as long as the work takes.

Zozo takes over being the thread. It keeps running when you're not looking. It unblocks the next issue the instant its blocker closes: continuously, not on whatever schedule you remember to check. And it hands back only the sliver that actually needed a human, in the smallest unit it can, at the moment it's needed: a push to your phone, one card on the Needs Attention page, your answer, and it resumes on its own. Judgment in seconds, not sessions.

Terminal agent
On Zozo
Dies with your laptop lid
Runs on a dedicated VM that stays up
You pick the next task
Auto-dispatch selects eligible issues by priority
Blocked work sits until you notice
Blockers reconcile every minute and rejoin the Frontier
Guesses when the spec is thin
Stops, asks one question, waits as long as it takes
Session scrollback is the only record
Append-only event journal is the source of truth
A crashed run is lost work
A stranded attempt resumes before fresh work starts

The core loop

Idea → issues → code → pull request

Two ways in. One path out. Bring a half-formed idea and let an Intake Session grill it into a plan, or label an issue ready-for-agent and skip straight to the dispatch. You're never forced through the grilling to get work done.

01

Bring an idea

Describe a feature in plain terms in the Dashboard. Early and vague is fine; that's the point.

02

Get grilled

Intake asks one focused question at a time (scope, edge cases, the parts left unsaid) until there's a structured issue plan with labels and dependencies.

03

Confirm the plan

The one step that stays yours. Confirm and it publishes real GitHub issues in dependency order; the ready ones land on the Frontier.

04

It implements

An isolated worktree and branch per attempt. The agent reads the repo, edits files, runs your build and tests, and commits.

05

You review

It pushes the branch and opens a PR that closes the issue. Open-PR-only waits for you; auto-merge verifies the tested commit against current main first.

Clarification

It asks instead of guessing.

Sometimes an issue that looked ready is missing a load-bearing decision. If the answer isn't in the issue, the docs, or the codebase, the attempt stops and asks you on the same thread, keeping every file it has already touched in its worktree.

It waits. No timeout forces a decision before you're ready. Answer from your phone and the same attempt continues with your answer and all of its context intact.

Zozo on a phone: a paused agent asks which option to take

Dispatch

The scheduling you'd otherwise do in your head.

Auto-dispatch is a standing mode, not a cron job. It parks when nothing can be selected and wakes the moment the picture may have changed.

tick · 5 min

The interval

Checks GitHub for anything newly selectable: an issue just labelled ready, or one whose last blocker was resolved.

slot freed

A run concludes

Capacity re-arms selection immediately, so the next issue starts without waiting for a tick.

landing done

A PR lands

Revisits every project whose selection picture just changed, the instant it changes.

It respects your dependency graph

Work blocked on another issue waits. A reconciler rechecks every open issue on every watched project once a minute, and a pre-selection check closes the last timing gap, so an issue whose blocker resolved seconds ago can join the pick already under way. Most autonomous-agent tooling doesn't attempt this.

How blocking works →

It knows when to stop itself

Three consecutive attempts failing for the same reason trip a circuit breaker and end the pass; selected-but-unstarted issues go back to ready. If GitHub can't be read for one project, that project is skipped and the rest of the fleet keeps moving. Suspend stops new selections and lets in-flight runs finish cleanly.

How dispatch decides →

Why you can leave it running

Nothing needs you until morning.

Unattended is a promise about blast radius, not optimism. Here's what the boundary actually is.

A machine of your own

Every customer gets a dedicated VM running their own full stack. Your code, journal, and credentials share hardware with no one. At signup, you choose Europe (EU) or the United States (US) as your Home Region; Singapore isn't an option. Your Stack stays inside that Home Region.

Credentials stay yours

Your browser sends each credential straight to your stack over TLS, into a secured store. It's never written to the journal, never in a workspace, never seen by our control plane: by construction, not policy.

Isolated execution

Each run executes in a disposable cell with a permission policy bounding what the agent may do. The harness server stays on loopback behind an authenticated dispatcher.

We don't have your code

Repository files, git history, and every thread message stay on your stack. The control plane gets account state, health fields, and aggregate token usage: defined fields, no payloads.

Stop it any time, lose nothing

Pause, abort, or delete an attempt mid-flight. The system actively refuses to discard a branch whose commits never reached a pull request; it makes you say so on purpose.

No lock-in

One click exports a manifest, the raw event journal, and a git bundle for every unshipped attempt, straight from your stack to your browser. Daily encrypted backups exist for recovery; the export exists for you.

Your Home Region stays fixed

Your Home Region is permanent for the life of your account. During maintenance, Zozo may move your Stack within this region, which can change its IP address. Your choice is standing consent to those moves: we'll notify you of an IP-changing move without asking for further confirmation. Standard, Plus, and Pro cost the same in both Home Regions.

Morning review is reading, not archaeology

Every turn, tool call, command, and decision is journaled as it happens, and the Dashboard renders runs from that same journal it uses to stream, resume, and recover. What ran while you were asleep is a record you read top to bottom, not a diff you reverse-engineer to work out what it was thinking.

Updates that can't strand you

Hosted releases roll out in health-gated waves. Your stack waits for active work to finish, takes a local backup, applies the update, verifies its health, and reverts automatically if the update fails. Host-infrastructure moves have to prove themselves healthy for minutes before any traffic switches over.

The compounding corpus

Month six asks better questions than month one.

Grilling needs something to check against. So Zozo writes the answers down, in your repository, as ordinary files.

Decided, not guessed

Every follow-up question depends on a real line between decided and undecided. The glossary or ADR update proposed on an issue is applied as the first act of the dispatch that picks it up, before any code, so the next clarification has one more fact to work from.

A byproduct of shipping

No separate step, no maintenance chore. It happens on every issue that lands. An undocumented repository gets grilled harder at first (there's nothing written down yet to check against) and gets easier every month you use it.

The record lives in your repo

Decisions land as CONTEXT.md and ADRs on your own remote, committed like everything else. Not a record we keep about you: text you grep in an editor and edit by hand when a decision changes.

Wayfinder · included

For an idea too big for one issue, it charts a map first.

Some ideas are bigger than a single issue can hold. Wayfinder charts one as a map: a graph of the open decisions standing between the idea and the destination. Each decision becomes a ticket, typed for how it actually gets resolved: answerable by reading, by your judgment call, by a disposable prototype, or by work that only unblocks the next decision.

Every ticket resolves on its own terms, and what's learned composes into a spec before a single line of implementation is ticketed. It ships on for every tenant, new and existing.

map_04 · multi-tenant billing
readingWhich invoice fields does the vendor API expose?
judgmentPer-seat or per-run metering?
prototypeCan we reconcile a webhook replay in under 200ms?
unblocksExtract the usage rollup behind an interface
4 tickets · spec drafts when the last one resolves

Pricing

You pay for the machine. Not a markup.

The fee pays for us operating your stack, not for owning your only way to run it. Connect the Claude or Codex subscription you already pay for and Zozo adds no inference charge on top of it.

Standard
$40/mo

Where every trial starts.

2 shared vCPU · 4 GB · 40 GB
Run cap 1 · Reserve 1
3 watched projects
Join the waitlist
Most solo devs
Plus
$50/mo

Three runs at once is where a backlog starts visibly draining.

4 shared vCPU · 8 GB · 80 GB
Run cap 3 · Reserve 1
6 watched projects
Join the waitlist
Pro
$60/mo

For a dozen repos and an API key behind them.

8 shared vCPU · 16 GB · 160 GB
Run cap 5 · Reserve 2
12 watched projects
Join the waitlist

Subscription credential

your plan's own price

Connect the Claude or Codex subscription you already pay for and this line is your model spend. There's no dollars-per-month range to publish because there isn't one to have: what constrains you is your own plan's usage limit, and one run at a time paces you against it instead of racing it. That's a pace, not a guarantee. This is the recommended path when you're footing the bill, and it needs your explicit, recorded consent to run unattended.

API-key credential

as much as you let it run

Metered by Claude or Codex on your own vendor account, with no markup from us, which is why it stays the default when a client is footing it and the spend needs to be a line item on their invoice. Dispatch the whole backlog unattended, or one issue on demand and nothing else. Every run reports its own tokens and cost into a daily per-provider rollup you can read: the figure your settings produced, measured on your account, not estimated from ours.

Monthly prices in USD before applicable tax · both credential paths supported on every plan · plan changes available once the subscription is active · self-hosting is on the roadmap, with no date promised

FAQ

The questions a careful developer asks first

Do I need an API key or a subscription credential?

Pick by how the work gets paid for, independently of plan. Running this against your own repos on your own money? Connect your Claude or Codex subscription. Billing a client instead? An API key's metered spend passes straight through to them. A subscription credential needs your explicit, recorded consent, and it's worth reading your vendor's terms first: that relationship is yours, not ours to vouch for.

Whose terms govern my subscription credential?

Your Claude or Codex subscription stays governed by your agreement with Anthropic or OpenAI, not Zozo. You are responsible for following those terms. If a vendor asks us to disable subscription credentials, or its terms change in a way that requires it, we may do so; an API-key credential is always available. Read the full vendor-terms disclosure.

What if the agent goes off the rails?

It works in an isolated worktree inside a disposable cell on your own VM, under a permission policy you control. Nothing merges without your review unless you turned auto-merge on for that project. Pause, abort, or delete an attempt mid-flight at any time.

Which repositories can it work on?

Any GitHub repository you can grant access to, via a fine-grained token you create. Watching a repository is you drawing the line around what counts as work: every issue inside it becomes eligible, nothing outside it exists to Zozo.

Can it merge its own work?

Only if you say so, per project. Open-PR-only opens the pull request and stops. Auto-merge sends it through Landing, which verifies the tested commit against the current main before merging it.

What happens if a run dies halfway through?

The thread's append-only journal is the source of truth; a vendor runtime's native session is a disposable cache. An issue carrying agent-in-progress with no live run is a stranded attempt, and it resumes before any fresh work is selected.

Can you see my code?

No. Repository files, git history, thread messages, and event payloads stay on your stack. The control plane receives account and billing state, closed health fields, aggregate token and cost usage, and identifiers: defined fields, never contents, never credential values.

Where does my Stack run?

Stacks are hosted in the EU (Germany or Finland) for now.

Why invite-only?

Because the promise is a machine of your own, credentials that never touch our servers, and an agent you can leave running unattended. A young product taking uncapped signups is exactly how that promise breaks. We onboard in small waves so operations stay tight enough to keep it. Codes go out in order.

Stop being the thread it runs on.

Join the waitlist and we'll send a code in order. Fourteen days on Standard, card required, nothing merged without you.

Double opt-in: confirm by email. To be removed, contact support@zozohq.com. Already have a code? Redeem your invite