Skip to content

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

FlagNotes
--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.

FlagDefaultNotes
--forceoffOverwrite an existing zolder.toml.
--timeroffAlso install the platform timer that runs zolder check.
--interval-minutes <N>10Timer interval in minutes (with --timer).
sh
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 config

zolder 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 0 when 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.
sh
zolder check

zolder status

A human-readable view over the last zolder.json.

FlagNotes
--jsonPrint 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_COLOR is 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: 0 only when the report is healthy and not stale, otherwise non-zero. A stale report is unhealthy even when every check passed. --json uses the same health-based exit code.
sh
zolder status         # human view, colored on a tty; flags a stale report
zolder status --json  # raw zolder.json, health-based exit code

zolder 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.paths with --exclude-caches plus any restic.exclude globs, against every [[restic.repo]].
  • Errors if there is no [restic] section or restic.paths is 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.
sh
zolder run backup

Point this at your restic repos on the node and schedule it separately from zolder check (which only observes backup freshness).