Added
- A reminder on a shared event now reaches the people it was shared with. Reminders were tied to
whoever created them, and nothing else. Someone would create an event, assign it to both partners,
set a reminder for the day before - and only they would be reminded. Worse, when the other person
opened the same event the reminder field was simply empty, which reads as "none is set" rather
than "yours is not set". Both assumed it was shared, and an appointment was missed. A reminder set
by the person who created the event is now written for each assignee as a row of their own, so it
arrives by push and shows up when they open it. Rows of their own, because everything attached to
a reminder is personal: whether it was dismissed, whether it was already delivered, and the time
itself, which each person may move. A reminder somebody set for themselves is never overwritten by
this, a dismissed one does not come back unless the time actually changed, and dropping someone
from the event drops the inherited reminder with it. Anyone who is not the event's author still
sets reminders for themselves alone - otherwise half the household would be notified because one
person made themselves a note. - Checklists in a task's description can be ticked off where they are shown. The boxes rendered
from- [ ]were already there and already inert: ticking one meant opening the editor and
hand-editing raw Markdown, which is enough friction that in practice the checklist stops being
maintained and the task's real state stops being visible to anyone else. They are now real
controls, exactly as they have been in Notes since v2.42.0 - the same rule, the same file, one
more caller rather than a second implementation. The server rewrites only the one source line, so
two members ticking different items at the same moment both keep their tick; saving the whole
description would have let the later writer discard the earlier one silently. A locked task stays
tickable on purpose, for the same reason marking one done does: the lock covers what the task is,
not how far it has come.
Changed
- Forty routes that existed only in the code now exist in the API specification too.
/api/v1
has been a documented surface since v2.7.1, and what is not in the specification does not exist
for anyone integrating against it. Four whole modules had never had a line of it: quick links, the
screensaver, recipe providers, and the permissions endpoints behind the rights matrix. Nothing was
broken, and nothing reported it either - the existing guard checks that the specification's own
files are wired up correctly, never that they match the routers. A new one now compares the two in
both directions, so neither a route without documentation nor a documented route without a route
handler can appear again.
Fixed
- The onboarding walkthrough is remembered per account, not per device. It used to live only in
localStorage, so a new device or a private browsing window showed it again even though the
account had already dismissed it. Dismissing it now also updates the account, and a version number
(rather than a plain seen/unseen flag) means a later release can intentionally show it again to
everyone if a large enough change warrants it - no new migration required, just raising the current
version. The install-to-home-screen banner is unchanged: whether a device has the app installed is
a property of that device, not the account, so it keeps its existing local 7-day snooze. - Week-view day headings align with the hourly calendar columns. The header and all-day row
now share the hourly grid's gutter width. - The all-day label lines up with the hours below it. The row it sits in was corrected above,
but the label inside it kept the old 48px width in a 64px column. It is right-aligned, so it
ended 16px short of the hour figures that start directly underneath: the column boundaries
matched and the two labels still did not. Both texts now end on the same vertical edge.