Product Roadmap¶
Last updated: June 2026 (revised — messaging bugfixes, notification clear-all, clean deploy, Firebase removal, stale file cleanup)
Current Status: Version 1.0 — Full Platform Live¶
All three core stages plus payments, coaching ecosystem, and admin tooling are implemented and functional.
Stage 1 — Discover ✅¶
- 45-question psychometric assessment with adaptive ordering
- 13-phase personalised report (rule-based insight panels — no AI calls)
- PDF export, print support
- "How to Read" guide modal
- 6-month retake cooldown (enforced in
StartHerePage.tsx) - Post-report feedback widget (rating + note, saved to
reportFeedback/{uid})
Stage 2 — Design ✅¶
- Future Studio — 6-step wizard (requires Discovery + Explorer plan)
- Guided Ikigai builder (4 quadrant cards, archetype suggestions, statement builder)
- Vision → Mission → SMART Goals chain-of-derivation flow
- Life Path Simulator (Acceleration / Mastery / Contribution)
- Strategic Audit (SWOT + habits + capability gap)
Stage 3 — Do ✅¶
- Growth Loop — habit tracking, weekly reflections, monthly reviews (requires Discovery + Life Design + Explorer plan)
- 30 / 60 / 90 day review cycles
- Per-habit progress rating and mastery tracking
- Trend indicator
Payments ✅¶
- Stripe Checkout via VPS Express (
/api/stripe/create-checkout-session) - Explorer plan: RM 99/year recurring subscription with
planExpiresAtgate - Coach plan: RM 599 (year 1) → RM 199/year (renewal) via Stripe Subscription Schedule ✅
- Annual renewal extension via
invoice.payment_succeededwebhook - Subscription cancellation handling via
customer.subscription.deletedwebhook (plan reverted,coachAppStatuscleared, coaches doc deactivated) - Promo codes: free-access, percent-off, fixed-off (admin-managed)
- Agent referral commission pipeline —
?ref=AGENTCODEcaptured insessionStorage→ passed in checkout metadata → posted to agents-service oncheckout.session.completedviaPOST http://127.0.0.1:5003/api/agents/internal/record-commission. Live-tested and confirmed: RM29.85 first sale at 15% Starter, repeat-customer bonus (+5%) working, idempotency on duplicatesessionIdconfirmed, wrong key returns 401 ✅ - Bug fixed (April 2026):
userDatawas used before declaration instripe.js— coach checkouts would crash withReferenceError. MoveduserDatalookup to run before theplan === 'coach'guard. planExpiresAtexpiry gate on all paid features- Admin complimentary access —
plan: 'explorer'with noplanExpiresAt= permanent free full access (admin-granted, no Stripe needed) hasPaidAccessfix — admin-granted explorer plans (noplanExpiresAt) now correctly returntrue
Coaching & Community ✅¶
- Certified coach directory + application workflow
- Full 5-step coach onboarding with payment gate: apply → admin pre-approve → Stripe payment →
payment_receivedstate → admin activation ✅ coachAppStatusfield on UserProfile ('approved_pending_payment' | 'payment_received') for clean gate state management- CoachPortal payment gate screens (payment form, payment confirmed, activating fallback)
- Annual renewal reminder banner in CoachPortal (amber ≤30 days, red if overdue)
- Coach portal with full client roster and archetype/goal visibility
- Coach referral system with unique per-coach referral links
handleGrantCoachAccessfixed — now also creates/reactivates coaches doc viaupsertCoachFromUser+ refreshes Active Coaches state ✅handleRevokeCoachAccessfixed — now also deactivates coaches doc viadeactivateCoach+ filters coaches state ✅- Team reports
- Workshops
- Read-only share link for mentors/parents
Admin ✅¶
- 10-tab AdminDashboard: Overview / Analytics / Engagement / Users / Profiles / Coaches / Workshops / Promo Codes / Feedback / Organisations
- Admin report viewer (full paid-tier, PDF-exportable)
- Admin cooldown reset + plan manager
- Promoting to coach:
upsertCoachFromUser+ coaches state refresh - Demoting from coach:
deactivateCoach+ coaches state filter - Admin complimentary access grant (permanent Explorer, no Stripe required)
- Feedback analytics tab (rating distribution + written notes)
- Coach applications — full lifecycle: Pre-Approve, Reject, Delete, Activate (only on
payment_received)
Organisation Management ✅ (data layer) / 🔲 (UI)¶
Organisationdata model —inviteCode,coachIds,plan,planExpiresAt,seatLimitactivateOrgPlan/deactivateOrgPlan— batch-updates all member plan fields- Org subscription covers all members (denormalized
plan: 'explorer'on each member user doc) - Members join via
/register?org=INVITE_CODE—orgId+orgRole: 'member'auto-set - Pending: Org Admin dashboard UI, invite link UI in AdminDashboard, auto-assign on join
Access Control & Docs (April 2026)¶
- Access gate refactor —
canAccessWellnessProfileandcanAccessFinancialPlannow self-contained (includehasPaidAccesscheck internally) Pricing.tsxfree plan copy corrected to accurately describe Phase 1 access onlydocs/access-control.mdcreated — single source of truth for all 3 access tiers, gate functions, org rules, and Explorer grant pathsdocs/architect-analysis-prompt.mdrewritten — includes mandatory doc-reading table, correct MongoDB/VPS references, current gate signatures,compatibilityEngine.ts,rateLimiter.js,/compareroute
Compatibility Engine (April 2026)¶
compatibilityEngine.tsextended with 4 new output sections:dosList,dontsList,approachGuide,traitsToWatchOut,conflictFlashpoints- 37-change plain-language rewrite of all compatibility output text
Rate Limiter (April 2026)¶
middleware/rateLimiter.jscreated — per-useruserLimiter(120 req/min keyed onreq.user.uid), admin bypass- Applied to
GET /meandPUT /meinroutes/users.js - Global IP limiter raised from 300 to 800 req/15 min
Self Mastery (April 2026) — menu name: Self Mastery, file: SelfMasteryPage.tsx¶
SelfMasteryPage.tsx(prev.SelfInquiryPage.tsx) — 5-phase structured self-coaching module (Data → Reactions → Patterns → Reality → Action)- Gated by
canAccessSelfInquiry(Discovery completed + Explorer/Coach plan) - AI-guided at every phase via
AiGuidecomponent; prompt builders inselfInquiryService.ts - Session persistence:
saveSelfInquirySession()writes toselfInquirySessions[]on user doc viaPUT /api/users/me - Past sessions injected into AI context for continuity across future sessions
/self-inquiryroute added toApp.tsx; nav entry added toLayout.tsx
People Blueprint (April 2026) — menu name: People Blueprint, file: PeopleBlueprintPage.tsx¶
PeopleBlueprintPage.tsx(prev.CorporatePage.tsx) — workplace relationship mapper with per-relationship compatibility guides- Gated by
canAccessCorporate(Discovery + Life Design completed + Explorer/Coach plan) - Users add manager / peer / subordinate relationships by archetype;
computeCorporateGuide()produces scores + playbooks computeTeamIntelligence()produces team-wide cohesion score and archetype spread- AI team coach via
AiGuidewithbuildTeamCoachSystemPrompt()context-aware to the full org chart saveCorporateData()writes tocorporateRelationships[]on user doc viaPUT /api/users/me/corporateroute added toApp.tsx; nav entry added toLayout.tsxcanAccessCorporateandcanAccessSelfInquirygate functions added tojourneyGates.ts- All documentation updated:
docs/access-control.md,docs/architecture.md,docs/features.md,docs/user-journey.md,docs/architect-analysis-prompt.md
File Naming Alignment (April 2026 — first pass)¶
All 7 page files renamed to match their menu display names exactly to eliminate confusion during development:
QuestionnairePage.tsx→DiscoveryPage.tsxLifeDesign.tsx→LifeDesignPage.tsxWellnessProfile.tsx→WellnessPage.tsxFinancialPlan.tsx→FinancialPage.tsxSelfInquiryPage.tsx→SelfMasteryPage.tsxCorporatePage.tsx→PeopleBlueprintPage.tsxProfileCompare.tsx→RelationshipLensPage.tsx
Imports in App.tsx, route JSX, and internal export default function names all updated in lockstep. Sub-folder step components (lifeDesign/, financialPlan/, wellnessProfile/, growthLoop/) are NOT affected.
File Naming Alignment (April 2026 — second pass, plain-language labels)¶
All 6 remaining page files renamed to match updated plain-language navigation labels:
DiscoveryPage.tsx→StartHerePage.tsxLifeDesignPage.tsx→DesignMyLifePage.tsxGrowthLoop.tsx→DailyGrowthPage.tsxWellnessPage.tsx→MindBodyPage.tsxFinancialPage.tsx→MoneyPlanPage.tsxReport.tsx→MyReportPage.tsx
Imports in App.tsx, route JSX, and internal export default function names all updated in lockstep. Sub-folder step components unchanged.
Messaging & Notifications (June 2026)¶
- Conversations stored with string UUID
_id(viarandomUUID()) instead of MongoDB ObjectId — fixes all server-sidefindOnelookups toDbId()helper added toconversations.jsfor backward compatibility with any existing ObjectId docsgetOrCreateConversation()now awaited before creating coaching notifications — eliminates dead/messageslinks- Notifications for coaching events embed
?conv=<uuid>for direct deep-link to the conversation thread Messages.tsxauto-selects the first conversation when no?conv=URL param is presentDELETE /api/notificationsendpoint added — clears all notifications for the authenticated user- "Clear all" button added to both notification panels in
Layout.tsx(sidebar + top bar dropdown)
Clean Frontend Deploy (June 2026)¶
- VPS was accumulating old Vite-hashed build assets (8,847 files);
rm -rf /opt/personality-app/public/assetsnow run before each SCP upload c:\My Apps\hostinger\deploy-personality.ps1created — builds, clears remote assets, then uploads fresh build in one commanddocs/deployment.mdupdated with manual steps and script reference
Layout & Sidebar UX (June 2026)¶
- Desktop top header hidden on authenticated inner pages (avoids double navigation chrome)
- Sidebar collapsible on inner pages (Report, Wellness, LifeDesign, Financial)
- Notification dropdown uses fixed positioning to prevent overflow/bleed on inner pages with collapsible sidebar
Firebase Removal & Codebase Cleanup (June 2026)¶
- Firebase SDK,
firebase-admin, and allVITE_FIREBASE_*env vars completely removed - Stale VPS files deleted:
firebase.js, orphanedagents.jsroute, one-off data scripts (checkorgs.js,checkuser.js,deletedup.jsetc.) - Stale local files deleted:
SelfInquiryPage.tsx,workshops-sharelinks-feedback.js,careerPaths.json.bak, emptyserver/src/models/ - Architecture doc corrected: removed phantom
/api/compareroute entry, fixedselfInquiry.sessionspath, removedfirebase.jsentry from server structure
Architectural Decisions¶
- VPS JWT Auth: Auth is handled entirely by the VPS (
/api/auth/*endpoints issuing 30-day JWTs). Firebase has been completely removed. All data is stored in MongoDB on the VPS. - React 19 + Vite 6: High-performance frontend with fast HMR.
- Tailwind CSS 4: Utility-first styling, consistent design system.
- Modular Scoring: Scoring logic (
scoring.ts) is fully decoupled from UI — safe to test independently and portable to future API or mobile integrations. - Data-Driven Content: All report and card content is driven from JSON data files — no hardcoded copy in components.
- 6-Month Assessment Cooldown: Prevents score drift from mood-based retaking. Uses existing
createdAttimestamp — no new DB fields required. - Rule-Based Insight Panels: The 4 insight panels (self / direction / decision / evolution) in the report are fully deterministic from
framework.json— no AI calls. Same archetype combination always produces the same output. - Stripe via VPS: Payment credentials never touch the client. Webhook signature verification on the VPS Express server prevents spoofed plan upgrades.
Known Architecture Items (Not Yet Addressed)¶
Three simultaneous✅ Fixed March 2026 —onSnapshotFirestore listeners (Layout + ProtectedRoute + DailyGrowthPage) — could be centralised to a React Context to reduce redundant reads.UserProfileProvidercreated insrc/contexts/UserProfileContext.tsx, mounted inmain.tsx. Now pollsGET /api/users/meevery 30 seconds. Layout, ProtectedRoute, and DailyGrowthPage all consumeuseUserProfile()instead of owning their own listeners.✅ Fixed March 2026 — Both files decomposed into focused child components.LifeDesignPage.tsxandGrowthLoop.tsxare 1000+ line monoliths — candidates for step-component decomposition.DesignMyLifePage.tsx(~500 lines) now delegates tosrc/pages/lifeDesign/(AssessmentStep, FuturePathStep, GuidedIkigaiStep, LifeBlueprintStep, StrategicAuditStep + shared LifeDesignTypes).DailyGrowthPage.tsx(~330 lines) delegates tosrc/pages/growthLoop/(OverviewTab, WeeklyReflectionTab, HabitTrackerTab, CycleReviewsTab + GrowthLoopTypes).Journey gate logic lives in both✅ Fixed March 2026 — gate conditions extracted toProtectedRoute.tsxandLayout.tsx— could be centralised.src/utils/journeyGates.ts. Both files now importcanAccessFutureStudio()andcanAccessGrowthLoop()from there.✅ Fixed April 2026 — both gate functions now includecanAccessWellnessProfileandcanAccessFinancialPlanrequired callers to add separatehasPaidAccesscheck.&& hasPaidAccess(profile)internally.Layout.tsxredundant checks removed.Rate limiter gap: high-frequency API abuse possible on authenticated endpoints.✅ Fixed April 2026 —middleware/rateLimiter.jscreated with per-useruserLimiter(120 req/min keyed onreq.user.uid). Applied toGET /meandPUT /meinusers.js. Global IP limiter raised to 800 req/15 min.