Case study · 2026

CurlCue

A hair-care app that scores products against your hair — not a universal good/bad list. Built end to end, for every hair type.

Role
Founder & sole developer
Timeline
Mar 2026 – present
Status
In development · pre-release
Type
Consumer mobile app (iOS)
1,500+
ingredient profiles

Each with a role, quality tier, and per-hair-type fit — porosity, curl pattern, and strand thickness.

100%
of scoring runs on-device

The engine and science layer ship inside the app; a scan needs no server round trip to score.

1a–4c
every hair type

Straight through coily, gender-neutral by design. Not a curly-only app.

144k+
lines of TypeScript

App, scoring engine, and edge functions — designed and written solo.

The problem

There is no such thing as a good hair product.

There are only good matches. Coconut oil is a repair powerhouse for thick, high-porosity curls — and a heavy, greasy mistake on fine, low-porosity waves. The same bottle, opposite outcomes.

Product-rating apps ignore this. They stamp one universal “clean” score on every ingredient for every person, which is exactly how curly-haired shoppers end up spending hundreds of dollars on well-reviewed products that were never going to work on their hair.

The brief I set myself: build the app that scores the product for you— your porosity, your curl pattern, your scalp, the look you’re actually going for.

What it does

Three pillars, one loop.

Scan tells you what fits, routines turn it into a habit, and the social layer shows what the habit earns. Never just a scanner.

  1. Scan

    Point the camera at a product. Barcode lookup, OCR fallback for unlabeled bottles, ingredient extraction — then the on-device engine scores it against your profile: porosity, curl pattern, density, scalp sensitivities, and the look you're steering toward.

  2. Routines

    An enforcing routine builder, not a passive checklist. Streaks, daily and weekly quests, and celebrations reward adherence, because hair results come from consistency, not from any single product.

  3. Social

    Show your hair, follow creators and stylists, keep reference photos. The score tells you what works; other people's results show you what's possible.

How it’s built

A flat good/bad flag is treated as a bug.

The engine’s core rule: every ingredient’s score is a function of its role in the formula, the product’s category, and the user’s hair — graded on a quality spectrum within that role. No shortcuts past any of the three.

Ingredient

Coconut oil

role · penetrating oilquality tier · best-in-class

Category

in a leave-in conditioner — a role this category expects, not a misplaced filler

Your hair

4a coily · high porosity · thick strands

penetrates the cortex, seals moisture in

86

score

2a wavy · low porosity · fine strands

sits on the cuticle, weighs strands down

41

score

Same bottle, opposite answers. A universal good/bad flag cannot say this — which is why the engine treats one as a bug.

Three lookups, no shortcuts

An ingredient is scored by what it is doing in this formula (its role), whether that role belongs in this kind of product (a silicone reads differently in a gel than in a shampoo), and how its quality tier fits this head of hair. The same ingredient legitimately scores high for one person and low for another — that is the point, not a bug.

Health gates the score; the look steers it

A product’s score is a health/suitability gate multiplied by alignment with the user’s desired look. Scalp irritation, buildup, and stripping vetoa score no matter how well the product serves the style — and the gate is shown on screen in points against a real counterfactual (“this would have scored 78 without the health cap”), so the arithmetic closes in front of the user instead of hiding in a multiplier.

No phantom axes

The engine may only read axes that onboarding actually collects, and a score is only shown once every axis it depends on exists. Preview score and detail score must agree for every hair profile — an honesty constraint that is checked, not assumed.

The engine ships in the app

Scoring runs 100% client-side: a 9,000-plus-line engine core and the 1,500+ ingredient science layer are bundled on the phone, so a scan scores instantly and privately. The 19 Deno edge functions carry only what must be server-side — barcode lookup, OCR, quest generation, and Claude-API verification of user-contributed products.

Tested by simulated users

The repo carries a persona suite — hair profiles with ground-truth expected scores per product — and an agent harness that drives the real app in the iOS simulator, then audits what it saw against each persona’s rubric. Scoring regressions surface as a failed persona, not as a one-star review.

Stack

  • React Native (Expo)
  • TypeScript
  • Supabase
  • PostgreSQL
  • Deno edge functions
  • Claude API
  • expo-camera
  • EAS build
Where it stands

In active development, honestly labeled.

CurlCue has been in daily development since March 2026 — the three pillars run in development builds today, and the milestone in front of it is the first TestFlight build, then App Store review. It is not shipped yet, and this page won’t claim otherwise.

What it already demonstrates is the part that doesn’t change at launch: a scoring engine with an opinionated, defensible model of the domain, and the discipline to keep it honest — verdicts that stay critical, math that closes on screen, and simulated users checking both before anything ships.