# Gym Tracker App - Implementation Plan ## Overview This document outlines the step-by-step implementation plan for building the Gym Tracker application based on the Product Design Document. The application will be containerized using Docker and consist of a Node.js/Express backend with SQLite database, and a vanilla JavaScript frontend served by Nginx. ## Project Structure ``` gym-tracker/ ├── backend/ │ ├── server.js # Express server and API routes │ ├── database.js # SQLite database setup and queries │ ├── package.json # Node.js dependencies │ └── package-lock.json ├── frontend/ │ ├── index.html # Main HTML file │ ├── styles.css # CSS styling │ ├── app.js # Main application logic │ ├── heatmap.js # Heatmap component logic │ ├── muscleGroups.js # Muscle group tracking logic │ └── api.js # API client for backend communication ├── nginx/ │ └── nginx.conf # Nginx configuration ├── Dockerfile # Docker container definition └── README.md # Setup and usage instructions ``` ## Implementation Phases ### Phase 1: Backend Setup #### Step 1.1: Initialize Node.js Backend - [ ] Create `backend/` directory - [ ] Initialize npm project (`npm init`) - [ ] Install dependencies: - `express` - Web framework - `sqlite3` - SQLite database driver - `cors` - Enable CORS for API - `body-parser` - Parse JSON request bodies - `uuid` - Generate unique session IDs #### Step 1.2: Create Database Schema - [ ] Create `database.js` file - [ ] Define SQLite database initialization - [ ] Create `sessions` table with schema: ```sql CREATE TABLE IF NOT EXISTS sessions ( id TEXT PRIMARY KEY, date TEXT NOT NULL, muscle_groups TEXT NOT NULL ); ``` - [ ] Implement database connection management - [ ] Add error handling for database operations #### Step 1.3: Build API Endpoints - [ ] Create `server.js` with Express setup - [ ] Implement `GET /api/sessions` - Fetch all sessions - [ ] Implement `POST /api/sessions` - Create new session - Validate date format - Validate muscle_groups array - Generate unique ID - [ ] Implement `PUT /api/sessions/:id` - Update session - Validate session exists - Validate input data - [ ] Implement `DELETE /api/sessions/:id` - Delete session - [ ] Add error handling and appropriate HTTP status codes - [ ] Enable CORS for frontend access #### Step 1.4: Test Backend API - [ ] Test each endpoint with curl or Postman - [ ] Verify data persistence in SQLite - [ ] Test edge cases (invalid data, missing sessions, etc.) ### Phase 2: Frontend Development #### Step 2.1: HTML Structure - [ ] Create `frontend/index.html` - [ ] Define semantic HTML structure: - Header with app title and balance indicator - "Add Today's Workout" button - Heatmap container - Muscle groups dashboard (6 cards) - Modal/form for adding sessions - [ ] Include CDN links for Cal-Heatmap - [ ] Link CSS and JS files #### Step 2.2: CSS Styling - [ ] Create `frontend/styles.css` - [ ] Style header and navigation - [ ] Style balance indicator (emoji + status text) - [ ] Style "Add Workout" button - [ ] Style heatmap container - [ ] Style muscle group cards: - Color-coded indicators (green/yellow/red) - Display days since last trained - Display training counts - [ ] Style modal/form for session entry - [ ] Add responsive design for mobile devices - [ ] Implement color scheme and typography #### Step 2.3: API Client Layer - [ ] Create `frontend/api.js` - [ ] Implement `fetchSessions()` function - [ ] Implement `createSession(session)` function - [ ] Implement `updateSession(id, session)` function - [ ] Implement `deleteSession(id)` function - [ ] Add error handling for network requests - [ ] Add loading states #### Step 2.4: Core Application Logic - [ ] Create `frontend/app.js` - [ ] Initialize application state: - Sessions array - Muscle groups configuration - [ ] Implement session management: - Load sessions on page load - Add new session functionality - Edit session functionality - Delete session functionality - [ ] Implement data calculation functions: - Calculate days since last trained per muscle group - Calculate training frequency (7 days, 30 days) - Calculate balance indicator score - [ ] Implement UI update functions: - Update muscle group cards - Update balance indicator - Refresh heatmap #### Step 2.5: Heatmap Component - [ ] Create `frontend/heatmap.js` - [ ] Initialize Cal-Heatmap with configuration: - Set date range (current year) - Configure color scheme (green/grey) - Set domain and subDomain - [ ] Transform sessions data for Cal-Heatmap format - [ ] Implement tooltip showing: - Date - Muscle groups trained - [ ] Add navigation controls (previous/next year) - [ ] Handle click events on heatmap cells #### Step 2.6: Muscle Groups Dashboard - [ ] Create `frontend/muscleGroups.js` - [ ] Define muscle groups configuration: - Chest, Legs, Delts, Lats, Triceps, Biceps - [ ] Implement rendering of muscle group cards - [ ] Calculate and display for each muscle group: - Days since last trained - Training count (last 7 days / last 30 days) - Color-coded status indicator - [ ] Update cards when sessions change #### Step 2.7: Balance Indicator - [ ] Implement balance score calculation logic: - Happy: All 6 groups trained 2+ times in last 7 days - Neutral: All 6 groups trained 1+ times in last 7 days - Angry: Any group not trained in last 7 days - [ ] Render emoji and status text - [ ] Update indicator when sessions change #### Step 2.8: Session Form/Modal - [ ] Create modal UI for adding/editing sessions - [ ] Implement form with: - Date picker (default: today) - Checkboxes for 6 muscle groups - Save button - Cancel button - [ ] Handle form submission - [ ] Validate form inputs - [ ] Clear form after submission - [ ] Close modal after save ### Phase 3: Docker Configuration #### Step 3.1: Create Dockerfile - [ ] Create `Dockerfile` in root directory - [ ] Use multi-stage build: - Stage 1: Install Node.js dependencies - Stage 2: Copy backend and frontend files - Stage 3: Install and configure Nginx - [ ] Copy backend files to container - [ ] Copy frontend files to Nginx html directory - [ ] Expose ports (80 for Nginx, 3000 for Express) - [ ] Set up startup command to run both services #### Step 3.2: Configure Nginx - [ ] Create `nginx/nginx.conf` - [ ] Configure Nginx to: - Serve static files from `/usr/share/nginx/html` - Proxy `/api/*` requests to Express backend - Set appropriate headers - [ ] Configure port 80 for HTTP #### Step 3.3: Test Docker Build - [ ] Build Docker image - [ ] Run container locally - [ ] Verify frontend loads correctly - [ ] Verify API endpoints work through Nginx proxy - [ ] Verify database persistence across container restarts - [ ] Test complete workflow (add/edit/delete sessions) ### Phase 4: Integration and Testing #### Step 4.1: End-to-End Testing - [ ] Test adding multiple sessions - [ ] Test multiple sessions on same day - [ ] Test editing sessions - [ ] Test deleting sessions - [ ] Verify heatmap updates correctly - [ ] Verify muscle group stats update correctly - [ ] Verify balance indicator changes appropriately #### Step 4.2: Edge Case Testing - [ ] Test with empty database (first use) - [ ] Test with many sessions (performance) - [ ] Test date boundaries (year transitions) - [ ] Test all muscle groups selected - [ ] Test no muscle groups selected (validation) - [ ] Test invalid date inputs #### Step 4.3: UI/UX Polish - [ ] Review and improve styling - [ ] Add loading indicators - [ ] Add success/error messages - [ ] Improve mobile responsiveness - [ ] Test across different browsers - [ ] Optimize performance ### Phase 5: Documentation and Deployment #### Step 5.1: Create README - [ ] Write `README.md` with: - Project overview - Prerequisites (Docker installed) - Installation instructions - Usage instructions - Docker commands reference - Backup recommendations - Troubleshooting guide #### Step 5.2: Deployment Preparation - [ ] Document Docker build process - [ ] Document port configuration - [ ] Document volume mount for data persistence - [ ] Create startup scripts if needed - [ ] Document environment variables #### Step 5.3: Final Review - [ ] Code review and cleanup - [ ] Remove console.logs and debug code - [ ] Optimize bundle size - [ ] Verify all PRD requirements met - [ ] Test final Docker image ## Development Order Recommendation **Recommended sequence for building:** 1. **Backend First** (Phase 1) - Build and test API independently - Ensures data layer is solid before frontend 2. **Frontend Core** (Phase 2.1-2.4) - HTML structure and basic styling - API client and core logic - Can test with mock data initially 3. **Frontend Components** (Phase 2.5-2.8) - Heatmap integration - Muscle groups dashboard - Balance indicator - Session form 4. **Docker Integration** (Phase 3) - Containerize application - Configure Nginx proxy 5. **Testing & Polish** (Phase 4-5) - End-to-end testing - Documentation - Final deployment preparation ## Key Technical Decisions ### Database Design - **Single table:** Simple schema with JSON-encoded muscle_groups array - **Text IDs:** Using UUIDs for session identification - **Date format:** ISO 8601 string format (YYYY-MM-DD) for consistency ### Frontend Architecture - **Modular files:** Separate concerns (app logic, heatmap, muscle groups, API) - **No build process:** Vanilla JS served directly - **Cal-Heatmap:** Mature library for heatmap visualization ### Docker Strategy - **Single container:** Both Nginx and Express in one container for simplicity - **Volume mount:** Persistent data storage outside container - **Nginx proxy:** Clean separation of static and API requests ## Success Criteria - ✅ Application runs in Docker container - ✅ All API endpoints function correctly - ✅ Heatmap displays gym sessions accurately - ✅ Muscle group tracking calculates correctly - ✅ Balance indicator shows appropriate status - ✅ Sessions can be added, edited, and deleted - ✅ Data persists across container restarts - ✅ UI is responsive and user-friendly - ✅ All PRD requirements implemented