## Start simple, scale when you're ready

The same binary covers the whole range. Run it as a nicer cron on one box, or turn on the orchestration, HA and agent tooling as you grow. You never swap tools or rewrite your jobs to move from one end to the other.

cron drop-in
cronstable spans the whole range
Airflow full orchestration
Homelab / single box

Point it at the crontab you already have and keep it. One static binary, no database, no broker, no daemon zoo. It stays out of your way and only does what a cron does until you ask for more.

Team / production

Switch on DAGs, leader-elected HA, fenced exactly-once, a durable state store, metrics and the agent interface. The same binary reaches Airflow-class orchestration without the metadata DB or the worker fleet.

## How it stacks up

cronstable versus its closest cron-family competitors, plus Apache Airflow as a heavier orchestrator for scale.

✓ Native ◐ Partial + Add-on – None

Capability | cronstable 35 native | yacron Python · YAML 9 native | supercronic Go · crontab 7 native | Ofelia Go · Docker 4 native | dkron Go · distributed 9 native | Cronicle Node · master/worker 9 native | K8s CronJob native resource 8 native | Airflow Python · orchestrator 18 native Diff. class
--- | --- | --- | --- | --- | --- | --- | --- | ---
AI & agent control Signature
MCP server for AI agents observe & control | ✓23 tools · read-only default | – | – | – | – | – | +3rd-party cluster MCP | +draft; 3rd-party wrapper
Agent triage & resources canned playbooks + context | ✓5 prompts + URI resources | – | – | – | – | – | – | –
Scheduling core
YAML job configuration | ✓native YAML crontab | ✓ | – | – | – | – | ✓ | +via dag-factory
Classic crontab files as-is Vixie `/etc/crontab` | ✓runs it unchanged | – | ✓ | – | – | ◐import only | – | –
Sub-minute schedules second-level, 7-field | ✓7-field · down to 1s | – | ✓ | ✓ | ✓ | – | – | ◐timedelta only
Extended cron dialect L · L5 · year column | ✓last-day · last-Fri · year | ✓ | ✓ | – | – | ◐year, no L | – | ✓
@reboot once per OS boot durable boot marker | ✓per boot, not per restart | ◐per process start | – | – | – | – | – | –
Arbitrary per-job timezones | ✓any IANA zone, per job | ✓ | ✓ | ◐prefix hack | ✓ | ✓ | ✓ | ✓
Concurrency policy + timeouts execution & kill timeout | ✓policy + exec/kill timeout | ✓ | ◐no timeout | ◐no timeout | ✓ | ✓ | ✓ | ✓
Configurable failure conditions stdout · stderr · exit code | ✓failsWhen · stderr default | ✓ | – | – | ◐HTTP jobs only | ◐HTTP jobs only | ◐exit codes only | ◐exit codes only
Retries with exponential backoff | ✓backoff · survives restart | ✓ | – | – | ◐no backoff | ◐fixed delay | ✓ | ✓
Depends-on-past gate skip while the last run fails | ✓onlyIfLastSucceeded | – | – | – | – | – | – | ✓
Missed-run catch-up after downtime | ✓durable catch-up | – | – | – | – | ✓ | ◐one run only | ✓
Orchestration & workflows
DAGs / dependency graphs durable workflow engine | ✓fan-out · sensors · resume | – | – | – | ◐chaining only | ◐chains only | +Argo / Tekton | ✓
Cross-task data hand-off XCom | ✓XCom between tasks | – | – | – | – | ✓ | +Argo | ✓
Dynamic task mapping fan-out over a list, then fan-in | ✓expand: over upstream list | – | – | – | – | – | – | ✓
Sensors poll-until-true tasks | ✓durable poke schedule | – | – | – | – | – | – | ✓
Human approval gates | ✓pause for sign-off | – | – | – | – | – | +Argo | ✓
Backfill / historical reruns | ✓whole-DAG backfill | – | – | – | – | ◐time machine | – | ✓
Distributed & fault-tolerant
Clustering + no double-run replicas from one config | ✓mTLS leader election · quorum | – | – | – | ✓ | ✓ | ✓ | ✓
Fenced exactly-once lease / lock fenced | ✓fenced via lease backend | – | – | – | ◐no fencing | – | – | ◐no fencing
Cluster-wide concurrency scope Forbid / Replace across the fleet | ✓concurrencyScope: cluster | – | – | – | ◐forbid, race-prone | ◐max-N, no Replace | ✓ | ◐queues, no Replace
Crash-resume of in-flight runs a peer adopts the orphan | ✓peer adopts the run | – | – | – | ◐4h stale threshold | ◐primary crash loses it | ✓ | ✓
Durable state store for jobs KV · locks · cursors · secrets | ✓+ idempotency & artifacts | – | – | – | – | – | ◐PV/Secrets only | ◐Variables/secrets
Observability & control
Live web dashboard tail · run · cancel | ✓live tail · 10 themes | – | – | – | ◐no cancel/tail | ✓ | +separate UI | ✓
HTTP REST control API | ✓status · start · cancel · history | ✓ | – | – | ✓ | ✓ | ✓ | ✓
Prometheus + statsd metrics | ✓both, native | ✓ | ✓ | – | ✓ | – | +kube-state-metrics | ✓
Per-job resource monitoring CPU time · peak memory | ✓whole process tree | – | – | – | ◐Prom gauges | ✓ | +metrics-server | –
Failure reporting mail · Sentry · Slack | ✓+ webhook & shell | ✓ | ◐Sentry only | ✓ | ◐Pro for per-job | ✓ | +Alertmanager | ✓
Secret redaction in output archived logs · on by default | ✓on by default | – | – | – | – | – | +log pipeline only | ◐known values only
Platform & deployment
Native Windows + macOS + Linux | ✓all three, native | – | – | ◐Docker-centric | ✓ | ◐no Windows | – | –
Self-contained multi-arch binaries no runtime install | ✓8 Linux arches + mac + win | ◐x86-64 only | ✓ | ✓ | ✓ | – | – | –
Hardened container images non-root · read-only · distroless | ✓+ 8 distro variants | – | – | – | – | – | ◐you harden it | ◐not distroless
Minimal runtime dependencies | ✓pure Python · MCP adds none | ◐8 pip deps | ✓ | ✓ | ✓ | – | – | –
State backup · restore · migrate live-safe admin verbs | ✓live-safe backup verb | – | – | – | ◐job defs only | ◐offline only | ◐etcd-wide, offline | ◐no backup/restore

