{
  "slug": "todoist-to-vikunja",
  "title": "Todoist Business to self-hosted Vikunja",
  "summary": "Todoist Business is cheap per seat, which makes this a genuine test of whether a $96-a-year subscription is worth escaping at all.",
  "publishable": true,
  "block_reason": null,
  "freshness": {
    "state": "fresh",
    "publishable": true,
    "oldest_input_days": 46.5,
    "problems": []
  },
  "incumbent": {
    "vendor": "Todoist",
    "vendor_id": "todoist",
    "plan": "Business",
    "plan_id": "business",
    "amount": 8,
    "period": "month",
    "per_seat": true,
    "billed": "annual",
    "seats": 6,
    "quote": "Teams Business Manage your teamwork, too ... US $8 plus local tax per user/month, $96 billed yearly",
    "caveat": null,
    "source_url": "https://www.todoist.com/pricing",
    "verified_at": "2026-10-19",
    "needs_reverification": false
  },
  "alternative": {
    "name": "Vikunja (self-hosted)",
    "repo": "go-vikunja/vikunja",
    "project": {
      "full_name": "go-vikunja/vikunja",
      "url": "https://github.com/go-vikunja/vikunja",
      "homepage": "https://vikunja.io",
      "description": "The task manager you actually own.",
      "stars": 5793,
      "forks": 761,
      "open_issues": 257,
      "license": "AGPL-3.0",
      "archived": false,
      "pushed_at": "2026-10-19T10:37:28Z",
      "days_since_push": 0,
      "latest_release": {
        "tag": "v2.7.0",
        "published_at": "2026-10-02T21:18:37Z",
        "url": "https://github.com/go-vikunja/vikunja/releases/tag/v2.7.0"
      },
      "days_since_release": 17,
      "health": "active",
      "recommended": true,
      "verified_at": "2026-10-19T10:53:57.587Z"
    },
    "box": {
      "provider": "Linode",
      "name": "Nanode 1GB",
      "id": "linode:g6-nanode-1",
      "vcpu": 1,
      "ram_gb": 1,
      "disk_gb": 25,
      "bandwidth_tb": 0.98,
      "monthly_usd": 5,
      "url": "https://www.linode.com/pricing/",
      "verified_at": "2026-10-19T10:53:42.716Z"
    },
    "storage": {
      "id": "backblaze-b2",
      "name": "Backblaze B2",
      "usd_per_gb_month": 0.00695,
      "egress": "free up to 3x stored volume per month, then $0.01/GB",
      "pricing_url": "https://www.backblaze.com/cloud-storage/pricing",
      "quote": "the amount of data stored per byte-hour over the last month at a rate of $6.95/TB/30-day",
      "verified_at": "2026-09-03",
      "verified_by": "human",
      "affiliate": true,
      "gb": 10,
      "monthly_usd": 0.07
    },
    "requirements": {
      "ram_gb": 1,
      "vcpu": 1,
      "disk_gb": 20
    },
    "box_alternatives": [
      {
        "provider": "Vultr",
        "name": "vc2-1c-1gb",
        "monthly_usd": 5,
        "vcpu": 1,
        "ram_gb": 1,
        "disk_gb": 25,
        "url": "https://www.vultr.com/pricing/",
        "chosen": false
      },
      {
        "provider": "Linode",
        "name": "Nanode 1GB",
        "monthly_usd": 5,
        "vcpu": 1,
        "ram_gb": 1,
        "disk_gb": 25,
        "url": "https://www.linode.com/pricing/",
        "chosen": true
      },
      {
        "provider": "DigitalOcean",
        "name": "1 vCPU · 1 GB",
        "monthly_usd": 6,
        "vcpu": 1,
        "ram_gb": 1,
        "disk_gb": 25,
        "url": "https://www.digitalocean.com/pricing/droplets",
        "chosen": false
      }
    ],
    "migration_hours": 5,
    "maintenance_hours_per_month": 0.4
  },
  "result": {
    "computable": true,
    "inputs": {
      "seats": 6,
      "horizon_months": 36,
      "hourly_rate": 50
    },
    "incumbent": {
      "cash_monthly": 48,
      "time_monthly": 0,
      "monthly": 48,
      "one_time": 0,
      "annual": 576
    },
    "alternative": {
      "cash_monthly": 5.07,
      "time_monthly": 20,
      "monthly": 25.07,
      "one_time": 250,
      "cash_one_time": 0,
      "time_one_time": 250,
      "annual": 300.83
    },
    "delta": {
      "monthly": 22.93,
      "upfront_to_switch": 250,
      "annual": 275.17
    },
    "break_even_month": 11,
    "break_even_hourly_rate": 79.66,
    "totals": {
      "at_12_months": {
        "incumbent": 576,
        "alternative": 550.83
      },
      "at_36_months": {
        "incumbent": 1728,
        "alternative": 1152.5
      },
      "at_horizon": {
        "incumbent": 1728,
        "alternative": 1152.5
      }
    },
    "savings": {
      "year_1": 25.17,
      "year_3": 575.5,
      "at_horizon": 575.5
    },
    "verdict": "switch"
  },
  "managed": {
    "provider": "PikaPods",
    "app": "Vikunja",
    "url": "https://www.pikapods.com/",
    "note": "Runs the same open-source software, applies updates, and takes daily encrypted backups to storage you own.",
    "source_url": "https://www.pikapods.com/apps",
    "quote": "Vikunja Self-hosted task and … Run Your Own From $2.7/month",
    "monthly_usd": 2.7,
    "verified_at": "2026-10-19T10:54:00.624Z",
    "migration_hours": 3,
    "result": {
      "computable": true,
      "inputs": {
        "seats": 6,
        "horizon_months": 36,
        "hourly_rate": 50
      },
      "incumbent": {
        "cash_monthly": 48,
        "time_monthly": 0,
        "monthly": 48,
        "one_time": 0,
        "annual": 576
      },
      "alternative": {
        "cash_monthly": 2.7,
        "time_monthly": 0,
        "monthly": 2.7,
        "one_time": 150,
        "cash_one_time": 0,
        "time_one_time": 150,
        "annual": 32.4
      },
      "delta": {
        "monthly": 45.3,
        "upfront_to_switch": 150,
        "annual": 543.6
      },
      "break_even_month": 4,
      "break_even_hourly_rate": 543.6,
      "totals": {
        "at_12_months": {
          "incumbent": 576,
          "alternative": 182.4
        },
        "at_36_months": {
          "incumbent": 1728,
          "alternative": 247.2
        },
        "at_horizon": {
          "incumbent": 1728,
          "alternative": 247.2
        }
      },
      "savings": {
        "year_1": 393.6,
        "year_3": 1480.8,
        "at_horizon": 1480.8
      },
      "verdict": "switch"
    },
    "crossover": 543.6
  },
  "curve": [
    {
      "month": 0,
      "incumbent": 0,
      "alternative": 250
    },
    {
      "month": 1,
      "incumbent": 48,
      "alternative": 275.07
    },
    {
      "month": 2,
      "incumbent": 96,
      "alternative": 300.14
    },
    {
      "month": 3,
      "incumbent": 144,
      "alternative": 325.21
    },
    {
      "month": 4,
      "incumbent": 192,
      "alternative": 350.28
    },
    {
      "month": 5,
      "incumbent": 240,
      "alternative": 375.35
    },
    {
      "month": 6,
      "incumbent": 288,
      "alternative": 400.42
    },
    {
      "month": 7,
      "incumbent": 336,
      "alternative": 425.49
    },
    {
      "month": 8,
      "incumbent": 384,
      "alternative": 450.56
    },
    {
      "month": 9,
      "incumbent": 432,
      "alternative": 475.63
    },
    {
      "month": 10,
      "incumbent": 480,
      "alternative": 500.7
    },
    {
      "month": 11,
      "incumbent": 528,
      "alternative": 525.77
    },
    {
      "month": 12,
      "incumbent": 576,
      "alternative": 550.84
    },
    {
      "month": 13,
      "incumbent": 624,
      "alternative": 575.91
    },
    {
      "month": 14,
      "incumbent": 672,
      "alternative": 600.98
    },
    {
      "month": 15,
      "incumbent": 720,
      "alternative": 626.05
    },
    {
      "month": 16,
      "incumbent": 768,
      "alternative": 651.12
    },
    {
      "month": 17,
      "incumbent": 816,
      "alternative": 676.19
    },
    {
      "month": 18,
      "incumbent": 864,
      "alternative": 701.26
    },
    {
      "month": 19,
      "incumbent": 912,
      "alternative": 726.33
    },
    {
      "month": 20,
      "incumbent": 960,
      "alternative": 751.4
    },
    {
      "month": 21,
      "incumbent": 1008,
      "alternative": 776.47
    },
    {
      "month": 22,
      "incumbent": 1056,
      "alternative": 801.54
    },
    {
      "month": 23,
      "incumbent": 1104,
      "alternative": 826.61
    },
    {
      "month": 24,
      "incumbent": 1152,
      "alternative": 851.68
    },
    {
      "month": 25,
      "incumbent": 1200,
      "alternative": 876.75
    },
    {
      "month": 26,
      "incumbent": 1248,
      "alternative": 901.82
    },
    {
      "month": 27,
      "incumbent": 1296,
      "alternative": 926.89
    },
    {
      "month": 28,
      "incumbent": 1344,
      "alternative": 951.96
    },
    {
      "month": 29,
      "incumbent": 1392,
      "alternative": 977.03
    },
    {
      "month": 30,
      "incumbent": 1440,
      "alternative": 1002.1
    },
    {
      "month": 31,
      "incumbent": 1488,
      "alternative": 1027.17
    },
    {
      "month": 32,
      "incumbent": 1536,
      "alternative": 1052.24
    },
    {
      "month": 33,
      "incumbent": 1584,
      "alternative": 1077.31
    },
    {
      "month": 34,
      "incumbent": 1632,
      "alternative": 1102.38
    },
    {
      "month": 35,
      "incumbent": 1680,
      "alternative": 1127.45
    },
    {
      "month": 36,
      "incumbent": 1728,
      "alternative": 1152.52
    }
  ],
  "sensitivity": [
    {
      "hourly_rate": 0,
      "verdict": "switch",
      "break_even_month": 0,
      "savings_at_horizon": 1545.5
    },
    {
      "hourly_rate": 25,
      "verdict": "switch",
      "break_even_month": 4,
      "savings_at_horizon": 1060.5
    },
    {
      "hourly_rate": 50,
      "verdict": "switch",
      "break_even_month": 11,
      "savings_at_horizon": 575.5
    },
    {
      "hourly_rate": 75,
      "verdict": "marginal",
      "break_even_month": 30,
      "savings_at_horizon": 90.5
    },
    {
      "hourly_rate": 100,
      "verdict": "stay",
      "break_even_month": 171,
      "savings_at_horizon": -394.5
    },
    {
      "hourly_rate": 150,
      "verdict": "stay",
      "break_even_month": null,
      "savings_at_horizon": -1364.5
    },
    {
      "hourly_rate": 200,
      "verdict": "stay",
      "break_even_month": null,
      "savings_at_horizon": -2334.5
    }
  ],
  "tradeoffs": {
    "you_lose": [
      "Todoist's natural-language quick add, which is the feature most people actually stay for",
      "Mature apps on every platform, including watch and widget support",
      "Karma, streaks and the habit machinery that makes people keep using it"
    ],
    "you_gain": [
      "A Go binary that runs comfortably on the smallest box any provider sells",
      "Free seats, so the whole team costs the same as one person",
      "Kanban, Gantt and list views without a higher tier"
    ]
  },
  "caveats": [
    "Vikunja imports from Todoist directly, which is why the migration estimate is low. Recurring tasks are the part that most often needs rebuilding by hand.",
    "Todoist Business is one of the cheaper subscriptions on this site. At small team sizes the arithmetic here usually favours simply paying it."
  ],
  "category": "tasks",
  "updated_at": "2026-10-19"
}