Devlog #3
Table of Contents
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_attimestamp 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