## Everything else it packs in

The agent interface gets the attention, but most of cronstable is the scheduler under it: a DAG engine, a fenced cluster, a durable state store and a live console, all in the same dependency-free daemon.

DAG engine

A durable workflow engine rather than plain job chaining: fan-out, sensors that wait on external conditions, and XCom hand-offs between tasks. Runs survive a restart and resume mid-flight; pause on a human approval gate, then backfill history when you need to.

fan-out sensors XCom approval gates backfill resume
Fenced, elected cluster

Run replicas from one config with mTLS leader election and quorum, so a job never double-fires. Fenced exactly-once execution through a lease backend keeps a stalled leader from overwriting its successor's work.

mTLS leader election quorum fenced exactly-once
Durable state store

A store your jobs can use directly: KV, locks, cursors, secrets, idempotency keys and artifacts, all surviving restarts. It runs without an external database or Redis.

KV locks cursors secrets idempotency artifacts
Live console

A web dashboard that tails logs, runs and cancels jobs on demand, and walks any DAG's task graph, with 10 phosphor themes. Backed by an HTTP REST API and native Prometheus + statsd.

live tail run/cancel REST API Prometheus 10 themes
Scheduling core

Runs your classic Vixie crontab files unchanged, with per-job IANA timezones, concurrency policies, exec/kill timeouts, retries with exponential backoff, and missed-run catch-up after downtime.

crontab as-is per-job TZ timeouts backoff catch-up
Portable & hardened

Runs natively on Windows, macOS and Linux, shipped as self-contained binaries across 13 OS × arch targets, plus distroless images that run non-root on a read-only root filesystem. Adds zero new dependencies.

Win mac Linux 13 builds distroless non-root

## One cool thing about cronstable

we're the only scheduler with a native agent interface.

Built-in MCP server

### Point Claude, Cursor or Copilot at your scheduler.

cronstable speaks the Model Context Protocol natively, served at `POST /mcp` over Streamable HTTP and through a `cronstable mcp` stdio bridge for desktop clients. It's written in pure Python against MCP revision 2025-11-25. Enabling it adds zero new dependencies. The agent gets read-only access until you grant it write tools.

    # wire it to Claude Code (remote or local)
    claude mcp add --transport http \
      cronstable https://host/mcp \
      --header "Authorization: Bearer $TOKEN"

    $ cronstable mcp --check
    mcp check: ok, protocol 2025-11-25,
      23 tool(s) at http://127.0.0.1:8080/mcp

Observe

- Every job, run & trend: status, history, live log tails
- DAGs, their runs and XCom data hand-offs
- The cluster & fleet, node-by-node
- Metrics and the durable state store

Act · opt-in

- Run or cancel a job on demand
- Trigger, backfill or approve a DAG
- Every write needs `confirm: true`
- Backfills default to a dry-run preview

Triage playbooks

- Root-cause a failing job
- Walk why a DAG run failed
- Scope the blast radius of a change
- Fleet-health digest & backfill plan

Safe by default

- Read-only until you opt in to mutating tools
- Inherits web auth; fails closed with no token
- Secret values & KV data redacted
- Origin & body defenses against rebinding

5-in-1
Orchestration without the Airflow overhead

Scheduler, durable DAG engine, a job-facing state store, a leader-elected cluster and a live console in one binary. It matches Airflow's orchestration without the metadata DB, the separate workers, or the Python-only footprint.

1 of 8
Only cronstable ships a native MCP server

Across every tool surveyed, it's the only native agent interface. Airflow and Kubernetes reach MCP only through third-party, whole-system add-ons, and Airflow's own server is still a draft proposal.

0 deps
Portable and dependency-free

Pure-Python with no new dependencies, self-contained binaries for 13 OS/arch targets, and images that run non-root on a read-only root filesystem.

## See it running

Open the live dashboard and drive a nine-node fleet yourself: tail a job's logs, walk a DAG's task graph, watch leader election, and inspect the durable state store.

▶ Open the live dashboard demo ★ cronstable on GitHub