Przejdź do treści
Radosław Kania

Własny produkt · SaaS

Joint Effort

jointeffort.pl

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
Edytor planu treningowego w Joint Effort

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.