Developers

Everything the app does, you can do from a script.

The app, the command line, AI assistants and your own scripts all write to the same place, so a task created from a script shows up on your phone a moment later.

# add a task from a script
curl -X POST "$OPENTODO/api/v1/tasks" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Renew passport","priority":1}'

# or with the command line
ot add "Renew passport" --priority 1 --due tomorrow

REST API

Tokens with full, read-only or agent scope. Writes go through the same sync log as the app, so a task created by a script appears on every device within seconds.

API reference

The ot command line

A separate static binary for scripts and coding agents: JSON output with schemas, dry runs, idempotency keys and exit codes you can rely on.

CLI reference

MCP for assistants

Connect the assistant you already use. Read-only by default; changes only when the owner and the person both allow them.

MCP endpoint

Webhooks

Signed events for Home Assistant, n8n or a chat relay, with retries and a delivery log.

Webhooks

CalDAV

Two-way sync with Apple Reminders, Thunderbird and Android task apps, with a password per device.

CalDAV

How it is built

A Go server with an embedded database and a web app that keeps a full copy on every device, converging through a log of field-level changes.

Architecture

Your to-do list, on your own server.

Try the demo in your browser. When you like it, install OpenTodo on your server and import your tasks.

OpenTodo is free and open source, with no paid tier. If it helps you, a star on GitHub helps other people find it, and a coffee helps keep it going.

Buy me a coffee