AI agents that run while you sleep.
Write a markdown file. watchd schedules it, runs claude -p, tracks cost. Single binary, zero config.
Write markdown.
Claude does the rest.
YAML frontmatter sets the schedule, model, and budget. The markdown body is the prompt. watchd runs claude -p, parses the JSON output, tracks cost per run.
--- name: uptime schedule: 5m model: sonnet permission_mode: default max_turns: 5 budget: 0.05 --- # Uptime Monitor Check if https://api.myapp.com/health returns 200. If not, tell me what's wrong.
$ watchd run uptime running uptime... ✓ uptime in 4.2s ($0.0089) The endpoint returned HTTP 200 with response time of 142ms. All healthy. $ watchd AGENT SCHEDULE STATUS COST LAST RUN uptime 5m success $0.0089 2m ago digest 1d success $0.1204 6h ago
$ watchd costs AGENT COST RUNS uptime $ 0.2314 26 digest $ 0.4816 4 security $ 0.8201 7 TOTAL $ 1.5331 37 $ watchd logs uptime ✓ uptime success 4.2s $0.0089 2m ago All healthy. 200 OK in 142ms. ✓ uptime success 3.8s $0.0076 7m ago All healthy. 200 OK in 138ms.
Cron can schedule. It can't track cost.
watchd wraps claude -p with scheduling, cost tracking, budget enforcement, and run history. Your agents are markdown files, not bash scripts.
A markdown file.
YAML frontmatter for schedule, model, budget. The body is the prompt Claude follows. No code, no framework.
--- name: digest schedule: 1d model: sonnet budget: 0.25 --- # Daily Digest Summarize the top stories on TechCrunch and Product Hunt from the last 24 hours. Focus on developer tools and AI infrastructure.
One command.
watchd runs claude -p with your prompt, tracks the result and cost. Test locally before scheduling.
$ watchd run digest running digest... ✓ digest in 12.3s ($0.0892) 3 noteworthy launches today... $ watchd costs AGENT COST RUNS digest $ 0.4460 5 TOTAL $ 0.4460 5
Runs while you sleep.
watchd up starts the scheduler. Agents run on their intervals. Deploy to any VPS and forget about it.
$ watchd up watchd: starting with 3 agent(s) digest 1d security 6h uptime 5m watchd: running digest... ✓ digest in 12.3s $0.0892 watchd: running security... ✓ security in 8.1s $0.0341 watchd: waiting for schedules
Agents you can run tonight.
Each agent is a markdown file. Drop it in agents/, run watchd up.
Check your endpoints every 5 minutes. Claude interprets the response, not just the status code.
--- name: uptime schedule: 5m model: haiku budget: 0.02 --- Check if https://api.myapp.com/health returns 200. If the response time is above 500ms or the body looks wrong, explain what might be happening.
Audit your repos for vulnerabilities. Claude reads the code, not just dependency lists.
--- name: security schedule: 6h model: sonnet max_turns: 15 budget: 1.00 --- Check the latest commits in my repo for security issues: SQL injection, hardcoded secrets, unsafe file ops. Flag anything that needs attention.
Summarize what matters from your inbox. Runs before you wake up.
--- name: inbox schedule: 1d model: sonnet budget: 0.50 --- Check my unread emails from the last 24 hours. Summarize anything from customers or investors. Ignore newsletters and marketing.
Generate release notes from your git log. Push to docs automatically.
--- name: changelog schedule: 1d model: sonnet max_turns: 10 --- Look at git commits from the last 24 hours. Write a concise changelog entry. Group by feature, fix, chore. Skip merge commits and CI changes.
Tail your logs, find patterns, suggest fixes. Runs every 30 minutes.
--- name: errors schedule: 30m model: sonnet budget: 0.10 --- Read the last 100 lines of /var/log/app/error.log. Group similar errors, identify root causes, suggest fixes. Skip known false positives.
Monitor slow queries and table growth. Claude explains what it finds.
--- name: dbhealth schedule: 1h model: sonnet max_turns: 10 budget: 0.25 --- Connect to the production database. Check for slow queries (>100ms), table bloat, and unused indexes. Suggest specific fixes.
Go binary. The LLM does the thinking.
watchd is a thin orchestration layer. No AI runtime, no model loading, no API keys. It spawns claude -p and parses the JSON output. That's it.