cron.watch
cron monitoring · scheduling · uptime

Know your jobs ran.
Not just that they exist.

A cron fails silently at 3am and you find out from a customer at 9. cron.watch flips that — every job, timer, and endpoint checks in, and we page you the moment one goes quiet, runs late, or drifts off its numbers.

Join the waitlist · double opt-in · no spam. Or see the live demo →

~/backups · crontab
# wrap any job. that's the whole integration. $ pg_dump app | gzip > dump.gz && \ curl -fsS https://cron.watch/s/4f9a-nightly # cron.watch already knows your schedule. # silence past the window = page. 23:00:04 ● ran nightly-backup 12.4s · 4.1GB 23:00:00 ● ran sync-stripe 0.9s 22:15:31 ● late rebuild-search +6m over p95 22:00:00 ● MISS send-digests → paged @sre $
UP148
DEGRADING2
DOWN1
SLO 30d99.94%
Replaces the cron-shaped hole in: AWS EventBridge CloudWatch Alarms healthchecks.io Uptime Kuma Dead Man's Snitch that one bash script that emails you
/ how it works

Three steps. Then it's just there, watching.

Instrument a single job by hand, or let the Field Agent find all of them. Either way you're protected in minutes, not a sprint.

01 — CONNECT

Add a URL or drop the agent

Pipe one curl into an existing job, or install the Field Agent once — it reads your crontab and systemd timers and registers every job automatically. Zero code changes.

02 — DEFINE

Set the window & expectations

Expected schedule, grace period, max run-time, and the metrics that matter — rows synced, queue depth, latency. We learn the baseline so late and weird are caught, not just missing.

03 — RELAX

Get paged only when it's real

Miss, overrun, or anomaly → routed to Slack, PagerDuty, OpsGenie, or a webhook by per-monitor policy. Flapping is dampened. Maintenance windows stay silent. No noise.

/ check-in methods

Whatever your job can do, it can check in.

Fire-and-forget HTTP, a live WebSocket for long jobs that report progress, plain email for the legacy box no one wants to touch — or just a DNS lookup, the cheapest health check there is.

http · fire-and-forget + payload
# bare ping — "I ran" $ curl -fsS https://cron.watch/s/4f9a-nightly # signal start + finish → get real duration $ curl .../s/4f9a/start $ ./run.sh; curl .../s/4f9a/$? # exit code # push your own values + metadata + logs $ curl .../s/4f9a \ -d 'rows=10423&host=worker-2®ion=eu' \ --data-binary @run.log 202 accepted · rows charted · log attached

The one-liner everyone starts with

A single GET says I ran. Add /start and an exit code and we compute real duration and success. POST a body and you get custom metrics, metadata, and the last lines of the log attached to the run — no agent required.

  • Works from cron, CI, Lambda, a Makefile — anything that speaks HTTP
  • Push rows, latency, queue depth — any number, charted & alertable
  • Exit codes turn a "ran" into "succeeded" — Sentry-style failure capture
  • Tag runs with host / region / version for filterable history
websocket · live progress
# long job? hold a socket open, stream progress. ws wss://cron.watch/s/4f9a-reindex {"phase":"export", "pct":12} {"phase":"index", "pct":64, "docs":8.1e6} {"phase":"swap", "pct":100} ● live reindex 64% · 8.1M docs · eta 2m11s # socket drops mid-run → instant alert, # no waiting for the window to expire.

For jobs that run for minutes, not milliseconds

Open a WebSocket and stream progress as it happens. The dashboard shows a live percentage and ETA, and if the connection drops mid-run we alert immediately — no waiting for a grace window to lapse.

  • Live progress bar + phase + ETA on the dashboard
  • Stream metric values continuously — watch latency in real time
  • Dropped socket = instant "job died" signal, not a delayed miss
  • Perfect for migrations, reindexes, ETL, model training
dns · cheapest check there is
# no HTTP? no problem. just resolve a name. # udp = featherweight ping (fire-and-forget) $ dig +short 4f9a-nightly.dns.cron.watch # tcp = confirmed check-in (completes a handshake) $ dig +tcp +short 4f9a-nightly.dns.cron.watch # encode exit status as a label $ ./run.sh; dig +tcp $?.4f9a.dns.cron.watch # works with host / nslookup / getent too ● ran nightly via dns/tcp · query logged 04:00:02

