Self-hosted Todoist alternative
Conatus is an open-source task manager you run on your own server. It was built
by someone who used Todoist for years and wanted the same workflow on hardware
they control. The parts you use every day work the way you already expect: quick
add, P1 to P4, #project, @label, recurring rules and saved filters.
It is not a clone, and it is currently a public beta. This page is the honest version: what carries over, what does not exist yet, and what you get in return.
Where it differs
Section titled “Where it differs”| Conatus | Todoist | |
|---|---|---|
| Hosting | Your server, Docker Compose | Todoist’s cloud |
| Licence | AGPL-3.0 | Proprietary |
| Cost | Free. You pay for the box it runs on | Free tier, then Pro and Business per user |
| Projects, filters, labels | Unlimited | Capped per plan |
| File attachments | Your own MinIO bucket | Todoist’s storage, size capped per plan |
| Telemetry | None | Product analytics |
| Data export | JSON export, plus daily database dumps you own | Account export |
| Clients | Web. Android in development | Web, macOS, Windows, iOS, Android |
| Automation | REST API, webhooks, MCP server | REST API, MCP server, integration directory |
Todoist’s plan limits and prices move; check their pricing page rather than this table. Last compared September 2026.
What Todoist has that Conatus does not
Section titled “What Todoist has that Conatus does not”Worth knowing before you spend an evening on a migration.
- Mobile and desktop apps. Conatus is a web app today. The Android client is on the roadmap, not released. iOS is not planned before v1.0.
- Push notifications. Reminders are absolute datetimes only, delivered by email and an in-app bell, and email needs SMTP configured. No relative reminders, no location reminders, no phone push.
- Offline work. Every client talks to the server. The offline sync API is a v0.3 target.
- The full recurrence grammar.
every day,every monday,every 2 weeks,every weekdayand friends work. Multi-weekday and positional rules such as “every 3rd Friday” do not. - Teams, workspaces and seats. Sharing is per project, by username, on your own instance. One owner, the rest editors. That is the whole permission model.
- An integration directory. There is no marketplace. There is an OpenAPI 3.1 contract, signed webhooks and an MCP server, and you wire up the rest.
- Karma, and years of polish. Conatus is at
v0.2.0-beta.3.
If any of those is a dealbreaker for you, stay where you are. The list is here so you can decide in two minutes instead of after the import.
What you get instead
Section titled “What you get instead”- The data is yours. PostgreSQL and MinIO on your own machine, no third party in the path, backed up daily from first boot with a one-command restore.
- No caps. Projects, sections, labels, filters, collaborators and attachment sizes are bounded by your disk, not a plan.
- No per-seat billing. Add everyone in the house or the team; the price does not change.
- Deadlines and durations as separate fields, on the row, next to priority, repeat, sub-task counts and labels. You do not open a task to see its state.
- Automation built in, not bolted on. Scoped bearer tokens, cursor
pagination,
Idempotency-Key, HMAC-SHA256 webhook signatures, and an MCP server so an AI agent can work your task list against your own instance. - You can read the code, fork it, and keep running the version you have.
Moving your tasks across
Section titled “Moving your tasks across”There is a built-in Todoist importer,
and it is the reason this page exists. Paste a Todoist API token, or upload the
.zip backup, and you get a per-project preview of sections, tasks, subtasks,
comments and warnings before a single row is written.
Projects and their nesting, sections, tasks and descriptions, sub-task hierarchy, priorities, due dates and times, deadlines, durations, labels, comments, and recurring rules that map onto Conatus rules all transfer.
Completed tasks, filters, attachments, reminders, activity history and Todoist collaborators do not. The full table spells out both columns.
The token is used for one request and never stored, name collisions are flagged so you choose rename or skip per project, and nothing is written until you confirm step two. Run it against a fresh instance first if you want to see the result before committing. For the step-by-step version, see Migrate from Todoist.
Try it
Section titled “Try it”Installing takes three commands and about five minutes:
mkdir conatus && cd conatuscurl -O https://raw.githubusercontent.com/nojusmorkunas/conatus/main/docker-compose.ymlcurl -o .env https://raw.githubusercontent.com/nojusmorkunas/conatus/main/.env.exampleFill in .env. Every replace-with-... value is a placeholder, not a safe
credential. Then docker compose up -d. The install guide
covers credentials, network binding and first login, and the
reverse proxy guide covers putting it on a
domain.
