Sari la conținut
Case study · proiect propriuNutriție și rețete cu AI

GenFitPlan: produs SaaS cu inteligență artificială

Diferența dintre „am pus un chatbot pe site” și un produs cu AI e că al doilea trebuie să dea un răspuns corect chiar și când utilizatorul are în frigider doar trei ouă și un borcan de muștar.

Produs SaaS cu AI — produs propriu

genfitplan.com
Website GenFitPlan pe desktop
Website GenFitPlan pe telefon

01 /Contextul proiectului

Ce e GenFitPlan și de ce l-am construit

GenFitPlan e produsul meu, nu o lucrare pentru un client. E în limba engleză și se adresează unei piețe internaționale, nu firmelor din România — îl pun în portofoliu pentru un singur motiv: arată ce pot construi când proiectul nu e un site, ci un produs cu logică proprie.

Ideea e simplă de povestit și grea de implementat: aplicația știe ce ai în frigider, știe ce obiective de nutriție ai și generează rețete care se încadrează în amândouă. Are trei părți conectate — inventar cu termene de expirare, generator de rețete și jurnal alimentar care se completează singur când gătești o rețetă generată.

02 /Constrângeri

Ce dicta, de fapt, forma site-ului

Fiecare decizie de mai jos vine dintr-una din constrângerile astea. Fără ele, ar fi rămas doar preferințe de design.

AI-ul costă bani la fiecare cerere

Fiecare rețetă generată e un apel plătit către un model de limbaj. Într-un produs cu plan gratuit, asta înseamnă că arhitectura trebuie să limiteze, să cache-uiască și să separe clar ce se generează de ce se servește din date deja existente. Altfel produsul se scufundă în costuri exact atunci când începe să meargă.

Datele de nutriție trebuie să fie reale

Un model de limbaj inventează valori nutriționale cu aceeași convingere cu care le și nimerește. Macronutrienții nu pot veni din text generat; trebuie să vină dintr-o bază de date reală, altfel produsul e o jucărie care minte utilizatorul despre ce mănâncă.

Pagina de prezentare și aplicația au nevoi opuse

Prezentarea trebuie să fie instant și indexabilă. Aplicația din spatele autentificării trebuie să fie interactivă și dinamică. Rezolvate la fel, una dintre ele iese prost.

03 /Abordarea

Deciziile luate și motivul din spatele fiecăreia

Un site nu e o listă de secțiuni. E o serie de decizii care fie duc vizitatorul la contact, fie îl pierd pe drum.

  1. 01

    Prezentarea e pre-randată, aplicația nu

    Pagina publică e generată la build și servită din cache — serverul confirmă asta prin antetele de pre-randare și prin cache-ul care raportează „HIT”. Rezultat: 13,6 KB de HTML comprimat, complet, cu tot textul și structura în el, livrat în sub 0,1 secunde. Rutele de aplicație, în schimb, rămân dinamice. Aceeași aplicație, două regimuri, pentru că au două scopuri diferite.

  2. 02

    Macronutrienții vin de la USDA, nu de la model

    Politica de securitate a paginii enumeră explicit sursele externe permise, iar printre ele e API-ul FoodData Central al Departamentului american al Agriculturii. Modelul de limbaj compune rețeta; cifrele de nutriție vin dintr-o bază de date oficială. E o separare de responsabilități pe care o poți verifica din antetele site-ului, fără să ai acces la cod.

  3. 03

    Structura paginii urmează întrebările, nu funcțiile

    Zece secțiuni, în ordinea în care se formează decizia: ce face, cum funcționează în trei pași, cât costă, întrebări frecvente. Titlul nu descrie tehnologia, ci rezultatul — „mănâncă ce ai deja, atinge-ți obiectivele”. Nimeni nu cumpără „generare de rețete cu AI”; oamenii cumpără să nu mai comande mâncare la ora opt seara. Pagina are și o secțiune de testimoniale, pe care nu o trec la capitolul dovezi: e un produs lansat recent, textele de acolo sunt exemplu de așezare în pagină, nu clienți reali. Pe site-ul ăsta nu număr ca dovadă ceva ce nu pot verifica — nici când e produsul meu.

  4. 04

    Erorile se raportează singure

    Produsul trimite erorile într-un serviciu de monitorizare, pe regiunea europeană. Într-o aplicație cu AI, unde răspunsurile sunt diferite la fiecare rulare, un bug pe care nu îl vezi în raport e un bug pe care nu îl repari niciodată — utilizatorul nu îți scrie, pur și simplu pleacă.

  5. 05

    Sursele externe sunt enumerate una câte una

    Politica de securitate nu spune „permite tot”. Enumeră fiecare domeniu care are voie să ruleze cod, să deschidă conexiuni sau să livreze imagini, iar încărcarea produsului în iframe de pe alt site e interzisă complet. La un produs care ține jurnalul alimentar al cuiva, adică date de sănătate, asta e minimul.

