shouldiselfhost?they tell you if you can — we tell you if you should
THE DECISION LAYER FOR SELF-HOSTING100 APPS UNDER COVERAGEPROTOCOL v1NO VENDOR HAS EVER PAID FOR A RATING
§
WORK-PM
Todoist logo

Should I self-host Todoist?

$7/mo · Pro · alternative: Vikunja
RATING
YES
OUTLOOK
NOT ASSIGNED
RATIONALE

Vikunja does lists, projects, labels and sharing in one small container — the $84/yr was for the apps, and the web app plus third-party clients cover enough.

WHAT YOU LOSE
01

Todoist's polished native apps and natural-language capture

02

Karma, if you liked being graded by your todo list

WHAT YOU'RE PAYING FOR

tasks & projects · labels/filters/due dates · sharing lists · mobile capture

Self-Hosting Facts
1 app per panel · Todoist
Assumes 1 seat on 1 always-on box you already run
Amount per month% of sub *
Subscription$7.00
VPS share0.507%
Storage + backup0.000%
Your hours · 10 min @ $203.3348%
Self-hosted all-in3.8355%
Effective markup1.8×
Setup · 35 min measured$11.67 once
Break-even3.7 months
VERDICT
YES
OUTLOOK
NOT ASSIGNED

* Percent of the subscription price. Your time is priced at the slider's rate — $0/h ("my homelab time is free and I love it") is a legitimate position. Every number is derived from the record, never hand-written. Price source, checked 2026-08-05.

Runs comfortably on a Raspberry Pi.

01
ALTERNATIVES
Ranked alternatives
01Vikunja logo
VikunjaOne container holding every task, project and due date, with no project cap and no per-seat bill.
go-vikunja/vikunja · ★ 5,033 · 46d
Vikunja running from the boot-verified compose file
Vikunja, running from the compose file on this page — screenshot from our verified instance, not marketing material.
02
EVIDENCE
PROTOCOL
v1
VERIFIED BY
zernonia
REVIEWED
10 AUG 2026
SETUP MEASURED
35 MIN
AI ASSISTANT
CLAUDE-CODE · STATED
WHAT BROKE
01

Fresh named volumes initialize root-owned while the image runs as uid 1000 — file handler crash-loops on permission denied until you set user: or chown

02

The image is distroless (no shell, no wget) — the compose ships a busybox sidecar probe so the health gate still proves HTTP serves

03

Registration ships open by default — create your account, then flip VIKUNJA_SERVICE_ENABLEREGISTRATION off

THE TESTED COMPOSE FILE — CI-BOOTED WEEKLY
# Vikunja — self-hosted to-do lists and projects (replaces Todoist)
services:
  vikunja:
    image: vikunja/vikunja:latest
    container_name: vikunja
    restart: unless-stopped
    # The image runs as uid 1000 but fresh named volumes initialize root-owned; without this
    # the file handler crash-loops on "permission denied".
    user: "0:0"
    environment:
      VIKUNJA_SERVICE_PUBLICURL: http://localhost:3456
      VIKUNJA_DATABASE_TYPE: sqlite
      VIKUNJA_DATABASE_PATH: /db/vikunja.db
      VIKUNJA_SERVICE_ENABLEREGISTRATION: "true" # create your account, then flip to false
    ports:
      - "3456:3456"
    volumes:
      - vikunja-files:/app/vikunja/files
      - vikunja-db:/db

  # The vikunja image is distroless — no shell, no wget, nothing to self-probe with.
  # This sidecar checks the API over the network so `compose up --wait` still proves
  # the service actually serves, not just that the process exists.
  vikunja-probe:
    image: busybox:stable
    restart: unless-stopped
    depends_on:
      - vikunja
    command: sleep infinity
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://vikunja:3456/api/v1/info >/dev/null || exit 1"]
      interval: 5s
      timeout: 5s
      retries: 24
      start_period: 15s

volumes:
  vikunja-files:
  vikunja-db:

Want a guided install instead? caniselfhostit.com/todoist has AI-agent prompts that assume a bare machine — that's their half of the stool, and it's good.

FULL TIMED LOG
# Timed setup log: Todoist → vikunja

**Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10
**Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 / Compose v5.1

## Timeline

| Step | Time |
|---|---|
| Read upstream docs, draft compose with healthcheck | ~11 min |
| **Boot: all services healthy in 11 s (measured, `compose up --wait`)** | — |
| Endpoint-level workflow check (login/health/API serve) + re-run from clean volumes | ~11 min |
| **Total: ~35 min** | |

Boot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this
session including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow —
dispute anything that doesn't reproduce (CONTRIBUTING.md).

## What broke

- Fresh named volumes initialize root-owned while the image runs as uid 1000 — file handler crash-loops on permission denied until you set user: or chown
- The image is distroless (no shell, no wget) — the compose ships a busybox sidecar probe so the health gate still proves HTTP serves
- Registration ships open by default — create your account, then flip VIKUNJA_SERVICE_ENABLEREGISTRATION off

## Verdict-relevant notes

- /api/v1/info endpoint makes the health gate clean.
03
HISTORY
10 AUG 2026UNRATED → YESInitial verdict: Vikunja does lists, projects, labels and sharing in one small container.