Vikunja — a task tracker that talks to agents
Trello was comfortable but my data lived on someone else's server. Vikunja is a local alternative, plus MCP. Showing how I wired it into Claude Code and what actually changed in my workflow.

I was on Trello for a year. It worked. But every task, every comment, every attachment lived on someone else's server. I tried Notion, same thing. Eventually I stood up Vikunja locally and wired in MCP. Here's why I'm not going back.
What is Vikunja
Open source, self-hosted, written in Go. Columns, tags, deadlines, reminders. REST API, SDK, two-way integratable.
My stack:
- Vikunja backend in Docker (internal port 3456)
- PostgreSQL as the database
- Caddy with TLS via Cloudflare cert
- API token scoped only to my agent account
The MCP server
This is the point. The vikunja-mcp plugin gives the agent:
vikunja_create_task(with labels, dueDate, parent)vikunja_list_tasks(by project, status, label)vikunja_update_task(move, deadline, status)vikunja_delete_task(with a guard hook!)
Config:
{
"mcpServers": {
"vikunja": {
"command": "vikunja-mcp",
"env": {
"VIKUNJA_URL": "http://localhost:3456",
"VIKUNJA_TOKEN": "claude-mcp-..."
}
}
}
}Workflow #1: brief breakdown
Most common use. I paste a client brief or my own note:
> Break this brief into tasks in project "kamilkaletka.dev/blog".
Use topic labels. Set deadlines to -2 days before publish date.The agent calls vikunja_list_projects, finds "kamilkaletka.dev/blog", then 6× vikunja_create_task with proper labels and deadlines. 30 seconds vs 5 minutes manually.
Workflow #2: morning standup with the agent
> What's on for today? Show tasks due today + overdue.The agent calls vikunja_list_tasks with due_lte=today and status=open, formats the results into a readable list. ~10 seconds, full view.
Workflow #3: closing tasks via conversation
> Start the task "Write the MCP post". I finished the Vikunja post, close it.The agent manages statuses from conversation. I don't open the UI for a week.
What locality gave me
Three things I didn't have in cloud:
1. Full ACL control. The agent's API token sees only one project (workspace for the agent). The rest belongs to my main user. Even if the agent goes off the rails, scope is small.
2. Integrated backup. The Vikunja DB ships to the same pg_dump as the rest of my services. If something happens, point-in-time recovery.
3. No rate limits. The agent creates 50 tasks in 3 seconds. Trello would throttle, Vikunja on localhost, no problem.
Minimal config
If you want to copy:
# docker-compose.yml
services:
vikunja:
image: vikunja/vikunja:latest
environment:
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: postgres
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_PASSWORD: ...
ports:
- "127.0.0.1:3456:3456"
depends_on:
- postgres
postgres:
image: postgres:15
environment:
POSTGRES_USER: vikunja
POSTGRES_PASSWORD: ...
volumes:
- vikunja-pg:/var/lib/postgresql/data
volumes:
vikunja-pg:docker compose up -d, open http://localhost:3456, make an account, generate a token, wire MCP. ~10 minutes total.
What doesn't work perfectly
1. The mobile app is weak. Browser on phone is fine, the dedicated client, mediocre. For mobile I use Telegram to the agent, which updates for me.
2. No task dependencies in the UI. They exist as relations but visualization is weak. For genuinely complex projects I still reach for Linear.
3. Filtering by multiple labels gets confused. The agent handles compound queries better than the UI.
Vikunja is "Trello that lives at my place and talks to the agent". If you have data you don't want to share with third parties and a workflow built around an agent, this is the best setup I found.