Postavil jsem si fitness tracker v Next.js a Convex. Žádná appka mi nevyhovovala.
Workout logger, macro tracking, progress grafy a tréninkový plán v jedné appce. 9 tabulek v Convex, TypeScript všude. Proč jsem to neudělal v Excelu.
Proč si stavět vlastní fitness appku?
Protože MyFitnessPal je na jídlo, Strong je na tréninky, Apple Health je na kroky a váhu, a nikde nemám všechno pohromadě s mým tréninkovým plánem.
Moje situace: 194 cm, 121 kg, cíl dostat se na 95-100 kg do září 2026. To znamená sledovat jídlo, tréninky, váhu, spánek a tělesné míry — a vidět to všechno na jednom místě.
Co appka umí
/today — Co dnes
Hlavní stránka. Otevřu ráno a vidím:
- Dnešní trénink podle plánu (jaký split, jaké cviky, kolik sérií)
- Nutriční cíle (2800 kcal, 190-210 g proteinu)
- Denní minimum checklist (jídlo, trénink, spánek, voda)
- Kolik jsem splnil a co chybí
/workout — Logger tréninků
Zvolím si dnešní workout z plánu (Upper A, Lower B, Legs+Shoulders...). U každého cviku loguju sety — váhu a opakování. Appka si pamatuje poslední hodnoty, takže nemusím hledat, co jsem zvedal minule.
/food — Makra
Loguju jídlo s makry. Mám oblíbená jídla a recepty, takže oběd ze 4 ingrediencí přidám dvěma kliknutími. Vidím průběžný součet kalorií, proteinu, sacharidů a tuků.
/body — Tělesné míry
Denně: váha a kvalita spánku. Měsíčně: obvod pasu, hrudníku, bicepsů, stehen. Appka počítá 7denní průměr váhy, aby vyhlazila denní výkyvy.
/history — Grafy
Trendové grafy: váha v čase, adherence k makrům, progrese v jednotlivých cvicích. Tady vidím, jestli jdu správným směrem.
Proč Convex?
Zkoušel jsem Supabase, Firebase, plain Postgres. Convex vyhrál z těchto důvodů:
1. Realtime z výroby. Žádné WebSocket setup, žádné subscriby. Napíšu query, data se live updatují. 2. TypeScript end-to-end. Schema v TypeScriptu, funkce v TypeScriptu, frontend v TypeScriptu. Žádný ORM, žádné typy navíc. 3. Transactions are built-in. Mutations jsou automaticky transakční. Nemusím řešit race conditions, když loguju set a zároveň updatuju progress.Databázové schema — 9 tabulek
| Tabulka | Co ukládá |
|---|
| btDailyLogs | Váha, spánek, denní checklist |
|---|---|
| btWorkouts | Jednotlivé tréninky (typ, datum, trvání) |
| btExercises | Sety v rámci tréninku (cvik, váha, reps) |
| btProgress | Měsíční tělesné míry |
| btIngredients | Databáze ingrediencí s makry |
| btRecipes | Recepty složené z ingrediencí |
| btFavoriteMeals | Oblíbená jídla (rychlé přidání) |
Všechno indexované pro rychlé dotazy — by_date, by_workout, by_user. Convex indexy fungují deklarativně ve schema souboru.
Tréninkový plán v kódu
Tréninkovej plán mám jako TypeScript soubor. 3denní split s A/B variantama:
- Upper A (Push fokus) — bench press, OHP, cable fly...
- Upper B (Pull fokus) — barbell row, pull-ups, face pulls...
- Lower A (Quad fokus) — squat, leg press, leg extension...
- Lower B (Hip fokus) — deadlift, hip thrust, leg curl...
- Legs + Shoulders — front squat, lateral raises, calf raises...
Appka rotuje automaticky. Nemusím přemýšlet, co dnes trénuju.
Co mě naučil tento projekt
1. Vlastní appka vás donutí logovat. Když jsem trackoval v MyFitnessPal, občas jsem to vynechal. Ale svoji appku otevřu, protože jsem ji sám postavil. Ego je silný motivátor. 2. Convex je pro tento typ projektu ideální. Realtime data, TypeScript, zero config. Kdybych to dělal v Supabase, měl bych 2x víc kódu. 3. Stavět si nástroje na osobní projekt je legit způsob, jak se učit. Tuhle appku jsem nikdy neplánoval prodávat. Ale naučil jsem se Convex, realtime subscriptions a schema design na reálném use-casu.121 kg → 95 kg je maraton, ne sprint. Ale mít data po ruce dělá ten maraton o dost snesitelnější.
Zaujal vás článek?
Pojďme si říct, co by podobná automatizace udělala ve vaší firmě.
Konzultace zdarma