Onboarding & Starter Content
New-account onboarding has two halves that ship together but are independent systems:
- The Get Started checklist: a seven-step widget in the (app) sidebar (and the mobile drawer) whose completion state is 100% DERIVED from real data on every layout load. Nothing about step completion is ever persisted; the only stored state is the widget's UI preference (
expanded | minimised | dismissed) onuser_profiles.onboarding_checklist. See Get Started Checklist. - Starter content seeding: every new podcast is seeded with system notification and show-notes templates (DB seed functions) plus three pre-built starter automations (
is_system = TRUE, is_enabled = FALSE). Disabled starters occupy no plan slot, so seeding is safe on every tier including Free. See Starter Content Seeding.
Code map
| Piece | Path |
|---|---|
| Checklist derivation (pure) | src/lib/onboarding/checklist.ts |
| Signal gathering + fail-open load | src/routes/(app)/+layout.server.ts (depends('app:onboarding')) |
| Staleness re-derivation | src/routes/(app)/+layout.svelte (afterNavigate) |
| Widget component | src/lib/components/onboarding/GetStartedChecklist.svelte |
| UI-state API | src/api/routes/user/onboarding.ts (PATCH /api/user/onboarding) |
| Help-link builder | src/lib/constants/docs.ts (docsUrl()) |
| Seeder | src/lib/onboarding/seed-starter-content.ts |
| Starter catalog | src/lib/automation/starter-catalog.ts |
| Recovery endpoint | src/api/routes/automations/starters.ts (POST /api/automations/starters/seed) |
| Creation-time hook | src/routes/(app)/p/new/+page.server.ts (fail-open side effect) |
Migrations
| Migration | What it adds |
|---|---|
20260711130000_onboarding_checklist_state.sql | user_profiles.onboarding_checklist JSONB (the widget UI state) |
20260711130100_starter_content_cap_semantics.sql | Slot-occupying cap semantics: automation_rules.is_system, and both cap triggers rewritten so system templates never count and automation rules count iff (NOT is_system) OR is_enabled |
20260711130200_fix_template_seed_functions.sql | Fixes to the dormant seed functions: a partial unique index arbitrating their ON CONFLICT DO NOTHING, and the show-notes seed's missing target_section |
20260107164436_automation_engine.sql | The original seed_default_notification_templates() function and the three system templates it inserts |