Marko Bera
ENSR
Javi se

← Svi radovi · 04 / 06

Kalorijski tracker za Srbiju

FitMess

Aplikacija za praćenje kalorija i kilaže, pravljena za srpsku hranu. Obrok upišeš slikom, glasom ili sa deklaracije. Koliko zapravo trošiš računa iz tvojih merenja na vagi, pa ne mora da se oslanja na formulu.

Uloga
Osnivač i jedini autor, uz AI agente
Status
Odobren na App Store-u avg 2026 · na čekanju
Period
Jun – septembar 2026
Tehnologija
Next.js 16, TypeScript, Supabase, Capacitor, Gemini
640
komitova
215
fajlova sa testovima
2
odbijanja na App Store-u pre odobrenja
5
načina da upišeš obrok

Video i ekrani

„Kalorije su matematika.“ Moj snimak ekrana dok radi Prizma, bez ijednog reza, u okviru telefona.
Početna: dnevni unos i makroi
Početna: dnevni unos i makroi
Slikaj obrok: rezultat sa sastojcima
Slikaj obrok: rezultat sa sastojcima
Pet načina da upišeš obrok
Pet načina da upišeš obrok
Gric: grickalice glasom
Gric: grickalice glasom
Mikronutrijenti i ocena zdravosti
Mikronutrijenti i ocena zdravosti
Analitika: nedelja na jedan pogled
Analitika: nedelja na jedan pogled

Zašto sam ga napravio

Veliki sam ljubitelj fitnesa. Hteo sam na dijetu, ali sam imao problem sa konzistencijom i sa tim da budem u konstantnoj mašini. Zato sam istraživao o kalorijama i shvatio da se nećeš gojiti ukoliko ne jedeš više nego što trošiš, pa sam pomislio: zašto ovo ne bih napravio za mainstream?

Uz pomoć naučnih studija povučenih sa PubMed-a, koje su u bazi, napravio sam da korisnik unese svoje podatke i na osnovu toga mu se izračuna dnevni unos: kalorije, proteini, masti i ugljeni hidrati. Dodao sam AI model koji sam testirao i trenirao promptovima da daje što tačnije rezultate, na srpskim jelima.

Ideja

Većina kalorijskih aplikacija tiho postane sudija. Propušten dan pocrveni, nedelja postane neuspeh, a najlakši način da se prestaneš loše osećati jeste da obrišeš aplikaciju. Moja rečenica za ovaj projekat bila je jednostavna: ne želim da bude još jedna klasična calorie tracker aplikacija.

Zato je FitMess instrument, kao Whoop, a ne plan. Sa plana možeš da padneš, a instrument ti samo govori nešto o tebi. Svaka funkcija je morala da prođe jedan test: da li korisniku govori nešto o njemu, ili mu govori šta da radi? Prvo gradi naviku, drugo gradi krivicu.

Iz toga su sledila još dva pravila. Jedinica uspeha je nedelja, a ne dan, pa jedna teška večera ništa ne upropasti. A aplikacija te meri, umesto da pretpostavlja: formule su samo početak, dok tvoja merenja na vagi ne kažu drugačije.

Vremenska linija

  1. Prvi komit. Next.js, Supabase i napisana specifikacija proizvoda.

  2. Napustio sam sistem sa više pod-agenata, jer je za ovaj projekat bio prespor. Prešao sam na gradnju funkciju po funkciju, sa jednim agentom po zadatku.

  3. Prva AI procena obroka sa slike preko Gemini-ja, direktnim REST pozivima sa strogom JSON šemom.

  4. Prizma: upis slikom postaje razgovor sa modelom u dva koraka.

  5. Nedeljno merenje i „poverenje u dan“: aplikacija počinje da meri potrošnju umesto da je pogađa.

  6. Dva launch videa napravljena u motion graphics studiju koji sam napravio uz Claude Code.

  7. Početak rada na App Store-u i Google Play-u: nativna ljuska, push obaveštenja, pravne stranice.

  8. Pokrenuto zatvoreno testiranje na Google Play-u.

  9. Odobreno na App Store-u posle dva odbijanja.

  10. Odluka da se interfejs prepiše kao prava React Native aplikacija. Backend, formule i podaci ostaju.

Sve funkcije

01

Prilagodljiva nedelja

Kad pojedeš preko cilja, razlika se raspoređuje na preostale dane iste nedelje, a ono što ne stane prelazi u sledeću. Dnevni rez je ograničen na 25% i nikad ne ide ispod 1.400 kcal za muškarce i 1.200 kcal za žene. Logika zna tvoj cilj: kad skidaš, manji unos nikad ne diže kasnije dane, a kad dobijaš na masi, diže. Kartica objašnjava zašto se broj pomerio i predlaže šetnju prema tvojoj kilaži.

