v0.1.0
A self-hosted todo & reminders service. One-off and recurring tasks (daily/weekly/monthly/yearly) with low/normal/high priorities that re-notify until done (2h/1h/20m), delivered via each user's own Telegram bot (with a Complete button) and desktop browser notifications. Multi-user, real-time, MIT-licensed, built to run inside a private Tailscale tailnet.
Highlights
- Three binaries —
dodo(HTTP API + web UI + scheduler + Telegram pollers, plusadminandbackupsubcommands; ships in the container),dodo-cli(agent CLI, JSON output),dodo-tui(terminal UI). - Web UI — server-rendered htmx + Alpine, real-time over websockets: list view with today/week/month + pending/completed/all filters, a month calendar, task create/edit/complete/snooze/delete, recurring tasks, profile, API tokens, Telegram setup, dark/light/system theme, English/Greek.
- Telegram — per-user bots, long polling (no webhooks), reminders with an inline Complete button that completes the task from chat.
- Browser notifications — opt-in desktop notifications for due tasks.
- Reminders — re-notify at the priority interval until completed; snooze to silence until later.
- Clients — agent CLI (JSON,
--pretty) and a bubbletea TUI, both token-authed. - Admin & ops —
dodo adminfor users/tokens (direct DB),dodo backup -dumpfor online SQLite backup. - Security — argon2id passwords, session cookies + CSRF, bearer API tokens, AES-256-GCM encryption of Telegram tokens at rest, strict per-user data scoping.
- Deploy — multi-arch container on GHCR, Docker Compose for dev + a Tailscale (
tsrp) production override.
Notable fixes since scaffolding
- Recurring tasks: completing one occurrence keeps the series open; the calendar, list and completed views show every occurrence.
- Telegram poller lifecycle (survives the config-time request context; long-poll timeout) and the
/wsupgrade (ResponseWriter hijack) — real-time and Telegram now work end-to-end.
First release — 58 commits.