Integrations overhaul and onboarding reboot
2026-02-26
Integrations UX sweep
- Added pre-setup overview pages so people can learn before they connect: hero + description, concrete use cases, realistic sample journal (using the actual journal card UI), permissions/scopes, plan notes, and related links. Linked the list cards to these pages instead of jumping straight into OAuth. (overview commit)
- Redid the integration detail pages layout: moved from a flat stack → card layout → sidebar + panel tabs (Settings / Status & data / Advanced), with spacing/typography cleanup and card wrappers restored where it helps clarity.
- Unified “Status & data” across integrations with a shared raw source data viewer that hits GET /users/me/journals/:date/sources/:slug and handles 404 (no data) cleanly.
- Webhook detail got split into Tokens vs. Status & data, with clearer section titles and token create flow (create form above list, auto-switch to the list after creation).
- Slack got a proper settings page: channel multi-select from the new channels endpoint, updated overview with real scopes and collected data, and a more relatable sample journal. (slack settings)
Multi‑account support
- Built first-class multi-account/workspace handling: multiple connections per integration type, per-connection sync status, grouping on the list, and a tabbed switcher on detail pages.
- Hid the switcher when it’s a single-account integration or there’s only one connection; moved “add another” to the right place (detail page).
- Dropped manual label editing now that the backend populates labels from provider info.
- Fixed tests for the new two-phase loading (connections list → detail) and adjusted snapshots around the new nav/tabs.
Onboarding reboot
- Started with a post-registration flow (Connect → Generate → Done), then replaced it with a lighter, no-OAuth-first experience: Setup (locale/timezone) → Format (log/story/adlib with live preview) → Done (CTA to integrations). Keeps momentum without OAuth friction. (onboarding refactor)
- Tons of small polish: hide header/footer, compact format buttons, localized/realistic samples, native locale labels, timezone select dropdown, friendlier “Free plan / Upgrade anytime” copy, and a staging/local flag to let me revisit /onboarding while debugging.
- Cleaned up routing/redirects and OAuth callback return so onboarding stays coherent even if the backend doesn’t bounce origin back.
Journals: generation, status, and sharing
- Aligned pipeline/generation APIs with backend changes: updated status types (incl. pending + error detail), stabilized task ordering on polls, and switched generation status polling to the new date-based endpoint. In a few places, skipped polling entirely and just navigated to the journal detail after triggering generation.
- Added generatedAt to make regenerations visible in the journal footer.
- Improved empty state on the journals page to be connection-aware with an instant generation trigger; defaulted format to log.
- Fixed share pages: resolve locale from generationOptions or browser language, localize metadata/OG tags, and reworked the share link creation UI (inline expiry buttons, clearer separation from existing links, label before expiry buttons).
Plans and polish
- Brought plan comparison in line with product-spec and trimmed the billing plan card to just the real differentiators (no duplicated rows, simpler LLM rank labels).
- Replaced scattered inline “saved” messages with a global toast system (auto-dismiss, slide-in).
- Lots of UI paper cuts: spacing/typography tokens, better sample excerpts (Webhook and Slack), saner list spacing in journal bodies, sidebar sizing alignment, and assorted i18n tidy-ups.
Overall: big UX pass that ties integrations + onboarding together, smooths the first-run path, and reduces friction across status/data visibility and sharing. Feels coherent now.