04 /Ce s-a livrat

Inventarul paginii live, nu o listă de promisiuni

Tot ce urmează există acum pe genfitplan.com și se poate verifica deschizând site-ul sau sursa paginii.

Produsul

  • Trei module conectate: inventar cu termene de expirare, generator de rețete, jurnal alimentar
  • Rute de aplicație pentru inventar, rețete, jurnal, plan premium și suport
  • Plan gratuit și plan cu plată, prezentate public pe pagina principală
  • Patru pagini legale: termeni, confidențialitate, cookies, GDPR

Integrări

  • Model de limbaj pentru generarea rețetelor
  • API-ul FoodData Central al USDA pentru date de nutriție
  • Bibliotecă de imagini externă pentru fotografiile din interfață
  • Monitorizare de erori pe regiunea europeană

Structura paginii publice

  • Ierarhie de titluri: 1 × H1, 10 × H2, 8 × H3
  • Proces explicat în 3 pași, secțiune de prețuri și întrebări frecvente
  • Formular de abonare la newsletter
  • 12 destinații interne distincte — module, autentificare și pagini legale — plus 8 ancore în pagină

Livrare și securitate

  • Pagină pre-randată la build și servită din cache (antetele de pre-randare și cache: HIT)
  • 13,6 KB HTML comprimat, 82 KB necomprimat
  • HSTS pe 2 ani, X-Frame-Options: DENY, X-Content-Type-Options
  • Content-Security-Policy cu fiecare sursă externă enumerată explicit

05 /Fapte măsurate

Cifre de pe site-ul live, cu metoda alături

Nu scriu creșteri de trafic sau număr de lead-uri: nu sunt date publice, deci nu le poți verifica. Astea se pot verifica, iar dacă între timp s-au schimbat, măsoară din nou.

Timp până la primul byte

37–81 ms

20 de cereri, în două serii

Document HTML livrat complet

0,04–0,08 s

HTML transferat, comprimat

13,6 KB

HTML necomprimat

82 KB

Mod de livrare

pre-randat, din cache

antet de pre-randare · cache: HIT

Structura paginii

1 H1 · 10 H2 · 8 H3

Cum am măsurat · 6 august 2026

Măsurat cu curl, 20 de cereri către pagina principală, în două serii separate, de pe un server din Germania. Sunt cifre de livrare a documentului HTML, nu de randare completă în browser. Pentru partea de browser, deschide raportul PageSpeed de mai jos: rulează pe infrastructura Google, nu pe a mea.

Următorul pas

Ai o idee de produs care are nevoie de mai mult decât un site?

Spune-mi ce vrei să facă produsul și pentru cine. Îți răspund cu o direcție tehnică, cu ce s-ar construi întâi și cu un interval de preț, fără obligații.

  • Răspuns în aceeași zi lucrătoare, direct de la cel care construiește
  • O direcție concretă + interval de preț, nu un „vă contactăm noi”
  • Fără obligații și fără insistențe după

Fără spam, fără abonamente. Datele rămân între noi.

Cere estimare gratuită