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.

install
source · Clone the upstream repo
git clone https://github.com/sundial-org/awesome-openclaw-skills
Claude Code · Install into ~/.claude/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"
OpenClaw · Install into ~/.openclaw/skills/
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"
manifest: skills/cron-mastery/SKILL.md
source content

Cron 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

SystemBehaviorBest ForRisk
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

wakeMode: "next-heartbeat"
, the cron system forces an event injection at
atMs
. Use
mode: "now"
in the
cron:wake
tool if you need to force an immediate wake outside of a job payload.

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

  1. Check current jobs:
    cron:list
    (includeDisabled: true)
  2. Create the Janitor:
    • Name:
      Daily Cron Cleanup
    • Schedule: Every 24 hours (
      everyMs: 86400000
      )
    • Payload: An agent turn that runs a specific prompt.

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

enabled: false
and have
lastStatus: ok
(finished one-shots), delete them to keep the list clean. Do not delete active recurring jobs. Log what you deleted."

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
    cron:list
    . If the job exists but didn't fire, check the system clock vs
    atMs
    .
  • "I have 50 old jobs": Run the Janitor manually immediately.