Material for MkDocs under docs/, covering self-hosting, the Rune, the quick-add and filter languages, importing from Todoist, CalDAV, mail-to-task, MCP, the AI layer and the API. The version is pinned: the maintainers have announced that MkDocs 2.0 removes the plugin system with no migration path, and an unpinned install would break this build on the day it lands. The landing page shows the quick-add parser as actual text rather than a screenshot of it — that is the thing worth showing, and it reads better as the real thing. It shares the app's design tokens, so the site and what it describes look like one project. MIT licence, contributing guide, security policy and issue templates. Pages deployment is behind workflow_dispatch, so the docs build on every push but nothing is published until the owner chooses to. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.0 KiB
Contributing
Thank you for looking. verdande is one person's self-hosted to-do app, so the bar for a change is "does this make it better for people running it on their own hardware" rather than "is it a feature some product has".
Before you write code
Open an issue first for anything beyond a bug fix. The non-goals are deliberate, and it is kinder to say no to a paragraph than to a weekend.
Running it
VERDANDE_DATA_DIR=./data VERDANDE_DEV=true go run ./cmd/verdande
cd web && npm install && npm run dev
The API is on 8080, the interface on 5173 with /api proxied to it — so the
session cookie stays first-party exactly as it does in production.
What CI checks
gofmt -l . # must print nothing
go vet ./...
go test -race ./...
The Docker image is built on every pull request too, so a Dockerfile that no longer works fails there rather than at release.
What a change needs
Tests for anything that could be silently wrong. Not coverage for its own sake — the parser, the permission checks and the import round trip are tested because a quiet failure in any of them loses somebody's data or shows them somebody else's.
Comments that say why, not what. The code says what it does. A comment earns its place by explaining a decision that is not obvious from reading it: why the connection pool is not 1, why recurrence is parsed before dates, why an uploaded file is never served inline.
Danish and English both. Anything that reads or writes text a person typed
has to work in both. ø is not an accented o, and a feature that only works
for one of the two languages is a broken feature.
Commits
Conventional Commits: feat(store):,
fix(web):, docs:. Releases are semver tags, which build and publish the image.
Security
Please do not open a public issue for a vulnerability. Email the address in SECURITY.md instead.