Set up a scheduled task per conventions/cron.md. Read the convention first.
Need a periodic check instead? Consider HEARTBEAT.md — see "Cron vs Heartbeat" in conventions/cron.md.
Determine:
QuestionIf yesIf noDoes the task need recent conversation context?Main sessionIsolatedDoes the agent need its AGENTS.md/SOUL.md?Isolated (normal)Isolated + lightContextIs this a one-shot reminder?--at with --delete-after-runRecurring schedule
Format: <agent-id>-<purpose> in kebab-case.
Examples: auditor-daily-report, archivist-daily-backup, reminder-standup-meeting
PatternCLI flagExampleCron expression--cron``--cron "0 7 * * *" (7 AM daily)Fixed interval--every``--every "4h"One-shot (relative)--at``--at "20m"One-shot (absolute)--at``--at "2026-03-15T09:00:00Z"
Always set timezone for cron expressions: --tz "America/Los_Angeles"
Main session (task needs conversational context):
bash
openclaw cron add \
--name "<agent-id>-<purpose>" \
--every "<interval>" \
--session main \
--system-event "<instruction text>" \
--wake now
Isolated (standalone task):
bash
openclaw cron add \
--name "<agent-id>-<purpose>" \
--cron "<expr>" \
--tz "<timezone>" \
--session isolated \
--message "<instruction text>" \
--agent <agent-id> \
--announce \
--channel <channel> \
--to "<target>"
Isolated + lightweight context (simple, self-contained chore):
bash
openclaw cron add \
--name "<agent-id>-<purpose>" \
--every "<interval>" \
--session isolated \
--message "<self-contained instruction>" \
--light-context \
--announce
One-shot reminder:
bash
openclaw cron add \
--name "reminder-<purpose>" \
--at "<time>" \
--session isolated \
--message "<reminder text>" \
--announce \
--delete-after-run
Always use --agent <agent-id> for agent-specific jobs.
--announce --channel <ch> --to "<target>"--webhook <url>markdown
## Scheduled Tasks
| Job | Schedule | Message | Action |
|---|---|---|---|
| `<job-name>` | `<schedule>` | `<message>` | <what the agent does> |
If the cron job executes scripts (not just a self-contained message), create a skill using the create-skill skill:
workspace/skills/<skill-name>/scripts/, not in ad-hoc workspace directoriesconventions/skills.md for where files belongSkip if the cron job's message is fully self-contained (no external scripts or supporting files).
bash
openclaw cron run <jobId> # Force immediate execution
openclaw cron list # Verify job exists
openclaw cron runs --id <jobId> # Check run history
<agent-id>-<purpose> kebab-case convention--tz)--agent binding for agent-specific jobsopenclaw cron run <jobId>--delete-after-runworkspace/skills/<name>/ with scripts in its scripts/ subdirconventions/skills.md)