Schedules

A schedule pairs a when (cron expression or one-shot time) with a what (prompt + working directory + Claude args). Each time it fires, we create a Job and wait for a runner to claim it.

When to fire

Three modes — pick one. The form's segmented control sets the underlying fields for you.

  • Builder — point-and-click. Minute, hour, weekday, day-of-month. Fastest path for "every weekday at 9am Hong Kong".
  • Cron — raw 5-field crontab expression for anything the builder can't express. We validate the syntax and preview the next 5 fires.
  • One-shot — runs once at a specific datetime, then disables itself.

Cron syntax

┌──────── minute       (0-59)
│ ┌────── hour         (0-23)
│ │ ┌──── day of month (1-31)
│ │ │ ┌── month        (1-12)
│ │ │ │ ┌ day of week  (0-6, Sunday=0)
│ │ │ │ │
* * * * *

# every 30 minutes
*/30 * * * *

# weekdays at 9:00 AM
0 9 * * 1-5

# 11:30 PM on the first of each month
30 23 1 * *

Timezone

Cron expressions are evaluated in the schedule's timezone, not UTC. The form auto-detects your browser's IANA zone. We respect DST — "9am every weekday" stays 9am local even when the clocks change.

What runs

Prompt

The prompt is passed to claude -p "…" verbatim, with one exception: when Continue session is on we also append --resume <last-session-id>.

Working directory

Claude is started in this directory on the runner machine. Use an absolute path. If blank, we fall back to the project's default, then to the runner's home directory.

Extra claude args

Anything the Claude CLI accepts. Common picks:

  • --model claude-opus-4-7 — pin a model regardless of CLI default.
  • --allowedTools Read,Write,Bash — explicit allowlist.
  • --mcp-config ~/mcp.json — load extra MCP servers.

Behaviour

Effort level

Maps to claude --effort. Higher = more thinking budget per turn, more tokens, slower.

  • low / medium — deterministic / quick lookups.
  • high — most agentic loops. Good default if unsure.
  • xhigh (our recommendation) — multi-step reasoning + tool calls.
  • max — rarely needed; reserved for hard reasoning. Costs add up.

Skip if running

If the previous run is still queued / claimed / running when the cron next fires, skip this fire instead of stacking another job. Recommended ON for anything that can take longer than the interval — otherwise jobs back up.

Retries

Set maxRetries > 0 to auto-retry failed runs with a backoff. Each retry is a separate Job linked back via parentJobId — the schedule detail page shows the chain. Timeouts and process crashes are both retried; cancelled jobs are not.

Continue session

Turns on claude --resume <last-session-id> so the conversation history + prompt cache survive across runs. The runner stores Claude session IDs locally — so this only makes sense if every run of this schedule lands on the same runner. Pin a runner via runner tags.

From the schedule's page you can drop the saved session id any time the context bloats up.

Runner tags

Routing labels — see Install a runner → Runner tags. A schedule's tag list must be a subset of the runner's tag list for the runner to claim it. Empty schedule tags = any runner.

Triggering manually

From the schedule page, Run now queues a job immediately regardless of the cron. Useful for testing prompt changes without waiting.

Disabling vs deleting

Disabled schedules stop firing but keep their config and history. Delete is irreversible and removes job history along with it.