Persistent daily reminder system with Telegram delivery, SQLite backend (Node.js), snooze, subtasks, and daily reports. Falls back to JSON if SQLite unavailable. Supports recurring and one-off tasks with interactive buttons.
markDone always closes task on today's date, removes any future-dated entry (e.g. task rescheduled to tomorrow and then marked done same day)date <= today)node:sqlite (built-in Node ≥22.5)A daily task management system for OpenClaw. Sends pending tasks via Telegram with interactive buttons (done, snooze, reschedule). Backed by SQLite with JSON fallback. All scripts are Node.js (v25, no external deps).
memory/reminders.db) — source of truth for tasks, daily status, and historymemory/recordatorios-hoy.json) — used when SQLite is unavailable (limited features)memory/reminders-config.json) — backend choice, frequency, window, snooze optionsnode skills/daily-reminders/scripts/init.mjs /path/to/workspace
The init script will:
node:sqlite built-in or better-sqlite3)recordatorios-hoy.json if presentmemory/reminders-config.jsonmemory/reminders-config.json:
{
"backend": "sqlite",
"frequencyMinutes": 30,
"windowStart": 8,
"windowEnd": 20,
"snoozeOptions": ["30m", "1h", "2h", "4h"]
}
Tasks that reset daily. Tell the agent:
"Add a recurring reminder to take my pill 💊"
The agent should call:
# Via db.mjs: addTask(db, { emoji: "💊", text: "Take pill", recurring: true })
Tasks that disappear once done:
"Remind me to call the dentist"
"Add subtask 'Pack clothes' to task 5"
# Via db.mjs: addSubtask(db, 5, { emoji: "👕", text: "Pack clothes" })
When a user presses 💤 Snooze on a task, send a follow-up message with buttons for each snooze duration from config:
| Button | Callback |
|---|---|
| 30 min | task_snooze:ID:30m |
| 1 hora | task_snooze:ID:1h |
| 2 horas | task_snooze:ID:2h |
| 4 horas | task_snooze:ID:4h |
Text command alternative: "snooze 3 2h" (snooze task 3 for 2 hours).
JSON mode limitation: Snooze is not available in JSON mode.
Sent via the report cron. Shows completion percentage, done/pending breakdown, and a 7-day trend chart (SQLite only).
"Show me my task report" or "How did I do this week?"
Use: node skills/daily-reminders/scripts/daily-report.mjs /path/to/workspace
When Telegram buttons are pressed, process via:
node skills/daily-reminders/scripts/handle-callback.mjs <workspace> <action> <taskId> [extra]
| Callback pattern | Action | Script args |
|---|---|---|
task_done:ID | Mark done | done ID |
task_tomorrow:ID | Reschedule to tomorrow | tomorrow ID |
task_next_week:ID | Reschedule to next Monday | next_week ID |
task_snooze:ID | Show snooze sub-menu | snooze ID |
task_snooze:ID:DURATION | Snooze for duration | snooze ID DURATION |
task_subtasks:ID | Show subtasks | subtasks ID |
All scripts accept workspace path as first argument or read OPENCLAW_WORKSPACE env var.
| Script | Purpose |
|---|---|
scripts/init.mjs | Interactive setup |
scripts/migrate.mjs | Migrate JSON → SQLite |
scripts/db.mjs | Shared DB module (imported by other scripts) |
scripts/get-pending.mjs | Output pending tasks as JSON |
scripts/reset-day.mjs | Midnight reset logic |
scripts/daily-report.mjs | Daily summary text |
scripts/handle-callback.mjs | Process button callbacks |
Schedule: */30 8-20 * * * (adjust frequency and window per config)
sessionTarget: isolated