Skip to content

Onboarding & Starter Content

New-account onboarding has two halves that ship together but are independent systems:

  1. 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) on user_profiles.onboarding_checklist. See Get Started Checklist.
  2. 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

PiecePath
Checklist derivation (pure)src/lib/onboarding/checklist.ts
Signal gathering + fail-open loadsrc/routes/(app)/+layout.server.ts (depends('app:onboarding'))
Staleness re-derivationsrc/routes/(app)/+layout.svelte (afterNavigate)
Widget componentsrc/lib/components/onboarding/GetStartedChecklist.svelte
UI-state APIsrc/api/routes/user/onboarding.ts (PATCH /api/user/onboarding)
Help-link buildersrc/lib/constants/docs.ts (docsUrl())
Seedersrc/lib/onboarding/seed-starter-content.ts
Starter catalogsrc/lib/automation/starter-catalog.ts
Recovery endpointsrc/api/routes/automations/starters.ts (POST /api/automations/starters/seed)
Creation-time hooksrc/routes/(app)/p/new/+page.server.ts (fail-open side effect)

Migrations

MigrationWhat it adds
20260711130000_onboarding_checklist_state.sqluser_profiles.onboarding_checklist JSONB (the widget UI state)
20260711130100_starter_content_cap_semantics.sqlSlot-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.sqlFixes 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.sqlThe original seed_default_notification_templates() function and the three system templates it inserts

Internal documentation - Not for public distribution