IronLog is a single-user, mobile-first web app for logging resistance-training workouts. It runs as a Docker Compose stack (React frontend served by Nginx, Node/Express API, PostgreSQL) and is intended for local-network use without authentication.
Key features
- Simple, fast workout logging (weight, reps, RPE)
- Rest countdown + stopwatch and rest-duration recording
- Program-based weekly workout structure and seeds
- PostgreSQL persistence with migrations and seed data
- Frontend: React (Vite) + Tailwind
- Backend: Node.js + Express
- Database: PostgreSQL
- Deployment: Docker Compose (recommended)
- Docker & Docker Compose (recommended)
- Or: Node.js (v18+ / v20 recommended) and PostgreSQL
-
Copy the example environment file and set a strong DB password:
cp .env.example .env
-
Build and start all services:
docker-compose up --build- After startup:
- Frontend: http://localhost:3000
- API: http://localhost:3001
Notes: the Postgres service is bound to 127.0.0.1:5432 by default; change docker-compose.yml if you need a different binding.
Migrations are applied automatically when the API starts (see server/src/db/migrate.js). The initial seed data is applied by the SQL migration 002_seed_data.sql.
-
Prepare environment variables (copy
.env.exampleto.envand setPOSTGRES_*values). Ensure a running Postgres instance is available. -
API (server)
cd server
npm ci
# start in watch/dev mode
npm run dev
# or in production mode
npm startThe server will run migrations on startup.
- Frontend (client)
cd client
npm ci
# start dev server (Vite)
npm run dev
# or build for production
npm run buildIf serving a production build locally without Docker, the built files appear in client/dist and can be served by a static server or Nginx.
Migrations run automatically when the API starts. To apply migrations, start the server (npm start) and watch the logs; the migration runner is server/src/db/migrate.js.
client/— React app (Vite)server/— Node/Express APIdb/init/— SQL init scripts mounted into Postgres containerdocker-compose.yml— Compose stack for db, api, client
The PostgreSQL data lives in the pgdata Docker volume. To create a backup:
docker-compose exec db pg_dump -U ironlog ironlog > backup_$(date +%Y%m%d).sqlTo restore from a backup:
docker-compose exec -T db psql -U ironlog ironlog < backup_20260210.sqlData persists across docker-compose down and docker-compose up because the pgdata volume is not removed. To fully reset the database (destroys all data):
docker-compose down -v
docker-compose up --build- Single-user app for local network use; no authentication enabled.
- Seed data and initial program are included in migrations.
For development questions or to add contributor notes, update this README or open an issue in the repo.