Skip to content
Case Study5. března 2026· 9 min čtení

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.

Postavil jsem si fitness tracker v Next.js a Convex. Žádná appka mi nevyhovovala.

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

TabulkaCo ukládá
btDailyLogsVáha, spánek, denní checklist
btWorkoutsJednotlivé tréninky (typ, datum, trvání)
btExercisesSety v rámci tréninku (cvik, váha, reps)
btProgressMěsíční tělesné míry
btIngredientsDatabáze ingrediencí s makry
btRecipesRecepty složené z ingrediencí
btFavoriteMealsOblí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ší.
#next.js#convex#typescript#fitness#case-study

Zaujal vás článek?

Pojďme si říct, co by podobná automatizace udělala ve vaší firmě.

Konzultace zdarma