Skincare App with AI Skin Analysis — Face Scan, Skin Score & Routine Recommendations
A skincare app for an Indonesian beauty brand — the client's name and visual identity are confidential at their request, so the screenshots on this page deliberately carry no branding. The heart of the product is AI Skin Analysis: the user takes a face photo guided by an on-screen frame, the photo goes to Cloudinary, and a Cloudflare Worker verifies the login token, bounds the image size, and forwards it to an AI vision model. The model's answer is never taken at face value: the Worker normalises it into a fixed vocabulary — ten skin concerns, face zones, and 0–100 scores — so the app always receives the same shape of data even when the AI provider changes. Results appear as a marked-up face map (oil in the T-zone, clogged pores, hydration, tone), a daily skin score with four derived readings, and a trend chart against previous scans. From there the user moves on to a checkable daily routine and product recommendations that always state their reasoning — which concern found on this face the product actually targets. Beyond scanning, the app also carries an article journal, short-form educational video, a community forum with public profiles, and a personal skin progress log.
- Platform
- Android & iOS
- Year
- 2026
- Industry
- Beauty & Skincare (client confidential)
- Role
- Full-cycle: Flutter app architecture, AI skin analysis flow design, the AI proxy on Cloudflare Workers, data model & Firestore security rules, Cloudinary integration
App screenshots
Click an image to zoom — swipe left/right to browse.
Key features
Guided face scan
An on-screen frame guides the user into position, with a progress indicator while the photo is assessed — not a shutter button followed by silence.
Marked-up face map
Findings are pinned to the exact spot they belong to — oil in the T-zone, clogged pores, hydration level, evenness of tone — so the result reads at a glance rather than as a report.
0–100 skin score & four metrics
One daily score alongside four derived readings (hydration, clarity, pores, dark spots). All point the same way — higher is better — and the worst finding decides, so one serious issue is never masked by something that happens to be fine.
Progress over time
Scan history is summarised into a trend chart and a month-over-month point difference, so users can see whether their routine is actually working.
Recommendations with reasons
Products are suggested from the concerns actually found on the user's face, and the reason is shown alongside — a recommendation without a reason just reads as an ad.
A routine you can tick off
Morning and evening steps with completed, next up, and later states — short enough that people actually follow it.
Journal, video, and forum
Educational articles, short videos, and a Q&A forum complete with public profiles, comments, and personal saves.
Per-user scan quota
Every account gets a daily scan allowance counted in Jakarta time, and an allowance is only spent once the analysis actually succeeds — a service failure never costs the user a scan.
Technical highlights
The advanced parts behind the scenes that make this system run smoothly.
- The AI key is never compiled into the APK. The app calls a Cloudflare Worker, and that Worker verifies the caller's Firebase ID token against Google's JWKS before touching the AI provider — without it, anyone who found the URL could spend the client's AI balance as a free API.
- The AI provider swaps with a one-line config change: LimitRouter (an OpenAI-shaped gateway running gemini-3.6-flash) is live, with Google AI Studio as the fallback path. The prompt, photo guards, output normalisation, token verification, and quota all live outside the provider file, so adding a provider rewrites none of those rules.
- The prompt lives server-side rather than in the app — the piece that gets revised most often can ship in seconds without forcing every user to install a new build.
- Model output is forced into a shared vocabulary (ten concern ids and a list of face zones) kept byte-identical between Worker and app, so old scan data stays readable and older app versions safely ignore newly added concerns.
- The Worker bounds photos to 768px itself rather than trusting the size the app sends. Measured on face photos, scoring did not differ from 1024px while the payload dropped from ~370KB to ~175KB.
- The prompt makes it explicit that this is a cosmetic assessment, not a medical diagnosis: the model may not name diseases, guess at medical conditions, suggest medication, or comment on the person's age, gender, or appearance.
- The model only returns a list of concerns; the four metrics on the results screen are derived from that list inside the app — no numbers are invented in between.
- All media (product photos, video, avatars, community uploads) goes through Cloudinary with an unsigned preset, which keeps Firebase to just Auth and Firestore.
Tech stack
Want an app like this for your business?
We've built systems like Skincare App with AI Skin Analysis from scratch all the way to production. Tell us what you need — the initial consultation is free, no strings attached.

