neomano-todo
An improved personal TODO system that uses SQLite as the backend (not text files).
Why SQLite:
- Structured fields (priority/status/dates/tags)
- Fast filtering and sorting
- Durable local storage with zero external dependencies
Features
- SQLite persistence (local file)
- Priorities 1–3
- 1 = high, 2 = medium, 3 = low
- Tags (many-to-many)
- Dates
due_at(when it should be done)remind_at(when to notify)
- Statuses
open,done,blocked,expired,forgotten
- Reminder metadata for OpenClaw cron
- Store
remind_at+cron_job_idso reminders can be created/updated/cancelled by the agent
- Store
- Backlog control
- Detect “stale candidates” based on
last_touched_atand priority thresholds
- Detect “stale candidates” based on
Configuration (environment variables)
Recommended: set in ~/.openclaw/.env on the gateway machine.
Storage
NEOMANO_TODO_DB_PATH- Path to the SQLite DB file.
- Default used by the helper script:
~/.openclaw/workspace/data/neomano-todo.sqlite3
Reminder delivery defaults
Used by the agent when scheduling a reminder (cron delivery).
NEOMANO_TODO_DEFAULT_CHANNEL- Example:
whatsapp,telegram, etc.
- Example:
NEOMANO_TODO_DEFAULT_TARGET- Example:
+593987233203for WhatsApp.
- Example:
NEOMANO_TODO_TZ- Example:
America/Guayaquil
- Example:
Data model (SQLite)
The helper script auto-creates tables on first run.
Main fields stored per task:
title,notespriority(1–3)status(open|done|blocked|expired|forgotten)created_at,updated_at,last_touched_at,completed_atdue_at,remind_atcron_job_id(optional, set after creating a cron job)- tags via
tags+task_tags
Helper script
Use the bundled deterministic helper script:
skills/neomano-todo/scripts/todo.py
It outputs JSON to make it easy for an agent to parse.
Commands
Add a task:
python3 skills/neomano-todo/scripts/todo.py add "Install Starlink antenna" --priority 2 --tags "starlink,truck" --notes "This weekend"
Get a task:
python3 skills/neomano-todo/scripts/todo.py get 12
List tasks:
python3 skills/neomano-todo/scripts/todo.py list --status open --order priority
python3 skills/neomano-todo/scripts/todo.py list --status open --order due
python3 skills/neomano-todo/scripts/todo.py list --tag sales --order priority
Complete / reopen:
python3 skills/neomano-todo/scripts/todo.py done 12
python3 skills/neomano-todo/scripts/todo.py reopen 12
Change status (blocked/expired/forgotten/etc):
python3 skills/neomano-todo/scripts/todo.py set-status 12 blocked
python3 skills/neomano-todo/scripts/todo.py set-status 12 forgotten
Change priority:
python3 skills/neomano-todo/scripts/todo.py set-priority 12 1
Update tags:
python3 skills/neomano-todo/scripts/todo.py set-tags 12 "sales,followup"
Update due/reminder timestamps:
python3 skills/neomano-todo/scripts/todo.py set-dates 12 --due-at "2026-03-29T09:00:00-05:00" --remind-at "2026-03-29T08:30:00-05:00"
Store cron job id (after scheduling a reminder with OpenClaw cron):
python3 skills/neomano-todo/scripts/todo.py set-cron-job 12 <cron_job_id>
Delete:
python3 skills/neomano-todo/scripts/todo.py delete 12
Reminder scheduling (OpenClaw cron)
The script stores reminder timestamps; the agent is responsible for scheduling.
Workflow:
- If
remind_atis set andstatusisopen, create/update a cron job scheduled atremind_at. - After creating the cron job, store its id in the task using
set-cron-job. - When the task becomes terminal (
done,expired,forgotten), cancel the cron job (if any).
Backlog control: stale candidates
Policy:
- P3 not touched for 30 days → review candidate
- P2 not touched for 45 days → review candidate
- P1 is never auto-forgotten
List stale candidates:
python3 skills/neomano-todo/scripts/todo.py stale-candidates
Response style
- Keep replies short.
- For WhatsApp: use bullets (no tables).
- When confirming changes: include task id, title, priority, and status.
