OpenClaw can act on three different schedules, and almost every newcomer confuses them: heartbeat, cron, and launchd. They sound like three names for the same thing, but they run at completely different layers, cost very different amounts of tokens, and solve different problems. Get the mix wrong and you either burn tokens on check-ins you never needed or wonder why your agent never does anything on time.
Here is the honest short version before the details. Heartbeat is the idle sensor sweep: it wakes the agent on an interval to check if anything needs attention. Cron is the scheduled task list: it fires full agent sessions at exact times for real work. Launchd is the engine keeper: a macOS system service that keeps OpenClaw running and can run scripts on a calendar, with zero AI tokens involved. Most guides cover one of them. You usually need two, sometimes all three.
The Short Version: Three Schedulers, Three Jobs
Put them side by side and the differences snap into focus:
- Heartbeat runs periodic agent turns in your main session so the model can surface anything that needs attention. Cadence is an interval, default 30 minutes (1 hour when Anthropic OAuth auth is configured). Best for: proactive check-ins, surfacing urgent items, light maintenance.
- Cron runs isolated agent turns at exact scheduled times. Best for: real work on a calendar, like a weekly post, a daily research digest, or a reminder that must fire at 9am sharp.
- Launchd is macOS itself. It starts processes at boot, keeps them alive, and can run commands on a calendar. Best for: keeping the OpenClaw gateway running 24/7 and firing shell scripts that need to survive a reboot.
If you only remember one line: heartbeat checks, cron works, launchd keeps the lights on.
Heartbeat: The Idle Sensor Sweep
A heartbeat is a scheduled turn in your main session. The agent wakes up on an interval, reads its HEARTBEAT.md checklist if one exists, checks whatever is on the list (inbox, calendar, queued tasks, open questions), and either handles it or replies HEARTBEAT_OK, which OpenClaw strips so you see nothing when nothing matters.
The default prompt is deliberately broad so the model can review outstanding tasks and check on you during the day without spamming you at night. You control the cadence, the quiet hours, and what gets checked. That is what the optional HEARTBEAT.md file is for: a tiny checklist in the agent workspace that tells the model what to watch between your messages.
The key settings that keep heartbeats cheap:
- isolatedSession: true runs each heartbeat in a fresh session so it does not send your full conversation history every tick. This is the biggest token saver.
- lightContext: true injects only HEARTBEAT.md instead of every workspace file.
- activeHours stops heartbeats at night so the agent is not poking itself at 2am.
- every: “0m” disables heartbeats entirely when you do not need proactive check-ins.
Here is a realistic config that keeps the cost near zero:
Cron: The Scheduled Task List
OpenClaw cron is the scheduler built into the gateway. Unlike heartbeat, a cron job does not tick on an interval. It fires at an exact time, runs an isolated agent session with full tool access, and delivers the result to a channel, a webhook, or nothing at all.
The job definition is what makes it an agent task rather than a shell command. A cron payload is an agentTurn: a prompt plus optional model override, timeout, and delivery rules. When the job fires, an agent actually reasons, searches the web, reads files, and calls tools, then reports back. Launchd and system cron cannot express that. They run commands; OpenClaw cron runs judgment.
Here is what the AI News Pulse job looks like as a definition:
This is also the naming trap that confuses everyone: OpenClaw cron and system cron share a word but are different tools. On a Mac, “cron” the system tool is legacy; launchd replaced it. OpenClaw cron is its own gateway scheduler with nothing to do with either, and it is the right tool when you want an agent to do real work on a schedule.
A real example from our setup is the daily AI News Pulse: every morning at 8am an isolated agent scans AI and OpenClaw news, checks what is already published on the site so it never suggests a duplicate, and posts a short briefing with WRITE, WATCH, and SKIP verdicts to the team channel. Nobody writes anything until a human picks a story. That is a cron job doing judgment work on a calendar, and it costs tokens only when it fires.
Launchd: What It Actually Is
Launchd is the macOS service manager. Every Mac runs it. It is what starts the OpenClaw gateway when the machine boots, restarts it if it crashes, and keeps it alive in the background, which is exactly how an agent stays reachable on a Mac mini without anyone opening a terminal.
You define launchd jobs as property list files in ~/Library/LaunchAgents. Each plist describes what to run and when: a calendar schedule (StartCalendarInterval), an interval, or at boot. The OpenClaw gateway itself is one of these: a plist that launches the gateway process and keeps it running.
You can confirm the gateway is registered with launchd in one command:
Launchd is also what fires the rerealize content calendar. Separate plists run shell scripts that invoke the openclaw CLI on schedule: affiliate posts on weekday mornings, a make-money cluster post on Tuesday and Friday afternoons, and the weekly AI news digest on Friday morning. Those are dumb, reliable process launches: launchd runs the script, the script starts an agent run, and the agent does the writing. No AI tokens are spent by launchd itself. It just makes sure the engine is running and the right scripts fire at the right times, even after a reboot.
What Each One Costs in Tokens
This is the part nobody explains, and it is why people either overpay or underuse their agent:
- Launchd: zero tokens, always. It starts processes and runs scripts. It has no idea what AI is. Keeping the gateway alive costs nothing.
- Heartbeat: a small constant burn. Every tick is a real model turn, and the input includes your session context unless you enable isolatedSession and lightContext. Output is nearly free because HEARTBEAT_OK gets stripped. If you do not need proactive check-ins, disable heartbeats entirely and keep an empty HEARTBEAT.md; that is exactly what this agent runs.
- Cron: zero until it fires. An idle cron job costs nothing. When it runs, it spends like any agent session, so give it a model and a timeout that match the job. Research briefings on a cheap flash model cost fractions of a cent; a full publishing run costs more because it does more.
The rule of thumb: keep the always-on layer free, make the interval layer tiny or off, and spend tokens only when a scheduled job actually does work.
Which Should You Use?
Walk this list in order and you will land on the right answer:
- Do you want OpenClaw to stay running and come back after a reboot? That is launchd, and it is already handled by the gateway plist on a Mac. Nothing for you to build.
- Do you want the agent to proactively surface things between your messages? Enable heartbeat and write a HEARTBEAT.md checklist, or skip it to save tokens.
- Do you want exact-time work, like a weekly digest, a backup check, or a post that goes out Tuesday at 2pm? Use OpenClaw cron or a launchd script, depending on whether the job needs agent judgment or just runs a command.
- Do you want a reminder fired into a channel once? That is a one-shot cron job, not a heartbeat.
The common mistakes are easy to avoid once you see them: using heartbeat for exact-time jobs (it is an interval, not an alarm), using system cron on a Mac when launchd is the native tool, and paying for constant heartbeats when the agent has nothing to check.
How rerealize Actually Runs It
This site is a working example of all three layers at once. Launchd keeps the gateway alive on the Mac mini and fires the content calendar scripts on schedule. OpenClaw cron runs the daily AI News Pulse that briefs the team on what is worth writing. Heartbeat is disabled here on purpose: the agent works when a human talks to it or a cron job fires, and it does not spend tokens checking for work that is not there.
The lesson is not that you need all three. It is that you should pick the tool by the job: launchd for uptime and scripts, cron for scheduled agent work, heartbeat for proactive check-ins, and nothing at all for the layers you do not need.
Start Scheduling Your Own Agent
If you are new to running OpenClaw, the scheduling layers only matter once the agent exists. Our beginner setup guide walks you through installing, connecting a channel, and making your first agent, free.
If your heartbeat is not firing at all, that is a different problem with its own fix: our guide to heartbeat troubleshooting covers the skip reasons and the configuration mistakes that stop check-ins entirely. And if you want to see how the two agent schedulers compare in more depth, the earlier heartbeat versus cron breakdown is still accurate today; this post adds the third layer most guides miss.

