workout-tracker is a mobile workout tracking application for iOS and Android. Its intent is narrow and concrete: let a lifter record the workouts they perform — the exercises and the sets within each session — and then review their workout history over time. The product exists so that training effort becomes a durable, reviewable record rather than something remembered or guessed at.
The audience is the individual lifter training on a phone in a gym, who wants proof of progress: what was lifted, when, and how it compares to prior sessions. The product is not a coaching platform, a social network, or a wellness companion; it is a personal training log.
Because workout records are private and must persist across sessions and devices, the app establishes an application-owned identity: a new user enrolls through self-service sign-up, and a returning user verifies identity at login before reaching their private workout records. The public Landing page explains the product before identity is established.
This document is the System Requirements Document for the product described above.
workout-tracker is delivered as a first-party mobile application for iOS and Android, backed by an application-owned API and persistent store. All product surfaces are custom first-party UI owned by the application.
Access is split into two boundaries:
Identity is application-owned and established by self-service enrollment (Sign Up) with returning verification (Login). This identity exists solely to keep workout records private and continuous for the correct person; it does not introduce differentiated roles, permissions, or shared-state visibility controls.
The current delivery horizon covers: enrollment, returning verification, logging a workout with its exercises and sets, viewing workout history, and viewing the details of a single past workout. Nothing beyond that is in current scope.
Removed from scope
Not applicable — no reference directive declares content_source.
FR-1 — Mobile workout tracking on iOS and Android (explicit) As a Workout Tracker User, I should use the workout tracker as a mobile app on both iOS and Android, so that I can track training from my phone.
FR-2 — Self-service enrollment before first use (required_inference) As a Workout Tracker User, I should create my own account before first use, so that my workout records are private to me and persist.
FR-3 — Returning identity verification (required_inference) As a Workout Tracker User, I should verify my identity on return, so that I can reach my own private workout records.
FR-4 — Log a workout (explicit) As a Workout Tracker User, I should log my workouts, so that each training session is recorded.
FR-5 — Record exercises and sets within a workout (required_inference) As a Workout Tracker User, I should record each exercise in a workout and each set's weight and reps, so that the log reflects what I actually did.
FR-6 — View workout history (explicit) As a Workout Tracker User, I should view my workout history, so that I can review past sessions over time.
FR-7 — View a single past workout's details (required_inference) As a Workout Tracker User, I should open one past workout and see its full set log, so that I can inspect exactly what I lifted in that session.
Failure/recovery: if the Sign Up submission fails, inline errors appear and the entered values are preserved for correction and retry. If the save in step 6 fails, a recoverable message appears and the composed workout remains in place for retry.
Failure/recovery: failed verification shows a clear, non-revealing message; the user retries or switches to Sign Up. If History fails to load, a retry control restores the list and the user can still start a new workout. If a selected workout cannot be found, an explicit not-found message offers a path back to History.
Failure/recovery: a failed save preserves the composed workout for retry; nothing entered is lost.
The creative direction is authoritative: Editorial swagger for the daily grind, after Tobias van Schneider — a mobile training log for lifters who want proof of progress. The feeling is discipline, effort, and earned pride, not calm wellness. Oversized type and one hot accent give raw training data the confidence of a sports magazine, and the editorial layout keeps dense set lists readable.
Mode. Dark mode only.
Colour tokens (exact hex, by role).
| Role | Hex | Use |
|---|---|---|
| Background | #0E0E0E | App ground; black ground at 80 percent |
| Surface | #1A1A1A | Raised bands, input fields, list grounds |
| Text | #F4F1EA | Warm off-white body and heading type |
| Primary | #FF3B1F | Actions, buttons, set numbers, stat band flip |
| Accent | #E8FF47 | Personal records only — the lime rule and the growing PR bar |
| Muted | #8C8C8C | Secondary labels, metadata, hairline-adjacent text |
Hairline rules are 1px in a low-contrast tone derived from #8C8C8C against #0E0E0E/#1A1A1A. The accent lime is reserved exclusively for personal-record marking and is never used for general actions.
Typography.
-0.03em, leading 0.9. Numbers are large and heavy.clamp() from 44px on mobile to 128px on desktop.Shape language. Sharp corners; no radius above 2px. Hairline 1px rules divide rows. Solid colour blocks and full-bleed bands replace cards.
Layout. Asymmetric editorial grid. One oversized headline spans the viewport. Set logs use ruled rows with the set number in red at the left edge. Wide margins on desktop; full-bleed bands on mobile.
Spacing rhythm. Generous vertical band spacing on desktop, tightened but still full-bleed on mobile; consistent hairline separation between ledger rows so dense set lists stay scannable.
Imagery style. High-contrast monochrome photography of hands, plates, and chalk. Large crops, generous grain, no stock gym smiles. Hover swaps a monochrome image for its colour version.
Readability constraint. Headlines, wordmarks, labels, numbers, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit, with nothing covering them. Imagery and decoration may crop, bleed, or overlap freely.
"LOG THE WORK" — a full-bleed black band that reads like a magazine cover.
On the public Landing page, a full-bleed #0E0E0E band fills the viewport. A cropped, high-contrast monochrome photograph of a loaded barbell sits at the right edge, bleeding off the frame with visible grain. The headline LOG THE WORK is set in Archivo Black at 128px on desktop (clamped down to 44px on mobile), stacked in three lines over the image on the left. Beneath it, a lime #E8FF47 rule pins the composition, and directly under the rule sits the red #FF3B1F "Start training" control. A quiet, clearly labeled path to Login sits in the same band for returning users.
Below the hero, editorial content bands describe logging and history using ruled rows and solid colour blocks — never cards. A black-on-off-white stat band presents the product's promise in 96px numbers on desktop and 44px on mobile, flipping to red on scroll.
The concept recomposes only accepted content and controls: the product name, the headline, the explanation of logging and history, the Sign Up entry, and the Login entry. It introduces no new behaviour or destination.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion, the hero renders in its final composed state immediately: colour image in place, headline fully visible, rule and control static. Content bands wrap into rows so every item is fully readable without scroll-linked reveals.Signature moves carried through the app. Set rows as ruled ledger lines with the red set number at the left edge and weight/reps in tabular columns with hairline dividers; a lime vertical bar that grows beside the week strip to mark a new personal record; a black-on-off-white stat band that flips to red on scroll with numbers at 96px desktop / 44px mobile.
prefers-reduced-motion every surface provides a usable static arrangement with all content fully readable.docker-compose.yml provisions the three runnable services: frontend, backend, and database. No additional services are required for the current workflows.
Log every workout — exercises, sets, weight and reps. Then review your history to see exactly what was lifted, when, and how it compares to last time.
01LOG
Name the exercise, enter the weight and the reps. Each set becomes its own ruled line, so a session reads back exactly as it was performed.
02 / REVIEW
Every session lands in your history newest first. Open any date and see exactly what you lifted — exercise by exercise, set by set.
Back Squat · Bench Press · Barbell Row
Deadlift · Overhead Press · Pull-Up
Front Squat · Incline Press · Romanian Deadlift
Bench Press · Pendlay Row · Lateral Raise
Your saved workouts stack in reverse order, each ruled row a receipt of the work.
Each set is a ruled ledger line with the red set number at the left edge and weight and reps in tabular columns.
A lime vertical bar grows beside the week strip to mark a new personal record.
03 / Enter

Log every workout — exercises, sets, weight and reps. Then review your history to see exactly what was lifted, when, and how it compares to last time.
01LOG
Name the exercise, enter the weight and the reps. Each set becomes its own ruled line, so a session reads back exactly as it was performed.
02 / REVIEW
Every session lands in your history newest first. Open any date and see exactly what you lifted — exercise by exercise, set by set.
Back Squat · Bench Press · Barbell Row
Deadlift · Overhead Press · Pull-Up
Front Squat · Incline Press · Romanian Deadlift
Bench Press · Pendlay Row · Lateral Raise
Your saved workouts stack in reverse order, each ruled row a receipt of the work.
Each set is a ruled ledger line with the red set number at the left edge and weight and reps in tabular columns.
A lime vertical bar grows beside the week strip to mark a new personal record.
03 / Enter
No comments yet. Be the first!