Proiecte/Rhovie
Rhovie
O aplicație de îngrijire a pielii cu AI. O scanare a feței îți citește pielea după textură, hidratare, riduri și pigmentare, iar fiecare scanare se salvează, așa că progresul se vede în loc să fie presupus.
- ROL
- Dezvoltare
- AN
- 2025–2026
- PLATFORMĂ
- iOS
- STARE
- Publicată în App Store

Scanarea, blocată până când lumina și încadrarea sunt bune
01 / 07
Screen 1 of 7: Scanarea, blocată până când lumina și încadrarea sunt bune
Îngrijirea pielii se face pe ghicite. Cumperi ceva, îl folosești săptămâni la rând și nu afli niciodată dacă a avut vreun efect.
Rhovie începe cu o scanare a feței care citește pielea pe patru axe, estimează tipul de piele și construiește o rutină de dimineață și una de seară în jurul produselor pe care le ai deja. Fiecare scanare se salvează cu imaginea ei, cu scorurile ei și cu condițiile în care a fost făcută, așa că a doua scanare e cea care îți spune cu adevărat ceva.
Designul de produs și de interfață e al lui Artur Moldovanu, prietenul și partenerul meu de business. Eu am construit produsul: fluxul de scanare, backendul pe Firebase, modelul de cont care trece din anonim în permanent, serviciul de analiză de pe Cloud Run, procesul de lansare și publicarea în magazin.
Cea mai grea constrângere a fost onestitatea. Ar fi fost ușor să întorc un număr sigur pe el din orice poză. Să nu întorci nimic și să explici de ce s-a dovedit a fi exact lucrul care îi face pe oameni să aibă încredere în tot restul.
Publicată în App Store și încă primește actualizări. Designul interfeței e al lui Artur Moldovanu; tot ce rulează sub el e al meu.
- STARE
- Publicată în App Store
- PLATFORMĂ
- iOS
- PUBLICATĂ DIN
- 2025
Trei ecrane îl duc.Un singur dispozitiv, trei stări.

STAREA 01 / 03
Scanarea
Camera nu te lasă să irosești o scanare. O singură față, încadrată destul de mare, ținută aproape drept și luminată fără reflexii sau neclaritate: toate verificate înainte ca declanșatorul să fie activat. Dacă ceva nu e bine, aplicația îți spune care dintre cele douăsprezece verificări a picat, în loc să întoarcă un număr sigur pe el dintr-o poză proastă.

STAREA 02 / 03
Rutina
Analiza întoarce patru axe și un tip estimat de piele. Rutina se construiește apoi din produsele pe care utilizatorul le are deja, cu golurile semnalate, nu umplute pe tăcute cu lucruri de cumpărat.

STAREA 03 / 03
Istoricul
Fiecare scanare se salvează cu imaginea, scorurile și condițiile ei. Rostul aplicației e a doua scanare, cea care îți spune dacă a funcționat ceva.
Două decizii care merită explicate.Părțile care au durat cel mai mult.
D—01
Când refuză o poză proastă
O scanare îl costă ceva pe utilizator: timp și, pe planul gratuit, unul dintre puținele credite pe care le are. Să întorci un scor sigur pe el dintr-o poză întunecată și strâmbă e mai rău decât să nu întorci nimic.
Așa că verificarea rulează pe telefon înainte ca declanșatorul să fie activat: exact o față, destul de mare în cadru, în limita a 12° de yaw, 10° de pitch și 8° de roll, plus un semnal de lumină fără subexpunere, reflexii sau neclaritate. Douăsprezece probleme distincte pot bloca declanșatorul, iar camera o numește pe cea întâlnită.
// every frame, before the shutter unlocksconst straightEnough = Math.abs(face.yawAngle) <= MAX_YAW && Math.abs(face.pitchAngle) <= MAX_PITCH && Math.abs(face.rollAngle) <= MAX_ROLL if (signal.highlightRatio > MAX_HIGHLIGHT_RATIO) issues.push('glare_detected')// usable only when issues is empty, no credit spentD—02
Cum muți istoricul unui necunoscut
Poți scana înainte să-ți faci cont. A fost decizia corectă de produs și cea mai grea de inginerie. Până își face cineva cont, poate să aibă deja o lună de scanări legate de o identitate anonimă.
Legarea credențialelor păstrează UID-ul, dar căile din storage, documentele din Firestore și înregistrările de abonament trebuiau să se mute toate ca un singur bloc. E o singură tranzacție în lot, cu reîncercare idempotentă: dacă pică la jumătate, nu se mută nimic.
// anon:7f2a… → user:7f2a…, uid preservedawait linkWithCredential(anonUser, cred) const batch = db.batch()moveScans(batch); moveRoutines(batch)moveEntitlements(batch) // all of it, or none of itawait batch.commit()PE CE E CONSTRUIT
- CLIENT
- React Native · Expo SDK 54 · TypeScript strict · Zustand · Zod
- BACKEND
- Firebase Auth, Firestore și Cloud Storage · serviciu de analiză pe Cloud Run
- VIZIUNE
- Vision Camera · detecție de față ML Kit · rețea facială MediaPipe
- OPERARE
- Sentry · EAS Build · App Store Connect · TestFlight
CREDITE
Design de produs și de interfață: Artur Moldovanu. Dezvoltarea, backendul, fluxul de viziune computerizată, procesul de lansare și publicarea în magazin sunt ale mele.
STARE
Publicată în App Store și în dezvoltare activă.
PROIECTUL URMĂTOR
TeamTipOut
Calculator de bacșiș pentru echipele din restaurante. Împărțire după orele lucrate, echipe salvate și un export pe care îl vede toată tura.
Spune-mi ce construiești.Un plan scris și un preț fix înainte să se miște vreun ban.
Răspund la tot într-o zi lucrătoare. Dacă nu sunt omul potrivit pentru proiect, ți-o spun din start, nu după trei săptămâni.




