feat(todo): reminders on the device, Upcoming's week strip, the task pane and search (ADR 0033, D2, D5, D8)

A task with a time takes reminders, minutes before it, in its sealed
payload; each device plans the coming ones whenever the tasks change and
schedules them with the system through flutter_local_notifications
(Android, iOS, macOS, Windows; on Linux the running app shows them), at
the minute where Android allows exact alarms. Notifying is asked for
when a task first gets a reminder; signing out or switching person
cancels them. Upcoming gets its week strip: the month opening
Material's calendar, the weeks before and after, a dot under each day
with tasks; a day picked scrolls the agenda to it, and scrolling moves
the strip along. From expanded windows on, a task opens in a pane
beside the list rather than in a dialog. Search, from every tab's app
bar, finds projects by name and tasks by every word typed, in their
title, description or labels, whatever the case and accents, on the
device alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-01 12:16:19 +01:00
commit 666e8dbcbb
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2,7 +2,8 @@
- **Status:** decided 1 Nov 2026, by the developer (D1–D10 below, the agent's
recommendations taken as a whole). Built the same day: steps 1 to 3, Today and
Upcoming as lists, and recurrence (step 4 without reminders and the week strip).
Upcoming as lists, recurrence, reminders and the week strip (step 4), the task
pane on wide windows and search (D2).
- **Numbering:** 0025–0029 are held (ADR 0030's note), 0032 is Jellyfin's; this is the
next free number.
- **Builds on:** ADR 0030, D7, D12, D14, D15 and D60 (Train's sealed rows, its shell, its
@ -59,7 +60,15 @@ the rail, a wash of strawberry, settings grouped as theirs. What the screenshots
windows on. From expanded windows on, a task opens in a pane beside its list, as Train's
Maps opens a route's map beside the list (Material's list–detail layout), and in a
bottom sheet below. Arranging the bar may come later; Search may become a tab if it
proves to be used as one.
proves to be used as one. As built (1 Nov): the pane is the frame's, beside whichever tab
is shown (`TaskPane` around the shell's tabs), 420 wide, the list keeping the rest; a
task tapped there opens in it, another replaces it, what was typed into the last
kept. Narrowed below expanded, the pane hides and tasks open in sheets again. Search is
a screen pushed onto the tab's own stack (back returns to the tab, a task found opens in
the pane where there is one): as typed, the projects whose name holds it and the tasks
every word is found in, in their title, description or labels' names, whatever the
case and the accents, open ones first by their date, done ones last; on the device
alone, which the screen says, as the instance reads no task (D5).
- **D3 Every screen washes down from the top in strawberry** (the developer's):
`TopGradient` under the app's `ScreenColor`, `PaletteColor.strawberry`, as Learn's in
cobalt and Train's in carrot; buttons and links stay cobalt.
@ -82,6 +91,23 @@ the rail, a wash of strawberry, settings grouped as theirs. What the screenshots
holds the account's keys; there is no email reminder and no overview the server writes.
A project shared later is sealed under a key its members share, which is that step's to
decide.
As built (1 Nov, the developer's choice of `flutter_local_notifications` over
`awesome_notifications` and platform code of Halkyon's own): a task's reminders are
minutes before the time on its date, in its sealed payload, so every device of the
person's reminds; a task with a day alone has none until the automatic reminder (D4)
is a setting. Each device plans its reminders whenever the tasks change, comes to the
front, or every six hours: the next 48 within 30 days (iOS keeps 64 pending), a
recurring task's next time alone, each under an ID hashed from its task and offset so
that planning again replaces it. They are scheduled with the system on Android, iOS,
macOS and Windows, so they come while the app is closed, at their instant: a device
moved to another zone has them moved once the app is opened. Linux schedules none, so
there the running app shows them. Android brings them at the minute only where the
person allows exact alarms (`SCHEDULE_EXACT_ALARM`, off by default since Android 14),
else within a few minutes; the app doesn't send the person to that setting. The
permission to notify is asked when a task first gets a reminder; a notification's
text, the task's title, is hidden on a locked Android screen. Signing out, or
switching person, cancels the person's reminders on the device. Tapping one opens the
app, not yet its task.
- **D6 Four tables: `project`, `section`, `task`, `label`** (recommended, as Train keeps a
workout and its series apart, D14): one row each, changed when edited, the last writer
winning, every payload JSON with a `schemaVersion`, UUID v7 ids. Inbox is a project the