Przejdź do treści
Wszystkie projekty

Projekt · 02

Status: Rozwijany

GymTracker

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.

GymTracker na komputerze z dzisiejszym treningiem

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

  1. 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.

  2. 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.

  3. 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

GymTracker na komputerze z dzisiejszym treningiem
Dzisiaj: zaplanowany trening i przycisk startuOtwórz obraz w pełnym rozmiarze ↗
Ekran aktywnego treningu z ćwiczeniem, seriami i licznikiem przerwy
Aktywny trening: ćwiczenie, serie i licznik przerwyOtwórz obraz w pełnym rozmiarze ↗
Kalendarz miesiąca z zaplanowanymi treningami i statusami
Kalendarz z planem na kolejne tygodnieOtwórz obraz w pełnym rozmiarze ↗
Postępy: waga, tkanka tłuszczowa i kroki z wykresami
Postępy: ostatnie pomiary i wykresyOtwórz obraz w pełnym rozmiarze ↗

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.

terminal
$ 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