Onboarding Timeline — Feature & Engagement Guide
Overview
This doc maps the ideal user journey from signup through full activation over 30 days. It serves as the canonical reference for understanding what a new user experiences, when gamification triggers fire, and how the dashboard evolves as users progress.
Audience: Product/design (UX flow, emotional arc) and engineering (technical triggers, component references). Technical details are in collapsible sections.
Related docs:
- Dashboard — layout, quick check-in flow, onboarding detection
- Feature Tour — reusable walkthrough engine + the flagship first-run dashboard tour
- Achievements — badges, XP, levels, ranks
- Goal Builder — 4-slide guided goal construction flow (universal, no variant gate)
- User Guide — end-user getting started walkthrough
- North Star — activation KPIs and milestone horizons
- Brand Guide — tone, anti-social app philosophy
30-Day Arc
timeline
title User Onboarding — 30-Day Arc
section Day 1 · First Session
Sign up via Clerk : Feeling — Curious
13-slide onboarding wizard : Feeling — Excited
Create first goal + confetti : Feeling — Accomplished
Customize goal : Feeling — Invested
Badges earned — first_sign_in, create_first_goal : XP 0 · Streak 1
section Days 2–3 · Return & Explore
First return visit : Feeling — Reinforced
Streak begins (day 2) : +50 XP per day
Habit check-ins : +25 XP each
Create second goal : Possible new badges
Badges — create_second_category, create_second_type : XP ~100–200
section Days 4–7 · Habit Formation
Join first community : Feeling — Belonging
Ally activity in feed : Social connection
First goal completion possible : +500 XP
Badge — join_first_community, complete_first_goal : Possible Level 2
section Days 8–14 · Deepening
Multiple active goals : Full dashboard unlocked
Regular check-in routine : XP accumulating
Community participation : Encouragements given
Expected — Level 2–3, streak 8–14 : 5+ badges
section Days 15–30 · Activated User
Habits solidified : Automatic routine
5th–10th goal completions : Rare/Epic badges
Full feature usage : DashboardHero, ActionHub
Expected — Level 4–5, streak 15–30 : 8+ badges
First Session Flow
The legacy
OnboardingWizard.vuemodal (a 5-slide dashboard overlay) was deleted in Phase 47 (e9c3ee002, "delete OnboardingWizard and remove Dashboard wiring"). Onboarding is now a full-page, 13-slide flow at/welcome/:slideId. For the exact slide-by-slide breakdown, validation rules, and mutation signatures, see Onboarding Flow (technical) — that document is the source of truth; the flowchart below shows only the session-level shape.
Shipped: an optional, skippable "Our Philosophy" slide (
PhilosophySlide.vue, v4.1 Phase 3) can appear early in the wizard, behind theonboarding_pledge_enabledflag — it surfaces the same anti-addictive-design values shown on the public/our-storypage. See Onboarding Flow (technical) § Philosophy slide for the full contract.
flowchart TD
A[User clicks Sign Up] --> B[Clerk OAuth screen<br/>Google · Apple · Email]
B --> C[Redirect to app]
C --> D{Router auth guard}
D -->|No token| E[Redirect to /sign-in]
D -->|Token present| F[syncClerkUser mutation]
F --> G[Backend: SyncUser resolve]
G --> G1[RecordSignIn interaction]
G --> G2[Backfill profile from Clerk API]
G --> G3{first_sign_in UserAction exists?}
G3 -->|No| G4["Create first_sign_in UserAction 🏅"]
G3 -->|Yes| G5[Skip — returning user]
G4 --> H{useOnboardingGate: shouldOnboard?}
G5 --> H
H -->|onboardingCompletedAt is falsy| I["Redirect to /welcome/:slideId<br/>13-slide wizard, full-page, no chrome"]
H -->|already completed| J[Dashboard]
I --> K["Slides 2–5: life area, goal name,<br/>goal shape, goal why"]
K --> L["Slides 6–9: Coach persona, tone,<br/>focus, rhythm"]
L --> M["Slide 10: goal motivation snapshot"]
M --> N["Slide 13: Done — confetti"]
N --> O{Goal name given?}
O -->|Yes| P["CompleteOnboardingAndCreateGoal mutation<br/>(atomic: stores onboarding state + creates goal)"]
P --> Q["create_first_goal badge 🏅"]
Q --> R["/dashboard?source=wizard"]
O -->|No| S["StoreOnboardingState mutation only"]
S --> T["/goals/create?source=wizard&coachPersona=...&category=..."]
R --> X[GettingStartedCard appears<br/>if goal still lacks category/type]
X --> Y{User customizes or skips}
Y --> Z["WelcomePrompt: Ready to add more goals?"]
Z --> AA[Dashboard — sparse state]
Day-by-Day Breakdown: Days 1–7
Day 1: First Session
What the User Sees
- Sign-in screen — Clerk OAuth with Google, Apple, or email options
- Onboarding wizard — full-page, 13-slide flow at
/welcome/:slideId(no dashboard chrome, cannot be dismissed): goal life area, goal name, goal shape, goal why, Coach persona, tone, focus, rhythm, an optional goal-motivation snapshot, source attribution, and a Done/celebration slide. See Onboarding Flow (technical) for the full slide-by-slide reference. - Confetti celebration — plays on the Done slide (respects
prefers-reduced-motion) - GettingStartedCard — appears on the dashboard if the newly created goal still lacks a category or type, letting the user customize it
- WelcomePrompt — "Ready to add more goals, {firstName}?" with CTA button
- Dashboard tour (behind
feature_tour_enabled) — a 6-stop guided walkthrough (streak, check-in, Coach, today's actions, goals, nav) fires once, only on the/dashboard?source=wizardlanding straight out of the wizard. See Feature Tour.
Emotional Journey
| Moment | Feeling | Brand Tone |
|---|---|---|
| Wizard welcome | Warm, recognized | "Coach who's also a friend" — personal greeting |
| Feature previews | Curious, intrigued | Quick visual demos — no walls of text |
| Goal creation | Empowered | Action-forward — user does something immediately |
| Confetti | Delighted, accomplished | Celebratory — earned, not empty |
| Customization | Invested | Ownership — "this is my goal" |
Gamification Triggers
| Trigger | Reward | XP | Badges | Streak | Level |
|---|---|---|---|---|---|
| Sign up complete | first_sign_in badge | 0 | 1 | 1 | 1 |
| Create first goal | create_first_goal badge | 0 | 2 | 1 | 1 |
No XP is awarded on Day 1 from these actions. Streak XP begins on Day 2 when the user returns.
Technical Details
Authentication Flow:
- Clerk OAuth → router guard in
ionic_frontend/src/router/index.ts syncClerkUser()callsSYNC_USER_MUTATIONfromsrc/constants/graphql/- Backend
Mutations::SyncUser(rails_api/app/graphql/mutations/sync_user.rb):RecordSignIn.call(user:)— creates/updatesUserSignInrecord- Backfills
first_name,last_name,usernamefrom Clerk API if missing - Checks if
first_sign_inUserAction exists → if not, creates it (acknowledged: true) - Returns
{ user, firstSignIn: true }
Onboarding wizard:
- Route:
/welcome/:slideId,meta.onboarding: true(hidesSideMenu/BottomTabBar, full-bleed canvas) - Registry:
ionic_frontend/src/views/welcome/placeholderSlides.ts— 13 slides, gate isuseOnboardingGate.shouldOnboard(onboardingCompletedAtfalsy), no A/B variant DoneSlide.vue(slide 13): fires confetti on mount (skipped underprefers-reduced-motion), then submits- After completion:
flow.reset()clears wizard state
See Onboarding Flow (technical) for the full slide registry, validation rules, and OnboardingAnswers shape.
Goal Creation Chain:
- If
goalNamewas given:COMPLETE_ONBOARDING_AND_CREATE_GOAL_MUTATION→Onboarding::CompleteOnboardingAndCreateGoalinteraction wrapsUserIdentity::StoreOnboardingState+GoalTracking::AddGoalin one transaction AddGoal(rails_api/app/interactions/goal_tracking/add_goal.rb) creates the goal- Triggers
Gamification::CreateFirstGoalActionJob.perform_later(user.id)if it's the user's first goal - Job (
rails_api/app/jobs/gamification/create_first_goal_action_job.rb) callsUserAction.create_first_goal(user_id)directly — nosleepor artificial delay UserAction.generate()creates the action record +UserFeedItem.add_badge_feed_item()- If no
goalNamewas given:STORE_ONBOARDING_STATE_MUTATIONonly, then the user finishes goal creation on/goals/create
Post-Wizard Dashboard State (ionic_frontend/src/views/Dashboard.vue):
hasNewGoalcomputed: 1 active goal + default description + no category/type setGettingStartedCardrenders withautoExpand: true- After customization or skip:
setupDismissed = true→ transitions to sparse state isSparseState: 1–2 active goals,hasNewGoalis false → showsWelcomePrompt
Key Files:
| File | Role |
|---|---|
ionic_frontend/src/views/welcome/placeholderSlides.ts | 13-slide onboarding registry |
ionic_frontend/src/views/welcome/WelcomeView.vue | /welcome/:slideId route component |
ionic_frontend/src/views/welcome/slides/DoneSlide.vue | Final slide — confetti + submit mutation |
ionic_frontend/src/components/dashboard/GettingStartedCard.vue | Goal customization card |
ionic_frontend/src/components/dashboard/WelcomePrompt.vue | "Add more goals" CTA |
ionic_frontend/src/views/Dashboard.vue | State orchestration |
ionic_frontend/src/composables/useOnboardingGate.ts | shouldOnboard + resume-slide logic |
ionic_frontend/src/router/index.ts | Auth guard + syncClerkUser |
rails_api/app/graphql/mutations/sync_user.rb | SyncUser mutation |
rails_api/app/interactions/onboarding/complete_onboarding_and_create_goal.rb | Atomic onboarding-state + goal creation |
rails_api/app/interactions/goal_tracking/add_goal.rb | Goal creation + badge triggers |
rails_api/app/models/user_action.rb | Badge enum + generation |
Day 2: First Return
What the User Sees
- Dashboard greeting: "Good morning/afternoon/evening, {firstName}"
- Streak counter updates to 2
- If a habit was created: Today's Habits section with check-in buttons
- Insight card with contextual tip
Emotional Journey
| Moment | Feeling | Brand Tone |
|---|---|---|
| Streak counter ticks up | Reinforced — "the app noticed I came back" | "Day 2. The streak is building." |
| Habit check-in | Satisfying micro-accomplishment | One-tap action, immediate feedback |
Gamification Triggers
| Trigger | Reward | XP | Badges | Streak | Level |
|---|---|---|---|---|---|
| Daily sign-in | Streak increase | +50 | 2 | 2 | 1 |
| Each habit check-in | XP award | +25 each | 2 | 2 | 1 |
Running total after Day 2 (with 2 check-ins): ~100 XP, 2 badges, streak 2, Level 1
Technical Details
RecordSignIn.call(user:)runs on every authenticated request viaSyncUser- Streak update:
User#update_streak!recalculates fromUserSignInHistoryconsecutive days - Streak XP:
GamificationService.award_xp(user, 50, 'Daily Streak')when new streak > current - Habit check-in:
CheckInHabitinteraction →GamificationService.award_xp(current_user, 25, 'Habit Check-in')
Key Files:
| File | Role |
|---|---|
rails_api/app/interactions/user_identity/record_sign_in.rb | Sign-in tracking |
rails_api/app/interactions/goal_tracking/check_in_habit.rb | Habit check-in + 25 XP |
rails_api/app/services/gamification_service.rb | XP awarding + level checks |
Day 3: Building Momentum
What the User Sees
- Streak counter at 3 — visual momentum growing
- Possibly creates a second goal with a different category or type
- If new category/type used: badge notification appears
Emotional Journey
| Moment | Feeling | Brand Tone |
|---|---|---|
| Streak = 3 | Momentum — "I'm on a roll" | "Small steps. You're proving it." |
| Unexpected badge | Delighted — surprise reward | Celebratory without being over the top |
Gamification Triggers
| Trigger | Reward | XP | Badges | Streak | Level |
|---|---|---|---|---|---|
| Daily sign-in | Streak increase | +50 | 2 | 3 | 1 |
| Habit check-ins | XP award | +25 each | 2 | 3 | 1 |
| 2nd goal (new category) | create_second_category badge | — | 3 | 3 | 1 |
| 2nd goal (new type) | create_second_type badge | — | 3–4 | 3 | 1 |
Running total after Day 3 (with daily check-ins): ~200 XP, 3–4 badges, streak 3, Level 1
Technical Details
AddGoalinteraction checks previous unique categories/types before creating the goal- If the new goal introduces a 2nd unique category:
CreateSecondCategoryActionJob.perform_later(user.id) - If the new goal introduces a 2nd unique type:
CreateSecondTypeActionJob.perform_later(user.id) - Jobs call
UserAction.generate()→ creates badge + feed item
Key Files:
| File | Role |
|---|---|
rails_api/app/interactions/goal_tracking/add_goal.rb | Category/type diversity detection |
rails_api/app/jobs/gamification/create_second_category_action_job.rb | Badge creation |
rails_api/app/jobs/gamification/create_second_type_action_job.rb | Badge creation |
Days 4–5: Community Discovery
What the User Sees
- Communities tab becomes relevant — browse public communities
- Join first community → badge notification
- Ally activity starts appearing in the dashboard feed
- Communities OnboardingTour (separate from main wizard) may show on first visit
Emotional Journey
| Moment | Feeling | Brand Tone |
|---|---|---|
| Browsing communities | Curious — "there are others like me" | Social accountability, not social media |
| Joining a community | Belonging — "I'm not alone in this" | "Your community sees the work you're putting in." |
| Seeing ally activity | Connected — motivation from others | Accountability feed, not content feed |
Gamification Triggers
| Trigger | Reward | XP | Badges | Streak | Level |
|---|---|---|---|---|---|
| Daily sign-ins (2 days) | Streak increase | +100 | — | 4–5 | 1 |
| Join first community | join_first_community badge | — | 4–5 | 4–5 | 1 |
| Habit check-ins | XP award | +25 each | — | — | — |
Running total after Day 5 (with daily check-ins): ~350 XP, 4–5 badges, streak 5, Level 1
Technical Details
- Community join triggers
JoinFirstCommunityActionJob.perform_later(user.id)if it's the user's first community - Job calls
UserAction.generate(user_id:, action: :join_first_community) - Communities OnboardingTour:
ionic_frontend/src/components/communities/OnboardingTour.vue— separate localStorage-persisted tour
Key Files:
| File | Role |
|---|---|
rails_api/app/jobs/gamification/join_first_community_action_job.rb | First community badge |
ionic_frontend/src/components/communities/OnboardingTour.vue | Communities feature tour |
Days 6–7: First Achievement
What the User Sees
- Dashboard approaching Active User state (if 3+ goals created)
- Momentum tiles (
DashboardHero) show more metrics as the honest 3-tile hierarchy variant replaces the 4-tile sparse one - First goal completion possible (especially with the 14-day default target)
- Level-up notification if XP threshold crossed (Level 2 at 500 XP)
Emotional Journey
| Moment | Feeling | Brand Tone |
|---|---|---|
| Week-long streak | Pride — "I showed up every day" | "Level up. Every day added up to this." |
| First goal complete | Accomplishment — "I actually did it" | Major celebration moment |
| Level up | Progression — "I'm growing" | Earned recognition, not participation trophy |
Gamification Triggers
| Trigger | Reward | XP | Badges | Streak | Level |
|---|---|---|---|---|---|
| Daily sign-ins (2 days) | Streak increase | +100 | — | 6–7 | 1 |
| Complete first goal | complete_first_goal badge + 500 XP | +500 | 5–6 | 6–7 | 2 |
| Habit check-ins | XP award | +25 each | — | — | — |
Running total after Day 7: ~550–700 XP, 5–6 badges, streak 7, Level 2 (threshold: 500 XP)
Technical Details
- Goal completion:
UpdateGoalinteraction →GamificationService.award_xp(user, 500, 'Goal Completion') - Milestone detection in
UpdateGoal#handle_completed_goals:- 1st completion →
create_complete_first_goal_action - 5th completion →
create_complete_fifth_goal_action - 10th completion →
create_complete_tenth_goal_action
- 1st completion →
- Level-up:
GamificationService.check_for_level_uploops until XP < next threshold - Level 2 threshold: 500 XP → triggers
CreateLevelUpNotificationJob
Key Files:
| File | Role |
|---|---|
rails_api/app/interactions/goal_tracking/update_goal.rb | Goal completion + 500 XP |
rails_api/app/services/gamification_service.rb | Level thresholds + level-up detection |
rails_api/app/jobs/gamification/create_level_up_notification_job.rb | Level-up notification |
Dashboard State Transitions
The dashboard progressively reveals features as the user advances through onboarding:
stateDiagram-v2
[*] --> NoGoals: First sign-in
NoGoals: No Goals
NoGoals: "Create Your First Goal" empty state
NewUser: New User (1 goal)
NewUser: GettingStartedCard (auto-expanded)
NewUser: Goal customization form
Sparse: Sparse State (1–2 goals)
Sparse: WelcomePrompt — "Add more goals"
Sparse: Goal grid + AI Insight card
Active: Active User (3+ goals)
Active: Full dashboard — DashboardHero,
Active: ActionHub, TodaysHabits,
Active: Weekly Activity, Ally Feed
NoGoals --> NewUser: Creates first goal\n(via wizard)
NewUser --> Sparse: Customizes or skips\nsetup
Sparse --> Active: Creates 3rd goal\nor dismisses prompt
Computed states in Dashboard.vue:
hasNoGoals→ No Goals statehasNewGoal→ New User state (1 goal, default description, no category/type)isSparseState→ Sparse state (1–2 goals, setup dismissed)- Default → Active state (3+ goals)
Days 8–30: Activation & Retention
Week 2 (Days 8–14): Deepening Engagement
- Multiple active goals across different categories
- Regular habit check-in routine forming
- Community participation — giving and receiving encouragements
- Dashboard fully transitions to Active User state with all widgets visible
- Expected progression: Level 2–3, 5+ badges, streak 8–14
Week 3 (Days 15–21): Habit Solidification
- Daily check-ins becoming automatic
- Potentially 5th goal completion →
complete_fifth_goalbadge - Deeper community engagement — following allies, community posts
- AI Coach insights becoming more personalized with accumulated data
- Expected progression: Level 3–4, 6+ badges, streak 15–21
Week 4 (Days 22–30): Activated User
- Full feature usage: DashboardHero, ActionHub, Weekly Activity heatmap
- Achievement showcase on profile
- Possible 10th goal completion →
complete_tenth_goalbadge - User is now "activated" per north-star KPIs
- Expected progression: Level 4–5, 8+ badges, streak 22–30
XP & Level Reference
| Level | XP Threshold | Typical Timeline |
|---|---|---|
| 1 | 0 | Day 1 |
| 2 | 500 | Days 6–7 |
| 3 | 1,000 | Days 10–14 |
| 4 | 2,000 | Days 18–22 |
| 5 | 3,500 | Days 25–30+ |
| 6 | 5,500 | Month 2+ |
| 7 | 8,000 | Month 2–3 |
| 8 | 11,000 | Month 3+ |
| 9 | 15,000 | Month 4+ |
| 10 | 20,000 | Month 5+ |
Success Metrics & KPIs
From the North Star metrics framework:
| KPI | Definition | Target | Measured From |
|---|---|---|---|
| Onboarding completion rate | % of signups who complete wizard + create first goal | > 80% | Day 1 |
| Time to first goal | Minutes from signup to first goal created | < 3 min | Day 1 |
| Time to first check-in | Hours from signup to first habit check-in | < 24 hrs | Day 1–2 |
| Time to first streak (3+ days) | Days from signup to 3-day streak | < 5 days | Day 3–5 |
| Activation rate | % who create goal + complete first check-in within 48h | > 60% | Day 1–2 |
| 7-day retention | % of signups who return on day 7 | 30–40% | Day 7 |
| 30-day retention | % of signups active at day 30 | 15–25% | Day 30 |
Goal Builder Flow
There is no variant_c experiment gate — every user gets the same 4-slide guided goal construction sequence (life area, goal name, goal shape, goal why) as slides 2–5 of the single onboarding registry.
flowchart TD
subgraph goalBuilder ["Slides 2–5, all users"]
LA["LifeAreaSlide<br/>Pick a life area (8 areas + Something else)"]
GN["GoalNameSlide<br/>Name your goal<br/>(+ area-specific suggestion chips)"]
GS["GoalShapeSlide<br/>Sprint / Arc / Habit / Life-list<br/>(+ conditional target date panel)"]
GW["GoalWhySlide<br/>Optional motivation textarea"]
LA --> GN --> GS --> GW
end
GW --> CB["Coach builder + goal-motivation-snapshot + source slides"]
CB --> DS["DoneSlide"]
DS -->|goal named| Q["CompleteOnboardingAndCreateGoal<br/>(atomic, confetti + create_first_goal badge 🏅)"]
DS -->|no goal name| GC["StoreOnboardingState only →<br/>/goals/create for manual entry"]
Activation impact: Surfacing intent before a blank goal creation form reduces drop-off from blank-page syndrome. The optional goalWhy answer is retained in onboardingAnswers — useful for coaching interactions.
See Goal Builder and Onboarding Flow (technical) for the full technical reference.
Planned Enhancements
NOTE
Items below are on the roadmap but not yet implemented. They are included to show where they would fit in the onboarding timeline.
Goal Brainstorming Quizzes (Phase 5)
- Where in timeline: Day 1, replaces or augments Slide 4 goal suggestions
- What: 3–5 questions about life areas and pain points → AI generates 3–5 suggested goals via
Ai::CoachService.suggest_goals() - Why: Reduces blank-page syndrome, increases goal quality and relevance
- Success metric: 40%+ adoption rate, 25% reduction in onboarding drop-off
Goal Templates Library (Phase 5)
- Where in timeline: Days 1–3, available during goal creation and from WelcomePrompt
- What: New
GoalTemplatemodel with pre-built milestones; template picker in goal creation flow - Why: Reduces friction for second/third goal creation, makes goals more structured from the start
- Success metric: 40% faster goal setup, 1.5x more milestones per goal
Key Files Reference
| File | Purpose |
|---|---|
ionic_frontend/src/views/welcome/placeholderSlides.ts | 13-slide onboarding registry (goal + Coach setup) |
ionic_frontend/src/views/welcome/WelcomeView.vue | /welcome/:slideId route component |
ionic_frontend/src/components/dashboard/GettingStartedCard.vue | Post-wizard goal customization card |
ionic_frontend/src/components/dashboard/WelcomePrompt.vue | "Add more goals" CTA for sparse state |
ionic_frontend/src/components/communities/OnboardingTour.vue | Communities feature tour (separate from wizard) |
ionic_frontend/src/views/Dashboard.vue | Dashboard state machine (no goals → new → sparse → active) |
ionic_frontend/src/composables/useOnboardingGate.ts | shouldOnboard + resume-slide logic |
ionic_frontend/src/router/index.ts | Router guard that triggers syncClerkUser |
ionic_frontend/src/constants/graphql/user.js | SYNC_USER_MUTATION, COMPLETE_ONBOARDING_AND_CREATE_GOAL_MUTATION, STORE_ONBOARDING_STATE_MUTATION, USER_QUERY |
rails_api/app/graphql/mutations/sync_user.rb | Backend user sync, first sign-in detection |
rails_api/app/interactions/onboarding/complete_onboarding_and_create_goal.rb | Atomic onboarding-state + goal creation |
rails_api/app/interactions/goal_tracking/add_goal.rb | Goal creation + milestone badge triggers |
rails_api/app/interactions/goal_tracking/check_in_habit.rb | Habit check-in + 25 XP award |
rails_api/app/interactions/goal_tracking/update_goal.rb | Goal completion + 500 XP award |
rails_api/app/interactions/user_identity/record_sign_in.rb | Sign-in tracking + streak update |
rails_api/app/models/user_action.rb | Badge/action enum and generation methods |
rails_api/app/services/gamification_service.rb | XP awarding, level thresholds, level-up detection |
rails_api/app/jobs/gamification/create_first_goal_action_job.rb | Async first-goal badge |
rails_api/app/jobs/gamification/create_level_up_notification_job.rb | Level-up notification |
| ionic_frontend/src/components/dashboard/BetterTogetherInterstitial.vue | Post-wizard ally invite modal (v1.16 Phase 75) | | ionic_frontend/src/composables/useBetterTogetherInterstitial.ts | Trigger, state, analytics for the ally interstitial | | ionic_frontend/src/components/tour/FeatureTour.vue | Reusable guided-tour overlay engine (v4.16 Phase 1) | | ionic_frontend/src/composables/useFeatureTour.ts | Tour step resolution + server-authoritative persistence | | rails_api/app/interactions/user_identity/store_feature_tour_state.rb | Writes UserDetail.data['feature_tours'] (deep_merge, sibling-key safe) |
Last updated: 2026-08-30 — renamed MomentumBar references to DashboardHero, which superseded it (OBJ-3016); previously corrected stale OAuth provider list — GitHub is not enabled, see docs/architecture/authentication.md