watching agents that run while you sleep

Know your agents did the job
before the bill tells you they didn't.

A green run means the scheduler worked, not that the task got done. RunVouch watches agents that run while you sleep and tells you when a run is missed, fails quietly, loops, or blows its budget. Works with Claude Code Routines, headless claude -p, OpenClaw, n8n and cron. When it went right, you get a record you can verify without us.

no card2-minute setupemail, Telegram, Slack, Discord, Teams or webhookself-host (MIT)
 example night · tonight an alert, next year a record
  • 02:00 nightly-reportMissed. Expected 02:00, nothing by 02:15missed
  • 03:00 inbox-triageExit 0, but no evidence: digest.html unchangedunproven
  • 03:30 repo-janitorRetry storm: cat CHANGELOG.md ×41 in 4 minloop
  • 04:00 price-scraper$0.41 · 12 tool calls · output 118 KBvouched
  • 05:00 lead-enricher$7.90 this run · daily cap $5 hitbudget
Telegram, 03:34 (example): repo-janitor: same tool + same input 41×. Each call looks fine; together it's a loop. Pause agent
examples
MISSED nightly-report, no run started for 16 minNO_EVIDENCE inbox-triage, digest.html unchanged, green ≠ doneRETRY_STORM repo-janitor, 41× identical tool callBUDGET_DAY lead-enricher, $7.90 > cap $5.00VOUCHED price-scraper, $0.41, evidence okMISSED nightly-report, no run started for 16 minNO_EVIDENCE inbox-triage, digest.html unchanged, green ≠ doneRETRY_STORM repo-janitor, 41× identical tool callBUDGET_DAY lead-enricher, $7.90 > cap $5.00VOUCHED price-scraper, $0.41, evidence ok
the problem

"It ran" is the wrong question

$1,800

in two nights

A Max subscriber scheduled overnight Claude Code runs. Nobody noticed until the bill. A per-run cost cap stops this at $2.

$437

for 14,000 identical calls

An agent got stuck on a missing file. Every single call looked normal in the logs; the pattern only exists across calls. That's a retry storm, RunVouch counts them and alerts at 8.

0 bytes

green run, empty report

The routine "succeeded". The report it was supposed to publish never changed. Ping monitors can't see that. Evidence checks can.

Sources: Claude Code issue #37686 ($1,800+ in two days) · "I let my AI agent run overnight, it cost $437". Read the write-ups →

how it works

Two lines around any job.
Eight detectors behind it.

Register the agent

Name it, set how often it should run, what it may cost, and what proof counts as "done".

rv agent nightly-report \
  --cadence 24h --cap-run-cost 2 --evidence

Wrap the run

Cron, systemd, GitHub Actions, a Routine, anything. Exit code, duration, output and evidence are captured automatically.

rv run nightly-report \
  --evidence-file out/report.html \
  -- claude -p "build tonight's report"

Get told, not surprised

Missed, failed, unproven, looping, over budget, drifting or stalled → Telegram, Slack, Discord, Teams or any webhook within minutes. Ask your MCP client "are my agents healthy?"

rv status
nightly-report   ok   $0.41   0 alerts
verifiable runs

Prove what your agent did, to anyone

An alert tells you tonight. A proof tells an auditor, a customer or your future self next year. Every finished run gets one, on every plan, Free included.

A record per run

When a run ends, its facts (agent, start, end, status, cost, tokens, tool calls, evidence verdicts) become one JSON object and a sha256 leaf. Written once, never updated.

A public daily chain

Every UTC day the leaves of all runs form a Merkle root, chained to the previous day. The day file is public at api.runvouch.com/proof/, no login.

A Bitcoin anchor

Each day file is stamped with OpenTimestamps, so its existence is committed in a Bitcoin block. Check it with ots verify; no RunVouch code involved.

rv proof RUN_ID --verify   # recomputes the leaf and the Merkle path against the public day file, exit 0 or 1

Verify a real run in your browser, no account: recompute the hashes and edit a field to watch it break. Who needs this: verifiable agent runs · the mechanism, byte for byte: docs/proof

platform reality

Why a Routine alone isn't enough

"A green status means the routine ran — it does not mean the task in your prompt succeeded." (Claude Code documentation, scheduled tasks)

Platforms schedule your agent. None of them tell you it silently produced nothing, looped on a missing file, or crossed a daily budget. That is the whole job of RunVouch, and it works the same for Claude Code, OpenClaw, n8n and plain cron:

Claude Code

RUNVOUCH_AGENT=nightly \
claude -p "build the report"

Plugin hooks report start, tools, cost, stop.

OpenClaw / n8n

rv run inbox-agent --cap-day-cost 10 \
  -- openclaw task run inbox

Or two HTTP calls from any workflow.

cron / scripts

