Cross-platform parity sweep
Monday, October 12, 2026
Cross-platform cleanup
- Spent the day closing a lot of web/Android alignment work: 24 Linear issues done, mostly making both clients behave like one product rather than two near-matches.
- On the web, landed the shared
LoadFramewith retry states, in-app confirm dialogs, infinite scrolling, a pageable notification inbox, and better failure handling for settings, onboarding, uploads, summaries, and the entry page. - Tightened the responsive shell too: rail from 600px, two-pane view from 960px, contrast-safe controls, and Android-matching list, calendar, card, and snackbar details. JRNL-915 and JRNL-921 were the big foundation pieces.
- Finished the first pass of entry-page parity: capped/centred reading layout, better top chrome, localized timeline sources with service marks, and steadier day-page spacing.
Correctness and recovery paths
- Fixed several cases where the UI would confidently do the wrong thing: the month chevron now follows the diary’s current month, partial photo uploads retain only failures, and failed onboarding saves stay on the current step with an inline retryable error.
- Made Free-plan summary
403s read as a plan limitation instead of an outage. Small distinction, huge difference in what the user thinks broke. - Closed two older operational/security issues too: unbounded throttler storage and OAuth token-exchange logs that could expose a
client_secret. - For the diary-card work, dropped a nonexistent edge case after tracing where
entries.summaryactually comes from:“the case does not occur.”
Android caught up with the web
- Shipped mobile API support for webhook tokens/API keys and marked the FCM push channel plus daily entry notification work done.
- Brought Android entry behavior forward: diary-timezone dates and place times, media ordered by capture time, empty tag states, useful locked-day paths, share-link preview/expiry, and media captions/retry/seek controls.
- Also aligned sources, profile/settings, and export screens: plan/reconnect state is visible in Sources, action rows lost misleading chevrons, and Export now shows earlier exports. Android PR #219 carried a broad batch of shared controls, navigation, feedback, and accessibility alignment.
Maintenance pass
- Migrated both DroidFlyer and Norimaki off CircleCI config
version: 2, since the old config now breaks every pipeline: DroidFlyer #556 and Norimaki #479. - Reviewed and approved the follow-up dependency/CI work across DroidFlyer, Norimaki, CircleCI, cycle-flyer, irasutoya,
circleci-cli, andgithub-weekly-reporter. A fairly intense cleanup night.