Inspiration
About 9 in 10 people on EGFR-targeted cancer therapy get a skin reaction, usually in the first weeks and mostly on the face. Other chemotherapy drugs cause dryness, darker patches and hair loss. Patients are told to "report any changes", but nobody gives them a way to measure one.
Two more gaps make it worse:
- The rash looks like acne, so people reach for acne products, which patient guidance says can make it worse. In a shop aisle there's no way to tell which moisturiser is safe. We audited 1,033 real products against that guidance: only 212 (21%) pass. Only 2% of shower gels do.
- Redness, the core sign of rash, is harder to see on deeper skin, for clinicians and cameras alike.
Reporting early matters: in a randomised trial of 766 people on chemotherapy, structured symptom self-reporting was associated with longer median survival (31.2 vs 26.0 months, Basch et al., JAMA 2017). Between Cycles brings that idea to skin and hair.
What it does
For patients:
- Baseline: three scans before treatment set your normal, and measure how much your scores move between photos when nothing has changed.
- Check-ins: each scan is compared with your own baseline. A change is flagged only when it's bigger than your own photo-to-photo noise (the 95% minimal detectable change from test-retest reliability studies).
- Skin-tone honesty: skin type is measured once. On deeper skin, every result says plainly that a steady redness score doesn't rule out a rash.
- Symptoms a photo can't see (fever, blisters, infection, pain) are asked at every check-in and always switch the app to "Contact your care team today".
- Picked for your skin today: each change maps to what guidance says helps (bumps or redness: a gentle soap-free cleanser; dryness: a hydrating moisturiser; darker patches: daily SPF), filled with real products that pass every rule. No ads, no affiliate links.
- Product check: snap an ingredient list. Ten fixed rules, each citing NHS, Macmillan, MASCC or U.S. Pharmacist guidance, flag what to avoid, what to ask about and what helps.
- Hair: hair density tracked each cycle (useful alongside scalp cooling), and face-preserving previews of shorter styles before hair loss begins.
- Care-team report: one printable page with changes, charts across cycles, photos with detection overlays, skin type, hair, symptoms and questions to ask.
- Private: no accounts; photos and history stay on the device.
For pharmacies and shops:
- Shelf check: the catalogue audit by category, plus a tool to check your own range and download the results.
- "Gentle during treatment" badge: two lines of HTML put a verdict on any product page, with the reason and source one tap away. A keyless public API (/api/check) does the same for a whole catalogue.
How we built it
Five YouCam APIs, each doing real work:
- AI Skin Analysis (8 concerns): redness, bumps, dryness and dark patches tracked as treatment side effects. We use raw_score, not ui_score, because the UI score is adjusted upward to encourage users, which would hide real change. Detection masks are shown as overlays and on the report.
- AI Fitzpatrick Skin Type: run once, in parallel with the first baseline scan, to decide whether redness readings carry a reliability note.
- AI Hair Density Detection: a level (1 to 4) and a score per hair check, charted across cycles.
- AI Hairstyle Generator: face-preserving previews of shorter styles and a no-hair preview.
- AI Hat Try-On: previews with a hat or beanie.
All calls run server-side in Next.js route handlers (upload via pre-signed URL, create task, poll with back-off), with per-IP rate limits and a unit-balance check so the public demo stays up. A vision model only transcribes ingredient labels; fixed rules decide. Product data: 1,033 products from Open Beauty Facts (ODbL). Stack: Next.js 16, React 19, Tailwind CSS 4, Recharts, IndexedDB, Vercel. 50 unit tests.
What we measured, not claimed:
- Repeatability on a real face: in matched light the noise band was 3.3 points; changing the light made it four times wider. That's why every scan asks for the same spot and light and shows a faint ghost of your first photo.
- Label reading: on 12 real label photos, the reader matched the human transcription's verdict 11/11 times it found a list (92% recall, 93% precision, median 2.6 s), and correctly declined the one photo with no ingredient list.
- Catalogue: 212 of 1,033 products (21%) pass every rule; fragrance is the most common problem in every category.
Challenges we ran into
- Photo scores wobble even when skin hasn't changed. A naive tracker would raise false alarms, the last thing a person in treatment needs. A personal noise band fixed it, and noisier concerns automatically need a bigger change.
- The hair density score's range isn't documented. We measured it ("medium" 1.71, "low" 0.92), so the API's own level is the headline and the score draws the trend.
- Our first label reader took 23 s per photo. Benchmarking showed one model was timing out and another had been retired; reordering got it to 2.6 s with the same accuracy.
- The scarf try-on generated a new scene instead of covering hair loss, so we cut it and built hair prep around the face-preserving hairstyle API.
Accomplishments that we're proud of
- A measurement method a clinician would recognise, running on a consumer skin API, and tested on a real face.
- A skin tracker that is honest with people with deeper skin, at the moment it matters.
- One set of cited rules serving three readers: a patient after a check-in, a patient in a shop aisle, and a shop's own product page.
- Every number in this writeup is reproducible from a script in the repo.
What we learned
Benchmarks change products, not just writeups: our biggest fixes (label speed, two rule false positives, and the same-light guidance) came from measuring our own system on real data. And light matters more than we expected: one change of light made the noise four times bigger.
Between Cycles tracks visible changes in photos; it doesn't diagnose, and the demo journey uses clearly labelled sample data.
What's next for Between Cycles
- A study comparing app levels with clinician grading across skin tones.
- Hair-density repeatability, scalp and chest coverage.
- Secure sharing of the report with the care team, and the badge on real pharmacy pages.
Built With
- gemini
- indexeddb
- nextjs
- open-beauty-facts
- react
- recharts
- tailwindcss
- typescript
- vercel
- vitest
- youcam-api
Log in or sign up for Devpost to join the conversation.