Docs › Cron, systemd, GitHub Actions and plain scripts

Cron, systemd, GitHub Actions and plain scripts

The rv client is a single Python file with no dependencies. It wraps a command, captures exit code, duration and output size, checks evidence files, and reports — and if RunVouch is unreachable your job still runs.

Install

curl -fsSL https://runvouch.com/rv -o ~/bin/rv && chmod +x ~/bin/rv
export RUNVOUCH_KEY=rv_…   # put in ~/.profile or the cron env

Wrap a job

# crontab -e
0 2 * * * rv run nightly-etl --log /var/log/etl.log --evidence-file /data/out/today.parquet -- python3 etl.py

--log appends the job's stdout/stderr to a file (and counts as evidence if it grew). --evidence-file requires the file to exist, be non-empty and be modified during the run.

Hourly, weekly, monthly

rv agent hourly-sync --cadence 1h --grace 10m
rv agent weekly-digest --cadence 7d --grace 2h --max-runtime 30m

MISSED fires when cadence + grace passes without a start; STALLED when a run exceeds max runtime without ending.

Report cost from any LLM job

RID=$(rv start price-scraper)
rv tool $RID openai.chat --input '{"model":"gpt-5","prompt_hash":"…"}' --cost 0.012 --tokens 4100
rv end $RID --status ok --cost 0.35 --evidence '{"rows": true}'

Per-call reporting enables retry-storm and per-run budget detection; per-run reporting is enough for daily caps and drift.

GitHub Actions

- run: rv run nightly-build --evidence-file dist/report.html -- npm run build:report
  env:
    RUNVOUCH_KEY: ${{ secrets.RUNVOUCH_KEY }}

Need a key? Get one free · Stuck? [email protected]