Files
gravl/.planning/codebase/STACK.md
T
2026-02-15 21:49:31 +01:00

4.0 KiB

Technology Stack

Analysis Date: 2026-02-15

Languages

Primary:

  • JavaScript (ES6+) - Both frontend and backend
  • SQL - PostgreSQL database queries in backend

Secondary:

  • HTML/CSS - Frontend UI styling

Runtime

Environment:

  • Node.js 20 (LTS) - Specified in Dockerfiles (node:20-alpine)

Package Manager:

  • npm (Node Package Manager)
  • Lockfile: package-lock.json present in both frontend/ and backend/

Frameworks

Core:

  • React 18.2.0 - Frontend UI library (frontend/package.json)
  • Express.js 4.18.2 - Backend REST API framework (backend/package.json)

Frontend:

  • Vite 5.0.8 - Frontend build tool and dev server
    • Config: frontend/vite.config.js
    • React plugin: @vitejs/plugin-react 4.2.1

Routing:

  • React Router DOM 6.21.0 - Frontend client-side routing
    • Configured in frontend/src/main.jsx with BrowserRouter and Routes

Web Server:

  • Nginx (Alpine) - Production frontend server
    • Config: frontend/nginx.conf
    • Serves static assets, proxies /api to backend
    • Gzip compression enabled

Key Dependencies

Frontend Critical:

  • react 18.2.0 - UI framework
  • react-dom 18.2.0 - DOM rendering
  • react-router-dom 6.21.0 - Client-side routing

Frontend Dev:

  • vite 5.0.8 - Build tooling
  • @vitejs/plugin-react 4.2.1 - React JSX support
  • @types/react 18.2.43 - TypeScript types
  • @types/react-dom 18.2.17 - TypeScript types

Backend Critical:

  • express 4.18.2 - HTTP server framework
  • pg 8.11.3 - PostgreSQL client library
  • jsonwebtoken 9.0.2 - JWT authentication token generation/verification
  • bcryptjs 2.4.3 - Password hashing and verification
  • cors 2.8.5 - Cross-origin resource sharing middleware

Backend Dev:

  • nodemon 3.0.2 - Auto-restart on file changes

Configuration

Environment:

  • Database connection via environment variables:
    • DB_HOST - PostgreSQL hostname (default: postgres)
    • DB_PORT - PostgreSQL port (default: 5432)
    • DB_USER - Database user (default: postgres)
    • DB_PASSWORD - Database password
    • DB_NAME - Database name (default: gravl)
    • JWT_SECRET - JWT signing key (default: gravl-secret-key-change-in-production)
    • PORT - Backend API port (default: 3001)

Build:

  • Frontend: vite.config.js - Vite configuration with React plugin
    • Dev server: 0.0.0.0:5173
    • API proxy: /api routes to http://localhost:3001
  • Backend: Simple Node.js entry point at backend/src/index.js

Database

Primary:

  • PostgreSQL - Relational database
    • Initialized via db/init.sql
    • Accessed via pg Node.js client library
    • Tables: users, programs, program_days, exercises, program_exercises, workout_logs, user_measurements, user_strength

Platform Requirements

Development:

  • Node.js 20+
  • npm 9+
  • PostgreSQL 12+
  • Docker and Docker Compose (for containerized development)

Production:

  • Deployment target: Docker containers via Docker Compose
  • Frontend container: node:20-alpine (build) → nginx:alpine (production)
  • Backend container: node:20-alpine
  • Reverse proxy: Traefik (configured in docker-compose.yml)
  • Network: Homelab environment with internal proxy and homelab networks

Build Process

Frontend:

  1. npm install - Install dependencies
  2. npm run build - Vite builds to dist/ directory
  3. Dockerfile multi-stage build:
    • Stage 1: Node 20 Alpine - npm install and build
    • Stage 2: Nginx Alpine - Serve built assets from /usr/share/nginx/html

Backend:

  1. npm install --production - Install dependencies (production only)
  2. Dockerfile: Node 20 Alpine - Copy src and run npm start

Development Commands

Frontend:

  • npm run dev - Start Vite dev server on 0.0.0.0:5173 with hot reload
  • npm run build - Production build to dist/
  • npm run preview - Preview production build

Backend:

  • npm run start - Run node src/index.js (production)
  • npm run dev - Run with nodemon for auto-restart on file changes

Stack analysis: 2026-02-15