Skip to content

quay schedule

quay schedule is the read/test surface — list what the daemon will fire, or fire one now to verify a schedule works without waiting for its cron tick.

Print every schedule with its label, cron, enabled flag, and last run.

Terminal window
$ quay schedule list
id label cron enabled last
ddf7a4d9-e521-4... nightly prod pg 0 3 * * * yes 2026-05-09T03:00:01Z ok: 84 tables, 12,402 rows
8b3d2117-45ac-9... hourly redis cache 0 * * * * yes 2026-05-09T19:00:00Z ok: 1,248 keys
5e1f8203-91bb-2... weekly mongo prod 0 4 * * 0 no (never)

Columns:

ColumnWhat it means
idSchedule UUID — pass to run-once
labelHuman label set in the desktop app
cron5-field cron expression (UTC)
enabledWhether the daemon will fire this on its tick
lastISO timestamp of last run + summary

If no schedules show, your config dir is empty. Either open the desktop app and add some via Settings → Pro Plus → Scheduled backups, or hand-write schedules.json (format below).

Fire one schedule immediately. Useful for:

  • Verifying a new schedule works before committing to the cron
  • Manual one-off backups from a script (quay schedule run-once ddf7a4d9... from your CI)
  • Triage: if last_status shows a failure, re-run to catch it live
Terminal window
$ quay schedule run-once ddf7a4d9-e521-4...
nightly prod pg: ok: 84 tables, 12,402 rows

The summary is also persisted to schedules.json so the desktop app’s schedule list reflects the run.

The desktop app writes this; the CLI reads it. Same shape on both sides:

{
"schedules": [
{
"id": "ddf7a4d9-e521-4abc-9999-12345abcdef0",
"label": "nightly prod pg",
"connection_id": "<id from connections.json>",
"cron": "0 3 * * *",
"dest_id": null,
"enabled": true,
"last_run_at": "2026-05-09T03:00:01Z",
"last_status": "ok: 84 tables, 12,402 rows"
}
]
}
FieldNotes
idUUID — generate via the app or uuidgen
labelFree-form
connection_idMust match an id in connections.json
cronStandard 5-field cron (min hour dom mon dow) in UTC
dest_idCloud upload destination id, or null for local-only
enabledtrue to participate in the daemon tick loop
last_run_at / last_statusWritten back by the daemon — leave empty when hand-creating

Standard 5-field cron in UTC:

ExpressionFires
0 3 * * *Daily at 03:00 UTC
0 * * * *Every hour, on the minute
*/15 * * * *Every 15 minutes
0 4 * * 0Weekly Sunday at 04:00 UTC
0 0 1 * *Monthly on the 1st at midnight UTC

Convert to your timezone before writing — the CLI doesn’t read system TZ. (Schedules stay timezone-stable when you take the laptop across zones, which is the trade-off.)

~/Documents/Quay-backups/<sanitised connection name>-<UTC stamp>.<ext>

Extension is .sql for SQL family + .jsonl for Mongo + Redis.

The path is hard-coded in v0.1. v0.2 will pick it up from the same “backup default location” setting the desktop app uses (Settings → Behavior).