Projekt · 02
Status: RozwijanyGymTracker
GymTracker to prywatna aplikacja do zapisywania treningów, planów, pomiarów ciała, celów i suplementów, robiona przede wszystkim pod telefon. To monorepo z API na Fastify, klientem w React i bazą PostgreSQL, uruchamiane przez Docker Compose na domowym serwerze i dostępne przez Tailscale.
01 · Problem
Co trzeba było rozwiązać
Aplikacje treningowe albo trzymają dane w cudzej chmurze, albo nie mają wszystkiego w jednym miejscu. Chciałem mieć plany, serie, pomiary, cele i suplementy razem, szybkie w obsłudze z telefonu na siłowni.
02 · Rozwiązanie
Jak to działa
npm workspaces z apps/api (Fastify 5, Zod, Prisma), apps/web (React 19, TanStack Query, Tailwind) i packages/shared. Schemat PostgreSQL 17 jest zarządzany migracjami Prismy; Docker Compose uruchamia bazę, API i frontend serwowany przez Nginx, a migracje odpalają się przy starcie.
03 · Funkcje
Co potrafi
- Treningi z seriami, ciężarem, powtórzeniami i notatkami; plany na dni tygodnia
- Kalendarz zaplanowanych, wykonanych i pominiętych treningów
- Pomiary ciała (waga, tkanka tłuszczowa, obwody, kroki) z wykresami
- Cele, dzienna lista suplementów i eksport wybranego okresu do JSON, CSV albo TXT
- Interfejs pod telefon: dolna nawigacja na telefonie, panel boczny od 900 px
04 · Technologie
Zbudowane z
- TypeScript
- Fastify
- Prisma
- PostgreSQL
- Zod
- React
- Docker
- Status
- Rozwijany
- Kod
- github.com/KacperBlok1/analiza-silownia
- Demo
- Nie ma wersji online · uruchom lokalnie
05 · Wyzwania
Co było trudne
Spójne błędy API
Jeden handler błędów w Fastify zamienia błędy walidacji Zod na 400, brak rekordu w Prismie (P2025) na 404, a konflikt unikalności (P2002) na 409, więc handlery tras nie powtarzają tego samego try/catch.
Migracje schematu
Model danych rósł przez cztery wersjonowane migracje Prismy (schemat startowy, treningi, postępy, historia kalendarza), które uruchamiają się same przy starcie kontenera.
Bez logowania
Logowania nie ma celowo: aplikacja działa w sieci domowej i przez Tailscale, a PostgreSQL jest dostępny tylko w sieci Dockera. Przed wystawieniem do internetu trzeba by dodać uwierzytelnianie.
06 · Zrzuty ekranu
Jak to wygląda




Wypróbuj
Uruchom lokalnie
Nie ma jeszcze wersji online. Kod i README są na GitHubie, a te polecenia uruchamiają projekt z głównego katalogu repozytorium.
$ cp .env.example .env
# ustaw POSTGRES_PASSWORD
$ docker compose up -d --build
$ docker compose exec api npm run prisma:seed -w @gymtracker/api
# aplikacja: http://localhost:8088