The cheapest, simplest health check there is

We run the authoritative nameserver for dns.cron.watch. Resolve your monitor's hostname and we log the query — that's the check-in. No HTTP client, no TLS, no auth token. If the box can resolve names, it can report in. Use UDP for a throwaway ping or TCP when you want the handshake to confirm delivery.

  • Escapes locked-down networks where only DNS (port 53) gets out
  • TCP completes a real handshake → reliable, confirmed check-in
  • One dig / nslookup / host — already on every box
  • Encode exit code as a label: $?.4f9a.dns.cron.watch
email · for the box you can't touch
# legacy cron that only knows how to MAILTO? # point it at your snitch address. MAILTO=4f9a-nightly@cron.watch 0 4 * * * /opt/legacy/backup.sh # any mail to that address = a check-in. # subject & body kept as the run log. ● ran nightly via email · 04:00:11 subj: "backup.sh complete — 4.1GB"

No outbound HTTP? Just send mail.

Every monitor gets an address like 4f9a@cron.watch. Any mail that lands counts as a check-in — perfect for ancient cron with MAILTO, appliances, or locked-down networks. Subject and body become the run log.

  • Drop-in for MAILTO= — the pattern legacy cron already uses
  • Works where outbound HTTP is firewalled off entirely
  • Body & subject captured as searchable run context
  • Same alerting, SLOs, and history as every other method
/ what's inside

Monitoring, not just a heartbeat.

Most snitches tell you a job pinged. We tell you whether it ran on time, finished fast enough, and produced sane numbers — then hold it to an SLO.

[agent]

Field Agent

Install once. Auto-discovers every crontab entry and systemd timer, registers them, and keeps the inventory in sync. Zero code changes, zero forgotten jobs.

[snitch]

Deadman's snitch

Silence is the signal. If the expected ping doesn't arrive inside the window, you get paged. The job doesn't have to know it failed — that's the point.

[latency]

Latency & duration

We track every run's duration, learn p50/p95, and alert on overruns — the job that still "succeeds" but now takes 40 minutes instead of 4.

[metrics]

Push your own values

Send rows processed, queue depth, bytes synced, revenue — any number. Charted on the dashboard and alertable, like a metrics backend that understands runs.

[anomaly]

Anomaly detection new

"Row count dropped 90% versus the trailing week" — even when the job exited 0. Catches the silent data bug a green checkmark hides.

[errors]

Failure capture

Exit codes, stderr, and the log tail come along on check-in. Sentry-style context on why a run failed — not just that it did.

[slo]

SLOs & error budgets

Hold a job to "succeeds 99% of runs / month." Live burn-down turns raw pings into a contract you can report on and defend.

[uptime]

Uptime checks

Active HTTP/TCP/keyword probes for endpoints and APIs, side by side with your passive cron snitches. One pane for "is it up" and "did it run."

[flap]

Flapping dampening

One blip isn't an incident. We distinguish a single miss from a job that's genuinely degrading, so you're paged on signal — never on noise.

[mute]

Maintenance windows

Scheduled deploys, backups, and known downtime stay silent. Mute by monitor, tag, or time range — no muscle-memory "ack" spam.

[status]

Status pages

Public or private status pages built from the same cron + uptime data. Your customers and your on-call see one source of truth.

[routes]

Per-monitor policies

Each monitor gets its own escalation path: who, which channel, after how long. Slack, PagerDuty, OpsGenie, or webhook — routed independently.

[api]

API · CLI · Terraform

Everything is an API. Manage monitors as code with the Terraform provider, script the CLI in CI, and never click through a console again.

[team]

Unlimited team

Invite the whole org — engineers, on-call, stakeholders. We charge per monitor, never per seat. Adding a teammate is always free.

[brand]

Custom domains roadmap

Shareable permalinks under cron.watch subdomains, then bring-your-own domain for white-label status pages and branded run links.

/ ai-native

Your agent can run your monitoring.

