← All work
Shipped · FES internship, mentor-approved

Skinstric

An A.I. skin-analysis flow, built frame for frame from a 14-screen Figma.

Open the app Code on GitHub
Figma frames, all built
14Figma frames, all built
routes that survive a refresh
6routes that survive a refresh
max photo edge before upload
1024pxmax photo edge before upload
animation libraries shipped
0animation libraries shipped
The problem

Skinstric was the Module 13 virtual internship at Front End Simplified: rebuild a real company’s A.I. skin-analysis flow from its Figma file and a live two-step API, deploy it, and get it past review.

The Figma draws the happy path. The work was making every screen hold up when real life gets in the way: a refreshed page, a blocked camera, a phone photo of several megabytes, a keyboard instead of a mouse. It was reviewed and approved.

Skinstric landing page with the headline Sophisticated skincare between DISCOVER A.I. and TAKE TEST diamond buttons
The landing page, straight from the Figma.
Skinstric photo step with two diamond targets: allow A.I. to scan your face, and allow A.I. to access the gallery, plus an empty Preview box
Camera or gallery. The Preview box shows the photo being analysed.
Skinstric demographics result showing the A.I. pick East Asian with an 83% confidence ring and a list of every other option with its confidence
The result: the A.I.’s pick, its confidence, and every option to correct it. The demo data is labelled as simulated.
What it does

From a first hello to a result you can correct.

A landing page that moves on purpose

Hovering or focusing TAKE TEST slides the headline aside and blooms the diamond around it. DISCOVER A.I. mirrors it from the other side.

Intake in two questions

Name, then city, sent to the first API step. PROCEED only appears once there is something to send.

Camera or gallery

The camera asks for permission first. The gallery takes a click or a dragged photo, and a Preview box shows the image being analysed.

A real camera screen

A mirrored selfie preview with a matching capture, a capture flash, Space or Enter to shoot, and retake or proceed before anything is sent.

Results you can correct

Race, age and sex each show the A.I.’s pick with a confidence ring, plus every other option to choose instead. RESET and CONFIRM, and confirmed corrections are kept.

Designed for phones too

Every screen has its own phone layout, not a squeezed desktop one.

How it’s built

The decisions that matter, and why.

  1. 01

    Shrink the photo before it leaves the browser

    Phones hand over photos of several megabytes, which is slow on mobile data and risks the upload limit, and the model doesn’t need 4000 pixels to read a face. Every photo is redrawn to at most 1024 pixels on its long edge and re-encoded as a JPEG first, keeping phone portraits upright.

  2. 02

    Every screen survives a refresh

    What the visitor entered, the photo and the analysis live in session storage, so a refresh or a pasted link picks up where it was. A screen whose earlier step is missing sends the visitor back one step instead of showing a broken page.

  3. 03

    Trust the live API over the brief

    The brief says step one answers with a misspelled SUCCUSS key; the live API answers with success and message. The code accepts either, and never trusts a 200 status on its own because the API returns 200 for almost everything.

  4. 04

    Say what the data is

    Skinstric’s test API returns simulated demographics by design. The results screen says so in plain words, so no one reads a demo number as a real prediction.

  5. 05

    The camera turns off the moment it’s done

    The stream is stopped as soon as the picture is taken, so the camera light goes off. Blocked, missing and busy cameras each get their own message, with a way to try again or upload a photo instead.

  6. 06

    Keyboard, screen readers and reduced motion

    Every hover state also works on keyboard focus, the options list is a real radio group that arrow keys move through, status changes are announced, and all motion is plain CSS that switches off for anyone who asks for less.

Built with
Next.js 16React 19Tailwind CSS v4MediaDevices camera APICanvas image processingSession storageVercel
Where it stands

Skinstric is live and approved. The analysis hub already has its other three areas laid out, ready for the day the API returns more than demographics.

Talk about a build like this