Skip to content

Site Map

Hierarchical map of every page in the consumer app. Companion to user-guide.md (prose reference) and user-flows.md (step-by-step journeys).

Scope: consumer app only (ionic_frontend/). The admin dashboard is mapped in admin-site-map.md; the marketing landing is mapped in marketing-site-map.md.

Source of truth: ionic_frontend/src/router/index.ts. Regenerate this doc whenever a route is added, removed, or its guard changes. Render PNG export with cd docs_site && npm run docs:diagrams.


Legend

flowchart LR
  pub(["Public route"]):::public
  auth["Authenticated route"]:::authed
  gateGate / Guard:::gate
  redir["Redirect"]:::redirect

  classDef public fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
  classDef authed fill:#fef3c7,stroke:#d97706,color:#78350f
  classDef gate fill:#fce7f3,stroke:#be185d,color:#831843
  classDef redirect fill:#e5e7eb,stroke:#6b7280,color:#1f2937
  • Publicmeta.public: true. No Clerk session required.
  • Authenticated — guarded by router.beforeEach. No session → redirected to /sign-in?redirect=….
  • Gate — additional beforeEnter or evaluateOnboardingGate may redirect even authenticated users.
  • Redirectredirect: entry in the router, no component.

Site map

flowchart TD
  Root["/"]:::redirect --> Dashboard

  subgraph Public["Public surfaces — no auth"]
    direction TB
    SignIn(["/sign-in"]):::public
    SignUp(["/sign-up"]):::public
    SsoCallback(["/sso-callback"]):::public
    PublicGoal(["/public_goal/:goalId"]):::public
    DesignSystem(["/design-system"]):::public
    InviteAccept(["/invite/:token"]):::public
    AccountDeleted(["/account-deleted"]):::public
  end

  subgraph Gates["Auth-gated entry guards"]
    direction TB
    AuthGuardClerk session check:::gate
    OnboardingGateevaluateOnboardingGate:::gate
    ProfileGateevaluateProfileCompleteGate:::gate
  end

  subgraph Onboarding["Onboarding wizard"]
    direction TB
    WelcomeRedir["/welcome"]:::redirect --> WelcomeSlide
    WelcomeSlide["/welcome/:slideId"]:::authed
  end

  subgraph Profile["Profile completion"]
    direction TB
    ProfileRedir["/profile/complete"]:::redirect --> ProfileSlide
    ProfileSlide["/profile/complete/:slideId"]:::authed
  end

  subgraph Home["Home / daily loop"]
    direction TB
    Dashboard["/dashboard"]:::authed
    CheckInRedir["/check-in"]:::redirect
    Feed["/feed"]:::authed
  end

  subgraph Goals["Goals"]
    direction TB
    GoalsList["/goals"]:::authed
    GoalCreate["/goals/create"]:::authed
    GoalDetail["/goal/:goalId"]:::authed
  end

  subgraph Communities["Communities"]
    direction TB
    CommList["/communities"]:::authed
    CommDetail["/communities/:id"]:::authed
    Challenge["/communities/:id/challenges/:challengeId"]:::authed
  end

  subgraph Progress["Progress"]
    direction TB
    Achievements["/achievements"]:::authed
    BadgesRedir["/badges"]:::redirect --> Achievements
    Play["/play"]:::authed
  end

  subgraph Coach["Coach"]
    direction TB
    CoachPage["/coach"]:::authed
    MeetCoach["/meet-coach"]:::authed
    Enneagram["/enneagram-assessment"]:::authed
  end

  subgraph Account["Account & meta"]
    direction TB
    Settings["/settings"]:::authed
    OurStory["/our-story"]:::authed
    PublicProfile["/u/:username"]:::authed
    AdminBridge["/admin"]:::authed
    CheckoutSuccess["/checkout/success"]:::authed
    NotificationHistory["/notifications"]:::authed
    FeedbackRedir["/feedback"]:::redirect --> Settings
    CheckoutCancelRedir["/checkout/cancel"]:::redirect --> Settings
    CatchAll["/:pathMatch(.*)*"]:::redirect --> SignIn
  end

  SignIn --> SsoCallback --> AuthGuard
  SignUp --> SsoCallback
  AuthGuard --> OnboardingGate
  OnboardingGate -- "first run" --> WelcomeSlide
  OnboardingGate -- "onboarded" --> ProfileGate
  ProfileGate -- "profile incomplete" --> ProfileSlide
  ProfileGate -- "profile complete" --> Dashboard

  CheckInRedir --> CoachPage
  Dashboard --> Feed
  Dashboard -. "urgent goal" .-> GoalDetail
  Dashboard -. "coach modal" .-> MeetCoach

  GoalsList --> GoalCreate
  GoalsList --> GoalDetail
  GoalDetail -. "share" .-> PublicGoal

  CommList --> CommDetail --> Challenge

  Settings -. "tabs" .-> MeetCoach
  Settings -. "tabs" .-> Enneagram

  classDef public fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
  classDef authed fill:#fef3c7,stroke:#d97706,color:#78350f
  classDef gate fill:#fce7f3,stroke:#be185d,color:#831843
  classDef redirect fill:#e5e7eb,stroke:#6b7280,color:#1f2937

