Skip to content

Backends

cronix supports five host schedulers in v1. The backend is selected at apply time via --backend <name>; everything else (manifest, signing, retries) is identical across backends.

BackendWhat cronix writesWhen to use
crontab/etc/crontab lines inside a # BEGIN cronix-managed block, each with a # cronix:owned markerBare-metal Linux/macOS, the simplest possible deployment
systemd-timer.timer + .service units in /etc/systemd/systemSystemd-based Linux hosts; gives you journalctl -u, systemctl status, and graceful Replace semantics for free
kubernetesCronJob + ConfigMap per (app, job, schedule-index)Anywhere you already run on Kubernetes
aws-schedulerEventBridge Schedules → cronix-trigger LambdaServerless / multi-account AWS deployments
vercelvercel.json crons[] array (owned wholesale)JAMstack and edge-deployed Vercel apps

For the strategy behind this list — which schedulers fit, which don’t, what’s planned in v1.1, and how community backends will work in v2.0 — see backend coverage strategy.

Ownership tracking

Every backend records ownership inside the resource it manages — never in a side-channel state file. cronix never modifies entries it didn’t create.

BackendMarker location
crontabA # cronix:owned app=… job=… hash=… comment line immediately following the schedule line, inside a # BEGIN cronix-managed / # END cronix-managed block
systemd-timerX-Cronix-{App,Job,Index,Hash}= annotations inside the unit files
kubernetescronix.dev/managed: "true" + cronix.dev/{app,job,index,hash} labels on the CronJob and ConfigMap
aws-schedulerA cronix- name prefix and a structured Description field on the EventBridge Schedule
vercelcronix owns the vercel.json crons[] array wholesale when enabled for the project — see the vercel backend page for the mixing caveats

For the deeper “where does state live?” answer, the per-backend marker semantics, drift detection, and the honest tradeoffs of each scheme, see state management.

Idempotency

cronix apply with no manifest changes is a complete no-op: no file mtime change, no API call, no log churn at INFO. Safe to run on every CI deploy. Hash-based change detection — the hash= field carries an FNV-1a fold over the canonical normalized job, so unchanged jobs are skipped.

Drift detection

cronix drift --exit-on-drift returns exit 5 when anything in the backend has diverged from the manifest. The drift command re-reads the backend on every run; nothing is cached. Hand-edits to a cronix:owned line, a deleted unit file, or a manually-changed CronJob are all caught.

Multi-host operator view

If you manage multiple backends from one operator host, cronix global-status reads all of them from a single config file (~/.cronix/config.yaml) and prints a unified table.