Task management apps want your data and your wallet. Todoist locks features behind premium tiers. TickTick has a free limit. Notion is great until you realize your entire workflow lives on someone else’s server.

Vikunja is a self-hosted, open source task manager that handles projects, kanban boards, Gantt charts, and CalDAV sync — all running on your own hardware.

What Vikunja Does

  • Projects and tasks — organize with subtasks, priorities, labels, and due dates
  • Kanban boards — drag-and-drop card view like Trello
  • Gantt charts — timeline view for project planning
  • CalDAV integration — sync tasks to any calendar app (Thunderbird, DAVx⁵, Apple Reminders)
  • Reminders — email and in-app notifications
  • Team collaboration — share projects with other users, assign tasks
  • Attachments and comments — attach files, leave notes on tasks
  • API and webhooks — automate everything
  • Todoist import — migrate your existing tasks directly

Prerequisites

  • A Linux server with Docker and Docker Compose installed
  • A domain name (optional but recommended for HTTPS)
  • 512MB RAM minimum — Vikunja is lightweight

Docker Setup

Create a directory for Vikunja:

mkdir -p ~/vikunja && cd ~/vikunja

Create the compose file:

# docker-compose.yml
version: "3.8"

services:
  vikunja:
    image: vikunja/vikunja:latest
    container_name: vikunja
    restart: unless-stopped
    ports:
      - "3456:3456"
    environment:
      VIKUNJA_DATABASE_TYPE: sqlite
      VIKUNJA_SERVICE_JWTSECRET: change-this-to-a-random-string
      VIKUNJA_SERVICE_FRONTENDURL: http://localhost:3456/
    volumes:
      - ./data:/app/vikunja/files
      - ./db:/db

Start it up:

docker compose up -d

Vikunja is now running at http://your-server-ip:3456. Create your first account through the web interface.

Using PostgreSQL Instead of SQLite

SQLite works fine for personal use. For teams or heavier workloads, switch to PostgreSQL:

# docker-compose.yml
version: "3.8"

services:
  vikunja:
    image: vikunja/vikunja:latest
    container_name: vikunja
    restart: unless-stopped
    ports:
      - "3456:3456"
    environment:
      VIKUNJA_DATABASE_TYPE: postgres
      VIKUNJA_DATABASE_HOST: db
      VIKUNJA_DATABASE_USER: vikunja
      VIKUNJA_DATABASE_PASSWORD: vikunja-db-password
      VIKUNJA_DATABASE_DATABASE: vikunja
      VIKUNJA_SERVICE_JWTSECRET: change-this-to-a-random-string
      VIKUNJA_SERVICE_FRONTENDURL: https://tasks.yourdomain.com/
    volumes:
      - ./data:/app/vikunja/files
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    container_name: vikunja-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: vikunja
      POSTGRES_PASSWORD: vikunja-db-password
      POSTGRES_DB: vikunja
    volumes:
      - ./postgres:/var/lib/postgresql/data

Setting Up Email Notifications

Vikunja can send task reminders and collaboration notifications via email. Add these environment variables to the Vikunja service:

    environment:
      # ... existing vars ...
      VIKUNJA_MAILER_ENABLED: "true"
      VIKUNJA_MAILER_HOST: smtp.yourdomain.com
      VIKUNJA_MAILER_PORT: "587"
      VIKUNJA_MAILER_USERNAME: [email protected]
      VIKUNJA_MAILER_PASSWORD: your-smtp-password
      VIKUNJA_MAILER_FROMEMAIL: [email protected]

CalDAV Sync

Vikunja exposes a CalDAV endpoint at:

https://your-vikunja-url/dav/principals/username/

To connect from your phone or desktop:

DAVx⁵ (Android):

  1. Install DAVx⁵ from F-Droid or Play Store
  2. Add a new account → “Login with URL and user name”
  3. Enter your Vikunja URL with /dav/ appended
  4. Use your Vikunja username and password

Thunderbird:

  1. Open the Tasks panel
  2. Right-click → “New Calendar”
  3. Choose “On the Network” → CalDAV
  4. Enter the CalDAV URL from Vikunja

Apple Reminders (macOS/iOS):

  1. Settings → Calendar → Accounts → Add Account → Other
  2. Add CalDAV Account with your Vikunja URL

Tasks sync bidirectionally — create a task in your phone’s calendar app and it appears in Vikunja.

Importing from Todoist

If you’re migrating from Todoist:

  1. Export your Todoist data (Settings → Backups → Download)
  2. In Vikunja, go to the menu → Import → Todoist
  3. You’ll need a Todoist API token from Settings → Integrations → Developer
  4. Vikunja pulls everything: projects, tasks, labels, priorities, and due dates

Reverse Proxy with Nginx

To serve Vikunja behind your existing Nginx setup:

server {
    listen 443 ssl http2;
    server_name tasks.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/tasks.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tasks.yourdomain.com/privkey.pem;

    client_max_body_size 20M;

    location / {
        proxy_pass http://localhost:3456;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

If you’re using Nginx Proxy Manager, just add a proxy host pointing to localhost:3456 with your domain and enable SSL.

Backup Strategy

Vikunja stores data in two places: the database and uploaded files.

SQLite backup:

# Add to crontab for daily backups
0 3 * * * cp ~/vikunja/db/vikunja.db ~/backups/vikunja-$(date +\%Y\%m\%d).db

PostgreSQL backup:

0 3 * * * docker exec vikunja-db pg_dump -U vikunja vikunja > ~/backups/vikunja-$(date +\%Y\%m\%d).sql

Don’t forget to back up the ./data directory too — that’s where file attachments live.

Troubleshooting

“Unauthorized” when logging in:

  • Make sure VIKUNJA_SERVICE_JWTSECRET is set and hasn’t changed between restarts
  • Clear your browser cookies for the Vikunja domain

CalDAV not syncing:

  • Verify the URL ends with /dav/principals/yourusername/
  • Some clients need the trailing slash — try with and without
  • Check that your Vikunja instance is accessible from outside your network

Tasks not sending reminders:

  • Confirm mailer settings are correct with a test email
  • Check container logs: docker logs vikunja
  • Reminders only trigger if the task has a due date and reminder set

Container won’t start:

  • Check permissions on the data and db directories
  • Run docker compose logs vikunja to see the error
  • Ensure port 3456 isn’t already in use

Vikunja vs Todoist vs TickTick

FeatureVikunjaTodoist FreeTickTick Free
Task limitUnlimitedUnlimited99/list
ProjectsUnlimited59
KanbanPremium only
GanttPremium only
CalDAV
RemindersPremium only2/task
Self-hosted
CostFree$5/mo premium$36/yr premium

Wrapping Up

Vikunja replaces Todoist, Trello, and basic project management tools with a single self-hosted app. It’s lightweight enough to run on a Raspberry Pi and powerful enough for team collaboration.

The CalDAV integration is the killer feature — your tasks live in Vikunja but show up in whatever calendar app you already use. No proprietary sync, no premium tiers, no task limits.

Start with SQLite, switch to PostgreSQL if you outgrow it. Either way, your tasks stay on your hardware.