9.3 KiB
9.3 KiB
Codebase Structure
Analysis Date: 2026-02-15
Directory Layout
gravl/
├── .git/ # Git repository
├── .planning/
│ └── codebase/ # Analysis documents (this file)
├── agents/ # AI agent configurations (not active codebase)
│ ├── architect/
│ ├── backend-dev/
│ ├── coach/
│ ├── frontend-dev/
│ ├── nutritionist/
│ └── reviewer/
├── backend/ # Express.js REST API server
│ ├── src/
│ │ └── index.js # Main server file (all routes and handlers)
│ ├── package.json # Backend dependencies
│ ├── Dockerfile # Docker build config
│ └── node_modules/ # Dependencies (not committed)
├── frontend/ # React SPA application
│ ├── src/
│ │ ├── main.jsx # App entry point (routing, providers)
│ │ ├── App.jsx # Main app shell (view routing)
│ │ ├── index.css # Global styles
│ │ ├── App.css # App component styles
│ │ ├── pages/ # Full-page components (views)
│ │ ├── components/ # Reusable components
│ │ └── context/ # React Context providers
│ ├── index.html # HTML template
│ ├── vite.config.js # Vite build configuration
│ ├── package.json # Frontend dependencies
│ ├── Dockerfile # Docker build config
│ └── node_modules/ # Dependencies (not committed)
├── db/ # Database schema and initialization
│ └── init.sql # PostgreSQL schema definition
├── docker/ # Docker-related files
├── docker-compose.yml # Multi-container orchestration
├── README.md # Project overview
├── CLAUDE.md # LLM context file
└── TODO.md # Project tasks and notes
Directory Purposes
backend/src/:
- Purpose: Backend application code
- Contains: Single Express server file with all routes, middleware, and database handlers
- Key files:
index.js(14,361 lines, monolithic backend)
frontend/src/:
- Purpose: Frontend application source code
- Contains: React component files, styling, and global state management
- Key files:
App.jsx,main.jsx, page components, AuthContext
frontend/src/pages/:
- Purpose: Full-page/route components (views)
- Contains: 8 page components handling entire view logic
- Key files:
Dashboard.jsx- Main view showing program and scheduled workoutWorkoutPage.jsx- Active workout tracking interfaceProfilePage.jsx- User profile and measurementsProgressPage.jsx- Progress tracking and statisticsLoginPage.jsx- Authentication entryRegisterPage.jsx- Account creationOnboardingWizard.jsx- Initial profile setupWorkoutSelectPage.jsx- Program/day selection
frontend/src/components/:
- Purpose: Reusable UI components
- Contains: Shared UI building blocks
- Key files:
Icons.jsx- Icon system and icon name mapping
frontend/src/context/:
- Purpose: React Context providers for global state
- Contains: Authentication state and session management
- Key files:
AuthContext.jsx- User login, registration, profile updates, token management
db/:
- Purpose: Database schema and initialization
- Contains: SQL scripts for schema creation and seed data
- Key files:
init.sql- Creates 8 tables, indexes, and inserts PPL program template
docker/:
- Purpose: Docker-related configuration (currently minimal)
- Contains: Likely Dockerfile templates or configuration
Key File Locations
Entry Points:
frontend/index.html- HTML template that loads React appfrontend/src/main.jsx- React bootstrap, BrowserRouter setup, routing definitionsfrontend/src/App.jsx- Main app shell, view routing, workout state managementbackend/src/index.js- Express server initialization, all API routes
Configuration:
frontend/vite.config.js- Vite build config, dev proxy setupfrontend/package.json- React, React Router, Vite dependenciesbackend/package.json- Express, PostgreSQL driver, JWT, bcrypt dependenciesdocker-compose.yml- Service definitions, networking, Traefik routing labels
Core Logic:
frontend/src/context/AuthContext.jsx- Authentication and session managementbackend/src/index.js- All API endpoints, auth middleware, database queriesdb/init.sql- Database schema and initial data
Styling:
frontend/src/index.css- Global styles, CSS variables, base componentsfrontend/src/App.css- Application layout stylesfrontend/src/pages/*.jsx- Inline inline className attributes (CSS-in-JS via CSS class selectors)
Naming Conventions
Files:
- Pages: PascalCase with "Page" suffix (e.g.,
LoginPage.jsx,WorkoutPage.jsx) - Components: PascalCase (e.g.,
Icons.jsx) - Context: PascalCase with "Context" suffix (e.g.,
AuthContext.jsx) - Backend routes: Lowercase with slashes (e.g.,
/api/auth/login,/api/user/profile) - Database tables: Lowercase with underscores (e.g.,
workout_logs,program_exercises)
Directories:
- Page directory:
pages/(plural) - Component directory:
components/(plural) - Context directory:
context/(singular, convention) - Backend:
src/(single index.js file, no subdirectories)
Functions:
- React components: PascalCase (e.g.,
function Dashboard()) - Hooks/helpers: camelCase (e.g.,
fetchProgram(),getCoachGreeting(),getMuscleGroups()) - Constants: camelCase (e.g.,
API_URL,weekdays,warmupExercises) - Middleware: camelCase (e.g.,
authMiddleware)
Variables:
- State: camelCase (e.g.,
user,loading,selectedDay) - Props: camelCase (e.g.,
onStartWorkout,onNavigate) - API endpoints: Lowercase kebab-case in URLs, snake_case in query parameters and JSON bodies
Types/Database:
- Columns: snake_case (e.g.,
password_hash,onboarding_complete,program_exercise_id) - Tables: Lowercase plural (e.g.,
users,programs,workout_logs) - Foreign keys: Follow pattern
{table_id}(e.g.,user_id,program_id)
Where to Add New Code
New Feature (e.g., new page/view):
- Primary code:
frontend/src/pages/{FeatureName}Page.jsx - Styling: Inline CSS class names in JSX or extend
App.css - API calls: Direct fetch in component useEffect hooks, passing API_URL from page file
- Routing: Add Route to
frontend/src/main.jsxwith Route path and component - If requires auth: Wrap in
<ProtectedRoute>wrapper in main.jsx - If requires context: Use
useAuth()hook from AuthContext
New API Endpoint (backend):
- Location: Add route handler in
backend/src/index.js - Pattern: Use
app.get(),app.post(),app.put()with path and handler function - Database: Use
pool.query()for PostgreSQL queries with parameterized queries ($1, $2, etc.) - Auth: Add
authMiddlewareparameter if endpoint requires authentication - Response: Return
res.json()with data or error object - Error handling: Wrap in try-catch, return appropriate status codes (400, 401, 404, 500)
New Component:
- Location:
frontend/src/components/{ComponentName}.jsx - Export: Default export or named export function component
- Props: Accept props for reusability, avoid direct API calls
- Integration: Import into pages or other components as needed
New Database Table/Schema Change:
- Location:
db/init.sql - Pattern: Add CREATE TABLE statement with proper data types and constraints
- Relations: Use FOREIGN KEY references and ON DELETE CASCADE
- Indexes: Add indexes for frequently queried columns (user_id, date, etc.)
- Seed data: Use INSERT statements with ON CONFLICT DO NOTHING
- Application: Changes apply on container restart (init.sql runs every startup)
Utilities/Helpers:
- Location: Keep in page file if only used there, or create in
frontend/src/utils/if reused - Pattern: Export as named functions (no separate utils directory currently exists)
- Examples:
getCoachGreeting(),getMuscleGroups(),getWeekStart()are defined in pages
Authentication/State:
- Location: Extend
frontend/src/context/AuthContext.jsxif global - Location: Add to page component state with useState if local to page
- Pattern: Use
useAuth()hook for auth context, create custom hooks if reusable state pattern emerges
Special Directories
node_modules/:
- Purpose: Installed npm dependencies
- Generated: Yes (by npm install)
- Committed: No (.gitignore)
- Notes: Frontend and backend have separate node_modules directories
.git/:
- Purpose: Git version control repository
- Generated: Yes (git init)
- Committed: N/A (git internal)
.planning/codebase/:
- Purpose: Architecture and codebase analysis documents
- Generated: Yes (by mapping tools)
- Committed: Yes (for orchestrator reference)
- Contains: ARCHITECTURE.md, STRUCTURE.md, and other analysis documents
agents/:
- Purpose: Agent configuration (not part of active codebase)
- Generated: Yes (from setup)
- Committed: Yes
- Notes: These are orchestrator definitions, not part of the running application
Structure analysis: 2026-02-15