Install Vikunja
Keep track of the company's tasks on your own server, with a list, kanban and calendar, and the right folder permissions from the start.
Last reviewed:
What Vikunja is
A program for keeping track of tasks. You set up projects, fill them with tasks, set deadlines and assign owners, and view everything as a list, a kanban board, a table or a timeline (Gantt). The same tasks, four ways to look at them.
It sounds like any to-do app, and the difference only shows once you are five people. A task has an owner. It has a date. It has a comment thread where the discussion about that specific matter lives, instead of being scattered in a group chat where nobody can find their way back. When someone asks who is doing what, the answer is on one screen.
What makes Vikunja useful in a company is that it is your own. The tasks sit on a machine you control, and they do not disappear because a free service changes its terms in February.
This is a server program
Vikunja is not an installation file you double-click on. It needs a machine to run on and a database next to it, and the easiest way to get both is Docker. If you do not have Docker, start with Install Docker.
Vikunja also has a cloud service that they run themselves for a fee, plus apps for phone and computer that can point either to their server or to yours. What the cloud service costs is on vikunja.io.
Windows and Linux Mint
The same files on both. Create a folder called vikunja in the home folder, that is in C:\Users\ert-namn on Windows and in /home/ert-namn on Linux Mint, and create two empty subfolders in it called files and db. It matters that you create them yourself, and the reason why is at the bottom. Then put a text file called compose.yaml in the vikunja folder:
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://localhost:3456
VIKUNJA_SERVICE_SECRET: BYT_UT_MIG_1
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_PASSWORD: BYT_UT_MIG_2
VIKUNJA_DATABASE_DATABASE: vikunja
ports:
- "3456:3456"
volumes:
- ./files:/app/vikunja/files
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:18
environment:
POSTGRES_USER: vikunja
POSTGRES_PASSWORD: BYT_UT_MIG_2
volumes:
- ./db:/var/lib/postgresql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -U $$POSTGRES_USER"]
interval: 2s
start_period: 30s
Replace the two placeholders with real random strings and save them where the company saves passwords. The two lines called BYT_UT_MIG_2 must contain exactly the same string, since it is the database password in both places. If you write different ones, Vikunja starts but cannot get into the database.
Open the terminal and go into the folder. On Windows it is PowerShell:
cd $HOME\vikunja
On Linux Mint the program is called Terminal:
cd ~/vikunja
Then start:
docker compose up -d
If you are in the wrong folder, Docker answers that no compose.yaml was found, and then it is the cd line that is missing. The health check on the database makes Vikunja wait for it instead of crashing and restarting a couple of times. Open http://localhost:3456 and register the first account. We ran exactly this file, and Vikunja started right away with the latest version.
That address always points to your own computer, that is what localhost means. If you pass it on, the recipient lands on their own machine instead of on your projects. For learning the program it is good enough. If the company is going to share the tasks for real, Vikunja must run on a machine that is switched on, reached at that machine's address, for example http://192.168.1.42:3456, and VIKUNJA_SERVICE_PUBLICURL changed to the same address.
Three things to do first
- Turn off registration once everyone in the company has an account. Add the line
VIKUNJA_SERVICE_ENABLEREGISTRATION: "false"underenvironmentand rundocker compose up -dagain. Otherwise anyone who reaches the address can create an account for themselves. - Set up one project per part of the company instead of one single large one. Marketing, finance, production. Tasks that end up in a shared pile never get done, because no one feels responsible for the pile.
- Assign an owner and a date to every task as soon as you create it. A task without an owner and without a date is a note, not a commitment, and the difference shows when things get busy.
The most common trap
Letting Docker create the folders for you. If you start without creating files and db first, Docker on Linux Mint creates them for root, while Vikunja inside the container runs as a regular user (uid 1000). The result is that the page loads but the log fills with permission denied, and attachments cannot be uploaded. We ran straight into this when we tested. On Windows with Docker Desktop, the same ownership problem normally does not occur.
The solution is simple and should be done before the first start: create the two folders yourself. If it has already happened on Linux Mint, you fix it with sudo chown -R 1000 files (only files needs the ownership change, the database container handles db itself) and restart with docker compose up -d.
If you see a warning that service.jwtsecret is going away, it means an older setting has been renamed. Use VIKUNJA_SERVICE_SECRET, just like in the file above, and you avoid it.