docs(phase6): documentation site, landing page and open-source scaffolding

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>
This commit is contained in:
Kristian Wind
2026-08-17 08:08:36 +02:00
co-authored by Claude Opus 5
parent 6b19ed062d
commit 7c9bde2cfd
25 changed files with 1716 additions and 14 deletions
+65
View File
@@ -0,0 +1,65 @@
# Saved filters
A filter is a small expression describing a slice of your tasks. The grammar is
Todoist's, so if you are coming from there you already know it.
```
today & p1
#Firma & @regnskab
overdue | (today & assigned to: me)
7 days & !@venter
```
## What you can write
| Term | Matches |
|---|---|
| `today`, `i dag` | Due today. |
| `tomorrow`, `i morgen` | Due tomorrow. |
| `overdue`, `forsinket` | Due before today. |
| `7 days`, `14 dage`, `2 weeks` | Due between now and then. A window, not a single day. |
| `no date`, `ingen dato` | No due date at all. |
| `p1` … `p4` | That priority. |
| `#Firma` | In that project. |
| `@regnskab` | Carrying that label. |
| `assigned to: me`, `tildelt: mig` | Assigned to you. |
| `assigned to: anders@example.dk` | Assigned to that person. |
| `assigned to: none` | Assigned to nobody. |
| `recurring`, `gentagen` | Repeats. |
| `completed`, `færdig` | Already done. |
| `subtask`, `underopgave` | Has a parent. |
| `2026-12-24` | Due on that exact day. |
| anything else | Searched for in the title and description. |
## Combining them
| Operator | Means |
|---|---|
| `&` | Both. |
| `|` or `,` | Either. |
| `!` | Not. |
| `( )` | Grouping. |
`&` binds tighter than `|`, so `overdue | today & p1` means
`overdue | (today & p1)`. Use brackets when you mean otherwise.
## Some that are worth saving
```
today & p1 What has to happen today
overdue What slipped
7 days & !@venter The week, minus what you are blocked on
#Firma & assigned to: me Your part of a shared project
p1 & no date Important, unscheduled — usually a mistake
recurring & overdue Habits you have stopped doing
```
## Why an expression is refused
A filter is compiled before it is saved. A filter that cannot run is worse than
none: you would find out later, from a list that is empty for a reason nobody can
see. If you get an error, it names the part it could not read.
!!! note "Labels are personal"
`@regnskab` matches *your* label of that name. Somebody else using the same
word on their own tasks is a different label, and your filter will not find it.