Application Architecture - Train5D Documentation

Train5D Platform Documentation

Last Updated: 2026-03-01

Train5D Application Architecture

Table of Contents


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


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?

  1. Conceptual Clarity - Directory structure matches the 5-pillar philosophy
  2. Scalability - Easy to add new pillar features as the platform grows
  3. Discoverability - Developers know exactly where to find/add pillar-specific code
  4. Consistency - Same organizational pattern across pages, API, components, and styles
  5. 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:

  1. Pages: Add to /pages/pillars/[pillar-name]/
  2. API: Add to /pages/api/pillars/[pillar-name]/
  3. Components: Add to /components/pillars/[pillar-name]/
  4. Styles: Add to /styles/pillars/[pillar-name]/
  5. 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.scss

Cross-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

πŸ”‘ Key Features

πŸ”„ 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

🧩 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

πŸ”‘ Key Features

πŸ“Š Muscle Group Fields


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

πŸ”‘ Key Features



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

Nutrition Library

Assessments Library

🎨 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.svg

Benefits 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

πŸ”‘ Key Features


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
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
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


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


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


Technology Stack

Frontend

Backend

Infrastructure

Development Tools

External Services


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):

  1. 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
  2. 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
  3. 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)

Exercise ←→ Equipment (Many-to-Many)

Food ←→ Nutrients (Many-to-Many)

Assessment ←→ Questions (One-to-Many)

User ←→ Sessions (One-to-Many)


Security Features

  1. Password Security
    • bcrypt hashing
    • Minimum complexity requirements
    • Password reset with time-limited tokens
  2. Session Security
    • Device fingerprinting (FingerprintJS)
    • Cross-device enforcement
    • Session generation for bulk invalidation
    • Sliding expiration (30 minutes)
    • IP and user agent tracking
  3. API Security
    • Session validation on all protected routes
    • CSRF protection (NextAuth)
    • SQL injection prevention (parameterized queries)
    • XSS prevention (React sanitization)
  4. 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-frontend

Database Migrations

# Connect to PostgreSQL
psql -U train5d -d training_platform

# Run migration scripts
\i migrations/001_create_tables.sql

Adding a New Feature

  1. Plan Feature Structure

    • Identify components needed
    • Design API endpoints
    • Plan database schema changes
  2. 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()
    );
  3. Create Feature Directory

    components/
    └── feature-name/
        β”œβ”€β”€ index.ts              # Barrel export
        β”œβ”€β”€ FeatureMain.tsx       # Main component
        β”œβ”€β”€ FeatureCard.tsx       # Sub-components
        └── FeatureModal.tsx
  4. Create API Routes in /pages/api/

    pages/api/
    └── feature-name/
        β”œβ”€β”€ index.ts              # List/Create
        β”œβ”€β”€ [id].ts               # Get/Update/Delete
        └── lookup-data.ts        # Supporting data
  5. Create Page in /pages/

    // pages/feature-name.tsx
    import { FeatureMain } from '@/components/feature-name';
    
    export default function FeaturePage() {
      return <FeatureMain />;
    }
  6. 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';
  7. Update Navigation in sidebar/header

    • Add route to components/UnifiedHeader.tsx
    • Add to components/dashboard/DashboardSidebar.tsx
  8. Test Authentication and permissions

    • Verify protected routes work
    • Test role-based access
    • Validate session handling
  9. 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

Technical Debt


Support & Maintenance

Monitoring

Backup Strategy

Performance Optimization


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