Devlog — 2026-10-19#

TL;DR#

Mostly a week of cleaning my own mess. Both repos got a big architecture-review pass: one rule where there used to be three copies, and a pile of real bugs fell out of it. Plus a few small features — a “what now?” suggestion in the timer, Daily Toad stats, and notes on Today. 1.15.2 shipped.

User-facing features#

  • “What now?” in the timer. The task picker suggests what to work on next and loads it as a “Suggested” group. Web picker does the same.
  • Daily Toad hit rate. Stats now show how often you actually ate the frog — computed from your real toad history, not vibes.
  • Notes and completed tasks in the timer’s Today list. Plus a “Today’s log” card with today’s notes on the dashboard.
  • Tablet settings, round two. Sound and haptics are list/detail panes. Lists go full width, split is 40/60, tapping a tab closes overlays.
  • iOS feels more native. Top-bar overflow menus are real iOS menus now.
  • Fixes you’d actually notice:
    • Typing in a text field no longer throws the cursor around.
    • A leading “!” in a task title survives sync. (It was getting eaten.)
    • Resuming a paused FLOW break keeps the time you had left.
    • Completed low-focus ADAPTIVE sessions are kept instead of silently dropped.
    • Deleted goal entries no longer sit “pending” forever.
    • Custom activities now reach the watch and re-push when you change them. Custom names show up in stats and the log picker.
    • iOS: add-task no longer breaks when the sheet closes, and the app waits for the foreground before drawing.
    • Some task fields were being dropped on sync, and the iPhone/watch payload for ADAPTIVE timers was off.

Technical improvements#

  • Sync: one codec, one door. Tasks convert to/from the server in one place and push only through the delta endpoint. Edits carry just the change instead of a rebuilt task, so stale fields stop overwriting fresh ones.
  • Backend architecture pass. Timer state, task writes, settings edits, focus-time math, period notes and the “user’s today” rule each live in one module now, shared by REST and web. Two code paths for the same rule is how you get bugs — and I found a dozen.
  • Bugs from the architecture review. Two batches of real bugs (about ten) fixed along the way.
  • Daily goal claim is atomic. No more double-claim races.
  • Time zones: one rule. Backend decides “the user’s today” in exactly one place.
  • Same handlers on every platform. iOS and Android handler copies folded into shared ones (new ADR for that), with a startup check that waits for them by name. Wear and watchOS share one rule for accepting remote timer changes.
  • Timer is one snapshot. Elapsed and remaining time come from the same source; timer events stopped writing the session row.
  • Todoist import uses a single pipeline for preview and import, so preview shows what import does.
  • Test audit. Went through every test file and dropped the ones with no value. Added real coverage for the production token refresh path, the iOS sync auth gate and iOS keychain storage — the stuff that actually bit me last week.
  • CI got faster. Backend Go and e2e suites run quicker: Postgres on in-memory storage, dedicated warmed build cache. Two TEMP experiment commits came and went.
  • Housekeeping: dependency bumps (router, crypto, Sentry, Google API), tablet screenshot tour fixed for the 10" emulator, tablet screens pushed to Claude Design, version 1.15.2.