Devlog #16
Table of Contents
Devlog — 2026-09-21#
TL;DR#
The big one this week: goals moved from a single text blob to individually addressable entries that can be ticked done, edited, deleted, and optionally linked to a task — landed together across mobile, backend, and webapp. Alongside it, bottom sheets got unified under one design system, a real WCAG contrast pass shipped, reminder scheduling got more accurate on both client and server, and recurring-task archiving finally works the way it should everywhere.
User-facing features#
- Goals are now made of individual entries, not one text blob. Each intention for a period gets its own line that can be ticked done and undone independently, edited or removed through a sheet, and optionally linked to a task so a goal shows an honest “N of M done” instead of a date-range guess. Carried-over entries no longer stick around forever or get carried twice by mistake, and the goals screen’s “Finished” count no longer includes deleted tasks. Shipped across mobile, backend, and webapp together.
- Bottom sheets were unified and the Log got a redesign (mobile): every sheet in the app now shares one consistent header, divider, and action-bar style; the Log’s timeline switched from session cards to a left-aligned time rail.
- Accessibility contrast pass (mobile + webapp): subtle/muted text and orange badges and labels were retuned to meet WCAG AA minimums, and the brand orange accent — previously a slightly different shade in light vs. dark mode — was made consistent; webapp design tokens were reconciled to match.
- More reliable reminders (mobile): the reminder-time picker now only offers options that make sense for a task’s actual deadline, date-only deadlines anchor to 9 AM local instead of drifting across timezones, and choosing a custom reminder time while creating a task now actually saves it (it was silently dropped before).
- Settings renamed for clarity (mobile): the entry labeled “Deadline Reminders” — which actually controls the once-a-day task digest, not per-task reminders — now says what it does.
- Native iOS controls (mobile): date/time pickers and toggle switches on iOS now render as real native iOS widgets instead of Material-style ones; Android is unchanged.
- Quick task creation from group headers (mobile + webapp): every task group (e.g. “High priority,” “Tomorrow”) now has a “+” that opens a prefilled add-task form matching that group.
- Recurring task archiving actually works now (mobile + backend): archiving a recurring task used to just push its due date forward instead of ending it, so there was no way to retire a series. Archive now ends the series everywhere, and unarchiving restores it intact.
- Webapp task list and defaults caught up to mobile: the Date view’s task list now lays out as full-width rows instead of a cramped single-column grid, and the webapp’s default grouping now matches mobile (by date, not status).
Technical improvements#
- Reminder delivery is now more resilient (backend): reminders are marked as sent only after they’re actually delivered, not before, so an interrupted job run retries instead of permanently skipping a reminder. Archived and ended recurring tasks are correctly excluded from the reminder job.
- Routine maintenance: version bumps, dependency updates (crash reporting, crypto, CI actions), and fixes to flaky/broken end-to-end tests around task deletion and session expiry.