If you searched for "how to set up OpenClaw reminders that actually work contextually" you probably hit the same wall I did: phone assistants forget context, calendar apps spam you at the wrong time, and "remind me later" slowly turns into a guilty inbox. OpenClaw fixes that by wiring reminders directly into the agent framework – the same place where your messages, calendar, shell, and browser state already live.
Why OpenClaw Reminders Beat Siri and Alexa
Apple and Amazon keep reminders siloed in their respective ecosystems. The moment you ask for anything more nuanced than "remind me at 6" they punt. OpenClaw, running on Node 22+ and backed by GPT-4-Turbo, operates on your data graph. It can:
- Read your calendar via the Composio integration
- Know when you switch Slack channels (gateway events)
- Query persistent memory (Postgres or SQLite, your pick)
- Ping your phone’s location stream via the
phone-node
The result: reminders that adapt to who you are with, where you currently are, and what is already on your schedule.
Prerequisites: Versions, Tokens, and Minimum Setup
I will assume you already have an agent running on ClawCloud or locally. If not:
- Install Node 22 or newer. 20.x fails on the optional chaining used in
gateway@3.9.0. npm install -g openclaw@2.6.4claw init– answer the wizard (name, OpenAI key, memory backend).- Run
claw daemonin a tmux pane and openlocalhost:6555for the gateway.
For Composio scopes, you need at minimum:
COMPOSIO_SCOPES="calendar:read gmail:send slack:write"
Paste them in .env, restart the daemon. We will lean on calendar metadata later.
Plain Old Time-Based Reminders
1. One-shot reminder via chat
The simplest test: open your Telegram bot connected to OpenClaw and type:
/agent remind me to stretch in 25 minutes
The agent parses "stretch" as the task and schedules a job in internal Redis (OpenClaw bundles tiny-redis-mem@1.1 so you don’t need an external server for single-node installs).
2. CLI scheduled task
If you prefer version control for reminders (I do), create reminders.yml:
- id: weekly-status
cron: "30 9 * * FRI" # every Friday 09:30
action: |
remind "Write status update" channel:slack-devops
Then hot-load:
claw tasks load reminders.yml
Trade-off: cron entries live outside the agent context, so they miss who you’re meeting with. Good for routine pings, bad for contextual magic.
Location-Aware Reminders with the Phone Node
OpenClaw ships a minimal Android/iOS wrapper (phone-node@0.9). It streams lat,lon,accuracy every 60 s (configurable).
1. Pairing the phone
- Install TestFlight build 34 if you’re on iOS, or the APK from GitHub Releases on Android.
- Scan the QR in Gateway → Integrations → Phone.
- Watch the terminal. You should see JSON blobs like:
{ "type":"location", "lat":48.2, "lon":16.3, "accuracy":15 }
2. Creating a geofence reminder
Chat:
/agent remind me to submit receipts when I arrive at the office
The agent internally resolves “office” by looking at memory.places. On a fresh install this is empty, so teach it once:
/agent set place office = current location
From now on every location event triggers a simple Haversine check (radius 120 m by default; override with geofenceRadius in config.json).
3. Battery and privacy notes
- iOS in background mode downgrades GPS to ~3 minute intervals. If you need tighter windows (e.g. <5 min), enable Precise Location in Settings.
- Your coordinates are stored only in the agent’s Postgres table
location_events. Turn onpruneLocationAfterDays: 7to auto-delete.
Context-Aware Reminders: “Next Meeting with Y”
This is where OpenClaw pulls ahead of any assistant I have used.
1. Calendar ingestion
The first time the agent needs calendar data it will consent-flow you via Composio. After that events live in memory.calendarEvents as ISO JSON.
2. Natural language trigger
/agent remind me to discuss hosting costs when I'm next meeting with Alice
What happens under the hood:
- The agent extracts intent: reminder, topic: hosting costs, and person: Alice.
- It queries calendar events where
attendeesarray contains “alice@corp.com” andstart > now(). - It picks the earliest one, returns
meetId. - Stores a row in
contextual_reminderswith FK tomeetId. - When the heartbeat (see next section) notices the meeting is < 10 min away, it enqueues the reminder.
Edge case: recurring meetings with Alice + Bob. The agent surfaces the match it thinks is correct and asks for disambiguation if there are >1 options in the next 7 days.
3. Static rule using YAML
You can make this reproducible:
- id: discuss-costs
when:
type: next-meeting
attendee: alice@corp.com
windowMinutes: 15
action: "remind 'Hosting costs budget review'"
Support for YAML rules landed in openclaw@2.6.0. Earlier tags will ignore the next-meeting condition.
The Heartbeat: Making Reminders Proactive
Time nerds might ask: why not just schedule a job at the exact meeting start? Because meetings get moved, canceled, or merged. OpenClaw’s heartbeat (default interval 60 s) is a small loop that checks:
- Due cron tasks
- Location proximity events
- Contextual bindings (meetings, flights, Focus Mode, etc.)
1. Tweaking heartbeat interval
Add to config.json:
{
"heartbeatSeconds": 30,
"maxBurst": 4
}
If your host is a $5 Hetzner box you can safely drop to 15 s without breaking 1% CPU.
2. Delivery channels
Reminders default to whichever source channel triggered the rule. Override:
remind "Grab umbrella" channel:signal
Channels map to Gateway connectors: signal, telegram, whatsapp, slack, discord, email. If the channel is offline the agent falls back to push (phone-node).
3. Snooze and decay
Every reminder row has snoozeCount and maxSnooze. Default maxSnooze = 3. After the third “snooze 10” it marks the task stale and writes an apology in daily recap. If you hate that paternalism set:
{"maxSnooze": 99}
Debugging: When Your Reminder Never Fires
The #1 issue on GitHub (see #2142) is silent failures. A quick checklist:
- Heartbeat off? Check logs:
Heartbeat disabled by env. You probably exportedCLAW_HEARTBEAT=0during testing. - Clock skew: on ARM SBCs (Raspberry Pi) NTP drifts after power save. Run
timedatectl status. - Permission scopes: After disabling Google Calendar in Composio the agent still thinks it can query but replies 403. Re-run
claw oauth refresh calendar. - Phone node GPS: iOS "Always" permission revoked after 30 days if app isn’t opened. Open once to restore.
Verbose mode helps:
claw daemon --log-level debug | grep reminder
You will see the evaluation graph: rule ➜ match ➜ dispatch. If it stops at match, delivery failed.
Putting It All Together
Here’s my actual production snippet (redacted tokens). It glues all three types:
# ~/.claw/reminders.yml
- id: pay-rent
cron: "0 8 1 * *"
action: "remind 'Pay rent via SEPA' channel:signal"
- id: invoice-reminder
when:
type: next-meeting
attendee: finance@acme.com
windowMinutes: 20
action: "remind 'Ask about overdue invoice #442'"
- id: office-geofence
when:
type: geofence
place: office
radius: 150
action: "remind 'Grab cold brew from fridge'"
Commit that to Git, push to the box, hit claw tasks load. Done.
Next Step: Teach the Agent Your World
Reminders only get as smart as the data you feed. Spend ten minutes seeding places, recurring meetings, and preferred channels:
/agent set place home = current location
/agent set place gym = 48.197,-16.352
/agent my default channel is signal
That small investment paid back instantly when it reminded me about a forgotten birthday while I was literally stepping into the party. Siri never stood a chance.