0 2 * * * rv run etl \
  --evidence-file out.parquet -- python3 etl.py

Zero dependencies. Fails open.

detectors

What RunVouch catches

MISSED

Expected run never started. Dead scheduler, expired token, crash before the first line.

FAILED

Non-zero exit or explicit failure, with the last stderr lines in the alert.

NO_EVIDENCE

Run says ok, but the file didn't change, the URL 404s, the assertion is false. Green ≠ done.

RETRY_STORM

Same tool, identical input, N times in one run. The invisible loop that burns money.

BUDGET

Per-run and per-day cost or token caps. Alert, then pause the agent.

DRIFT

Duration or output size off its recent baseline, and outside the range this job has actually produced. The agent is quietly doing something else.

STALLED

Started, no end, no heartbeat past the max runtime. Hung on a prompt nobody will answer.

COST

Tokens and dollars per run, read straight from Claude Code transcripts. Weekly cost report per agent.

PROOF

Not a detector but a receipt: one hashed record per run, written once, that an auditor can check with a standalone script. Verify it yourself.

What the alert looks like

Telegram · 02:16
⚠️ RunVouch [MISSED] nightly-report
no run started for 16 min (cadence 24h + grace). Scheduler dead, auth expired, or agent crashed before first ping.
Slack · #agents · 05:02
⚠️ RunVouch [BUDGET_DAY] lead-enricher
24h cost 7.90 > daily cap 5.00, pause agent · view runs
integrations

Works with what you already run

Claude Code Routinesclaude -p (headless)Claude Code hooksMCPOpenClawn8ncron / systemdGitHub ActionsLangGraphPython / Node / bash

Native Claude Code plugin (hooks report start, every tool call and stop), an MCP server so agents can check on each other, and a zero-dependency CLI for everything else.

Nothing to watch yet? Start from a ready-made agent on official data: a nightly 13F digest, Form D raises in your sector, or a weekly competitor hiring watch, each with evidence built in.

compare

Why not Healthchecks, Cronitor or Langfuse?

Ping monitors
Healthchecks · Cronitor
Trace platforms
Langfuse · LangSmith · Arize
RunVouch
Knows the job ran on timeyesnoyes
Knows the job actually did something (evidence)nonoyes
Detects retry storms across tool callsnomanual, in tracesautomatic
Hard cost cap per run / per daynothreshold alerts, no capyes + pause
Setup1 URLSDK in your code2 lines or a plugin
Built forops teams, cronML teams debugging promptspeople running agents unattended
Price$0–85/moper seat / per million spans$0 · $19 · $99

Detailed comparisons: Healthchecks.io · Cronitor · Langfuse

pricing

The alert is free. The brake is $19.

Free

$0
  • 3 agents
  • All 8 detectors
  • Email, Telegram, Slack, Discord, Teams & webhook alerts
  • A cost cap alerts you, the agent keeps running
  • 7-day history
  • Verifiable proof per run
Start free

Solo

$19/month
  • A cost cap that refuses the next run
  • 50 agents
  • 90-day history
  • Weekly cost report
  • MISSED and FAILED alerts sent every time, no 10-minute cooldown
  • Verifiable proof per run
Upgrade to Solo, $19/mo

Team

$99/month
  • 1000 agents
  • 90-day history
  • API export (CSV / JSON) for audits
  • Read-only dashboard for teammates (viewer keys)
  • PagerDuty incidents
  • Verifiable proof per run
Upgrade to Team, $99/mo

Running these jobs for clients instead of yourself? What an agency shows the client.

Get your key

Only used to identify your account and match a future subscription. No newsletter, no card. Prices in USD, VAT handled at checkout by Polar; upgrade with the same email you sign up with.

faq

Questions

Why do you need my email for a free key?

Because the key is the account. If you upgrade later, the payment is matched to the same email; if you lose the key, we can rotate it. We don't send marketing mail.

What does $19 buy that Free does not have?

The brake. On every plan a cost cap alerts you the moment a run crosses it. On Solo and Team the next run is refused as well, so a loop that bills by the token stops instead of running until morning. Free is three agents, all eight detectors and every alert channel, so you can see what RunVouch does before you pay for it.

Does RunVouch see my prompts or data?

No. It receives what your job reports: start/end, exit status, tool names and a hash of their input (for loop detection), cost/tokens, output size, and true/false evidence results. Evidence checks on files run on your machine; only the verdict is sent.

What if RunVouch is down?

rv run fails open: your job still runs unmonitored and prints a warning. Monitoring must never break the thing it monitors.

Can I self-host?

Yes. The server is a single MIT-licensed Python file with SQLite. The hosted version is the same code plus alerts, backups and the dashboard.

Where does it run?

EU (Netherlands) infrastructure behind Cloudflare. Data stays in the EU.