Devlog — 2026-06-01#

TL;DR — Big week. Dark mode landed on Android, Todoist import is in, and the web app got a near-complete UI overhaul covering dashboard, task views, calendar, and a command palette. Under the hood, sync got smarter with version-based delta sync and proper tombstone handling on both client and server.


User-facing features#

  • Dark mode — phone app now supports system dark mode
  • Todoist import — bring in tasks from a Todoist CSV export
  • Newsletter opt-in — shown during registration, also toggleable in account settings
  • Confirm password on registration — basic but missing until now
  • Haptics improvement — vibration strength slider now has 10 discrete steps, saves on release, and shows the current value
  • Calendar: add task from session sheet — you can now create a task directly from the work session detail dialog

Web app (not publicly available yet):

  • Full dashboard with KPIs, today’s tasks, week chart, and session timeline
  • Kanban board redesign with updated card design
  • Task list view with board/list toggle, split pane detail view, and multi-select bulk actions
  • Collapsible sidebar with mini timer — persists collapse state
  • Zen mode: full-screen timer with no chrome
  • Calendar: month grid + day detail pane
  • Global search / command palette (⌘K)
  • Task archive/restore, overdue indicators, stats charts with period comparisons
  • Settings reworked into a wide desktop layout

Technical improvements#

  • Version-aware delta sync — Android and backend now use optimistic concurrency; each sync pull is version-gated, reducing data transfer and conflict surface
  • Authoritative elapsed time — timer elapsed time is now computed from a canonical started_at timestamp rather than local wall clock, so timer state is consistent across devices and after backgrounding
  • Tombstone handling — deleted tasks and sessions are now properly propagated through sync on both sides; local tasks absent from a full sync response are purged
  • Break sessions no longer persisted — short and long break sessions were being written to the local database; fixed
  • Timer settings sync fix — auto-start values were being sent incorrectly to the backend; corrected
  • Session pull on login — sessions from the backend are now fetched immediately after signing in
  • Watch stability — fixed an ANR, Wearable API connection spam, and a background crash; also restored the ongoing activity indicator required by Play Store policy
  • Architecture refactor (both repos) — significant internal seam work this week: typed preference repositories, decomposed timer side-effect coordinator, cleaner handler/service boundaries, backend split into proper packages. No user-visible changes but lays groundwork for testability
  • Playwright e2e suite — web app now has a CI-integrated end-to-end test suite with ~13 user story scenarios passing
  • Sentry cleanup — INFO-level logs without an exception are no longer sent to Sentry, reducing noise