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:
To connect from your phone or desktop:
DAVx⁵ (Android):
- Install DAVx⁵ from F-Droid or Play Store
- Add a new account → “Login with URL and user name”
- Enter your Vikunja URL with
/dav/appended - Use your Vikunja username and password
Thunderbird:
- Open the Tasks panel
- Right-click → “New Calendar”
- Choose “On the Network” → CalDAV
- Enter the CalDAV URL from Vikunja
Apple Reminders (macOS/iOS):
- Settings → Calendar → Accounts → Add Account → Other
- 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:
- Export your Todoist data (Settings → Backups → Download)
- In Vikunja, go to the menu → Import → Todoist
- You’ll need a Todoist API token from Settings → Integrations → Developer
- 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_JWTSECRETis 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 vikunjato see the error - Ensure port 3456 isn’t already in use
Vikunja vs Todoist vs TickTick
| Feature | Vikunja | Todoist Free | TickTick Free |
|---|---|---|---|
| Task limit | Unlimited | Unlimited | 99/list |
| Projects | Unlimited | 5 | 9 |
| Kanban | ✅ | Premium only | ✅ |
| Gantt | ✅ | Premium only | ❌ |
| CalDAV | ✅ | ❌ | ❌ |
| Reminders | ✅ | Premium only | 2/task |
| Self-hosted | ✅ | ❌ | ❌ |
| Cost | Free | $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.