CLI reference
Generated from the same command tree meridian --help renders from, so the two can never disagree.
meridian run
Start the reconciliation loop
meridian run [options]Loads and validates config, builds adapters, runs a read-only startup auth probe against
every configured calendar, then cycles on the config’s interval until SIGINT/SIGTERM.
No reconciliation cycle runs (outside --once) until every calendar’s auth probe passes — a pod that never becomes ready has provably written and deleted nothing.
See also: metrics & health, Deploy on Kubernetes.
--config- path to rules.yaml
--once- run a single cycle and exit
--listen- observability listen address (/metrics, /healthz, /readyz)
meridian validate
Validate a rules.yaml (no credentials needed)
meridian validate [options]Strict parse, every reference check, CEL and template compilation — everything run
does at startup except resolving secret env vars and the live auth probes. Safe for CI.
--config- path to rules.yaml
--from-configmap- treat the config file as a k8s ConfigMap manifest and validate its data key “rules.yaml” (e.g. helm template output, kubectl get cm -o yaml)
meridian wipe
Delete this instance’s shadow events (explicit cleanup)
meridian wipeThe explicit-cleanup counterpart to the automatic per-cycle sweep, which only ever touches calendars currently targeted by a rule. Listing here is unbounded: it also reaches shadows outside the normal sync window. Only markers belonging to the resolved instance ID are ever touched.
Both subcommands print a plan (how many shadows, on which calendars) and prompt for confirmation before deleting anything; --yes skips the prompt for scripting. --instance targets a different instance ID than the one in your current config — useful after renaming an instance, when the old shadows are otherwise invisible and need a one-time manual cleanup.
See also: Operate.
meridian wipe calendar
Delete ALL of this instance’s shadows on one calendar
meridian wipe calendar <account/calendar> [options]--config- path to rules.yaml
--yes- skip the confirmation prompt
--instance- wipe shadows of this instance ID instead of the configured one (post-rename cleanup)
meridian wipe rule
Delete one rule’s shadows (all calendars, or --calendar)
meridian wipe rule <rule-id> [options]--config- path to rules.yaml
--yes- skip the confirmation prompt
--instance- wipe shadows of this instance ID instead of the configured one (post-rename cleanup)
--calendar- narrow to one account/calendar
meridian oauth
Interactive OAuth bootstrap for provider accounts (Google)
meridian oauth [options]Runs the local-loopback OAuth consent flow and obtains a refresh token. By default the token is printed to stdout (pipe it into your secret store). With --write-env FILE the token is instead written into FILE as MERIDIAN_GOOGLE_REFRESH_TOKEN=… without ever being displayed.
The OAuth consent screen must be published to Production status in Google Cloud Console — apps left in Testing mode issue refresh tokens that expire after 7 days, unworkable for a long-running sync engine.
--client-id- OAuth client ID (Desktop-app type)
--client-secret- OAuth client secret
--port- localhost callback port
--write-env- write the refresh token into this env file instead of printing it
--env-key- env key to write with --write-env
meridian identities
Ask a CalDAV server which addresses it knows this account by
meridian identities [account] [options]Reading your own RSVP off an invitation means picking your entry out of the attendee
list. Google marks it; iCalendar has no equivalent, so a CalDAV account has to name its
own addresses in identities before filter.skipDeclined or transform.transparentForRSVP
can work.
This asks the server directly, via the calendar-user-address-set property, and prints the answer ready to paste. It also lists the account’s calendars and their paths, which a config needs anyway and which providers tend to bury in a web UI.
Run it against a configured account by name, or before any config exists by passing --endpoint with credentials in the environment or a local .env. Nothing is written: the config is usually a ConfigMap in git.
--config- path to rules.yaml
--endpoint- CalDAV base URL, to run without a config file
--username- CalDAV username (prefer MERIDIAN_CALDAV_USERNAME in a .env)
--password- CalDAV password (prefer MERIDIAN_CALDAV_PASSWORD in a .env)
meridian version
Print build version information
meridian versionTag, commit, and build date via -ldflags in release builds; falls back to Go’s toolchain-embedded build info (debug.ReadBuildInfo) for local builds.