Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d390d021f | ||
|
|
18db79c063 | ||
|
|
1612f53966 |
@@ -85,7 +85,7 @@ what a person reads is decided by the client, which knows what language they are
|
|||||||
curl -X POST https://todo.example.dk/api/v1/tasks/quick-add \
|
curl -X POST https://todo.example.dk/api/v1/tasks/quick-add \
|
||||||
-H "Authorization: Bearer vrd_..." \
|
-H "Authorization: Bearer vrd_..." \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{"text": "betal moms i morgen kl 10 p1 #Firma @regnskab"}'
|
-d '{"text": "file the VAT return tomorrow at 10am p1 #Accounts @tax"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
### Projects and sections
|
### Projects and sections
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ forward mail to, and an MCP endpoint so Claude can work your task list directly.
|
|||||||
|
|
||||||
## What it does
|
## What it does
|
||||||
|
|
||||||
- **[Quick add](quick-add.md) that reads what you type.** `betal moms i morgen kl
|
- **[Quick add](quick-add.md) that reads what you type.** `file the VAT return
|
||||||
10 p1 #Firma @regnskab` becomes a task due tomorrow at 10:00, priority 1, in
|
tomorrow at 10am p1 #Accounts @tax` becomes a task due tomorrow at 10:00,
|
||||||
Firma, labelled regnskab. Danish and English, mixed freely in one line.
|
priority 1, in Accounts, labelled tax. Danish and English, mixed freely in one
|
||||||
|
line.
|
||||||
- **Projects, sections, sub-tasks, labels, [saved filters](filters.md).** List,
|
- **Projects, sections, sub-tasks, labels, [saved filters](filters.md).** List,
|
||||||
board and calendar views, and foldable groups over the projects in the sidebar.
|
board and calendar views, and foldable groups over the projects in the sidebar.
|
||||||
The calendar draws each task to its length — drag the foot to resize, the body
|
The calendar draws each task to its length — drag the foot to resize, the body
|
||||||
@@ -39,8 +40,17 @@ forward mail to, and an MCP endpoint so Claude can work your task list directly.
|
|||||||
- **Live sync** — a change made by somebody else appears without a refresh.
|
- **Live sync** — a change made by somebody else appears without a refresh.
|
||||||
- **Repeating tasks** as RRULE, comments and attachments, and reminders that go
|
- **Repeating tasks** as RRULE, comments and attachments, and reminders that go
|
||||||
out as Web Push to an iPhone or a Mac.
|
out as Web Push to an iPhone or a Mac.
|
||||||
- **[Calendar](caldav.md), [mail](mail.md) and [Claude](mcp.md)** connected over
|
- **[Your mail as an inbox](mailboxes.md).** Star a mail in Gmail, or flag one
|
||||||
open standards rather than private formats.
|
over IMAP in iCloud or Fastmail, and it becomes a task — and the star or flag
|
||||||
|
comes off once it has, so a starred inbox empties as the tasks are made instead
|
||||||
|
of only filling up.
|
||||||
|
- **[Calendar](caldav.md) and [Claude](mcp.md)** connected over open standards
|
||||||
|
rather than private formats.
|
||||||
|
- **Six themes**, three dark and three light — including *Charcoal*, a warm
|
||||||
|
near-black after Apple Notes — and a size and typeface chosen apart from them.
|
||||||
|
- **Holds through a short network drop.** A save rides out a few seconds of no
|
||||||
|
signal and goes through when it comes back; a reload opens from what it last saw
|
||||||
|
rather than the browser's offline page. It installs as a PWA.
|
||||||
|
|
||||||
## What it looks like
|
## What it looks like
|
||||||
|
|
||||||
@@ -60,6 +70,16 @@ columns.*
|
|||||||
marked with an arrow to them, so a delegated task reads as delegated wherever you
|
marked with an arrow to them, so a delegated task reads as delegated wherever you
|
||||||
meet it.*
|
meet it.*
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Charcoal, the newest of six themes — a warm near-black after Apple Notes, with
|
||||||
|
amber where the accent green usually is.*
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Six themes — three dark, three light — chosen on the settings page, with the
|
||||||
|
typeface and how tightly it sits set apart from them.*
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
*Where [Gmail](mailboxes.md), the [calendar feed](caldav.md) and the
|
*Where [Gmail](mailboxes.md), the [calendar feed](caldav.md) and the
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ Both endpoints run the same server and reach the same things.
|
|||||||
| `complete_task` | Tick one off. |
|
| `complete_task` | Tick one off. |
|
||||||
| `add_comment` | Comment on a task. |
|
| `add_comment` | Comment on a task. |
|
||||||
|
|
||||||
`create_task` prefers natural language, so *"add betal moms i morgen kl 10 p1
|
`create_task` prefers natural language, so *"add file the VAT return tomorrow at
|
||||||
#Firma"* goes through the same parser the app uses — dates, priorities, projects,
|
10am p1 #Accounts"* goes through the same parser the app uses — dates, priorities,
|
||||||
labels and recurrence in either language.
|
projects, labels and recurrence in either language.
|
||||||
|
|
||||||
## What it can reach
|
## What it can reach
|
||||||
|
|
||||||
|
|||||||
@@ -832,9 +832,9 @@ paths:
|
|||||||
tags: [tasks]
|
tags: [tasks]
|
||||||
summary: Create a task from one line of natural language.
|
summary: Create a task from one line of natural language.
|
||||||
description: |
|
description: |
|
||||||
Danish and English. `betal moms i morgen kl 10 p1 #Firma @vigtigt` becomes
|
Danish and English. `file the VAT return tomorrow at 10am p1 #Accounts @tax`
|
||||||
a task due tomorrow at 10:00, priority 1, in the project Firma, labelled
|
becomes a task due tomorrow at 10:00, priority 1, in the project Accounts,
|
||||||
vigtigt. An unknown `#project` is not an error — the task goes to the
|
labelled tax. An unknown `#project` is not an error — the task goes to the
|
||||||
Inbox rather than a thought being thrown away over a typo.
|
Inbox rather than a thought being thrown away over a typo.
|
||||||
requestBody:
|
requestBody:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
One line in, a fully-formed task out.
|
One line in, a fully-formed task out.
|
||||||
|
|
||||||
```
|
```
|
||||||
betal moms i morgen kl 10 p1 #Firma @regnskab
|
file the VAT return tomorrow at 10am p1 #Accounts @tax
|
||||||
```
|
```
|
||||||
|
|
||||||
becomes a task called **betal moms**, due tomorrow at 10:00, priority 1, in the
|
becomes a task called **file the VAT return**, due tomorrow at 10:00, priority 1,
|
||||||
Firma project, labelled regnskab.
|
in the Accounts project, labelled tax.
|
||||||
|
|
||||||
The parts it understands are tinted underneath the text as you type, so you can see
|
The parts it understands are tinted underneath the text as you type, so you can see
|
||||||
it being read before you commit to it.
|
it being read before you commit to it.
|
||||||
@@ -16,8 +16,8 @@ it being read before you commit to it.
|
|||||||
|
|
||||||
| You type | It means |
|
| You type | It means |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `#Firma` | Put it in that project. `#"Q3 rapport"` for a name with spaces. |
|
| `#Accounts` | Put it in that project. `#"Q3 report"` for a name with spaces. |
|
||||||
| `@regnskab` | Add that label. As many as you like. |
|
| `@tax` | Add that label. As many as you like. |
|
||||||
| `p1` … `p4` | Priority. `!!!`, `!!` and `!` also work. |
|
| `p1` … `p4` | Priority. `!!!`, `!!` and `!` also work. |
|
||||||
| `i dag`, `i morgen`, `i overmorgen` | Today, tomorrow, the day after. |
|
| `i dag`, `i morgen`, `i overmorgen` | Today, tomorrow, the day after. |
|
||||||
| `mandag`, `på fredag` | The next such weekday. |
|
| `mandag`, `på fredag` | The next such weekday. |
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 334 KiB After Width: | Height: | Size: 334 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 370 KiB After Width: | Height: | Size: 367 KiB |
|
Before Width: | Height: | Size: 355 KiB After Width: | Height: | Size: 352 KiB |
|
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 232 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 232 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 220 KiB |
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 220 KiB |
@@ -992,12 +992,22 @@
|
|||||||
<figure class="shot">
|
<figure class="shot">
|
||||||
<img
|
<img
|
||||||
src="screenshots/themes.webp"
|
src="screenshots/themes.webp"
|
||||||
alt="The settings page showing five themes as swatches and, below them, four looks written in the typeface each one selects."
|
alt="The settings page showing six themes as swatches and, below them, four looks written in the typeface each one selects."
|
||||||
width="1400"
|
width="1400"
|
||||||
height="900"
|
height="900"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
/>
|
/>
|
||||||
<figcaption>Five themes and four looks: how bright, and how it reads.</figcaption>
|
<figcaption>Six themes and four looks: how bright, and how it reads.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/notes-charcoal.webp"
|
||||||
|
alt="Notes in the Charcoal theme: a warm near-black modelled on Apple Notes, the note list on the left and a note open on the right, with amber where the accent green usually is."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Charcoal — the newest theme, a warm near-black after Apple Notes, amber for the accent.</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
<figure class="shot">
|
<figure class="shot">
|
||||||
<img
|
<img
|
||||||
@@ -1040,6 +1050,75 @@
|
|||||||
<figcaption>Integrations: your mailbox, your calendar feed, your address.</figcaption>
|
<figcaption>Integrations: your mailbox, your calendar feed, your address.</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h3 class="sub">Six themes, the same day</h3>
|
||||||
|
<p class="muted">
|
||||||
|
Three dark and three light — a property of the screen you are sitting at, a
|
||||||
|
laptop in the sun and a monitor in a dark room wanting different answers. The
|
||||||
|
typeface and how tight it sits are chosen apart from them.
|
||||||
|
</p>
|
||||||
|
<div class="shots">
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-northern-lights.webp"
|
||||||
|
alt="The Today view in the Northern lights theme: dark, with a green accent."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Northern lights — dark, a green accent. The default.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-charcoal.webp"
|
||||||
|
alt="The Today view in the Charcoal theme: a warm near-black modelled on Apple Notes, with amber for the accent."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Charcoal — a warm near-black after Apple Notes, amber accent.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-dusk.webp"
|
||||||
|
alt="The Today view in the Dusk theme: dark and warm, with an amber accent."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Dusk — dark and warm.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-daylight.webp"
|
||||||
|
alt="The Today view in the Daylight theme: light and coolly neutral."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Daylight — light and coolly neutral.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-paper.webp"
|
||||||
|
alt="The Today view in the Paper theme: light and warm, like paper."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Paper — light and warm, like paper.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="shot">
|
||||||
|
<img
|
||||||
|
src="screenshots/theme-contrast.webp"
|
||||||
|
alt="The Today view in the Contrast theme: black on white, for bright light."
|
||||||
|
width="1400"
|
||||||
|
height="900"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<figcaption>Contrast — black on white, for bright light.</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="features">
|
<section id="features">
|
||||||
@@ -1120,6 +1199,15 @@
|
|||||||
by itself — without touching when it is actually due.
|
by itself — without touching when it is actually due.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="cell">
|
||||||
|
<h3>Holds through a drop</h3>
|
||||||
|
<p>
|
||||||
|
A tunnel, a lift, a base station handing over — the app does not go
|
||||||
|
blank when the signal does. A save you make rides out a few seconds of
|
||||||
|
no connection and goes through when it comes back, and a reload opens
|
||||||
|
from what it last saw rather than the browser's offline page.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="group-label">Connected to what you already use</p>
|
<p class="group-label">Connected to what you already use</p>
|
||||||
@@ -1154,9 +1242,10 @@
|
|||||||
<h3>Your mail, as an inbox</h3>
|
<h3>Your mail, as an inbox</h3>
|
||||||
<p>
|
<p>
|
||||||
Star a mail in Gmail, or flag one over IMAP in iCloud or Fastmail, and
|
Star a mail in Gmail, or flag one over IMAP in iCloud or Fastmail, and
|
||||||
it becomes a task. Forward one to your own address instead and the
|
it becomes a task — and the star or flag comes off once it has, so a
|
||||||
subject is parsed like anything else you type. One way: unstarring it
|
starred inbox empties as the tasks are made instead of only filling up.
|
||||||
later does nothing to the task you made.
|
Forward one to your own address instead and the subject is parsed like
|
||||||
|
anything else you type.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="cell">
|
<div class="cell">
|
||||||
@@ -1237,6 +1326,25 @@
|
|||||||
<a href="https://github.com/kristianwind/verdande/releases">the releases page</a>.
|
<a href="https://github.com/kristianwind/verdande/releases">the releases page</a>.
|
||||||
</p>
|
</p>
|
||||||
<ul class="lately">
|
<ul class="lately">
|
||||||
|
<li>
|
||||||
|
<span class="ver">0.42</span>
|
||||||
|
A sixth theme, <strong>Charcoal</strong> — a warm near-black after Apple
|
||||||
|
Notes, with amber for the accent. And the app now holds through a short
|
||||||
|
network drop: a save rides out a few seconds of no signal, and a reload
|
||||||
|
opens from what it last saw rather than the browser's offline page.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">0.42</span>
|
||||||
|
A starred Gmail message loses its star once it has become a task, the way
|
||||||
|
a flagged IMAP mail already did — so a starred inbox empties itself as the
|
||||||
|
tasks are made instead of only filling up.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">0.42</span>
|
||||||
|
Notes read as three lines, the last one the project they are filed under;
|
||||||
|
the calendar lightened to pastel days with today marked at the top; and
|
||||||
|
two-factor set-up shows a QR code to scan.
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<span class="ver">0.41</span>
|
<span class="ver">0.41</span>
|
||||||
A task you have delegated is marked where you meet it, not only on the
|
A task you have delegated is marked where you meet it, not only on the
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 38 KiB |
@@ -73,6 +73,19 @@ const SHOTS = [
|
|||||||
{ name: 'detail', path: (ids) => `/opgave/${ids.detail}`, theme: 'dark' },
|
{ name: 'detail', path: (ids) => `/opgave/${ids.detail}`, theme: 'dark' },
|
||||||
{ name: 'notes', path: '/noter', theme: 'dark', prepare: openMeetingNote },
|
{ name: 'notes', path: '/noter', theme: 'dark', prepare: openMeetingNote },
|
||||||
{ name: 'notes-source', path: '/noter', theme: 'dark', prepare: showNoteSource },
|
{ name: 'notes-source', path: '/noter', theme: 'dark', prepare: showNoteSource },
|
||||||
|
// Charcoal, the newest theme — a warm near-black modelled on Apple Notes, with
|
||||||
|
// amber where the green usually is. The notes list shows a theme's surfaces, text
|
||||||
|
// and one accent at once, so that is where the landing page carries it up close.
|
||||||
|
{ name: 'notes-charcoal', path: '/noter', theme: 'charcoal', prepare: openMeetingNote },
|
||||||
|
// The same Today view in each of the six themes, for a gallery that shows the
|
||||||
|
// whole range at a glance. One view throughout, so the only thing that changes
|
||||||
|
// from picture to picture is the theme itself. Names are the themes' own.
|
||||||
|
{ name: 'theme-northern-lights', path: '/', theme: 'dark' },
|
||||||
|
{ name: 'theme-charcoal', path: '/', theme: 'charcoal' },
|
||||||
|
{ name: 'theme-dusk', path: '/', theme: 'dusk' },
|
||||||
|
{ name: 'theme-daylight', path: '/', theme: 'light' },
|
||||||
|
{ name: 'theme-paper', path: '/', theme: 'paper' },
|
||||||
|
{ name: 'theme-contrast', path: '/', theme: 'contrast' },
|
||||||
// The new work, and in the light theme, which is what most people want to look
|
// The new work, and in the light theme, which is what most people want to look
|
||||||
// at a landing page in. The calendar drawing tasks to their length, and a note
|
// at a landing page in. The calendar drawing tasks to their length, and a note
|
||||||
// somebody shared into the "Shared with me" group.
|
// somebody shared into the "Shared with me" group.
|
||||||
|
|||||||