Inspiration

Every appearance-change resource for cancer treatment — every wig catalogue, every turban-tying video, every "look good, feel better" workshop — assumes you're in a room with a mirror, a stranger, and other patients. Look Good Feel Better has run those workshops since 1989 and reached nearly 600,000 people, and they are genuinely good. But they are in person, scheduled, and public. Nothing exists for the actual moment this decision gets made: alone, at home, at 11pm, before an appointment, trying to picture what you'll look like before you're the one holding the mirror.

We wanted to build the thing that comes before the workshop — private, free, and honest about what it is and isn't.

What it does

Still You is a five-step try-on: upload a photo (or use a sample), say what you're preparing for, try on wigs/turbans/hats/brow looks rendered onto your own face, see where to actually buy the one you keep — in stock, with a real price, right now — and leave with a single printable page for a salon or a wig fitter. No account required to look. Nothing is stored until you explicitly choose to keep something.

Every generated preview is labelled synthetic on screen — never presented as a photograph. The appearance baseline is guidance, never a diagnosis, and carries a not-medical-advice disclaimer on every response. Deleting your account deletes everything.

How we built it

  • Frontend — Next.js 15 / React, the whole five-step flow in one Studio screen: camera capture (getUserMedia, mirrored, centre-cropped to 3:4), or a sample face; a live catalogue fetched from the backend so the UI and the data can't drift; and a step rail that reflects real API state, not a fake progress bar.
  • Backend — FastAPI, one thin adapter module per sponsor API (perfectcorp.py, serpapi.py / commerce.py, nutrient.py, xano.py), each independently swappable and independently testable offline.
  • Perfect Corp / YouCam carries steps 02 and 03: skin-analysis for the appearance baseline, and hat / wig / hair-style for the try-on render itself.
  • SerpApi (Google Shopping) carries step 04, and also powers the one original measurement in the project: a structured, multi-region availability index for medical headwear — is the market actually stocked, in real time, region by region.
  • Nutrient DWS carries step 05: the kept looks become one printable page someone can hand to a salon.

Challenges we ran into

The honest version, because we'd rather show the debugging than hide it:

  1. Perfect Corp's real base URL isn't the one in their own web console. yce.perfectcorp.com is the account/redemption UI; the actual API host is yce-api-01.makeupar.com. Nothing about that is obvious from the redeem-code page.
  2. Auth is a plain Authorization: Bearer <key>, not the X-YCE-API-Key header their marketing copy references.
  3. The file-upload step double-signs if you're not careful. Perfect Corp's upload API returns a presigned S3 PUT URL with its own signed headers — reusing our authenticated client (which attaches its own Authorization header by default) to make that PUT causes S3 to reject the request, because it's now signed twice. The fix was a bare client for that one call.
  4. The task-polling status field isn't documented anywhere we could find. We assumed data.status; the real field is data.task_status, and the top-level status key is just the HTTP status code echoed back — so a naive read silently "worked" (no key error) while never actually matching "success", and every real render quietly timed out even after Perfect Corp had already finished it in the background. We only caught this by reading the raw JSON of a real completed task, not from docs.
  5. .env was never actually being loaded. python-dotenv was installed but never imported, so every key we set was silently ignored by the running server. Every "verify with a real call" step upstream of that fix was quietly running against no credentials at all.
  6. Zero credits, correct request. Even with the shape fully verified, every real call returned CreditInsufficiency until the APIWORLD code was actually redeemed on the account behind the live key — a reminder that a 400 isn't always a code bug.

Accomplishments that we're proud of

  • A five-step pipeline that is actually wired end to end, not a Figma flow with one working screen: session → baseline → try-on → find → takeaway all make real network calls and were verified live in-browser.
  • Four sponsor APIs, each doing genuine work, not a token integration — removing any one of them breaks a real step, not a nice-to-have.
  • Nothing fake ships silently. Every failure mode — no credits, no marketplace key, an unreachable endpoint — degrades to an honestly labelled result instead of a crash or a plausible-looking fake. There's a standing rule in this codebase: never ship a plausible fake, and it's enforced in the failure path of every adapter, not just the happy path.
  • One original measurement. The Medical Headwear Availability Index is real structured data we collected, not a claim.

What we learned

That the gap between "the API docs say X" and "the API actually does X" is where most of a hackathon weekend goes — and that the fix is always the same: make one real call, read the raw response, and correct the code to match reality rather than the documentation. Every adapter in this project carries a comment naming the exact field that turned out to be wrong.

