Train5D Application Architecture
Table of Contents
- Overview
- Directory Structure
- Authentication & Session System
- Exercise Management System (Pillar 4)
- Nutrition Management System (Pillar 2)
- Assessment System
- Dashboard & User Interface
- Shared Components & Utilities
- Database Schema
- Technology Stack
- Future Pillar Implementation
Overview
Train5D is a comprehensive digital health platform built on the 5 Pillars Framework: Mindset, Nutrition, Posture, Exercise, and Energy Mastery. The platform integrates holistic health management into a unified system that emphasizes cross-pillar connections and personalized guidance.
The 5 Pillars
1. Mindset π§
The foundation of transformation. Includes goal setting, habit formation, journaling, mood tracking, and behavioral change strategies.
2. Nutrition π₯
Evidence-based nutritional guidance with 25 database tables covering foods, nutrients, meal planning, health conditions, and special dietary needs.
3. Posture π§
Body alignment and movement patterns. Includes posture assessments, ergonomic guidance, movement quality tracking, and corrective strategies.
4. Exercise πͺ
Comprehensive exercise library with 16 database tables covering exercises, muscle groups, equipment, progressions, and programming.
5. Energy Mastery β‘
The integrative pillar that encompasses sleep, recovery, stress management, and overall energy optimization. Connects all other pillars into a cohesive wellness framework.
Core Philosophy
- Working with the body, not against it
- Integration is key: All 5 pillars work together, not in isolation
- Sustainable, evidence-based changes
- Personalized guidance based on holistic data across all pillars
Directory Structure
Pillar-Based Organization
Train5D uses a pillar-first directory structure that mirrors the 5 Pillars Framework. This ensures code organization aligns with the productβs conceptual model, making it intuitive for developers to locate and add features.
Why Pillar-Based Structure?
- Conceptual Clarity - Directory structure matches the 5-pillar philosophy
- Scalability - Easy to add new pillar features as the platform grows
- Discoverability - Developers know exactly where to find/add pillar-specific code
- Consistency - Same organizational pattern across pages, API, components, and styles
- Future-Ready - Structure ready for Mindset, Posture, and Energy Mastery pillars
File Organization Conventions
app/
βββ pages/
β βββ pillars/ # π― All 5 pillars
β β βββ exercise/ # Pillar 4: Exercise
β β β βββ index.tsx # /pillars/exercise (library)
β β β βββ [id].tsx # /pillars/exercise/[id] (detail)
β β β βββ [id]/
β β β β βββ edit.tsx # /pillars/exercise/[id]/edit
β β β βββ new.tsx # /pillars/exercise/new
β β βββ nutrition/ # Pillar 2: Nutrition
β β β βββ index.tsx # /pillars/nutrition (library)
β β βββ posture/ # Pillar 3: Posture (future)
β β β βββ index.tsx # Coming soon
β β βββ mindset/ # Pillar 1: Mindset (future)
β β β βββ index.tsx # Coming soon
β β βββ energy/ # Pillar 5: Energy Mastery (future)
β β βββ index.tsx # Coming soon
β βββ account/ # User account features
β β βββ dashboard.tsx
β β βββ profile.tsx
β β βββ sessions.tsx
β βββ admin/ # Admin features
β β βββ index.tsx
β βββ auth/ # Authentication
β β βββ login.tsx
β β βββ register.tsx
β β βββ ...
β βββ assessments/ # Cross-pillar assessment system
β βββ search.tsx # Global search
β βββ index.tsx # Homepage
β
βββ pages/api/
β βββ pillars/ # π― Pillar-specific APIs
β β βββ exercise/
β β β βββ exercises/
β β β βββ muscle-groups/
β β β βββ equipment/
β β β βββ categories/
β β β βββ checkpoints/
β β β βββ progressions/
β β βββ nutrition/
β β βββ foods/
β β βββ nutrients/
β β βββ categories/
β β βββ health-conditions/
β βββ assessments/ # Assessment APIs
β βββ auth/ # Authentication APIs
β βββ session/ # Session management
β βββ user/ # User management
β
βββ components/
β βββ pillars/ # π― Pillar-specific components
β β βββ exercise/
β β β βββ index.ts # Barrel export
β β β βββ ExerciseLibrary.tsx
β β β βββ ExerciseForm.tsx
β β β βββ ExerciseCard.tsx
β β β βββ ExerciseModal.tsx
β β βββ nutrition/
β β β βββ index.ts
β β β βββ NutritionLibrary.tsx
β β β βββ FoodCard.tsx
β β β βββ NutrientModal.tsx
β β βββ posture/ # Future
β β βββ mindset/ # Future
β β βββ energy/ # Future
β βββ assessments/ # Assessment components
β βββ auth/ # Auth components
β βββ layouts/ # Layout components
β βββ sessions/ # Session components
β βββ shared/ # Truly shared UI components
β
βββ styles/
βββ pillars/ # π― Pillar-specific styles
β βββ exercise/
β β βββ _exercise-library.scss
β β βββ _exercise-details.scss
β β βββ _exercise-form.scss
β βββ nutrition/
β β βββ _nutrition-library.scss
β βββ posture/ # Future
β βββ mindset/ # Future
β βββ energy/ # Future
βββ assessments/
βββ dashboard/
βββ main.scss
URL Structure
Pillar Routes: - /pillars/exercise -
Exercise library - /pillars/exercise/[id] - Exercise detail
- /pillars/exercise/[id]/edit - Edit exercise -
/pillars/exercise/new - Create new exercise -
/pillars/nutrition - Nutrition library -
/pillars/posture - Posture (coming soon) -
/pillars/mindset - Mindset (coming soon) -
/pillars/energy - Energy Mastery (coming soon)
System Routes: - /account/* - User
account features - /admin/* - Admin features -
/auth/* - Authentication - /assessments/* -
Cross-pillar assessments - /search - Global search
Adding New Pillar Features
When adding features to a pillar:
- Pages: Add to
/pages/pillars/[pillar-name]/ - API: Add to
/pages/api/pillars/[pillar-name]/ - Components: Add to
/components/pillars/[pillar-name]/ - Styles: Add to
/styles/pillars/[pillar-name]/ - Export: Update the barrel export in each component directory
Example: Adding a new exercise feature
# Page
app/pages/pillars/exercise/workout-plans.tsx
# API
app/pages/api/pillars/exercise/workout-plans/index.ts
# Component
app/components/pillars/exercise/WorkoutPlanCard.tsx
# Style
app/styles/pillars/exercise/_workout-plans.scssCross-Pillar Features
Features that span multiple pillars (like Assessments) remain at the
root level: - /pages/assessments/ -
/pages/api/assessments/ -
/components/assessments/
Authentication & Session System
π― Purpose
Secure user authentication with cross-device session management, device fingerprinting, and concurrent session control.
π Pages
Authentication Pages
(/auth/*)
| Page | Route | Description |
|---|---|---|
pages/auth/login.tsx |
/auth/login |
User login with credentials or Google OAuth |
pages/auth/register.tsx |
/auth/register |
New user registration |
pages/auth/forgot-password.tsx |
/auth/forgot-password |
Request password reset |
pages/auth/reset-password.tsx |
/auth/reset-password |
Complete password reset |
pages/auth/verify-email.tsx |
/auth/verify-email |
Email verification after registration |
pages/auth/resend-verification.tsx |
/auth/resend-verification |
Resend verification email |
Account Pages
(/account/*)
| Page | Route | Description |
|---|---|---|
pages/account/dashboard.tsx |
/account/dashboard |
User account dashboard |
pages/account/profile.tsx |
/account/profile |
User profile management |
pages/account/sessions.tsx |
/account/sessions |
Manage active sessions |
Admin Pages (/admin/*)
| Page | Route | Description |
|---|---|---|
pages/admin/index.tsx |
/admin |
Admin dashboard |
pages/admin/users.tsx |
/admin/users |
User management (planned) |
pages/admin/analytics.tsx |
/admin/analytics |
Platform analytics (planned) |
π API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/auth/[...nextauth] |
ALL | NextAuth authentication handler |
/api/auth/me |
GET | Get current user session |
/api/auth/register |
POST | Register new user |
/api/auth/login |
POST | User login |
/api/auth/logout |
POST | User logout |
/api/auth/forgot-password |
POST | Request password reset |
/api/auth/reset-password |
POST | Reset password with token |
/api/auth/verify-email |
POST | Verify email address |
/api/auth/resend-verification |
POST | Resend verification email |
/api/auth/sessions |
GET/DELETE | List/revoke user sessions |
/api/session/check |
GET | Check session validity |
/api/session/cross-device-check |
POST | Validate cross-device session |
/api/session/list |
GET | List all user sessions |
/api/session/cleanup |
POST | Clean expired sessions |
/api/session/limits |
GET | Get session limits by tier |
π§© Components
All components are organized by feature in dedicated directories for better maintainability:
components/
βββ ComingSoon.tsx # Coming soon placeholder
βββ Welcome.tsx # Welcome component
β
βββ auth/ # π Authentication components
β βββ index.ts # Barrel export
β βββ LoginForm.tsx # Login form with FingerprintJS
β βββ RegisterForm.tsx # Registration form
β βββ ForgotPasswordForm.tsx # Password reset request
β βββ ResetPasswordForm.tsx # Password reset completion
β
βββ layouts/ # π Layout components
β βββ index.ts # Barrel export
β βββ Layout.tsx # Base page layout
β βββ AuthLayout.tsx # Authentication page layout
β βββ UnifiedHeader.tsx # Main site header
β βββ Header.tsx # Alternate header
β
βββ sessions/ # π Session management components
βββ index.ts # Barrel export for clean imports
β
βββ Core Session Components
βββ SessionActivityTracker.tsx # Tracks session activity/heartbeat
βββ SessionManagement.tsx # Full session management dashboard
βββ SessionManagementProvider.tsx # Context provider for session state
βββ SessionNotification.tsx # Session alerts and notifications
βββ SessionNotification.module.css # Notification styles
βββ SessionProvider.tsx # Custom session provider
βββ SessionStatus.tsx # Current session status indicator
βββ SessionTestingDashboard.tsx # Dev testing interface
β
βββ Session UI Components
βββ SessionManager.tsx # Session list and management UI
βββ SessionCard.tsx # Individual session card display
βββ SessionWarningBanner.tsx # Session expiration warnings
βββ SessionLimitModal.tsx # Session limit reached modal
βββ SessionStatusWidget.tsx # Compact status display widget
βββ SessionDashboardWidget.tsx # Dashboard widget for sessions
Import Patterns:
// Authentication components
import { LoginForm, RegisterForm } from '@/components/auth';
// Layout components
import { UnifiedHeader, AuthLayout } from '@/components/layouts';
// Session components
import {
SessionStatus,
SessionManager,
SessionTestingDashboard
} from '@/components/sessions';
// Or from main components index
import { LoginForm, UnifiedHeader, SessionStatus } from '@/components';π Libraries & Utilities
Session logic (non-UI) remains in lib for separation of concerns:
lib/
βββ auth.ts # NextAuth configuration
βββ session/
β βββ index.ts # Session exports (types, functions, hooks)
β βββ core.ts # Session CRUD operations
β βββ hooks.tsx # useCustomSession, CustomSessionProvider
β βββ enforcement.ts # Session limit enforcement
β βββ limitEnforcement.ts # Tier-based limit checking
β βββ tracking.ts # Session activity tracking
β βββ middleware.ts # Session middleware
β βββ middlewareTracking.ts # Middleware for tracking
βββ db.ts # PostgreSQL connection pool
Architecture Decision: -
Components: UI components in
/components/sessions/ (React, JSX, visual) -
Libraries: Business logic in /lib/session/
(functions, hooks, utilities) - Clear Separation: UI
rendering vs data/logic processing
ποΈ Database Tables
users- User accounts (email, password_hash, role, session_generation)user_sessions- Active sessions (session_token, device_fingerprint, expires_at, session_generation)
π Key Features
- Device Fingerprinting: FingerprintJS for browser identification
- Cross-Device Control: Prevent concurrent sessions on same device type
- Session Generation: Invalidate all sessions when security event occurs
- Sliding Expiration: 30-minute inactive timeout
- OAuth Support: Google authentication
- Role-Based Access: User/Admin roles
π Session System Flow
Complete Authentication & Session Creation Flow
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. USER INITIATES LOGIN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ User clicks "Sign in with Google" or enters credentials β
β β’ Browser: pages/login.tsx OR components/LoginForm.tsx β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. NEXTAUTH AUTHENTICATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ NextAuth handles OAuth flow with Google β
β β’ Server: /api/auth/[...nextauth] (lib/auth.ts) β
β β’ Validates user credentials β
β β’ Creates/updates user in database (users table) β
β β’ Generates JWT token β
β β’ Sets NextAuth session cookies: β
β - __Secure-next-auth.session-token β
β - __Host-next-auth.csrf-token β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. REDIRECT TO DASHBOARD β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ User redirected to /dashboard β
β β’ NextAuth session active, but no database session yet β
β β’ Dashboard renders with UnifiedHeader component β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. DEVICE FINGERPRINT GENERATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ UnifiedHeader detects authentication (isAuthenticated = true) β
β β’ Waits 2 seconds for NextAuth session to stabilize β
β β’ Calls: initializeCrossDeviceEnforcement() β
β β
β Flow in lib/crossDeviceEnforcement.ts: β
β βββ detectFromClient() in lib/unifiedDeviceDetection.ts β
β βββ deviceDetector.detectDevice() in lib/deviceDetection.ts β
β βββ generateDeviceFingerprint() β
β β’ Uses browser attributes: β
β - User agent, screen size, pixel depth β
β - Language, platform, timezone β
β - Cookie enabled, DNT setting β
β β’ Generates hash (e.g., "ak9lj4") β
β β’ Stores in localStorage as 'deviceInfo': β
β { β
β sessionType: 'desktop', β
β deviceFingerprint: 'ak9lj4', β
β deviceName: 'Chrome on macOS' β
β } β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. DATABASE SESSION CREATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ UnifiedHeader reads deviceInfo from localStorage β
β β’ Calls: /api/auth/me with header: β
β X-Device-Fingerprint: ak9lj4 β
β β
β Flow in /api/auth/me: β
β βββ Validates NextAuth JWT token (getToken()) β
β βββ Checks for existing session with session_token cookie β
β βββ If no existing session OR different user: β
β β βββ Extracts device fingerprint from X-Device-Fingerprint headerβ
β β βββ Calls createSession() from lib/session/core.ts β
β β βββ Creates record in user_sessions table: β
β β { β
β β id: uuid, β
β β user_id: '929151dd-6983-4134-9603-0177ccc14c9a', β
β β session_token: 'OQxEwgLhea...', (random secure token) β
β β device_fingerprint: 'ak9lj4', (from header) β
β β session_type: 'desktop', (detected server-side) β
β β session_generation: 1, β
β β ip_address: '64.225.9.200', β
β β user_agent: 'Mozilla/5.0...', β
β β browser: 'Chrome', β
β β os: 'macOS', β
β β device: 'Desktop', β
β β expires_at: NOW() + 30 days, β
β β last_activity_at: NOW(), β
β β is_active: true β
β β } β
β βββ Sets session_token cookie (HttpOnly, 30-day expiry) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 6. CROSS-DEVICE ENFORCEMENT INITIALIZATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ After session creation, UnifiedHeader continues initialization β
β β’ Cross-device enforcement starts polling β
β β’ First validation check runs immediately β
β β
β Flow in lib/crossDeviceEnforcement.ts: β
β β’ startEnforcement() sets up interval polling β
β β’ validateSession() calls /api/session/cross-device-check β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 7. CROSS-DEVICE SESSION VALIDATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β POST /api/session/cross-device-check β
β Body: { β
β sessionType: 'desktop', β
β deviceFingerprint: 'ak9lj4', β
β deviceName: 'Chrome on macOS', β
β enforcementConfig: { shouldEnforce: true, ... } β
β } β
β β
β Server validates session: β
β 1. Verify NextAuth session (getServerSession) β
β 2. Check if enforcement enabled for session type β
β 3. Query database for matching session: β
β SELECT * FROM user_sessions β
β WHERE user_id = $1 β
β AND (device_fingerprint = $2 β
β OR device_fingerprint LIKE '%' || $2 || '%') β
β AND is_active = true β
β AND expires_at > NOW() β
β β
β 4. If session found: β
β βββ Check session_generation matches user's current generation β
β βββ Call sessionLimitEnforcer.checkSessionLimit() β
β β βββ Get user's tier and session limits β
β β βββ Count active sessions by type β
β β βββ Check if under limit (e.g., 1 desktop session allowed) β
β β βββ Return { allowed: true, currentUsage, limits } β
β βββ Update last_activity_at = NOW() β
β βββ Return { valid: true, needsLogout: false } β
β β
β 5. If session NOT found or invalid: β
β βββ Return { valid: false, needsLogout: true, β
β reason: 'invalid_session' } β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 8. SESSION VALIDATION RESULT HANDLING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Client receives validation result: β
β β
β IF valid = true: β
β β’ β
User stays logged in β
β β’ Validation continues polling every 60 seconds β
β β’ Session activity timestamp updated on each validation β
β β
β IF valid = false AND needsLogout = true: β
β β’ β Trigger cross-device logout β
β β’ Call /api/session/cross-device-signout β
β β’ Set localStorage 'forceSignOut' to trigger logout on other tabs β
β β’ Redirect to /login β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Session Activity & Maintenance
Continuous Session Validation:
Every 60 seconds (while user is active):
βββ Cross-device validation check runs
βββ Updates last_activity_at timestamp
βββ Checks session limits
βββ Validates session generation
βββ Returns session status
Session Expiration:
Sessions expire when:
βββ expires_at timestamp passes (30 days from creation)
βββ last_activity_at > 30 minutes ago (inactive timeout)
βββ session_generation < user.session_generation (bulk invalidation)
βββ is_active = false (manual termination)
Cleanup Process:
Automatic cleanup (scheduled job):
βββ Delete sessions where expires_at < NOW()
βββ Mark inactive sessions (last_activity_at > 30 min)
βββ Remove orphaned sessions
Device Fingerprint Matching
Query Logic in cross-device-check.ts:
-- Matches both exact fingerprints and partial matches
WHERE device_fingerprint = 'ak9lj4'
OR device_fingerprint LIKE '%ak9lj4%'Why both conditions: - Exact match: Simple string comparison (fastest) - Partial match: Handles cases where fingerprint stored in JSON format - Fallback: Ensures compatibility with different storage formats
Session Limit Enforcement
Tier-Based Limits (from sessionLimitEnforcement.ts):
Free Tier:
βββ desktop: 1 concurrent session
βββ mobile_web: 1 concurrent session
βββ mobile_app: 1 concurrent session
βββ tablet: 1 concurrent session
βββ incognito: unlimited (-1)
βββ api_token: not allowed (0)
Pro Tier:
βββ desktop: 3 concurrent sessions
βββ mobile_web: 2 concurrent sessions
βββ mobile_app: 2 concurrent sessions
βββ ... (upgradeable)Enforcement Logic:
On validation:
1. Get user's subscription tier
2. Get session limits for that tier
3. Count active sessions by type
4. If current sessions >= limit:
βββ Block new sessions
βββ Return list of oldest sessions
βββ Suggest actions (upgrade tier, terminate oldest)
5. If under limit:
βββ Allow session to continue
Session Generation System
Purpose: Bulk invalidation of all user sessions for security events
How it works:
User Record:
βββ session_generation: 1 (current)
All Sessions:
βββ session_generation: 1 (matches user)
Security Event (password change, suspicious activity):
βββ Increment user.session_generation to 2
βββ All old sessions (generation 1) now invalid
Next validation:
βββ Compare session.session_generation (1) with user.session_generation (2)
βββ Mismatch detected
βββ Force logout, require re-authentication
Key Files & Their Roles
Session Creation: - /api/auth/me -
Creates session with client fingerprint -
lib/session/core.ts - createSession(), validateSession() -
lib/deviceDetection.ts - Generates device fingerprint
Session Validation: -
/api/session/cross-device-check - Validates sessions -
lib/sessionLimitEnforcement.ts - Enforces tier limits -
lib/crossDeviceEnforcement.ts - Client-side validation
polling
Session Management: -
components/UnifiedHeader.tsx - Orchestrates session flow -
lib/auth.ts - NextAuth configuration -
/api/auth/sessions - List/revoke sessions endpoint
Critical Implementation Details
Why fingerprint is generated BEFORE session creation: 1. Device detection must happen client-side (browser APIs) 2. Fingerprint stored in localStorage for consistency 3. Same fingerprint used for: - Session creation (via X-Device-Fingerprint header) - Session validation (from localStorage deviceInfo) 4. Prevents mismatch that would cause immediate logout
Why we removed server-side session creation: - JWT callback on server cannot access browser APIs - Server-generated fingerprints (timestamps) donβt match client - Would require client to update fingerprint after creation - Simpler to create session from client with correct fingerprint
Session Cookie vs Device Fingerprint: - session_token cookie: Identifies the session (secret, secure) - device_fingerprint: Identifies the device (persistent across sessions) - Both needed: Cookie for auth, fingerprint for cross-device control
Exercise Management System (Pillar 4)
π― Purpose
Comprehensive exercise library with muscle groups, equipment, categories, checkpoints, and progressions.
π Pages
| Page | Route | Description |
|---|---|---|
pages/exercises/index.tsx |
/exercises |
Exercise library with tabs for exercises, muscle groups, equipment, etc. |
pages/exercises/new.tsx |
/exercises/new |
Create new exercise |
pages/exercises/[id].tsx |
/exercises/[id] |
View exercise details |
pages/exercises/[id]/edit.tsx |
/exercises/[id]/edit |
Edit existing exercise |
π API Endpoints
Exercises
| Endpoint | Method | Description |
|---|---|---|
/api/exercises |
GET | List all exercises with filters |
/api/exercises |
POST | Create new exercise |
/api/exercises/[id] |
GET | Get exercise details |
/api/exercises/[id] |
PUT | Update exercise |
/api/exercises/[id] |
DELETE | Delete exercise |
/api/exercises/lookup-data |
GET | Get all lookup data (categories, muscle groups, etc.) |
/api/exercises/form-data |
GET | Get form dropdown data |
Muscle Groups
| Endpoint | Method | Description |
|---|---|---|
/api/exercises/muscle-groups |
GET | List muscle groups |
/api/exercises/muscle-groups |
POST | Create muscle group |
/api/exercises/muscle-groups |
PUT | Update muscle group |
/api/exercises/muscle-groups |
DELETE | Delete muscle group |
Equipment
| Endpoint | Method | Description |
|---|---|---|
/api/exercises/equipment |
GET | List equipment |
/api/exercises/equipment |
POST | Create equipment |
/api/exercises/equipment |
PUT | Update equipment |
/api/exercises/equipment |
DELETE | Delete equipment |
Categories
| Endpoint | Method | Description |
|---|---|---|
/api/exercises/categories |
GET | List categories |
/api/exercises/categories |
POST | Create category |
/api/exercises/categories |
PUT | Update category |
/api/exercises/categories |
DELETE | Delete category |
Checkpoints
| Endpoint | Method | Description |
|---|---|---|
/api/exercises/checkpoints |
GET | List checkpoints |
/api/exercises/checkpoints |
POST | Create checkpoint |
/api/exercises/checkpoints |
PUT | Update checkpoint |
/api/exercises/checkpoints |
DELETE | Delete checkpoint |
Progressions
| Endpoint | Method | Description |
|---|---|---|
/api/exercises/progressions |
GET | List progressions |
/api/exercises/progressions |
POST | Create progression |
/api/exercises/progressions |
PUT | Update progression |
/api/exercises/progressions |
DELETE | Delete progression |
Supporting APIs
/api/exercises/anatomical-regions- Anatomical regions/api/exercises/movement-roles- Movement roles (agonist, antagonist, etc.)/api/exercises/muscle-fiber-types- Muscle fiber types
π§© Components
components/exercises/
βββ ExerciseLibrary.tsx # Main library container with tabs
βββ ExerciseForm.tsx # Exercise create/edit form
β
βββ components/
β βββ exercises/
β β βββ ExercisesTab.tsx # Exercises list view
β β βββ ExerciseCard.tsx # Exercise card display
β β βββ ExerciseModal.tsx # Exercise detail modal
β β
β βββ muscle-groups/
β β βββ MuscleGroupsTab.tsx # Muscle groups manager
β β βββ MuscleGroupCard.tsx # Muscle group card
β β βββ (edit via EditItemModal)
β β
β βββ equipment/
β β βββ EquipmentTab.tsx # Equipment manager
β β βββ EquipmentCard.tsx # Equipment card
β β βββ (edit via EditItemModal)
β β
β βββ categories/
β β βββ CategoriesTab.tsx # Categories manager
β β βββ CategoryCard.tsx # Category card
β β βββ (edit via EditItemModal)
β β
β βββ checkpoints/
β β βββ CheckpointsTab.tsx # Checkpoints manager
β β
β βββ shared/
β βββ EditItemModal.tsx # Generic edit modal
β βββ LayoutToggle.tsx # Grid/List view toggle
β βββ FilterSection.tsx # Search and filters
β
βββ utils/
βββ index.ts # Utility functions
βββ muscleGroupColors.ts # Color coding for muscle groups
βββ exerciseHelpers.ts # Exercise data helpers
ποΈ Database Tables
exercises- Exercise recordsmuscle_groups- Muscle group definitions- Fields: id, name, simple_name, description, category, body_region, anatomical_location
equipment- Equipment itemscategories- Exercise categoriescheckpoints- Progression checkpointsprogressions- Exercise progressionsexercise_muscle_groups- Junction table (many-to-many)exercise_equipment- Junction table (many-to-many)
π Key Features
- Tabbed Interface: Exercises, Muscle Groups, Equipment, Categories, Checkpoints, Progressions
- Grid/List Views: Toggle between card grid and table list
- Advanced Filtering: Search, category, difficulty, muscle group filters
- Inline Editing: Edit muscle groups, equipment, categories directly in library
- Modal Forms: Clean modal interface for editing
- Image Upload: Support for exercise media
- Relationships: Many-to-many relationships between exercises and muscle groups/equipment
π Muscle Group Fields
- Name: Full muscle group name
- Simple Name: Short reference name
- Category: upper_body, lower_body, core
- Body Region: arms, back, core, legs
- Anatomical Location: anterior, posterior, lateral, medial, superior, inferior, deep, superficial
- Functional Role: Description of muscle function
(stored in
descriptioncolumn)
Nutrition Management System (Pillar 2)
π― Purpose
Comprehensive nutrition database with foods, nutrients, health conditions, and dietary recommendations.
π Pages
| Page | Route | Description |
|---|---|---|
pages/pillars/nutrition/index.tsx |
/pillars/nutrition |
Nutrition library with tabs for foods, nutrients, etc. |
π API Endpoints
Foods
| Endpoint | Method | Description |
|---|---|---|
/api/nutrition/foods |
GET | List foods with filters |
/api/nutrition/foods |
POST | Create new food |
/api/nutrition/foods/[id] |
GET | Get food details |
/api/nutrition/foods/[id] |
PUT | Update food |
/api/nutrition/foods/[id] |
DELETE | Delete food |
Supporting Data
| Endpoint | Description |
|---|---|
/api/nutrition/lookup-data |
Get all nutrition lookup data |
/api/nutrition/categories |
Food categories |
/api/nutrition/food-groups |
Food groups (grains, proteins, etc.) |
/api/nutrition/nutrients |
All nutrients |
/api/nutrition/vitamins-minerals |
Vitamins and minerals |
/api/nutrition/macronutrients |
Macronutrients (protein, carbs, fat) |
/api/nutrition/micronutrients |
Micronutrients |
/api/nutrition/health-conditions |
Health conditions |
/api/nutrition/organ-systems |
Organ systems |
/api/nutrition/special-diets |
Special diet tags |
/api/nutrition/tags |
General tags |
/api/nutrition/fruits-vegetables |
Fruits and vegetables |
/api/nutrition/herbs-spices |
Herbs and spices |
/api/nutrition/healing-foods |
Healing foods |
/api/nutrition/health-systems |
Body systems |
/api/nutrition/conditions |
Conditions/ailments |
π§© Components
components/pillars/nutrition/
βββ NutritionLibrary.tsx # Main nutrition library container
β
βββ components/
β βββ foods/
β β βββ FoodsTab.tsx # Foods list view
β β βββ FoodCard.tsx # Food card display
β β
β βββ nutrients/
β β βββ NutrientsTab.tsx # Nutrients view
β β
β βββ shared/
β βββ EditItemModal.tsx # Generic edit modal
β βββ LayoutToggle.tsx # Grid/List view toggle
β βββ FilterSection.tsx # Search and filters
β
βββ icons/
βββ nutrition-icon.tsx # SVGR-generated nutrition icon (2248 lines)
ποΈ Database Tables
foods- Food itemsnutrients- Nutrient definitionsvitamins_minerals- Vitamins and mineralsmacronutrients- Protein, carbs, fatsmicronutrients- Trace nutrientsfood_categories- Food categoriesfood_groups- Food groupshealth_conditions- Medical conditionsspecial_diets- Diet tags (vegan, keto, etc.)food_nutrients- Junction table
π Key Features
- Comprehensive Database: Foods, nutrients, health relationships
- Health Mapping: Link foods to health conditions and organ systems
- Dietary Tags: Special diets, allergens, restrictions
- Nutrient Profiles: Detailed macro/micro nutrient content
- Search & Filter: Advanced filtering by category, diet, health condition
- Custom Icon System: SVGR-converted SVG icons with preserved colors and styles
Standardized Library Headers
π― Purpose
All content library pages (Exercise, Nutrition, Assessments) now share a consistent header design pattern for improved user experience and visual consistency.
π Header Structure
Component Pattern:
<div className="exercise-library-header">
<div className="exercise-library-header__content">
<div className="exercise-library-header__text">
<h2>Library Title</h2>
<p>Library description text</p>
</div>
<div className="exercise-library-header__icon">
{/* Icon component (150px-200px) */}
</div>
</div>
</div>
π Implementation Across Libraries
Exercise Library
- Component:
components/pillars/exercise/ExerciseLibrary.tsx - Icon: Custom SVG (inline)
- Size: 150px
- Title: βExercise Content Libraryβ
- Description: βComprehensive management system for all exercise-related contentβ
Nutrition Library
- Component:
components/pillars/nutrition/NutritionLibrary.tsx - Icon: SVGR-generated React component
(
nutrition-icon.tsx) - Size: 200x200px with viewBox=β0 0 300 300β
- Title: βNutrition Content Libraryβ
- Description: βComprehensive management system for all nutrition-related contentβ
- Special: 2248-line component with preserved colors from original SVG
Assessments Library
- Component:
components/assessments/AssessmentsLibrary.tsx - Icon: FileText from lucide-react
- Size: 150px
- Color: #34aadc (blue)
- Title: βClient Assessmentsβ
- Description: βCreate, manage, and organize your assessment templates and formsβ
π¨ Icon Implementation Methods
Method 1: SVGR Tool (Nutrition Icon)
# Install SVGR CLI
npm install --save-dev @svgr/cli
# Convert SVG to React component
npx @svgr/cli --typescript \
--out-dir components/icons \
--filename-case kebab \
public/nutrition-icon.svgBenefits of SVGR: - β
Preserves all internal
<style> tags as inline style props - β
Converts CSS
classes to proper React attributes - β
Maintains all colors and styling
from original SVG - β
TypeScript-compatible with SVGProps interface -
β
No CSS scoping conflicts - β
Proper JSX attribute conversion
(xmlns:xlink β xmlnsXlink)
Method 2: Inline SVG (Exercise Icon)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
{/* SVG paths */}
</svg>
Method 3: Icon Library (Assessments Icon)
import { FileText } from 'lucide-react';
<FileText size={150} strokeWidth={1.5} style={{ color: '#34aadc' }} />
π§ CSS Classes
Shared Styles:
.exercise-library-header {
// Header container styles
&__content {
// Flex container for text and icon
display: flex;
justify-content: space-between;
align-items: center;
}
&__text {
// Text content area
h2 { /* Title styles */ }
p { /* Description styles */ }
}
&__icon {
// Icon container
width: 200px;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
}
}Location: Styles compiled in
.next/static/css/859288ddadee3626.css
π¦ Package Dependencies
{
"devDependencies": {
"@svgr/cli": "^8.1.0"
},
"dependencies": {
"lucide-react": "^0.263.1"
}
}π Migration History
November 26, 2025 - Header Standardization: 1.
Identified inconsistent header layouts across libraries 2. Standardized
all three libraries to use exercise-library-header class
structure 3. Implemented SVGR tool for complex SVG with internal styles
(nutrition icon) 4. Updated AssessmentsLibrary.tsx to match header
pattern 5. Fixed file naming issue (AssessmentsLibrary vs
AssessmentLibrary) 6. All libraries now display consistent headers with
proper icons and spacing
Key Learnings: - SVGR is superior to dangerouslySetInnerHTML for complex SVGs - Inline styles (from SVGR) prevent CSS scoping issues - Browser cache must be cleared after structural changes - Component file naming must match imports exactly
Assessment System
π― Purpose
Create, manage, and complete health assessments with scoring and results analysis.
π Pages
| Page | Route | Description |
|---|---|---|
pages/assessments/index.tsx |
/assessments |
Assessment library (private) |
pages/assessments/create.tsx |
/assessments/create |
Create new assessment |
pages/assessments/[id]/edit.tsx |
/assessments/[id]/edit |
Edit assessment |
pages/assessments/[id]/take.tsx |
/assessments/[id]/take |
Take assessment (public) |
pages/assessments/my/index.tsx |
/assessments/my |
Userβs assessments |
pages/assessments/public.tsx |
/assessments/public |
Public assessments list |
pages/assessments/results/[responseId].tsx |
/assessments/results/[responseId] |
View assessment results |
π API Endpoints
Assessments
| Endpoint | Method | Description |
|---|---|---|
/api/assessments |
GET | List assessments |
/api/assessments |
POST | Create assessment |
/api/assessments/[id] |
GET | Get assessment details |
/api/assessments/[id] |
PUT | Update assessment |
/api/assessments/[id] |
DELETE | Delete assessment |
/api/assessments/[id]/clone |
POST | Clone assessment |
/api/assessments/[id]/public |
GET | Get public assessment |
/api/assessments/my-assessments |
GET | Userβs assessments |
/api/assessments/public |
GET | Public assessments |
Questions & Responses
| Endpoint | Method | Description |
|---|---|---|
/api/assessments/[id]/questions |
GET/POST | Manage questions |
/api/assessments/questions/[questionId] |
PUT/DELETE | Update/delete question |
/api/assessments/[id]/responses |
POST | Submit assessment response |
/api/assessments/responses/[responseId] |
GET | Get response details |
Supporting Data
| Endpoint | Description |
|---|---|
/api/assessments/lookup-data |
Get categories and option sets |
/api/assessments/categories |
Assessment categories |
/api/assessments/option-sets |
Predefined answer sets |
/api/assessments/templates |
Assessment templates |
π§© Components
components/assessments/
βββ AssessmentsLibrary.tsx # Main assessments library
βββ EditAssessmentForm.tsx # Assessment create/edit form
β
βββ components/
βββ AssessmentCard.tsx # Assessment preview card
βββ QuestionBuilder.tsx # Question creation interface
βββ ResultsDisplay.tsx # Results visualization
ποΈ Database Tables
assessments- Assessment definitionsassessment_questions- Questionsassessment_option_sets- Predefined answer optionsassessment_responses- User responsesassessment_answers- Individual answersassessment_categories- Assessment categories
π Key Features
- Question Types: Multiple choice, scale, text, etc.
- Scoring System: Automated scoring and results
- Public/Private: Share assessments publicly or keep private
- Templates: Reusable assessment templates
- Response Tracking: Track user responses and history
- Results Analysis: Detailed results breakdown
Dashboard & User Interface
π― Purpose
Unified dashboard and navigation for all application features.
π Pages
| Page | Route | Description |
|---|---|---|
pages/index.tsx |
/ |
Public landing page (Coming Soon) |
pages/account/dashboard.tsx |
/account/dashboard |
Main user dashboard |
pages/admin/index.tsx |
/admin |
Admin dashboard |
pages/pricing.tsx |
/pricing |
Pricing tiers page |
pages/workout-builder.tsx |
/workout-builder |
Workout builder tool |
pages/search.tsx |
/search |
Global search across platform |
π API Endpoints
User & Subscription
| Endpoint | Description |
|---|---|
/api/tiers |
Subscription tiers |
/api/user/subscription |
User subscription status |
/api/user/usage |
User usage statistics |
Search
| Endpoint | Method | Description |
|---|---|---|
/api/search/global |
GET | Global search across all platform content |
/api/search/exercises |
GET | Search exercises specifically |
/api/search/nutrition |
GET | Search nutrition/food items |
/api/search/assessments |
GET | Search assessments |
π§© Components
Layouts
components/
βββ Layout.tsx # Base layout wrapper
βββ AuthLayout.tsx # Authentication page layout
β
βββ dashboard/
βββ DashboardLayout.tsx # Main dashboard layout
βββ DashboardSidebar.tsx # Navigation sidebar
βββ DashboardHeader.tsx # Dashboard header
βββ DashboardContent.tsx # Content wrapper
Navigation
components/
βββ UnifiedHeader.tsx # Site-wide header
βββ Navigation.tsx # Main navigation
βββ footer/
βββ Footer.tsx # Site footer
Dashboard Widgets
components/dashboard/
βββ StatsCard.tsx # Statistics display cards
βββ QuickActions.tsx # Quick action buttons
βββ RecentActivity.tsx # Recent activity feed
βββ WelcomeCard.tsx # Welcome/greeting card
π Key Features
- Responsive Design: Mobile, tablet, desktop layouts
- Sidebar Navigation: Collapsible sidebar with all features
- Session Indicators: Session status always visible
- Role-Based UI: Different views for user/admin
- Quick Actions: Fast access to common tasks
Shared Components & Utilities
π§© Shared Form Components
components/shared/
βββ CleanForm.tsx # Form components library
β βββ CleanFormField # Form field wrapper
β βββ CleanInput # Styled input
β βββ CleanTextarea # Styled textarea
β βββ CleanSelect # Styled select dropdown
β βββ CleanButton # Styled button
β
βββ CleanModal.tsx # Modal component
βββ EditItemModal.tsx # Generic edit modal
π Utility Libraries
lib/
βββ db.ts # PostgreSQL connection pool
βββ api-service.ts # Frontend API client
βββ text-utils.ts # Text formatting utilities
βββ date-utils.ts # Date formatting utilities
βββ validation.ts # Form validation
βββ constants.ts # Application constants
π¨ Styles
styles/
βββ main.scss # Main stylesheet
βββ _pricing.scss # Pricing page styles
βββ assessment-take.css # Assessment styles
βββ assessment-results.css # Results styles
βββ assessment-medical-history.scss # Medical history styles
βββ nutrition-library.scss # Nutrition library styles
π Shared Utilities
- API Service: Centralized API client with error handling
- Text Utils: capitalizeWords, formatName, slugify
- Date Utils: formatDate, timeAgo, dateRange
- Validation: Email, password, form validation rules
- Constants: App-wide constants and enums
Database Schema
Core Tables
Users & Authentication
users (
id UUID PRIMARY KEY,
email VARCHAR UNIQUE,
password_hash VARCHAR,
first_name VARCHAR,
last_name VARCHAR,
role VARCHAR, -- 'user' | 'admin'
session_generation INTEGER, -- Invalidate all sessions
email_verified BOOLEAN,
created_at TIMESTAMP,
updated_at TIMESTAMP
)
user_sessions (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users,
session_token VARCHAR UNIQUE,
device_fingerprint VARCHAR,
session_generation INTEGER,
session_type VARCHAR, -- 'desktop' | 'mobile_web' | 'tablet'
ip_address VARCHAR,
user_agent TEXT,
browser VARCHAR,
os VARCHAR,
device VARCHAR,
location VARCHAR,
expires_at TIMESTAMP,
last_activity_at TIMESTAMP,
is_active BOOLEAN,
created_at TIMESTAMP
)Exercises
exercises (
id SERIAL PRIMARY KEY,
name VARCHAR,
description TEXT,
category_id INTEGER,
difficulty VARCHAR,
instructions TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
is_active BOOLEAN
)
muscle_groups (
id SERIAL PRIMARY KEY,
name VARCHAR,
simple_name VARCHAR,
description TEXT, -- Used for "Functional Role"
category VARCHAR, -- 'upper_body' | 'lower_body' | 'core'
body_region VARCHAR, -- 'arms' | 'back' | 'core' | 'legs'
anatomical_location VARCHAR, -- 'anterior' | 'posterior' | etc.
created_at TIMESTAMP,
updated_at TIMESTAMP,
is_active BOOLEAN
)
equipment (
id SERIAL PRIMARY KEY,
name VARCHAR,
description TEXT,
category VARCHAR,
where_to_buy TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
is_active BOOLEAN
)
exercise_muscle_groups (
id SERIAL PRIMARY KEY,
exercise_id INTEGER REFERENCES exercises,
muscle_group_id INTEGER REFERENCES muscle_groups
)
exercise_equipment (
id SERIAL PRIMARY KEY,
exercise_id INTEGER REFERENCES exercises,
equipment_id INTEGER REFERENCES equipment
)Nutrition
foods (
id SERIAL PRIMARY KEY,
name VARCHAR,
description TEXT,
food_group_id INTEGER,
category_id INTEGER,
created_at TIMESTAMP,
updated_at TIMESTAMP
)
nutrients (
id SERIAL PRIMARY KEY,
name VARCHAR,
type VARCHAR, -- 'vitamin' | 'mineral' | 'macro' | 'micro'
description TEXT
)
food_nutrients (
id SERIAL PRIMARY KEY,
food_id INTEGER REFERENCES foods,
nutrient_id INTEGER REFERENCES nutrients,
amount DECIMAL,
unit VARCHAR
)Assessments
assessments (
id SERIAL PRIMARY KEY,
title VARCHAR,
description TEXT,
category_id INTEGER,
is_public BOOLEAN,
created_by UUID REFERENCES users,
created_at TIMESTAMP,
updated_at TIMESTAMP
)
assessment_questions (
id SERIAL PRIMARY KEY,
assessment_id INTEGER REFERENCES assessments,
question_text TEXT,
question_type VARCHAR,
order_index INTEGER,
required BOOLEAN
)
assessment_responses (
id SERIAL PRIMARY KEY,
assessment_id INTEGER REFERENCES assessments,
user_id UUID REFERENCES users,
score INTEGER,
completed_at TIMESTAMP,
created_at TIMESTAMP
)
assessment_answers (
id SERIAL PRIMARY KEY,
response_id INTEGER REFERENCES assessment_responses,
question_id INTEGER REFERENCES assessment_questions,
answer_text TEXT,
answer_value INTEGER
)Naming Conventions
- Tables: lowercase with underscores
(
muscle_groups,exercise_equipment) - Columns: snake_case (
created_at,is_active,body_region) - Primary Keys:
id(serial or uuid) - Foreign Keys:
{table}_id(user_id,exercise_id) - Timestamps:
created_at,updated_at - Booleans:
is_active,is_public,email_verified
Technology Stack
Frontend
- Framework: Next.js 15.5.6 (React)
- Language: TypeScript
- Styling: SCSS, CSS Modules, styled-jsx
- State Management: React Hooks (useState, useEffect, useContext)
- Forms: Custom form components (CleanForm)
- Icons: Lucide React, SVGR-generated custom icons
- SVG Processing: @svgr/cli (converts SVG to React components)
- Device Fingerprinting: @fingerprintjs/fingerprintjs
Backend
- Runtime: Node.js
- Framework: Next.js API Routes
- Authentication: NextAuth.js v4
- Database: PostgreSQL
- ORM/Client: node-postgres (pg)
- Password Hashing: bcrypt
- Session Management: Custom JWT + Database sessions
Infrastructure
- Server: Linux (Ubuntu/Debian)
- Process Manager: PM2
- Web Server: Nginx (reverse proxy)
- Database: PostgreSQL 12+
- SSL: Letβs Encrypt
Development Tools
- Package Manager: npm
- Build Tool: Next.js built-in (Webpack)
- Linting: ESLint
- Type Checking: TypeScript
External Services
- OAuth: Google OAuth 2.0
- Email: (TBD - verification emails)
Key Architectural Patterns
1. Session Management Pattern
Client (Browser)
βββ FingerprintJS generates device fingerprint
βββ Stored in localStorage
βββ Sent via X-Device-Fingerprint header
Server
βββ NextAuth handles authentication
βββ Custom session created in database
βββ Device fingerprint stored with session
βββ Cross-device enforcement checks
βββ Session generation for bulk invalidation
2. Component Organization Pattern
Feature-Based Directory Structure:
components/
βββ {feature}/ # All components for a feature
β βββ index.ts # Barrel export for clean imports
β βββ {Feature}Main.tsx # Main feature component
β βββ {Feature}Card.tsx # Card/item display
β βββ {Feature}Modal.tsx # Feature-specific modal
β
βββ shared/ # Truly shared components
βββ CleanForm.tsx
βββ CleanModal.tsx
βββ EditItemModal.tsx
Benefits of Consolidation: - β
Single source of
truth (no duplicate files) - β
Clean imports:
import { Component } from '@/components/feature' - β
Easy
to discover related components - β
Clear feature boundaries - β
Prevents scattered files across codebase
Consolidation History (Nov 2025):
- Session Components (Nov 19, 2025)
- Before: 23 files across 3 locations
(
/components/,/components/sessions/,/lib/session/components/) - After: 14 unified files in
/components/sessions/ - Result: 30% fewer files, zero duplication
- Before: 23 files across 3 locations
(
- Auth Components (Nov 19, 2025)
- Before: 4 files scattered at root
(
/components/LoginForm.tsx, etc.) - After: Organized in
/components/auth/with barrel export - Result: Clean grouping of authentication logic
- Before: 4 files scattered at root
(
- Layout Components (Nov 19, 2025)
- Before: 4 layout files mixed with root components
- After: Organized in
/components/layouts/with barrel export - Result: Clear separation of structural components
Total Impact: - π 12 files removed from root
/components/ directory - π 3 new organized feature
directories created - π― 100% of components now follow feature-based
structure - π All imports standardized with barrel exports
3. Component Architecture
Page (Route)
βββ Layout Component (DashboardLayout/AuthLayout)
βββ Feature Component (ExerciseLibrary/NutritionLibrary)
βββ Tab Components (ExercisesTab/MuscleGroupsTab)
βββ Item Components (ExerciseCard/MuscleGroupCard)
βββ Shared Components (EditItemModal/CleanForm)
3. API Structure
/api/{feature}/{resource}/{action}
Examples:
- /api/exercises/muscle-groups (GET/POST/PUT/DELETE)
- /api/nutrition/foods/[id] (GET/PUT/DELETE)
- /api/assessments/[id]/questions (GET/POST)
4. Data Flow
User Action β Page Component β API Service β API Route β Database β Response β State Update β UI Update
5. Authentication Flow
Login β NextAuth β Database Session β Device Fingerprint β Cross-Device Check β Protected Route Access
Feature Relationships
Exercise ββ Muscle Groups (Many-to-Many)
- Each exercise can target multiple muscle groups
- Each muscle group can be in multiple exercises
- Junction table:
exercise_muscle_groups
Exercise ββ Equipment (Many-to-Many)
- Each exercise can require multiple equipment items
- Each equipment can be used in multiple exercises
- Junction table:
exercise_equipment
Food ββ Nutrients (Many-to-Many)
- Each food contains multiple nutrients
- Each nutrient appears in multiple foods
- Junction table:
food_nutrients
Assessment ββ Questions (One-to-Many)
- Each assessment has multiple questions
- Each question belongs to one assessment
User ββ Sessions (One-to-Many)
- Each user can have multiple active sessions
- Each session belongs to one user
- Controlled by session limits per device type
Security Features
- Password Security
- bcrypt hashing
- Minimum complexity requirements
- Password reset with time-limited tokens
- Session Security
- Device fingerprinting (FingerprintJS)
- Cross-device enforcement
- Session generation for bulk invalidation
- Sliding expiration (30 minutes)
- IP and user agent tracking
- API Security
- Session validation on all protected routes
- CSRF protection (NextAuth)
- SQL injection prevention (parameterized queries)
- XSS prevention (React sanitization)
- Access Control
- Role-based access (user/admin)
- Protected routes (useCustomSession)
- API endpoint authorization
Development Workflow
Running the Application
# Development
cd /var/www/training.train5d.com/app
npm run dev
# Production Build
npm run build
# Start Production
pm2 start ecosystem.config.js
pm2 restart training-frontendDatabase Migrations
# Connect to PostgreSQL
psql -U train5d -d training_platform
# Run migration scripts
\i migrations/001_create_tables.sqlAdding a New Feature
Plan Feature Structure
- Identify components needed
- Design API endpoints
- Plan database schema changes
Create Database Tables (if needed)
-- migrations/xxx_create_feature_tables.sql CREATE TABLE feature_items ( id SERIAL PRIMARY KEY, name VARCHAR NOT NULL, created_at TIMESTAMP DEFAULT NOW() );Create Feature Directory
components/ βββ feature-name/ βββ index.ts # Barrel export βββ FeatureMain.tsx # Main component βββ FeatureCard.tsx # Sub-components βββ FeatureModal.tsxCreate API Routes in
/pages/api/pages/api/ βββ feature-name/ βββ index.ts # List/Create βββ [id].ts # Get/Update/Delete βββ lookup-data.ts # Supporting dataCreate Page in
/pages/// pages/feature-name.tsx import { FeatureMain } from '@/components/feature-name'; export default function FeaturePage() { return <FeatureMain />; }Update Barrel Exports
// components/feature-name/index.ts export { default as FeatureMain } from './FeatureMain'; export { default as FeatureCard } from './FeatureCard'; // components/index.ts export * from './feature-name';Update Navigation in sidebar/header
- Add route to
components/UnifiedHeader.tsx - Add to
components/dashboard/DashboardSidebar.tsx
- Add route to
Test Authentication and permissions
- Verify protected routes work
- Test role-based access
- Validate session handling
Build and Deploy
npm run build pm2 restart training-frontend
Best Practices: - Keep all feature components in one directory - Use barrel exports for clean imports - Separate UI (components) from logic (lib) - Follow existing naming conventions - Document in APPLICATION_ARCHITECTURE.md
Future Pillar Implementation
Mindset (Pillar 1)
Status: Not yet implemented
Planned Features: - Journal entries with mood tracking - Goal setting and progress visualization - Habit formation and tracking - Daily reflections and gratitude practices - Cognitive behavioral tools - Mindfulness and meditation guides - Progress milestones and celebrations
Database Tables (Planned): -
mindset_journal_entries - mindset_goals -
mindset_habits - mindset_mood_logs -
mindset_milestones - mindset_reflections
Integration Points: - Link goals to exercise and nutrition plans - Track mood patterns with energy levels - Connect habits to all other pillars - Behavioral insights from cross-pillar data
Posture (Pillar 3)
Status: Not yet implemented
Planned Features: - Posture assessments and screenings - Movement pattern analysis - Ergonomic workspace evaluations - Corrective exercise prescriptions - Progress tracking with photos/videos - Pain and discomfort logging - Mobility and flexibility tracking
Database Tables (Planned): -
posture_assessments -
posture_movement_patterns - posture_ergonomics
- posture_corrections - posture_pain_logs -
posture_mobility_tests
Integration Points: - Link to exercise corrective programs - Connect pain patterns to nutrition (inflammation) - Track energy impacts from posture improvements - Mindset connection for body awareness
Energy Mastery (Pillar 5)
Status: Not yet implemented (The Integrative Pillar)
Planned Features: - Sleep quality tracking and optimization - Recovery metrics and readiness scores - Stress management tools - Energy level logging throughout the day - Circadian rhythm optimization - HRV and biometric integration - Environmental factors (light, temperature) - Caffeine and supplement timing
Database Tables (Planned): -
energy_sleep_logs - energy_recovery_metrics -
energy_stress_logs - energy_daily_levels -
energy_biometrics -
energy_environmental_factors -
energy_supplements
Integration Points: - Connects ALL pillars (mindset, nutrition, posture, exercise) - Sleep impacts everything: recovery, mood, performance, cravings - Energy patterns inform workout timing and intensity - Nutrition timing based on energy needs - Stress management through all modalities - The hub that ties everything together
Cross-Pillar Integration Features
Unified User Dashboard: - 5-pillar health score visualization - Daily check-ins across all pillars - Interconnection insights (e.g., βPoor sleep affected workout performanceβ) - Holistic progress tracking - AI-powered recommendations considering all pillars
Integration Tables (Planned): -
user_pillar_scores - Daily scores for each pillar -
pillar_connections - Track how pillars affect each other -
cross_pillar_insights - AI-generated insights -
holistic_recommendations - Recommendations considering all
5 pillars
See: Five Pillars Integration Guide for detailed implementation strategy.
Future Enhancements
Additional Planned Features
- Workout Builder completion
- Exercise video uploads
- Nutrition meal planning with AI
- Advanced progress tracking and analytics
- Mobile app (React Native)
- Social features (share workouts, support groups)
- AI-powered holistic recommendations across all 5 pillars
- Wearable device integrations (Oura, Whoop, Apple Watch)
- Telehealth integrations
Technical Debt
- Standardize API response formats
- Add comprehensive error logging
- Implement rate limiting
- Add API documentation (Swagger)
- Unit and integration tests
- Performance monitoring
- Database indexing optimization
- Reorganize assessments by pillar
Support & Maintenance
Monitoring
- PM2 process monitoring
- Database connection pooling
- Session cleanup cron jobs
- Error logging
Backup Strategy
- Daily database backups
- Media file backups
- Configuration backups
Performance Optimization
- Database query optimization
- Image optimization
- Code splitting (Next.js automatic)
- CDN for static assets (future)
Recent Architecture Changes
Route Reorganization (November 26, 2025)
Authentication Routes Consolidated: - Moved all
authentication pages to /pages/auth/ directory - Removed
duplicate/old auth pages from root - Benefits: Clear separation of
concerns, easier to maintain, follows Next.js conventions
Before:
pages/
βββ login.tsx
βββ register.tsx
βββ forgot-password.tsx
βββ verify-email.tsx
βββ resend-verification.tsx
βββ auth/
β βββ signin.tsx
β βββ reset-password.tsx
After:
pages/
βββ auth/
βββ login.tsx
βββ register.tsx
βββ forgot-password.tsx
βββ reset-password.tsx
βββ verify-email.tsx
βββ resend-verification.tsx
Account Pages Reorganized: - Created
/pages/account/ directory for user account features - Moved
dashboard and profile to account section - Provides clear namespace for
user-specific features
Before:
pages/
βββ dashboard.tsx
βββ profile.tsx
After:
pages/
βββ account/
βββ dashboard.tsx
βββ profile.tsx
βββ sessions.tsx
Admin Pages Structured: - Created
/pages/admin/ directory for admin features - Moved admin
dashboard to admin section - Prepared for future admin features (users,
analytics, etc.)
Before:
pages/
βββ admin.tsx
After:
pages/
βββ admin/
βββ index.tsx
Search Feature Added: - New global search functionality - API endpoints for searching across all content types - Search page with unified search interface - Search components and styles added
New Files:
pages/
βββ search.tsx # Global search page
βββ api/
βββ search/
βββ global.ts # Search all content
βββ exercises.ts # Exercise-specific search
βββ nutrition.ts # Nutrition-specific search
βββ assessments.ts # Assessment-specific search
styles/
βββ search/
βββ search.scss # Search page styles
Benefits of Reorganization: 1. Clearer Structure: Features grouped by purpose (auth, account, admin) 2. Better Scalability: Easy to add new features within each section 3. Improved Navigation: Users understand where they are in the app 4. Easier Maintenance: Related files are co-located 5. RESTful Conventions: Routes match industry standards 6. Future-Proof: Room for growth in each section
Migration Notes: - All authentication routes now use
/auth/* prefix - Dashboard moved to
/account/dashboard - Admin features now under
/admin/* - Old route files deleted to prevent confusion -
No database changes required - Session system remains unchanged
Last Updated: November 26, 2025