How to Install Vikunja (Self-Hosted To-Do Lists with Reminders and a Phone App)

Planka (tutorial 92) is boards for projects. For the everyday — the shopping list, "call the dentist", the holiday packing list, the jobs for Saturday — you want a plain to-do app with due dates, reminders, subtasks and sharing. Vikunja is that: fast, pleasant, with list, Kanban, table and Gantt views of the same tasks, a web app that works on phones, and CalDAV so tasks appear in your phone's reminders app.
Quick reference
| Task | What |
|---|---|
| Folder | ~/docker/vikunja/compose.yaml |
| Web | http://server-ip:3456 |
| Registration | on for the household, then VIKUNJA_SERVICE_ENABLEREGISTRATION: false |
| Share a list | project → … → Share → user or link |
| Phone | the web app (add to home screen), or CalDAV in Tasks.org / Apple Reminders |
| Reminders by email | VIKUNJA_MAILER_* settings |
1. The compose file
mkdir -p ~/docker/vikunja && cd ~/docker/vikunja
nano compose.yaml
services:
vikunja:
image: vikunja/vikunja:latest
container_name: vikunja
ports:
- "3456:3456"
environment:
VIKUNJA_SERVICE_PUBLICURL: http://192.168.1.50:3456
VIKUNJA_SERVICE_JWTSECRET: ${JWT_SECRET}
VIKUNJA_SERVICE_ENABLEREGISTRATION: "true"
VIKUNJA_SERVICE_TIMEZONE: Europe/London
VIKUNJA_DATABASE_TYPE: sqlite
VIKUNJA_DATABASE_PATH: /app/vikunja/files/vikunja.db
volumes:
- ./files:/app/vikunja/files
restart: unless-stopped
.env with JWT_SECRET. SQLite is plenty for a household.
docker compose up -d
sudo ufw allow from 192.168.1.0/24 to any port 3456
Open http://192.168.1.50:3456, Register, create accounts for the family, then set registration to "false" and up -d.
2. Projects and tasks
A project is a list: Shopping, House, Holiday 2027, Work. Type a task and press Enter. Quick-add magic in the task text: Buy milk tomorrow *shopping !2 sets the due date, a label and priority. Click a task for subtasks, description, attachments, repeat (every week, every 3rd of the month), reminders (an hour before, or at a fixed time), and assignees.
3. Views
Every project has List, Gantt (tasks on a timeline), Table (sortable spreadsheet) and Kanban (columns, drag between them). Same tasks, pick the view that fits — the shopping list in List, the renovation in Kanban. Overview shows everything due across projects; Upcoming is the week ahead.
4. Share
Project → … → Share: add a user (edit or read-only), or a link share for someone without an account — grandparents can tick off the Christmas list from a link. Teams group users for bigger setups.
5. On the phone
- The web app: add http://192.168.1.50:3456 (or the proxied https address) to the home screen. Works offline for reading.
- CalDAV: every project is a CalDAV calendar at /dav/projects/. Add the account in Tasks.org (Android) or Apple Reminders (iOS: Settings → Reminders → Accounts → Other → CalDAV) with your Vikunja login, and tasks sync both ways with native notifications.
6. Reminder emails
Add to the environment:
VIKUNJA_MAILER_ENABLED: "true"
VIKUNJA_MAILER_HOST: smtp.gmail.com
VIKUNJA_MAILER_PORT: 587
VIKUNJA_MAILER_USERNAME: myserver@gmail.com
VIKUNJA_MAILER_PASSWORD: ${SMTP_PASSWORD}
VIKUNJA_MAILER_FROMEMAIL: myserver@gmail.com
(the app password from tutorial 49). Reminders and overdue tasks arrive by email; the Overview also has an Email reminders toggle per user.
Behind the proxy
tasks.example.com → 127.0.0.1:3456 with the WebSocket lines, HTTPS, and set VIKUNJA_SERVICE_PUBLICURL to match.
Troubleshooting
Links in emails or the app point at the wrong address. PUBLICURL.
CalDAV won't connect. The URL is https://tasks.example.com/dav/projects/ (trailing slash), with your Vikunja password — not an app token.
Forgot a password. Email reset needs the mailer; otherwise docker compose exec vikunja /app/vikunja/vikunja user reset-password .
Tasks disappear from a view. A filter is set on that view (the funnel icon) — clear it.
Wrapping up
One container, accounts for the household, a project per list, CalDAV to the phone, email reminders. The shopping list is shared, the holiday list is tickable from a link, and nothing you need to remember is in a company's cloud.
