CrabTalkCrabTalk

Cron

Daemon-level cron — run skills on a schedule, even when no client is connected.

The daemon has a built-in cron scheduler. Skills fire into sessions on a schedule — whether or not a client is connected. Your agent checks feeds at 2am, runs maintenance every hour, or sends a daily summary. You close your laptop, the cron keeps running.

Creating a cron

From the REPL or any client, create a cron entry:

schedule: "0 */2 * * *"    # standard cron expression
skill: "check-feeds"       # fired as /check-feeds
session: 12345              # target session (determines the agent)

The daemon validates the cron expression on create. Invalid schedules are rejected.

Quiet hours

Crons support quiet hours — a time window where fires are silently skipped:

quiet_start: "23:00"
quiet_end: "07:00"

Both must be set. Times are in the daemon's local timezone. If a cron would fire inside the window, it's skipped — no queuing, no catch-up.

How it works

Crons are daemon-level, not session-level. They survive config reloads and runtime swaps. On daemon restart, they're recovered from crons.toml.

When a cron fires:

  1. The daemon sends /<skill> as a message into the target session
  2. The agent in that session processes it like any slash command
  3. Output goes to session history — no client needs to be listening
  4. The reply channel is dropped (fire-and-forget)

One-shot crons

Set once: true to fire a cron exactly once, then auto-delete. Useful for reminders or deferred tasks.

Protocol

Three operations on the daemon protocol:

OperationMessageResponse
CreateCreateCronMsgCronInfo
DeleteDeleteCronMsgSuccess or not found
ListListCronsMsgCronList

See Protocol for the full wire format.

What's next

  • Agents — the agents that crons trigger
  • Skills — the skills that crons fire
  • Protocol — cron protocol messages

On this page