Integrations shipped, summaries reworked
2026-03-04
Integrations
- Shipped the Todoist integration settings + about pages (OAuth, single-account) with proper data alignment, a new icon, and less engineer-y copy. Wrapped it all up in PR #360.
- Built out Google Calendar’s flow: a dedicated /connect page for iCal URL (api_key) connections, settings page with tabs, and fixed the authType to
api_key. Added connect API, form, validation, and tests. - Unified the integration registry as the single source of truth (icons, pipeline texts, slug types) so adding a new integration is one entry instead of a scavenger hunt.
Journals & summaries
- Took a few swings at the monthly page: added summary tabs, tried week-grouping + inline summaries, then reverted to the correct flat timeline that mixes journals, weekly, and monthly summaries with clear sort rules. Finalized via PR #357.
- Tightened the look: summary items are now compact 1-row entries, badges for Weekly/Monthly, a consistent “Updated:” footer label, and those poetic subtitle lines for detail pages. Lots of small CSS fixes (gaps, truncation, divider placement).
- UX around errors got nicer: dedicated 404 empty states for journal/weekly/monthly detail pages, with a Generate button (and remaining quota) on missing journals. Also fixed the fade-in animation re-trigger when bouncing back to the journals tab.
- Locale-aware dates on the tag journal list so JP users actually see JP dates.
Notifications, billing, and navigation
- Expanded notification settings to per-type, per-channel controls, then trimmed to only user-configurable types and moved summary toggles under the Email group. Synced keys with the backend and removed unused stuff.
- Pulled billing out to a standalone /billing route with a header nav link; updated the plan cards to show history limits and summary availability. Tracked by PR #348.
- Reworked the Integrations list into sidebar tabs (Available / Connected / Coming Soon), made Available the default, and switched to the new
visibilityfield from the API. Fixed a lint gripe by usinguseSyncExternalStore.
Auth & login
- Replaced the landing page with auth-based redirects and redesigned login as a 2-column layout. Then cleaned house: removed the unimplemented email/password form, killed the dead sign-up link, added CjkFontLoader, and fixed a hydration mismatch by deferring render. Also tightened terms wording and swapped “GitHub” → “Todoist” in examples.
Loading states & polish
- Extracted a shared ListSpinner and replaced all the plain “Loading…” states across the app. PR #359.
- Caught an overly broad CSS edit that nuked ~500 lines; restored globals and only reapplied the intended change. Followed up with a bunch of small visual tweaks (background tone, non-wrapping badges, ellipsis for long titles).
- Normalized hyphenated pipeline task kinds to underscore i18n keys so the rotating loading messages show up correctly during journal generation.
Net-net: a lot of surface polish, two integrations moved forward (Todoist shipped; Google Calendar flow solid), summaries feel coherent again, and the settings/billing/auth flows are cleaner.