Site map


Route table

The authoritative list. Diff against grep -E "path:" ionic_frontend/src/router/index.ts after any router change.

Component-backed routes

PathNameComponentAuthGateUser-guide section
/sign-inSignInSignIn.vuepublic§1 Creating your account
/sign-upSignUpSignUp.vuepublic§1 Creating your account
/sso-callbackSsoCallbackSsoCallback.vuepublic
/dashboardDashboardDashboard.vueauthonboarding§2 Your dashboard
/analyticsPersonalAnalyticsAnalyticsView.vueauthpersonal_analytics_enabled flag guard
/feedActivityFeedActivityFeed.vueauthonboarding§9 Feed and social
/goalsGoalsGoals.vueauthonboarding§4 Goals
/goals/createGoalCreateGoalCreate.vueauthonboarding§4 Creating a goal
/goals/create/quizGoalDiscoveryQuizGoalDiscoveryQuizView.vueauthgoal_quiz_enabled flag guard
/goal/:goalIdgoalGoal.vueauthonboarding§4 Goal detail page
/communitiesCommunitiesCommunities.vueauthonboarding§11 Communities
/communities/:idCommunityCommunity.vueauthonboarding§11 Community detail page
/communities/:id/challenges/:challengeIdChallengeLeaderboardChallengeLeaderboard.vueauthonboarding§11 Communities
/achievementsAchievementsAchievements.vueauthonboarding§10 Achievements, XP, and ranks
/events/:idSeasonalEventSeasonalEventView.vueauthonboarding(v4.63 Phase 9 — behind seasonal_events_enabled; flag-off renders the same "not found" state as a bad link)
/public_goal/:goalIdpublicGoalPublicGoal.vuepublic§4 Public goals
/adminAdminRedirectAdminRedirect.vueauthonboarding(bridges to admin_dashboard SPA)
/settingsSettingsSettings.vueauthonboarding§15 Settings and profile
/settings/connected-appsConnectedAppsConnectedAppsView.vueauth(v4.14 Phase 5 — Connected Apps list: connect/disconnect/pause/resume)
/settings/connected-apps/:provider/mappingsManageMappingsManageMappingsView.vueauth(v4.14 Phase 5 — Connected Apps mapping management)
/settings/blockedBlockedUsersBlockedUsersPage.vueauthonboarding§16 Blocked users
/settings/importDataImportDataImportPage.vueauthdata_import_enabled flag guard(v4.64 Phase 5 — CSV import: pick a file, review, commit, summary)
/our-storyOurStoryOurStory.vueauthonboarding
/checkout/successCheckoutSuccessCheckoutSuccess.vueauthonboarding§14 Supporter tier
/design-systemDesignSystemDesignSystem.vuepublic
/coachCoachCoach.vueauthonboarding§7 Meet your Coach
/meet-coachMeetCoachMeetCoach.vueauthonboarding§7 Meet your Coach
/u/:usernamePublicProfilePublicProfile.vueauthonboarding
/enneagram-assessmentEnneagramAssessmentEnneagramAssessment.vueauthonboarding§7 Meet your Coach
/coaching/typeEnneagramTypeDetailEnneagramTypeDetail.vueauthonboarding§7 Meet your Coach
/playPlayPlayView.vueauthonboarding
/welcome/:slideIdWelcomeSlideWelcomeView.vueauthmeta.onboarding§1 Onboarding
/profile/complete/:slideIdCompleteProfileSlideCompleteProfileView.vueauthevaluateProfileCompleteGate
/alliesAlliesAlliesPage.vueauthally-request-flow-enabled flag guard
/allies/discoverAllyDiscoverAllyDiscoveryPage.vueauthally-request-flow-enabled flag guard
/allies/pendingAllyPendingInboxPendingAllyRequestsPage.vueauthally-request-flow-enabled flag guard
/invite/:tokenInviteAcceptPartnerInvitePage.vuepublicpartner-invite-enabled
/teams/newCreateTeamCreateTeamView.vueauth
/join-team/:codeJoinTeamJoinTeamView.vuepublic
/team-homeTeamHomeTeamHomeView.vueauth
/team-settings (alias /teams/settings, the latter baked into CreateTeamView.vue's Stripe redirect)TeamSettingsTeamSettingsView.vueauth
/team-leaderboard (alias /teams/leaderboard)TeamLeaderboardTeamLeaderboardView.vueauthteams_leaderboards flag guard
/notificationsNotificationHistoryNotificationHistory.vueauthonboarding
/account-deletedAccountDeletedAccountDeleted.vuepublicevaluateAccountDeletedGate — in-memory post-deletion flag only, set by the self-service deletion flow; unset (fresh boot, refresh, deep link) redirects to /sign-in(OBJ-3059 — terminal screen at the end of self-service account deletion, App Store Guideline 5.1.1(v))

Redirects (no component)

PathTargetWhy
//dashboardDefault landing for signed-in users
/badges/achievementsLegacy URL alias
/check-in/coach/check-in/coach migration (PR #915); CheckIn.vue removed
/feedback/settings?tab=feedbackDeep-link into Settings feedback tab
/checkout/cancel/settings?tab=supporterStripe cancel → return to upgrade tab
/welcome/welcome/:slideId (resumes mid-flow via firstSlideId())Onboarding resume
/profile/complete/profile/complete/:slideId (about by default)Profile-completion entry
/:pathMatch(.*)*/sign-inCatch-all 404 → sign-in

Total: 40 component-backed routes + 8 redirects = 48 entries in the routes array.

CI-enforced. Drift between this table and router/index.ts fails the Route Drift workflow. Run locally with cd docs_site && npm run docs:check-routes.


Notes

  • All authenticated routes also pass through evaluateOnboardingGate. A user who has not finished onboarding is redirected to /welcome/:slideId regardless of which route they hit. The welcome path itself is exempt (D-05 in router/index.ts) to prevent redirect loops.
  • /profile/complete* has its own beforeEnter guard (evaluateProfileCompleteGate) that bounces users with already-complete profiles to /settings. This is the one route group that runs a second gate after beforeEach.
  • Admin role guard is hooked via to.meta.requiredRole === 'admin'. No route currently sets it; admin-only surfaces live in the separate admin_dashboard/ SPA, mapped in admin-site-map.md. /admin here is a bridge that redirects users into that SPA.
  • /u/:username is not flagged public in the router despite being conceptually a public profile page. Signed-out visitors hitting it are sent to /sign-in. If public access is desired, add meta: { public: true }.

For visual journeys through these routes (sign-up, daily check-in, goal lifecycle, coach setup), see user-flows.md.


Last updated: 2026-09-19 (footer currency fix, OBJ-4028 atlas sweep — a 3-run chronic gap; content last changed 2026-09-18, PR #3328, adding the /events/:id SeasonalEvent route row)

Loading…