Files
food-tracer/README.md
T

5.4 KiB
Raw Blame History

Food Tracer

Aplikace pro evidenci snědených jídel a útraty za jídlo. Ke každému jídlu se dá vedle názvu a zdroje uložit i cena a kalorie, takže jde zpětně zjistit, kolik člověk za jídlo utratil za den, měsíc nebo rok.

Umí naimportovat měsíční přehled vyexportovaný ze stránky statistik Luncheru — ve formátu XLSX, CSV i JSON.

Struktura

types/    → Sdílené TypeScript typy generované z OpenAPI (zdroj pravdy: types/api.yml)
server/   → Express 5 backend (Node.js 22, ts-node)
client/   → React 19 frontend (Vite 7, React Bootstrap)

Package manager: Yarn Classic. Každá složka má vlastní package.json.

Rozjetí

cd types  && yarn install && yarn openapi-ts   # typy je nutné vygenerovat první
cd ../server && yarn install
cd ../client && yarn install

Do server/.env.development patří JWT_SECRET o délce alespoň 32 znaků (šablona je v server/.env.template).

Vývoj

./run_dev.sh          # vše naráz v tmuxu (Linux/macOS)
.\run_dev.ps1         # dvě PowerShell okna (Windows)

Nebo ručně ve dvou terminálech:

cd server && NODE_ENV=development yarn startReload   # port 3001
cd client && yarn start                              # port 3000, proxy /api → 3001

Testy a build

cd server && yarn test     # Jest, in-memory úložiště
cd server && yarn build    # tsc → server/dist
cd client && yarn build    # tsc --noEmit + vite build → client/dist

Nasazení

JWT_SECRET=... docker compose up --build

Produkčně běží aplikace nad Redisem, ve vývoji nad JSON souborem (server/data/db.json). Viz server/.env.template.

Den: příjem a výdej

Přehled dne má dvě záložky:

  • Příjem — co jste snědli, s cenou, gramáží a kaloriemi.
  • Výdej — pohyb. Kroky, minuty, kilometry nebo opakování; z množství a spotřeby na 100 jednotek se dopočtou spálené kalorie (10 000 kroků ≈ 400 kcal). U silových cviků jde zadat i počet sérií — 3 × 40 kliků se tak neplete se 120 v kuse, i když kalorie vyjdou stejně.

Volitelně se dá k dni zapsat i délka spánku. Slouží jako kontext — do energetické bilance nevstupuje, protože klidový výdej už pokrývá celých 24 hodin včetně spánku a žádná standardní rovnice s délkou spánku nepočítá.

Nahoře je bilance dne: příjem − (klidový výdej + pohyb).

Šablony tréninků

Opakované tréninky se ukládají jako šablony na stránce Šablony — v přehledu dne pak stačí jedno kliknutí a celý trénink se založí, místo zadávání cviku po cviku. Do šablony jde zařadit i jinou šablonu, třeba rozcvičku, kterou máte v každém tréninku; při použití se její cviky rozbalí. Zanoření je kvůli jednoduchosti jen na jednu úroveň a aplikace to hlídá.

Založené položky jsou samostatné aktivity, takže je jde v dni doupravit, aniž by se změnila šablona.

Šablonu jde vytvořit i opačným směrem — z toho, co už máte v dni zapsané. U jídla ikonou záložky v řádku, u tréninku tlačítkem Uložit jako šablonu v záložce Výdej (vybere se, které cviky zahrnout). Při zakládání jídla nebo aktivity je v dialogu i zaškrtávátko Uložit i jako šablonu.

Na druhé záložce jsou šablony jídel — opakovaně jedené jídlo (název, zdroj, kalorie, gramáž, cena), které se v přehledu dne založí jedním kliknutím. Ty se neskládají z jiných. U domácích jídel jde do poznámky zapsat postup přípravy.

Osobní údaje

Na stránce Osobní údaje se z pohlaví, roku narození, výšky a hmotnosti spočítá klidový výdej (bazální metabolismus) rovnicí Mifflin–St Jeor. Kdo má hodnotu změřenou přesněji, může ji zadat ručně — ta pak má přednost.

Výpočet se záměrně nenásobí koeficientem fyzické aktivity, jak to dělají kalkulačky TDEE: pohyb si aplikace eviduje zvlášť a přičítá ho, takže vynásobení by ho započítalo dvakrát.

Kalorie a gramáž

Ke každému jídlu jde vyplnit cenu za 100 g a z ní se dopočítá gramáž (u TechToweru typicky 44 Kč/100 g). Gramáž jde kdykoli přepsat ručně a každá položka má vlastní sazbu — hlavní jídlo a salát s jiným cenováním se nepletou. Sazby podniků se nastavují v Nastavení a při výběru zdroje se předvyplní.

Z gramáže a energie na 100 g se pak dopočítají kalorie. Hodnotu nabídne tlačítko Najít kalorie:

  • z vlastní knihovny — co jste jednou zadali, aplikace si pamatuje pod názvem jídla a příště nabídne sama,
  • z Open Food Facts (otevřená databáze, bez klíče),
  • odkazem na KalorickéTabulky.cz, které veřejné API nemají — otevřou se v novém panelu a název jídla se zkopíruje do schránky, hodnotu opíšete ručně.

Když je externí databáze nedostupná, hledání nespadne — zůstane vlastní knihovna.

Import z Luncheru

Na stránce Statistiky je tlačítko Import z Luncheru. Stačí nahrát soubor stažený ze statistik Luncheru:

  • Záznamy se rozdělí do dnů, ke kterým patří (export je typicky za celý měsíc).
  • Zakládají se jako oběd, protože Luncher řeší výběr obědů. Chod jde při importu změnit a jednotlivá jídla pak upravit v přehledu dne.
  • Před uložením se ukáže náhled toho, co se založí.
  • Opakovaný import stejného měsíce data nezduplikuje.