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:
- The daemon sends
/<skill>as a message into the target session - The agent in that session processes it like any slash command
- Output goes to session history — no client needs to be listening
- 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:
| Operation | Message | Response |
|---|---|---|
| Create | CreateCronMsg | CronInfo |
| Delete | DeleteCronMsg | Success or not found |
| List | ListCronsMsg | CronList |
See Protocol for the full wire format.