verdande

Self-hosted tasks and projects, shared with the people you share the work with. One binary, SQLite inside it.

Built to be deployed as a Rune in Yggdrasil Panel — upload the manifest, fill in two fields, press start. It also runs anywhere Docker does.

Verdande is one of the three Norns — the one who spins that which is becoming. Not what has been, and not what is fated to be: the thing you are in the middle of. Which is what a to-do list is.

Add a task
file the VAT return next friday at 10am p1 #Accounts @tax
→ file the VAT return Fri 10:00 P1 Accounts tax

The same line works in Danish — betal moms på fredag kl 10 p1 #Firma @regnskab — and the two can be mixed mid-sentence.

What it looks like

The Today view: a sidebar of projects, filters and labels beside a list of tasks due today, each with its priority ring, time and labels.
Today. Dark is the default; there is a light theme too.
The Today view in the light theme: a sidebar of projects, filters and labels beside a list of tasks due today.
Today. Dark is the default; there is a light theme too.
A project in board view: one column per section, with task cards showing due dates, labels and repetition.
Board view — one column per section.
Notes: a list of notes on the left, one open on the right with headings, bullet lists, a quotation and a shell command in a code block.
Notes. Rich text on top, Markdown underneath.
Upcoming as a single week: seven columns of days, each holding the tasks due that day.
A week at a time — so a task can be dragged across a month boundary.
A task open in the detail drawer, with its description, priority, due date, labels, sub-tasks and an attached file.
A task, opened.
The settings page showing five themes as swatches and, below them, four looks written in the typeface each one selects.
Five themes and four looks: how bright, and how it reads.
The instance-wide history page: who did what, in which project, filtered by person and event.
What has been done on the server, across every project.

What it does

Reads what you type

Dates, times, priorities, projects, labels and repetition, parsed out of one line — in Danish and English, mixed freely.

Shared, properly

Owner, editor and viewer roles. People outside your instance join by invite link. Changes appear live.

Notes, beside the work

Rich text to write in, Markdown on disk. File a note in a project and everybody in it can read it; #project and [[another note]] are links, and a task shows what has been written about it. A zip of Markdown goes in and comes back out the same shape, so nothing is trapped here.

A real CalDAV server

Two-way. Tick something off in Apple Reminders and it is ticked off here. Not a read-only feed pretending.

Claude, connected

A built-in MCP server. Ask what is due this week, or have a task added, in conversation.

Your mail, as an inbox

Star a mail in Gmail, or flag one in iCloud or Fastmail, and it becomes a task. Forward one to your own address instead and the subject is parsed like anything else you type. One way: unstarring it later does nothing to the task you made.

Nothing to remember

Start typing anywhere and you are writing a task, with the letter you pressed already in the field. Sign in with a passkey and there is no password to forget either.

Yours to leave

Import from Todoist, export back to it, or take everything as JSON. The round trip is tested, not promised.

Keys stay behind

Mail tokens and mailbox passwords are encrypted in the database, and the key lives in a file beside it — not inside it. So a backup you download, or one that ends up somewhere it should not, does not open your mail.

Who did what

Every change is written down — who moved it, who closed it, who let somebody in. Delete the account and the trail stays: it is the instance's record, not the person's.

Running it

As a Rune in Yggdrasil Panel

This is what it was built for. Runes → Carve a rune, upload rune/verdande.yaml, create a server from it, set the public address and your mail server, and start it. No port forwarding — give it a subdomain and the panel routes it through your Cloudflare Tunnel.

Or with Docker, anywhere

docker run -d --name verdande \
  -p 8080:8080 \
  -v verdande-data:/data \
  -e VERDANDE_BASE_URL=https://todo.example.dk \
  ghcr.io/kristianwind/verdande:latest

Open the address and create the first account. That one is the administrator.

What it will not do

No karma or points. No team workspaces. No native apps. No mail integration beyond Gmail and the forwarding address. No languages beyond Danish and English. And no sync protocol of its own — CalDAV and the API are the sync.