v2026.3.30-beta
Onboarding
- Organization onboarding funnel: New multi-step flow for journal setup — org profile with live preview, plan comparison table, Stripe Checkout, welcome page
- User onboarding funnel: Two-step flow for new users — display name + username, then avatar, pronouns, bio, and profile visibility with live preview
onboarding_completeflag: Profiles now track whether a user has completed onboarding, with automatic redirect for new users
Billing
- Stripe subscription checkout: End-to-end flow working — upgrade button creates Stripe Checkout session, webhook activates subscription
- Stripe price ID sync: Backend reads price IDs from environment variables and syncs to the plans table on startup
- Error display on billing page: Upgrade errors are now shown to the user instead of silently swallowed
- Plan pre-selection: Homepage pricing buttons pass the selected plan through the signup callback URL
UI
- Unified footer: Removed duplicate kit Footer from marketing and public layouts — single footer across all pages
- Feedback modal: Replaced the /feedback page with a dialog accessible from the nav bar, with draft persistence and amber icon indicator for unsaved drafts
- CSS view transitions: Enabled for all SvelteKit page navigations
- Pronouns field: Added to profiles (backend + frontend), displayed on public profile identity card
- Nav avatar: Now shows the user's profile photo instead of always showing initials
Infrastructure
- Asset proxy:
GET /api/assets/{*key}serves public S3/R2 objects (avatars, covers) through the backend, restricted to public prefixes only - S3Proxy compatibility: Disabled request checksums for local dev S3-compatible services
- Full public URLs: Avatar and cover image uploads now store complete URLs instead of bare R2 keys
- Process-compose Stripe config: Added Stripe environment variables to the backend process