Prilagodljiva nedelja

02

Poverenje u dan

Najvažnije pravilo motora: odsustvo podatka nije podatak. Dan sa jednim zaboravljenim unosom od 122 kcal ranije se računao kao pravi dan od 122 kcal i dizao je sve naredne dane. Sada se dani kojima aplikacija ne veruje računaju kao dani po planu i nikad se ne čitaju kao upisani broj.

03

Prizma

Slika ne vidi veličinu porcije niti kako je hrana spremljena, i tu upis slikom greši. Prizma od toga pravi kratak razgovor. Slikaš do pet fotografija (preporuka su dva ugla, sa viljuškom u kadru kao razmerom), a model ili odmah da procenu, ili postavi ciljana pitanja sa ponuđenim odgovorima o onome što ne vidi. Odgovaraš dodirom ili jednom glasovnom porukom. Rezultat je raspisan po sastojcima, svaki sa svojim gramima, umesto jednog broja.

04

Slikaj obrok, Gric i deklaracija

Pet ulaza u isti dan: Slikaj obrok (jedna slika i gotovo), Prizma (najtačnije), Gric (izgovoriš sve grickalice odjednom: „dva jajeta, slanina i hleb“), Deklaracija (čita vrednosti na 100 g i preračunava na ono što si pojeo) i Trening. Posle upisa možeš da dodaš još jednu porciju bez novog slikanja, ili da na kartici obroka pomeriš klizač „Nisam sve pojeo“.

Slikaj obrok, Gric i deklaracija

05

Skrivena mast

Ljudi potcenjuju obroke, a greška se skuplja na masti iz pripreme: ulje se ne vidi na slici, a pohovano nosi 30–40% više kalorija. Pravila za to žive u jednom zajedničkom modulu i ulaze u promptove za obrok, glas i grickalice. Namerno su izostavljena iz deklaracija, gde odštampana vrednost već sadrži svu mast, i iz Prizme, koja o pripremi pita umesto da pogađa. Oba izuzetka čuvaju testovi.

06

Nedeljno merenje

Aplikacija prestaje da pogađa potrošnju iz formule i meri je iz trenda kilaže i onoga što si pojeo. Nikad ne reaguje na jedno merenje: trend se pokaže posle dva, a predlog tek posle tri. Skokovi od vode ili glikogena padaju van razumnog opsega, pa se prikažu, ali ne menjaju ništa. Aplikacija novi cilj samo predloži, a ti ga prihvataš jednim dodirom. Gemini piše rečenicu, nikad brojeve.

07

Mikronutrijenti i ocena zdravosti

Druga stranica Početne pokazuje vlakna, šećer, so i zasićene masti u odnosu na dnevne granice, uz jednostavnu ocenu zdravosti dana. Vrednost koja fali računa se kao nepoznata, nikad kao nula, pa ocena ne ulepšava dan sa nepotpunim podacima.

Mikronutrijenti i ocena zdravosti

08

Analitika

Dnevni prosek unosa sa makroima po danu, mikronutrijenti za sedam dana, BMI i trend kilaže. Dodirneš stubić i vidiš taj dan. Sve je napravljeno iz postojećih unosa, bez novih tabela.

Analitika

09

Trening, voda i koraci

Upišeš trening i vidiš „mirovanje (BMR) + trening = potrošeno danas“. Upisan trening nikad ne dodaje kalorije na budžet: množilac aktivnosti već plaća 3–5 treninga nedeljno, a ponovno dodavanje je najčešći način na koji kalorijska aplikacija tiho ugoji korisnika. Potrošnja se računa neto (MET − 1). Cilj koraka prati tvoj nivo aktivnosti, umesto 10.000 svima.

10

Podsetnici, navike i nagrade

Web i nativna push obaveštenja: jutarnja poruka i večernji pregled sa pravim preostalim brojem, plus ekran nagrade za tri obroka u danu. Niz dana se izvodi iz nagrada i nikad se ne čuva posebno. Dnevne navike za čekiranje zamenile su staru stranicu „Pravila ishrane“ koju niko nije koristio.

Podsetnici, navike i nagrade

11

Tvoji podaci

„Moji podaci“ pokazuju sve pre preuzimanja. Svaka nova tabela sa korisničkim podacima mora biti prijavljena za izvoz, inače test pada. Tu su i promena naloga, pravne stranice (privatnost, uslovi, brisanje naloga) i izričit pristanak za zdravstvene podatke pri registraciji.