cron.watch ships an MCP server and a machine-readable llms.txt, so Claude, Cursor, or any AI client can sign you up, spin up monitors, and push data — no console, no clicking. And because the user (or their agent) opts in themselves, it's inbound and compliant by design — no cold lists.

mcp · connect once, let the agent drive
# add cron.watch to any MCP client $ claude mcp add cron.watch \ -e CRONWATCH_API_KEY=cw_live_… \ -- python -m cronwatch_mcp # then just ask: you "watch my nightly pg backup, alert if it's late or under 4GB" agent create_monitor(name="nightly-backup", schedule="0 23 * * *") checkin_url: https://cron.watch/s/4f9a-nightly push_metric(rows, size_gb) · alert < 4GB

Built for agents, not just humans

Everything's an API, and the API is exposed as MCP tools — signup, create_organization, create_monitor, check_in, push_metric. Point an LLM at llms.txt and it already understands the whole product.

  • 1-click signup — the agent walks the user through opt-in; nobody gets cold-emailed
  • Organizations & teams — spin up workspaces, invite unlimited members, all by tool call
  • Send data — push rows, latency, exit codes + metadata straight from a run
  • Open-source reference server + hosted mcp.cron.watch roadmap
[mcp]

MCP server

Drop cron.watch into Claude, Claude Code, or Cursor. Your agent manages monitors and pushes metrics through typed tools — no glue code.

[llms.txt]

Machine-readable docs

We publish /llms.txt and /llms-full.txt so any LLM can read how to sign up, model orgs, and send data — end to end.

[opt-in]

Compliant by design

Self-serve, agent-led signup means users come to you and opt in. Inbound growth — no scraped lists, no cold-email reputation risk.

/ honest comparison

One tool instead of three half-fits.

AWS is overkill, healthchecks.io stops at the ping, Uptime Kuma was built for websites. Here's where each lands — no straw men.

Capability cron.watch AWS EventBridge
+ CloudWatch
healthchecks.io Uptime Kuma
Deadman's snitch (silence = alert) built-in DIY alarms core push-only addon
Auto-discovery of cron / systemd Field Agent
Check-in via HTTP / WS / email / DNS all four SDK/events HTTP only HTTP push
Live progress for long jobs WebSocket
Latency / duration baselines p50/p95 metric + alarm basic
Client-pushed custom metrics any value custom metrics $$
Anomaly detection on values add-on
SLO / error budget burn-down hand-rolled
Uptime probes + status pages both Route53/Synthetics core
Pricing model per monitor per call/metric per check self-host
Unlimited team members IAM sprawl tiered
Setup effort one curl console + IAM one curl host it yourself
/ pricing

10 monitors free for 3 months. Then 50¢ each.

No per-seat tax — invite the whole team. Run up to 10 monitors free for your first 3 months; after that it's just cents a monitor. Prepay a balance or go monthly.

Free trial
$0 / 3 months
Up to 10 monitors free for your first 3 months — full features, no card.
  • 10 monitors free for 3 months
  • HTTP, WebSocket & email check-in
  • Unlimited team members
  • Latency, custom metrics & SLOs
  • Slack & webhook alerts
Join the waitlist
Pay as you grow
50¢ / monitor / mo
After your 3-month trial. Top up a prepaid balance or pay monthly — your call.
  • $0.50 / monitor / mo once the trial ends
  • Prepay $10/yr as account balance (usage draws down)
  • or $5/mo billed monthly — cancel anytime
  • Everything in Free, plus —
  • Field Agent · anomaly detection · uptime probes
  • PagerDuty / OpsGenie / per-monitor routing
  • Status pages · 1-yr history · API · Terraform · CLI
Get early access
Enterprise
Let's talk
For large fleets, compliance, and custom branding.
  • Volume pricing — well under 50¢ at scale
  • Custom domains & white-label status pages
  • SSO / SAML & audit logs
  • SLA, on-prem agent, priority support
  • Self-host option · invoicing & POs
Contact sales

10 monitors free for 3 months · $0.50/monitor/mo after · $10/yr prepaid balance or $5/mo

Stop finding out from your customers.

cron.watch is launching soon. Get on the waitlist and we'll hand you early access — 10 monitors free for 3 months when you're in.

Double opt-in · we email you once at launch · unsubscribe anytime. See the live demo →