Devlog — 2026-08-10#

TL;DR#

Goals moved from four standing slots to dated periods with a review ritual (Achieved / Dropped / Carried) — the week’s biggest change, spanning mobile, webapp, and sync. The Abandoned task status was removed in favor of a derived state (archived + not done), simplifying the board back to three columns. Backend sync got a full performance pass — batch and delta pushes now pipeline into a handful of round trips instead of one per item — alongside a security hardening pass on the webapp (CSRF, CSP). Also landed: an activity picker on mobile task sheets, markdown descriptions on mobile, working completion undo and reworked keyboard shortcuts on webapp, and a run of auth/sync reliability fixes. One release (1.9.0).

User-facing features#

  • Goals are now tied to a specific week/month/quarter/year instead of being one standing slot per horizon. A swipeable timeline lets you browse past and future periods, with a picker to jump to any of them, and an ended period with no outcome can be resolved right there as Achieved, Dropped, or Carried with an optional note (mobile + webapp). A few related bugs were fixed along the way: duplicate goals appearing after re-sync, and periods showing today’s label instead of the one they were actually written for.
  • Abandoned is no longer something you set — archiving an unfinished task now abandons it automatically, and it’s no longer a separate board column (webapp is back to Todo / In Progress / Done). Archiving a recurring task now advances it to the next occurrence instead of killing the series, and no longer gets silently recorded as completed.
  • Mobile task sheets (add and edit) gained an activity picker. Task and goal descriptions now render markdown on mobile — bold, lists, quotes, code, links — matching the webapp.
  • Webapp task/goal descriptions gained checklists, headings, and horizontal rules on top of existing markdown support, plus one-click task editing.
  • Webapp: completing a task now gives visible feedback (a toast, immediate re-sorting) and undo actually works.
  • Webapp: due dates can be set without a time, with the same quick presets mobile already had; native date/time picker popups now follow the app’s dark theme instead of always rendering light.
  • Webapp keyboard shortcuts reworked: bare-letter shortcuts now require Ctrl so they don’t fire while typing, hints reveal on Alt, and the task form now advertises its Ctrl+Enter / Escape shortcuts instead of hiding them.
  • Webapp polish: one-click task completion, the Done column now scrolls instead of growing indefinitely, timer settings got a proper design pass, and session/task modals no longer close if you select text inside them.
  • iOS: fixed a crash opening the side drawer right after login, and fixed the flow-timer recovery dialog showing a countdown for a mode that actually counts up.
  • Sessions that never properly finished (app killed mid-timer, process death) no longer show up as zero-duration clutter in stats and history.

Technical improvements#

  • Backend sync performance pass: batch and delta pushes now pipeline into roughly one database round trip per phase/type instead of one per item — batch uploads that were taking 5-10 seconds under load are now substantially faster. Session deletes were the last entity type still on the slow per-item path and are now batched too.
  • Sync error handling fixed: transient server-side failures (timeouts, dropped connections) were being classified the same as permanent bad-data errors, so the mobile client discarded queued writes instead of retrying them. They’re now correctly retried.
  • Webapp security hardening: the CSRF cookie now carries Secure/HttpOnly flags, and a Content-Security-Policy was added — rolling it out surfaced a few inline scripts that were quietly relying on being unrestricted, including one that had silently broken calendar filtering.
  • Auth reliability: sessions now restore correctly from a still-valid refresh token on cold launch (previously required a fresh login once the short-lived access token expired); a latch bug that could permanently block token refresh after a single failure is fixed; the WebSocket connection now waits for a valid token instead of retrying a doomed handshake forever.
  • Mobile no longer queues sync deletes for sessions that never made it to the server in the first place, cutting redundant round trips.
  • Reduced tracing/observability noise: WebSocket traffic no longer pollutes trace spans, and Android telemetry exports to the collector — previously silently blocked and invisible on both platforms — are fixed and now log visibly on failure.