Devlog — 25 May 2026#

TL;DR — Recurring tasks and daily goals landed — two features that have been in the backlog long enough to collect dust. The watch got a proper duration picker instead of making you dig through settings. Lot of polish across the board too.


User-facing features#

  • Recurring tasks. Create a task that respawns on completion — daily, weekly, monthly, or every N days. When you check it off, the next instance appears automatically. Repeat icon shows up on both phone and watch so you know which tasks are cycles, not one-shots.

  • Daily goals, streaks, and a heatmap that actually means something. Set a session target for the day. Hit it, get a streak. The year heatmap now highlights goal-achieved days in green so at a glance you can see if last month was real work or just theater. Banner auto-dismisses when you hit the goal — no interaction needed.

  • Watch duration picker. Tap the time display on the idle timer screen and a concentric ring picker opens. Drag to set work and break durations without leaving the watch. Previously you had to go digging through settings — which on a 44mm screen is its own kind of suffering.

  • Calendar month view. Tap the chevron in the calendar header and the week strip expands into a full month grid. Tap a date, it collapses back and scrolls to that day. Clean, no extra navigation.

  • Stats shortcut from the side drawer. The session summary boxes in the drawer now navigate directly to the statistics screen. One tap instead of hunting for it in the nav.

  • Adaptive timer mode on the web. The web timer now has Adaptive mode with four energy presets — each with derived focus and break durations. There’s also a global timer panel on every authenticated page so the countdown is always visible, not just on the timer tab. Kombine finally has a favicon too.

  • Timer mode changes are instant. Switching modes used to have a 3-second lag before anything actually happened (thanks, debounce). That’s gone. The change is applied immediately.

  • Bottom sheets look like they belong to the same app. Consistent action bar across goal settings, date pickers, recurrence picker, and session editing. Also translated to Polish, German, Spanish, and French.


Technical improvements#

  • Daily snapshots in sync. The backend now tracks per-day goal achievement data and exposes it through the sync pull endpoint. Android pulls this on sync so streak and heatmap data survives reinstalls and device switches.

  • Recurrence fields wired through sync. Recurring task data is now included in every create and update API call. It wasn’t — silently dropped on the way out. Fixed.

  • WebSocket and push notification handling unified. Both transports were processed by separate handlers that weren’t always kept in sync. Merged into one dispatcher — no more silent event drops when a message type only had a handler on one side.

  • Timer clear state syncs between web and Android. Stopping a timer on one device now clears the state on the other. Previously a cleared timer on the web would leave Android thinking a session was still in progress.

  • Statistics week alignment. Week views now use ISO week (Monday start). Was using a locale-dependent default that produced wrong boundaries depending on the device region.

  • Task list scroll jank fixed. Performance regression in the task list that caused frame drops while scrolling. Gone.

  • GMS-less device handling. Push notification registration no longer crashes on devices without Google Play Services — fails gracefully instead.