| name | reminder |
| description | Create one-time reminder tasks using OpenClaw cron. User specifies reminder time and task content in natural language via Discord, and the task result will be sent back through Discord. |
| metadata | {"openclaw":{"emoji":"⏰","user-invocable":true,"requires":{"bins":["openclaw"],"tools":["session_status","cron"]}}} |
Reminder Skill
Create one-time reminder tasks using OpenClaw cron.
Usage
When user says "remind me to XXX in 30 seconds" or "remind me at 3pm", I create a cron job that executes the task and returns the result when the time comes.
Parameter Configuration
Fixed Parameters
--session main - Use main session to inherit Discord context
--system-event - System event payload for main session
--channel discord - Discord channel
--announce - Send result directly to Discord
--delete-after-run - Delete task after execution
Dynamic Parameters (from current session context)
Use session_status tool to get current session's deliveryContext:
--agent - Get from deliveryContext.accountId (e.g., machu)
--to - Get from deliveryContext.to (e.g., channel:1476104553148452958)
How to get:
session_status
Time Parsing
Parse user input time, support:
- Relative time:
30 seconds, 1 minute, 30 minutes, 2 hours, 1 day
- Absolute time:
3pm, 9am today, 12pm tomorrow
Convert to ISO 8601 format for cron.
Usage Example
User says "remind me to check weather in 30 seconds":
session_status
date -u -d "+30 seconds" +"%Y-%m-%dT%H:%M:%SZ"
cron action=add job='{
"name": "reminder-weather",
"at": "2026-02-26T13:30:00Z",
"session": "main",
"systemEvent": "Check Beijing weather",
"agent": "machu",
"announce": true,
"channel": "discord",
"to": "channel:1476104553148452958",
"deleteAfterRun": true
}'
openclaw cron add \
--name "reminder-weather" \
--at "2026-02-26T13:30:00Z" \
--session main \
--system-event "Check Beijing weather" \
--agent machu \
--announce \
--channel discord \
--to "channel:1476104553148452958" \
--delete-after-run
Task Content (SECURITY)
User-specified task content must be sanitized before passing to cron.
Prefer the cron tool so task content is passed as structured JSON instead of a shell command.
If falling back to openclaw cron add, shell-injection validation is mandatory:
-
Validation Method: REJECT dangerous patterns (not escape)
The script rejects any input containing:
- Command substitution:
$(), backticks `
- Shell metacharacters:
;, |, &, >, <
- Double quotes:
" (breaks CLI quoting)
- Newlines:
\n (can inject multiple commands)
- Dangerous command prefixes:
sudo, rm, wget, curl, bash, etc.
-
Sanitization Script:
Use scripts/sanitize-message.sh to validate input:
./scripts/sanitize-message.sh "user's task content"
-
If rejected: Tell user the task contains invalid characters and ask them to rephrase without: $() ` ; | & > < " or dangerous commands.
Confirmation Reply
After creating the task, reply to user to confirm:
- "OK, will remind you in X minutes/to do XXX"
- Don't tell user the specific cron command
Notes
- Time must be in the future, not the past
- Task content should be concise and clear
- If time exceeds 48 hours, suggest using calendar
- Always use
--session main + --system-event for reliable Discord delivery
- Prefer the
cron tool over shelling out to openclaw cron add
- Validate task content with sanitize-message.sh before using the CLI fallback