Inspiration

People do not wonder about their skin in the abstract. They wonder at three specific moments: right before they buy, right after a breakout, and when they are standing in the bathroom holding a nearly empty bottle, deciding whether to buy the same one again.

That last moment is the expensive one. A serum costs $30–$120 and needs four to twelve weeks to show anything. During those weeks the user has no baseline, no way to separate a real change from Tuesday's lighting, and no way to distinguish "this isn't working" from "I keep forgetting to use it". So they quit early and waste the money, or they keep re-buying on hope.

What it does

Glowline answers one question: is this product actually working?

You name the product and the day you started. Each check-in sends a selfie to YouCam's AI Skin Analysis. Glowline compares the result against your own baseline — never against anyone else's skin — and returns a verdict:

  • Keep going — concerns improving, none worsening, so repurchasing is justified by your data
  • Power through — still inside the window where change is physically possible, or moving in a direction only your preference can judge (more oil is the goal for dry skin, a problem for oily)
  • Change one variable — the window has passed and nothing moved; stopping is a result too
  • Fix adherence — you logged 14 of 39 days, so no conclusion is possible
  • Come back — too little evidence yet (fewer than three check-ins, under two weeks of measured history, no capture for weeks, or every photo has been flagged), and it says which of those it is instead of guessing

Beyond the core statistical verdict, Glowline pairs longitudinal Skin AI telemetry with an end-to-end Agentic Skincare & Smart-Mirror Decision Suite:

  • 4-Step Agentic Routine Protocol & Multi-Bottle Conflict Auditor: Inspects your entire active shelf, detects overlapping exfoliating acids/retinoids when redness or hydration regresses, and synthesizes a 4-step clinical protocol (Signal vs. Noise Audit → Shelf Conflict Check → Active Pivot → Next Scan Schedule) with a hands-free Spoken Mirror Briefing (window.speechSynthesis).
  • Active-Ingredient & Formulation Pivot Engine ("What to Do / Buy Next"): Translates lagging or regressing YouCam raw_score concerns into specific evidence-based formulation pivots (e.g., Azelaic Acid 10% + Centella Serum, Ceramide NP + Panthenol 5% Barrier Cream, Encapsulated Retinal 0.05% + Peptide Night Serum) with a 1-click button that pre-fills the replacement or companion formula directly into your tracker.
  • Interactive 5-Zone Facial Topology Map: Maps your Day 1 → Latest raw_score deltas onto YouCam's 5 anatomical sub-zones (Forehead, Left Cheek, Nose & T-Zone, Right Cheek, Periorbital & Chin) so you can inspect localized sub-score progression.
  • Side-by-Side Day 1 Baseline vs. Latest Scan Clinical Comparison & Printable Dossier: Compares your Day 1 anchor against your latest check-in side-by-side (including lighting Δluma consistency and per-concern deltas) and exports a formatted clinical skin dossier via print/PDF.
  • Live Smart-Mirror Webcam Viewfinder (0 API Units): Uses client-side optical analysis (getUserMedia + canvas luminance, highlight clipping, and bilateral shadow symmetry checks) inside a 60–80% face-alignment oval to verify lighting against your Day 1 baseline before a single YouCam API unit is spent.
  • Bottle Financial ROI & Cost-Per-Point Receipt: Combines your bottle price, days tracked, and net raw_score gain into a concrete repurchase receipt (cost per day, cost per +1 pt of verified skin improvement, and projected annual savings when retiring a stalled formula).

How we used the YouCam API

AI Skin Analysis, v2.1, format: "json", with a fixed five-concern SD set (redness, texture, pores, acne, hydration) — 12 units per check-in, confirmed against the live SKU list and by balance delta.

The pipeline is the documented one: POST /s2s/v2.0/file for a pre-signed upload, PUT the bytes, POST /s2s/v2.1/task/skin-analysis, then poll until the task settles.

Three provider behaviours shaped the design:

  1. A failed task costs zero units. So a rejected selfie is a free retry, and Glowline lets skin analysis be its own quality gate rather than paying 10 units for a Face Attributes pre-flight on every check-in — which would cost 10 units even on a perfect photo.
  2. ui_score is deliberately inflated. The documentation describes it as "a psychological motivator… we adjust the raw scores to produce more favorable results". Glowline reads raw_score, because a cosmetically adjusted score would flatten exactly the slow trend the product exists to detect. It warns rather than switching silently if only ui_score appears.
  3. Results expire — the download URL in two hours, results in 24. Everything is copied into local storage the moment a task succeeds.

Why it isn't a wrapper

The API tells you what your skin looks like now. Glowline decides what that means over time, and it is built around the ways that naive comparison goes wrong:

It measures its own noise. A skin score moves several points between two photos taken seconds apart, because of lighting and angle. Glowline asks for a second shot in the same session now and then, uses the spread as its noise floor, and reports only movement that clears it. Everything else is called no change. The floor is bounded at both ends — never above 15 points, and never below 3, because a floor that is too low makes the app cry wolf, and telling someone to abandon a working product is the worst error this product can make.

It refuses to blame the product for your routine. Below 60% logged adherence there is no verdict, only "we can't tell yet".

It respects how long skin takes. Each concern carries its own expected response window. A retinol is not judged at day three.

It keeps the measurement honest. Three separate things are recorded on every capture, and each one stops a different way for a trend to become a lie:

  • the concern set (dst_actions), so a configuration change cannot silently mix two methods in one series;
  • the derivation of each concern — a whole-face aggregate, a single score, or one named region — because those are three different numbers. Several regions with no aggregate are refused rather than averaged, since an average is not comparable with an aggregate and the difference is bigger than the noise floor;
  • the lighting context, so a photo taken under a different bulb is caught before it is uploaded instead of being compared with the history.

It does not adjust your photos. Correcting exposure or white balance against the baseline would also erase genuine colour change — the redness signal this product exists to measure. So it refuses a badly-lit capture and asks you to retake it in the same light, rather than manufacturing a comparable-looking photo.

What we verified

393 unit tests, 184 HTTP integration checks, and a real capture through the live API. Writing the tests, an adversarial audit and a live API run found eighteen real bugs — including a budget meter that reported 0 units for an account holding 1,016, and a parser that silently discarded every score in a ZIP-shaped response. All of it is written up with the observed payloads. Two real provider responses are committed as regression fixtures, asserted against by the test suite, including a check that different subjects produce genuinely different scores (redness 100 vs 61.3).

What's next

Face alignment — detecting the eye line client-side and cropping every capture to the same geometry. Lighting is already handled (a capture in materially different light is refused before a unit is spent), so geometry is the last remaining source of cross-session variance. It needs a face-detection dependency the front end deliberately does not have yet — no build step, one runtime dependency — which is why it was not shipped half-finished.

Built With

Share this project:

Updates

Submission history