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:

  1. Install Node 22 or newer. 20.x fails on the optional chaining used in gateway@3.9.0.
  2. npm install -g openclaw@2.6.4
  3. claw init – answer the wizard (name, OpenAI key, memory backend).
  4. Run claw daemon in a tmux pane and open localhost:6555 for 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

  1. Install TestFlight build 34 if you’re on iOS, or the APK from GitHub Releases on Android.
  2. Scan the QR in Gateway → Integrations → Phone.
  3. 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 on pruneLocationAfterDays: 7 to 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:

  1. The agent extracts intent: reminder, topic: hosting costs, and person: Alice.
  2. It queries calendar events where attendees array contains “alice@corp.com” and start > now().
  3. It picks the earliest one, returns meetId.
  4. Stores a row in contextual_reminders with FK to meetId.
  5. 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 exported CLAW_HEARTBEAT=0 during 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.