One-click hosting for personal AI agents
Agent Haven
Pick an agent, paste a Telegram bot token, and get a running machine you never have to SSH into.
Agent Haven hosts vetted AI agents (Hermes and OpenClaw) with one launch flow. It provisions the machine, installs the agent, connects Telegram, and hands you a console for status, channels, skills, sessions, logs and a terminal.
01 / 05 · blueprint
Motivation
Running a self-hosted agent means renting a box, running an installer, wiring secrets and a Telegram bot, then babysitting updates. I wanted that whole chore behind one button, with a calm UI on top and no SSH.
The MVP had to prove the full path twice. First locally with fake and Parallels providers, so CI never needs cloud credentials. Then on real infrastructure, with a transcript for every claim about live behavior.
Capabilities
- Six-step launch wizard covering agent, provider and region, plan, SSH key, secrets and review. The Telegram token is masked to its last four characters.
- A deployment engine that walks
validatingthroughconfiguringChannelstorunning, and refuses to reportrunningif the gateway health check never passes. - Convex work queue with leased, fenced claims, consumed by a runner that holds the provider credentials. Per-runner tokens are minted from the dashboard and stored as hashes.
- Instance view with live stats, desired vs observed lifecycle drift, power controls, and tabs for channels, triggers, skills, sessions, logs, exec approvals and a terminal.
- Telegram webhook wake. Fly machines scale to zero and the next message starts them again.
- App chat that talks to the agent through the console terminal bridge.
- Admin, member and viewer roles enforced in both the UI and Convex.
- Redacted receipts committed for every live run, plus doctor and smoke CLIs.
Key decisions
A provider port with a mandatory fake
Why
Cloud providers stay swappable without touching app code, and the deterministic fake lets the whole MVP run in CI with no Hetzner or Fly credentials.
What it cost
More packages up front, and the fake can drift from real providers, so live claims still need live receipts.
Convex for state, a separate runner for the slow work
Why
Convex is the reactive read model and work queue. Long VM work happens in a Node runner that holds the provider secrets, and fencing tokens stop a stale runner from finishing work it no longer owns.
What it cost
Two deployables plus runner registration. Whenever the queue is unreachable the console shows status unavailable.
Container-native launch on Fly
Why
Each blueprint names an image and an init script that becomes PID 1, with config written from app secrets. There is no SSH bootstrap step, boot is fast, and it works with scale to zero.
What it cost
Image quirks surfaced one at a time in live runs, like ENTRYPOINT handling and s6-overlay for Hermes.
UI honesty as a tested rule
Why
No green light without data behind it. Channel counts say they are saved configs, demo catalogs carry a DEMO badge, and missing queue data reads as unavailable. Tests enforce it.
What it cost
The local demo looks less finished than a mocked-up dashboard would.
Evidence gates on live claims
Why
Any claim about live behavior has to point at a redacted transcript, and an adversarial review gate checks commits against that rule.
What it cost
Real process overhead on every commit.
Architecture
The browser only talks to Clerk and Convex. Provider credentials live with the runner, which claims work from the queue, drives the engine and streams events back.
Limits and what's next
- Proven live on Fly with OpenClaw. The Hetzner provider is implemented and tested locally, and a live Hetzner run is next.
- Hermes deploys and runs, but its wake-on-message path isn't exercised yet because it polls Telegram instead of using a webhook.
- Next: pin Hermes by image digest like OpenClaw, so every deploy is reproducible.
- Skills and vetted updates are browsable. Pinning, uploading and publishing skills are on the roadmap.
- Browser end-to-end tests run locally, and moving them into CI is next. CI already runs lint, typecheck, unit tests, queue smokes and the build.