AI arhitektura

  • Modeli: Gemini za slike obroka, glas i deklaracije, pozvan direktno preko REST-a sa strogom šemom odgovora, bez rizika od verzija SDK-a. Model za svaki tok je podešavanje na serveru, a ne kod, pa je poređenje tačnosti Flash i Pro modela promena podešavanja, nikad nova objava.
  • Brojevi dolaze iz koda. BMR, TDEE, prilagodljiva nedelja i nedeljno merenje su determinističke funkcije sa testovima. Model samo napiše rečenicu oko broja, a ako poziv padne, koristi se šablon.
  • Proveri oblik, ne samo vrednosti. Gemini 3 vraća svoje razmišljanje kao dodatne delove označene sa thought: true. Spojene naslepo, te beleške su završile na ekranu korisnika kao „Status TOO_SLOW explained: Yes“. Sada se delovi sa razmišljanjem izbacuju, a svaki odgovor se proverava pre upotrebe.
  • Naplata po korisničkoj radnji, ne po pozivu. Prizma za jedan obrok zove model dva puta. Brojanje HTTP poziva bi obećanje „5 besplatno dnevno“ pretvorilo u laž, pa se kvota naplaćuje jednom po radnji, u svakom od šest AI tokova, a test proverava da to svaki tok radi.

Ulazak u prodavnice

App Store: dva odbijanja. Prvo je stiglo zato što se ljuska otvarala na marketinškoj strani. Drugo je navelo pravilo 4.8: prijava preko Google-a traži ravnopravnu alternativu, pa sam dodao prijavu preko Apple-a. Navelo je i pravilo 1.4.1, jer aplikacija računa BMR, TDEE i BMI, a naučni izvori su postojali samo u komentarima koda. Učinio sam ih vidljivim u aplikaciji. Odobreno 23.08.2026.

Google Play: zatvoreno testiranje pokrenuto 15.08. u 177 zemalja. Testeri ulaze preko Google grupe umesto preko spiska mejlova, pa je dovoljan jedan link. Na teži način sam naučio da se ulazak u grupu računa kao prijava za test, a ne instalacija, i da Play-u ponekad treba cela noć da prepozna novog člana.

Buildovi za obe platforme idu preko Codemagic-a. Nativna ljuska je Capacitor, sa push obaveštenjima, prijavom preko Google-a i Apple-a i safe area podešavanjem koje ima tačno jednog vlasnika.

Model naplate

Besplatno zauvek, uz do pet AI procena dnevno, a pretplata je za one koji žele više. Nije probni period. Verzija 1 prodaje samo preko App Store-a i Google Play-a (RevenueCat kao jedini sloj), jer prodaja na vebu unutar remote ljuske donosi rizik bez dokazane koristi.

Najzanimljiviji deo je bila bezbednost. Nijedan korisnik ne može da piše u tabele pretplate i potrošnje. Brojač se pomera samo kroz jednu funkciju u bazi koja sama čita id korisnika i povećava ga atomski, pa dva brza dodira ne mogu oba da pročitaju 3 i upišu 4. Ograničenje je napravljeno, ali namerno isključeno. Uključuje se zajedno sa ekranom za pretplatu, nikad pre, a test pada ako ga neko upali samog.

Šta dalje

FitMess je za sada na čekanju i backend miruje. Plan za povratak je već odlučen: interfejs se pravi iznova kao nativna React Native (Expo) aplikacija, uz potpuni redizajn, a Supabase, bezbednosna pravila, 37 API ruta, sve formule i sve migracije ostaju. Veb verzija me je naučila kakav osećaj nativna aplikacija mora da ima od prvog dana: trenutno paljenje, haptika, nativna navigacija i prava tastatura.

Šta sam ja odlučio

  • „Instrument, a ne plan.“ Sve zbog čega se korisnik oseća kao pred sudijom se izbacuje.
  • Jedinica uspeha je nedelja, a ne dan.
  • Potrošnja se meri, ne pretpostavlja.
  • Trening nikad ne dodaje kalorije na budžet.
  • Besplatan nivo ostaje besplatan zauvek.

Šta je uradio AI

  • Napravio Next.js aplikaciju, prilagodljivi motor i testove.
  • Sredio lanac nativnih buildova (Codemagic, potpisivanje, push).
  • Napisao AI promptove i šeme.
  • Napravio motion graphics studio i oba launch videa.

Gde sam ga ispravio

  • Tretirao je neupisan dan kao pravi podatak. Uveo sam poverenje u dan.
  • Pustio je da skriveno razmišljanje modela stigne do ekrana. Sada model piše samo reči, a svaki odgovor se proverava.
  • Planirao je da AI kvotu broji po API pozivu. Prebacio sam je na korisničku radnju.
  • Prvi launch video je bio niz statičnih ekrana. Tražio sam pravu interakciju: prst tapne, klizač se pomera, jedna neprekidna kamera.

Sledeća studija

FSB Doprinosi