What's next for Still You

  • Finish verifying the brow/lash makeup try-on category values (the only endpoint we chose not to guess into working-looking code) directly with Perfect Corp.
  • Real Xano schema instead of the in-process session fallback.
  • A second marketplace key (Etsy, eBay) live in production for head coverings specifically, since that's where handmade and secondhand options actually live.
  • Device-camera testing across more phones, and a proper accessibility pass.

Sponsor / track fit

Table only — not a claim of winning, a plain statement of what's actually wired and checkable in the repo right now.

Track What they're asking for What Still You does
Overall Winner — $12,500 Progress · Concept · Feasibility across the whole build A complete, working five-step flow across four sponsor APIs, verified live end-to-end in this session — not a single polished screen
Perfect Corp — AI-Driven Consumer Experiences ($2,500, 2 winners) Meaningful use of ≥1 Perfect Corp / YouCam API Two: skin-analysis (appearance baseline, step 02) and hat / wig / hair-style (the try-on render itself, step 03) — both call shapes verified live against the real API
SerpApi — Best AI Use Case Real-time structured data via a SerpApi API Google Shopping search for live, in-stock, priced products (step 04) and the Medical Headwear Availability Index — an original structured measurement, not a demo query
Nutrient — DWS Challenge A core document operation via Nutrient DWS The takeaway (step 05): kept looks are built into one printable page via Nutrient DWS, HTML → PDF

Workflow

                            ┌───────────────────────────────┐
                            │       LANDING (Public)        │
                            │       /  ·  /why  ·  /signin  │
                            └───────────────┬───────────────┘
                                            │
                                            │ Start
                                            ▼
┌──────────────────────────────────────────────────────────────────────────────────┐
│                                 STUDIO (/studio)                                 │
│                                                                                  │
│   01 YOUR PHOTO                            02 WHAT TO PREPARE FOR                │
│   ┌──────────────────────────────┐         ┌─────────────────────────────────┐   │
│   │ • Camera / Upload / Sample   │────────▶│ POST /baseline                  │   │
│   │ • Local state only           │         │   → perfectcorp.py              │   │
│   │ • Never sent without consent │         │     • skin-analysis             │   │
│   └──────────────────────────────┘         │     • real concern scores       │   │
│                                            └────────────────┬────────────────┘   │
│                                                             │                    │
│                                                             │ Choose Item        │
│                                                             ▼                    │
│   03 TRY IT ON                                                                   │
│   ┌──────────────────────────────────────────────────────────────────────────┐   │
│   │ POST /try-on  →  perfectcorp.py                                          │   │
│   │   • Head Coverings ──▶ Hat (ref image sourced live via Step 04 Search)   │   │
│   │   • Hair           ──▶ Wig / Hairstyle (real style IDs)                  │   │
│   │   • Brows / Lashes ──▶ Honestly preview_only (unverified)                │   │
│   │   • Fallback Policy──▶ Always synthetic:true label, never raw failure    │   │
│   └─────────────────────────────────────┬────────────────────────────────────┘   │
│                                         │                                        │
│                                         ▼                                        │
│   04 FIND IT                               05 TAKE IT WITH YOU                   │
│   ┌──────────────────────────────┐         ┌─────────────────────────────────┐   │
│   │ GET /find                    │         │ POST /choose                    │   │
│   │   → commerce.py              │──Keep──▶│   → xano.py (session store)     │   │
│   │   → Google Shopping / SerpApi│         └────────────────┬────────────────┘   │
│   │   → Real-time price & stock  │                          │                    │
│   │   → Verified purchase link   │                          ▼                    │
│   └──────────────────────────────┘         ┌─────────────────────────────────┐   │
│                                            │ POST /takeaway                  │   │
│                                            │   → nutrient.py                 │   │
│                                            │   → HTML to PDF (Nutrient DWS)  │   │
│                                            └─────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────────────────────────┘

Every box on this diagram represents an active, verified network call—no placeholders.

Built With

  • fastapi
  • getusermedia
  • google-oauth
  • google-shopping
  • httpx
  • nextjs
  • nutrient-dws
  • oauth2
  • perfect-corp
  • pydantic
  • python
  • react
  • scrypt
  • serpapi
  • tailwindcss
  • typescript
  • uvicorn
  • webgl
  • xano
  • youcam-api
Share this project:

Updates

Submission history