Skip to content
Conatus laurel logo

Self-hosted task and project management

Projects, recurring work, reminders and shared lists. On your own server.
The Conatus window. A sidebar holds Inbox, Focus, Calendar, Organize and Trash, then pinned projects, the labels urgent and deep-work, and the saved filters Priority 1, Overdue and Urgent work. The Today view lists overdue and due tasks from every project, each with a coloured priority ring and inline metadata: repeat icons, dates, durations, deadline flags, comment counts and labels.
One view across every project. Priority, dates, deadlines, duration, sub-tasks and labels sit on the row. You never open a task to see them.

Projects and sections

Nest projects, split them into sections, tag across all of them. Four priority levels, the same P1 to P4 you already think in. Sub-tasks carry their own dates and labels.

A Conatus project split into Backlog and In Progress sections, each with a task count. Under In Progress, the task 'Build responsive homepage prototype' shows a 0/3 sub-task count and lists its three sub-tasks indented beneath it, each with its own priority ring, date and label.

Recurrence and deadlines

Every day, every Monday, every 2 weeks, every weekday. Due dates and deadlines are separate fields, because they are separate things. An overdue repeat advances instead of piling up.

A Conatus project list. Four tasks carry a repeat icon next to their due date, reading Today 07:30, Friday, Tomorrow 19:00 and two overdue dates in red. 'Renew gym membership' shows a due date of 2026-09-09 and, separately, a deadline flag of 2026-09-12.

Comments and attachments

Share a project, argue in the comments, attach the file. Attachments land in your own MinIO bucket, not on someone else’s CDN. Reminders sit on the same panel.

A Conatus task panel. The left side shows the title, description, three sub-tasks at 0/3, an attached breakpoints.csv at 160 B, and a comment from admin. The right rail shows Project, Date, Deadline, Duration, a P1 priority with a red flag, the labels urgent and deep-work, and a Reminders entry.

Todoist import

Connect the Todoist API or upload a backup, then review exactly what will land before anything is written. Recurring rules, hierarchy, sections, labels and comments all survive. Then work in list, board or calendar view.

The Conatus Todoist importer on step 2 of 3, Review projects. Five projects are listed with checkboxes and counts. Work has 64 tasks, 18 subtasks, 5 sections and 22 comments; Website Redesign carries an amber 'Name already exists' badge.

API and webhooks

Scoped bearer tokens, an OpenAPI 3.1 contract at /api/v1/openapi.json, cursor pagination and Idempotency-Key. Webhooks POST task and project events, signed with HMAC-SHA256. An MCP server ships separately for AI agents.

curl -H "Authorization: Bearer tdm_..." \
"https://tasks.example.com/api/v1/tasks?completed=false"
{
"type": "task.completed",
"taskContent": "Build responsive homepage prototype",
"projectName": "Website Redesign",
"occurredAt": "2026-09-02T12:48:05.412Z"
}
Every webhook POST carries an X-Webhook-Signature header you verify against the secret shown once at creation.
mkdir conatus && cd conatus
curl -O https://raw.githubusercontent.com/nojusmorkunas/conatus/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/nojusmorkunas/conatus/main/.env.example

Before starting the stack, open .env, replace every replace-with-... value, and set CONATUS_VERSION=0.2.0-beta.3. The sample values are placeholders, not safe credentials. For a local install or a reverse proxy on the same host, also set CONATUS_BIND_ADDRESS=127.0.0.1 so port 4399 is not exposed to your network.

docker compose up -d

Conatus is now at http://localhost:4399.

Treat the downloaded .env as a checklist. Compose only checks that the required variables exist; it cannot tell whether you left a placeholder in place. Set CONATUS_ADMIN_USERNAME and CONATUS_ADMIN_PASSWORD to create an administrator on first boot. The install guide walks through credentials, network binding and first login.

The stack. The app, PostgreSQL, MinIO for attachments, a migration job that runs before the app comes up, and a backup timer that dumps the database daily from day one. Everything persists in named Docker volumes, and restoring takes one command.

This is v0.2.0-beta.3, a public beta. Upgrades migrate automatically from any earlier release, but back up first. Some migrations need a restore to roll back. On a domain you also want a reverse proxy.

Support Conatus

Conatus is open source and free. If it has been useful, a GitHub star helps more people find it.

Star on GitHub