Mobile polish, timelines, and maps
2026-09-27
Entry timeline got real shape
- Shipped the first Story / Timeline split on diary pages with #694, then kept pushing the idea outward: shared entries now get the same timeline tabs, and the month page has both a calendar view and a Today card.
- Finished the visual recognition pass on entries: month cards can show up to four photo thumbnails, and Timeline places became proper cards with inline Maps Static API images.
- Settled the map direction for the Story view too: one Google map for all of a day’s locations, while Timeline keeps maps per place. Much clearer than stacking a separate iframe for every stop.
Mobile integration became a lot less rough
- Landed a dense batch around the phone as a data source: proper Mobile icon/text, translated steps/sleep/workout highlights, sane integration-page behavior, and store-managed subscription handling.
- Built
/integrations/mobileso people can actually review and delete what their phone sent. The API work now includes photo URLs and captions, which unlocks the next gallery/timeline pass. - Fixed the staging photo-upload 500. The culprit was a Pixel 3 XL JPEG with NUL-terminated EXIF strings making Postgres reject the
jsonbpayload. Also fixed the GPS reference handling that those strings could break. Nasty, but concrete. - Dropped the timeline-address ticket after checking the Android design: “timeline place cards show the name only.” No need to build data nobody is using.
Auth and the late-night frontend sweep
- Fixed post-login redirects so opening a protected page no longer dumps people at
/entriesafter signing in. - Web sign-out now revokes the refresh token server-side instead of merely deleting it locally.
- Finished the day with a pretty wild merge streak: 15 frontend PRs landed, including shared timelines, entry maps, and photo thumbnails.
- Filed the next admin/mobile backlog: store revenue reporting, preventing plan grants over active store subscriptions, and mobile usage visibility. Plenty still behind the UI work.