Workout Tracker

paused

Two years of gym notes turned into a database and a progress video.

Tech Stack

Node.jsSQLiteRemotionReactTypeScriptTailwind CSSdayjs

TL;DR

Notes app to SQLite to video

Notes

December 9, 2025 at 11:18 PM

Workout

10/1
  –  weight: 210
  –  CGBP - 160 5x12
10/4
  –  weight: 207.9
  –  Bench - 190 5x8
  –  Leg Press - 295 5x12
10/5
  –  Weight: 208
  –  narrow grip lat pull down - 135 5x5
10/6
  –  Weight: 206.8
  –  squat - 190 5x5
  –  Barbell shrug 190 5x6
10/7
  –  weight: 206.6
  –  Narrow grip lat pull down - 140 5x5
  –  Bench: 195 5x6
  –  Machine pec fly: 4x12 115
10/8
  –  weight: 206.2
  –  Shoulder press: 95 5x5
10/9
  –  weight: 207.8
  –  Squat: 195 5x5
  –  Bench: 200 5x5
  –  Machine pec fly: 4x12 120
  –  Barbell Shrug: 195 5x6
10/15
  –  weight: 210.5
  –  Shoulder press 100 5x5
  –  Leg press 300 5x12
  –  Narrow grip lat pull down 145 5x5
10/16
  –  weight:209
  –  Bench: 205 5x5
  –  Barbell Shrug: 200 5x6
  –  EZ barbell curl: 75 3x12
  –  Rope push down: 47.5 4x12
  –  Machine pec fly: 4x12 125
10/17
  –  weight: 208.3
  –  Squat: 200 5x5
  –  Narrow grip lat pull down 154 5x5
  –  Seated leg curl: 100 3x12
  –  Leg extension: 95 3x12
  –  Upright supinated row: 85 3x12
10/22
  –  weight: 210.3
  –  Bench: 210 5x4
  –  Narrow grip lat pull down 160 5x5

Sample of raw workout data from Notes app

workouts.db
sqlite> SELECT
  ec.name,
  COUNT(*) as sessions
FROM workout_exercises we
JOIN exercise_catalog ec
  ON we.exercise_id = ec.id
JOIN workouts w
  ON we.workout_id = w.id
WHERE ec.name = 'Bench'
  AND w.date LIKE '2024%'
GROUP BY ec.name;

name  | sessions
------|----------
Bench | 63

SQLite query results

30-second progress video

What it is
Two years of gym notes typed into the Notes app, one line per exercise, no year on any of them.
Parsing
A chain of regexes handles about ten formats: Bench - 190 5x8, Bench: 5x8 190, and a bare 185 5x5 that belongs to the exercise above it.
Result
3,112 lines became 421 workouts and 2,305 exercises in a normalized SQLite database.
Video
Remotion, React and plain SVG, no chart library: a heatmap and a weight chart running from 210 to 232.5 lbs.

Started October 2025.