Awesome-openclaw-skills cron-mastery
Master OpenClaw's timing systems. Use for scheduling reliable reminders, setting up periodic maintenance (janitor jobs), and understanding when to use Cron vs Heartbeat for time-sensitive tasks.
git clone https://github.com/sundial-org/awesome-openclaw-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cron-mastery" ~/.claude/skills/sundial-org-awesome-openclaw-skills-cron-mastery && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/cron-mastery" ~/.openclaw/skills/sundial-org-awesome-openclaw-skills-cron-mastery && rm -rf "$T"
skills/cron-mastery/SKILL.mdCron Mastery
Rule #1: Heartbeats drift. Cron is precise.
This skill provides the definitive guide for managing time in OpenClaw. It solves the "I missed my reminder" problem by enforcing a strict separation between casual checks (heartbeat) and hard schedules (cron).
The Core Principle
| System | Behavior | Best For | Risk |
|---|---|---|---|
| Heartbeat | "I'll check in when I can" (e.g., every 30-60m) | Email checks, casual news summaries, low-priority polling. | Drift: A "remind me in 10m" task will fail if the heartbeat is 30m. |
| Cron | "I will run at exactly X time" | Reminders ("in 5 mins"), daily reports, system maintenance. | Clutter: Creates one-off jobs that need cleanup. |
1. Setting Reliable Reminders
Never use
act:wait or internal loops for long delays (>1 min). Use cron:add with a one-shot at schedule.
Standard Reminder Pattern (JSON)
Use this payload structure for "remind me in X minutes" tasks:
{ "name": "Remind: Drink Water", "schedule": { "kind": "at", "atMs": <CURRENT_MS + DELAY_MS> }, "payload": { "kind": "agentTurn", "message": "⏰ Reminder: Drink water!", "deliver": true }, "sessionTarget": "isolated", "wakeMode": "next-heartbeat" }
Note: Even with
, the cron system forces an event injection at wakeMode: "next-heartbeat"
. Use atMs
in the mode: "now"
tool if you need to force an immediate wake outside of a job payload.cron:wake
2. The Janitor (Auto-Cleanup)
One-shot cron jobs (kind:
at) disable themselves after running but stay in the list as "ghosts" (enabled: false, lastStatus: ok). To prevent clutter, install the Daily Janitor.
Setup Instructions
- Check current jobs:
(includeDisabled: true)cron:list - Create the Janitor:
- Name:
Daily Cron Cleanup - Schedule: Every 24 hours (
)everyMs: 86400000 - Payload: An agent turn that runs a specific prompt.
- Name:
The Janitor Prompt (Agent Turn)
"Time for the 24-hour cron sweep. List all cron jobs including disabled ones. If you find any jobs that are
and haveenabled: false(finished one-shots), delete them to keep the list clean. Do not delete active recurring jobs. Log what you deleted."lastStatus: ok
3. Reference: Timezone Lock
For cron to work, the agent must know its time.
- Action: Add the user's timezone to
.MEMORY.md - Example:
Timezone: Cairo (GMT+2) - Validation: If a user says "remind me at 9 PM," confirm: "9 PM Cairo time?" before scheduling.
4. The Self-Wake Rule (Behavioral)
Problem: If you say "I'll wait 30 seconds" and end your turn, you go to sleep. You cannot wake up without an event. Solution: If you need to "wait" across turns, you MUST schedule a Cron job.
- Wait < 1 minute (interactive): Only allowed if you keep the tool loop open (using
).act:wait - Wait > 1 minute (async): Use Cron with
.wakeMode: "now"
Example Payload for "Checking back in 30s":
{ "schedule": { "kind": "at", "atMs": <NOW + 30000> }, "payload": { "kind": "agentTurn", "message": "⏱️ 30s check-in. Report status." }, "wakeMode": "now" }
Troubleshooting
- "My reminder didn't fire": Check
. If the job exists but didn't fire, check the system clock vscron:list
.atMs - "I have 50 old jobs": Run the Janitor manually immediately.