Własny produkt · SaaS
Joint Effort
SaaS dla trenerów personalnych, który projektuję i rozwijam sam. Trener układa plany treningowe, klient wykonuje je i zapisuje w portalu, co zrobił.
- Branża
- Fitness, trenerzy personalni
- Okres
- 01.2025 – teraz
- Rola
- Jedyny twórca: UX, architektura, baza danych, wdrożenie
- Stack
- TypeScript · React Router (SSR) · Mantine · Supabase/PostgreSQL · Zod · Vitest · Playwright · Astro


Kontekst
Trener personalny prowadzi kilkunastu, czasem kilkudziesięciu klientów. Każdy ma swój plan, swoje kontuzje i swoje postępy. W praktyce żyje to w arkuszach, notatkach i wiadomościach na komunikatorze. Joint Effort zbiera to w jednym miejscu: trener planuje treningi, klient wykonuje je i zapisuje w portalu, co zrobił.
To mój własny produkt. Odpowiadam za całość: od projektu UX, przez architekturę i bazę danych, po wdrożenie i landing page.
Problem
Edytor planu musi być szybki dla trenera, który układa tydzień za tygodniem, i jednocześnie czytelny dla klienta na telefonie na siłowni. Do tego dane o zdrowiu i sylwetce są wrażliwe: trener może widzieć wyłącznie swoich klientów, a klient tylko siebie.
Co zrobiłem
Język domeny przed kodem
Zanim powstały ekrany, spisałem słownik domeny: plan, szablon, tydzień, trening, seria, wykonanie, zakończona współpraca. Każde pojęcie ma jedną nazwę i listę nazw, których nie używamy. Dzięki temu interfejs, kod i baza mówią tym samym językiem.
Edytor planu treningowego
Zbudowałem edytor, w którym trener układa tygodnie, treningi, grupy ćwiczeń i serie. Ćwiczenia pochodzą z biblioteki projektu, a każde ma partię mięśniową ze stałego słownika. Z tego edytor liczy na bieżąco serie na partię w tygodniu. Plan można zapisać jako szablon i kopiować kolejnym klientom.
Bezpieczeństwo w bazie, nie w kodzie
Izolację danych trzyma Row Level Security w PostgreSQL (Supabase). Trener widzi tylko klientów, których prowadzi. Nawet błąd w aplikacji nie odsłoni cudzych danych, bo baza ich nie zwróci. Gdy RLS liczony per wiersz zaczął spowalniać odczyt drzewa planu, przepisałem ten odczyt tak, by nie liczyć polityk dla każdego wiersza osobno.
Portal klienta jak aplikacja
Klient korzysta z portalu na telefonie. Aplikację da się dodać do ekranu głównego (PWA). Portal ma raport dzienny, profil z pomiarami i czat z trenerem. Każdy push na main po zielonych testach wdraża migracje i aplikację na staging.
Efekt
Produkt działa w becie z pierwszymi testerami: jointeffort.pl.