[{"data":1,"prerenderedAt":97},["ShallowReactive",2],{"$f2anc6wid4tle1":3},{"site":4,"app":16,"alternatives":69,"compose":92,"log":93,"changelog":94},{"hourly_rate_usd":5,"break_even_window_mo":6,"reference_env":7,"attribution":8},20,18,"Fresh Debian 12, Docker + Compose preinstalled, 2 GB RAM \u002F 2 vCPU ($5-class VPS)",{"caniselfhostit":9},{"name":10,"url":11,"repo":12,"license":13,"author":14,"note":15},"caniselfhostit.com","https:\u002F\u002Fcaniselfhostit.com","https:\u002F\u002Fgithub.com\u002Fcaniselfhostit\u002Fcaniselfhostit","MIT","Jashanpreet Singh","Capability data (app → replacement pairings, pricing snapshots) seeded from this dataset. They answer 'can you run it, and how' — go there for guided installs.",{"id":17,"name":18,"domain":19,"category":20,"price_usd_mo":21,"price_plan":22,"price_unit":23,"price_source":24,"price_checked":25,"links":26,"jobs":28,"verdict":33,"alternatives":34,"provenance":36,"verdict_reason":39,"what_you_lose":40,"economics":43,"hardware_tier":47,"verified":48,"compose":56,"derived":61},"todoist","Todoist","todoist.com","work-pm",7,"Pro","flat","https:\u002F\u002Fwww.todoist.com\u002Fpricing","2026-08-05",{"caniselfhostit":27},"https:\u002F\u002Fcaniselfhostit.com\u002Ftodoist",[29,30,31,32],"tasks & projects","labels\u002Ffilters\u002Fdue dates","sharing lists","mobile capture","YES",[35],"vikunja",{"capability_seed":37,"decision_layer":38},"caniselfhostit","original","Vikunja does lists, projects, labels and sharing in one small container — the $84\u002Fyr was for the apps, and the web app plus third-party clients cover enough.",[41,42],"Todoist's polished native apps and natural-language capture","Karma, if you liked being graded by your todo list",{"vps_share_usd_mo":44,"storage_usd_mo":45,"maint_min_mo":46},0.5,0,10,"pi",{"by":49,"at":50,"protocol":51,"setup_min":52,"assistant":53,"evidence":54,"what_broke":57},"zernonia","2026-08-10","v1",35,"claude-code",[55,56],"logs\u002Ftodoist-vikunja.md","compose\u002Ftodoist-vikunja.yml",[58,59,60],"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",{"hourly_rate_usd":5,"self_host_cost_usd_mo":62,"net_saving_usd_mo":63,"setup_cost_usd":64,"break_even_months":65,"break_even_date":66,"markup_index":67,"primary_abandoned":68,"verdict_stale":68},3.83,3.17,11.67,3.68,"2026-11-30",1.83,false,[70],{"id":35,"name":71,"tagline":72,"repo":73,"site":74,"license":75,"category":20,"resources":76,"provenance":81,"metrics":82},"Vikunja","One container holding every task, project and due date, with no project cap and no per-seat bill.","go-vikunja\u002Fvikunja","https:\u002F\u002Fvikunja.io","AGPL-3.0",{"ram_min_mb":77,"disk_gb":78,"arm64":79,"containers":80,"external_db":68},512,5,true,1,{"capability_seed":37,"decision_layer":38},{"id":35,"stars":83,"last_commit":84,"latest_release":85,"docker_pulls":89,"open_issues":90,"fetched_at":91},5033,"2026-08-10T20:56:08Z",{"tag":86,"published_at":87,"url":88},"v2.5.0","2026-08-04T12:46:14Z","https:\u002F\u002Fgithub.com\u002Fgo-vikunja\u002Fvikunja\u002Freleases\u002Ftag\u002Fv2.5.0",null,242,"2026-08-11T03:55:33.413Z","# Vikunja — self-hosted to-do lists and projects (replaces Todoist)\nservices:\n  vikunja:\n    image: vikunja\u002Fvikunja:latest\n    container_name: vikunja\n    restart: unless-stopped\n    # The image runs as uid 1000 but fresh named volumes initialize root-owned; without this\n    # the file handler crash-loops on \"permission denied\".\n    user: \"0:0\"\n    environment:\n      VIKUNJA_SERVICE_PUBLICURL: http:\u002F\u002Flocalhost:3456\n      VIKUNJA_DATABASE_TYPE: sqlite\n      VIKUNJA_DATABASE_PATH: \u002Fdb\u002Fvikunja.db\n      VIKUNJA_SERVICE_ENABLEREGISTRATION: \"true\" # create your account, then flip to false\n    ports:\n      - \"3456:3456\"\n    volumes:\n      - vikunja-files:\u002Fapp\u002Fvikunja\u002Ffiles\n      - vikunja-db:\u002Fdb\n\n  # The vikunja image is distroless — no shell, no wget, nothing to self-probe with.\n  # This sidecar checks the API over the network so `compose up --wait` still proves\n  # the service actually serves, not just that the process exists.\n  vikunja-probe:\n    image: busybox:stable\n    restart: unless-stopped\n    depends_on:\n      - vikunja\n    command: sleep infinity\n    healthcheck:\n      test: [\"CMD-SHELL\", \"wget -qO- http:\u002F\u002Fvikunja:3456\u002Fapi\u002Fv1\u002Finfo >\u002Fdev\u002Fnull || exit 1\"]\n      interval: 5s\n      timeout: 5s\n      retries: 24\n      start_period: 15s\n\nvolumes:\n  vikunja-files:\n  vikunja-db:\n","# Timed setup log: Todoist → vikunja\n\n**Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10\n**Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 \u002F Compose v5.1\n\n## Timeline\n\n| Step | Time |\n|---|---|\n| Read upstream docs, draft compose with healthcheck | ~11 min |\n| **Boot: all services healthy in 11 s (measured, `compose up --wait`)** | — |\n| Endpoint-level workflow check (login\u002Fhealth\u002FAPI serve) + re-run from clean volumes | ~11 min |\n| **Total: ~35 min** | |\n\nBoot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this\nsession including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow —\ndispute anything that doesn't reproduce (CONTRIBUTING.md).\n\n## What broke\n\n- 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\n- The image is distroless (no shell, no wget) — the compose ships a busybox sidecar probe so the health gate still proves HTTP serves\n- Registration ships open by default — create your account, then flip VIKUNJA_SERVICE_ENABLEREGISTRATION off\n\n## Verdict-relevant notes\n\n- \u002Fapi\u002Fv1\u002Finfo endpoint makes the health gate clean.\n",[95],{"date":50,"app":17,"from":89,"to":33,"reason":96},"Initial verdict: Vikunja does lists, projects, labels and sharing in one small container.",1786459422182]