Commands
zolder is a single binary with four subcommands. Run zolder --help for the generated summary, or zolder <command> --help for one command.
Global flag
| Flag | Notes |
|---|---|
--config <PATH> | Path to the machine-local config. Applies to every subcommand. Defaults to zolder.toml in the platform config dir (~/.config/zolder, ~/Library/Application Support/zolder, or %APPDATA%\zolder) so timer runs find it regardless of the working directory. |
zolder --version and zolder --help are also available.
zolder init
First-run wizard: discover Syncthing, write the config dir and API-key file, and optionally install the check timer. It reads Syncthing's config but never modifies it (ADR-0002). See Getting started for the full walkthrough.
| Flag | Default | Notes |
|---|---|---|
--force | off | Overwrite an existing zolder.toml. |
--timer | off | Also install the platform timer that runs zolder check. |
--interval-minutes <N> | 10 | Timer interval in minutes (with --timer). |
zolder init # wizard only
zolder init --timer # ...and install a 10-minute timer
zolder init --timer --interval-minutes 15
zolder init --force # rewrite an existing configzolder check
Runs every check this machine's config declares, writes the zolder.json status report, prints it, and alerts on change. This is the command your timer runs.
- Exits
0when every check passed (healthy) and non-zero when any check failed. - Alerting is edge-triggered — it fires only when the set of failing checks changes. See Alerting.
- If a heartbeat URL is configured, it is pinged after the run.
zolder checkzolder status
A human-readable view over the last zolder.json.
| Flag | Notes |
|---|---|
--json | Print the raw zolder.json verbatim and exit (no reformatting — for scripts and the future fleet layer). |
Behavior:
- Color is used only when stdout is a terminal and
NO_COLORis unset (the de-facto opt-out standard); output is never colored when piped or redirected. - A report older than one hour is treated as stale and flagged — an "all ok" from an hour ago is exactly what a dead timer looks like.
- Exit code is health-based:
0only when the report is healthy and not stale, otherwise non-zero. A stale report is unhealthy even when every check passed.--jsonuses the same health-based exit code.
zolder status # human view, colored on a tty; flags a stale report
zolder status --json # raw zolder.json, health-based exit codezolder run backup
Runs restic backup for every configured repo, through zolder so the run's exit code and duration are captured and a failure raises an alert. Taking the backup is deliberately a separate, explicit command — the restic freshness check never triggers a backup itself (ADR-0002).
- Backs up the configured
restic.pathswith--exclude-cachesplus anyrestic.excludeglobs, against every[[restic.repo]]. - Errors if there is no
[restic]section orrestic.pathsis empty. - Exits non-zero if any repo's backup failed. Backup failures always alert (no deduplication) — a backup that didn't run is not a steady state to fall silent on.
zolder run backupPoint this at your restic repos on the node and schedule it separately from zolder check (which only observes backup freshness).