Devlog — 2026-07-13#

TL;DR#

A plumbing week: reminder settings now actually sync across devices, recurring tasks stay consistent between app and web, and a nasty watch lockout bug got closed. Plus watch complication/break fixes, dark mode polish, and an iOS duplicate-task bug.

User-facing features#

  • Custom reminder time now actually schedules a notification, and reminder settings sync across devices — change your reminder time on one device and it takes effect everywhere, not just where you changed it.
  • Changing your display name finally sticks. It used to blank out again the next time you logged in.
  • Recurring tasks are more trustworthy: marking one done on web no longer silently strips its recurrence, and web and mobile now agree on how recurrence rules are stored, so behavior matches across clients.
  • Post-session tagging popup reworked on both app and web — it only shows up for sessions you didn’t tag with a task or activity (not every session), auto-dismisses after a few seconds, and can be turned off entirely.
  • Watch: starting a break from the watch’s “session done” screen actually starts a break now. Complications no longer freeze mid-session and update live without burning through the daily refresh budget.
  • Global haptic strength now applies to every vibration (taps, ticks, session end) instead of just the end-of-session alarm.
  • Dark mode readability fixes in the side drawer and onboarding intro slides.
  • Fixed onboarding occasionally flashing the login screen or a task picker when it shouldn’t.
  • iOS: fixed a bug where newly created tasks could show up twice, caused by a casing mismatch between iOS-generated IDs and the backend.
  • iOS: the morning digest and the daily task summary now fire independently and more reliably — previously one silently swallowed the other, and both could arrive late or not at all.

Technical improvements#

  • Closed a real lockout bug: if a token-refresh response got dropped (flaky connection, watch app backgrounded mid-request), the device could end up permanently locked out, recoverable only by a full re-provision.
  • Recurring-task completions weren’t reaching the server through some sync paths at all — rerouted through the correct channel with reliable, duplicate-safe delivery.
  • Added test coverage for the watch’s token-refresh and offline-action-queue behavior around the lockout fix above.
  • Reminder settings now travel end-to-end through sync — previously only your user ID and theme made the trip, so reminder changes from another device were silently dropped.
  • Fixed a build issue where design-system previews would crash in Android Studio due to a resource-wiring gap introduced by a newer build tooling setup.
  • Two patch releases shipped mid-week (1.6.0 → 1.6.1).