Tasks are stored as plain JSONL on disk (one JSON object per line). A local HTTP server exposes them over a REST + SSE API. Three interfaces ship out of the box:
- CLI: todoopen task create, todoopen task list, etc. - TUI: a Bubble Tea terminal UI with live SSE updates - Web UI: a browser interface, also live via SSE
All three talk to the same local API, so they stay in sync automatically.
The part I'm most excited about is the adapter system.
- View adapters control how task data is rendered; sync adapters handle push/pull to remotes.
The contracts are small so it's straightforward to add your own. Want to sync to a custom backend or render tasks as Markdown? Write an adapter.
Data stays yours. tasks.jsonl is human-readable, grep-able, and never locked behind a database.
It also has agent primitives (leases, idempotency keys, heartbeats) if you want to point an AI agent at it, but the core design is human-first: plain files, open protocol, composable interfaces.