Inspiration

ARU is short for "아름다운 루틴" — Korean for "a beautiful routine."

I used to work as a model (Paris/Seoul fashion Week), and these days I work in tech. One thing has stayed the same through both: every friend who visits Korea asks me what skincare they should buy. Korea is now famous for K-beauty, but if you can't read a Korean ingredient label, standing in a Seoul beauty store is honestly overwhelming. And it's not just foreigners, my Korean friends struggle too, not because there's too little information, but because there's way too much of it.

The existing apps lose me in one of two ways. Either they promise your skin will be "whitened" or "regenerated". The kind of efficacy claims Korean cosmetics advertising law actually restricts, and that people have learned to tune out or they analyze your face and then just... stop. Nobody answers the real question you have in the store aisle: so what should I buy today?

That's ARU. Point your phone at your face for 30 seconds, get an honest read on what your skin shows right now, and walk away with a skin report, three product picks, and a morning/evening routine. It works in five languages (English, Korean, Japanese, Chinese, Arabic with full RTL), because the people who need it most are the ones who can't read the labels.

What it does

1. 30 second on-device scan MediaPipe Face Landmarker finds your T-zone and cheeks in the browser. A quality loop checks light, distance, steadiness and glare on every frame, and auto capture fires only when conditions are actually good. On the basic path, the photo never leaves your device.

2. Honest skin report Reads only what a photo can truly support: oil, redness, texture. When capture confidence is low, the app demotes its own reading and says so, leaning on the questionnaire instead of pretending.

3. AM/PM routine : Concrete morning/evening routine built around the three picks, not just a product list.

4. Care links Allow listed retailer links to buy today, plus dermatologist outlinks when a professional is the right answer.

*5. 2 week & 4 week check in * An opt in email loop that asks how the routine is going and feeds the next recommendation.

6. 5 languages English (default), Korean, Japanese, Chinese, and Arabic with a full right to left layout, because the people who need this most are the ones who can't read the labels.

How i built it

1. Codex carried the feature work, and the git history proves it. There are 21 public codex/ session branches in the repo, one per working session: the camera quality gate, the scan pipeline split, security hardening, Android packaging, the iOS Safari camera fixes. The whole production-hardening stretch from July 13 to 19 (PRs #44–#61) is Codex end to end. I reviewed and merged everything by hand; no assistant ever had permission to merge or deploy. Full story in, https://github.com/seonkistall/aru-buildweek/blob/main/BUILDLOG.md.

2. Learned to delegate investigations, not just edits. When Android auto capture never fired, I didn't ask for threshold tweaks. I asked Codex to investigate the coordinate system itself and redesign. It found the fragile aspect-ratio conversion, rebuilt auto-capture on raw face-box size, and added a /scan?debug=1 overlay so I could watch every gate value live on a real phone.

3. Ran Codex adversarially before launch. "Hunt this surface like an attacker and pin every finding with a regression test." That round caught an unauthenticated email relay and a consent scope bypass, before real users, not after. It also locked down Supabase RLS on nine tables and revoked browser role DB privileges.

4. GPT-5.6 runs inside the product itself Phrasing recommendation reasons inside the claim filter with schema validation, per-IP rate limits, a 15-second timeout, and a verified template fallback when anything goes wrong.

5.Everything is pinned by tests 297 Vitest tests, 42 Playwright mobile E2E tests, and a 180-combination text-fit matrix (9 routes × 5 locales × 4 viewports).

Challenges i ran into

1. The bug that looked like tuning and absolutely wasn't. Auto capture wouldn't fire on Android, and two rounds of threshold tuning did nothing. Real-device debug output revealed the ridiculous truth: the MediaPipe GPU delegate was emitting corrupted landmarks with values around 1e34, so the computed face size was astronomically wrong and no threshold on earth could pass.

The fix (simplified): ts // app/scan/use-landmarker.ts — landmarks outside [0,1] mean the // GPU delegate is corrupted: recover once on the CPU delegate if (faceBox.size < 0 || faceBox.size > 1) { recreateLandmarker({ delegate: "CPU" }); // self-heal, one time }

Plus a rule I now follow religiously: never touch camera thresholds without real device debug data.

2. Five languages means five ways to break. A global keep all style silently forbade every line break in Japanese and Chinese, and after adding Arabic RTL, the forward arrows still pointed right. The same reproduce → regression-test → smallest-fix loop caught both.

3. iPhone Safari kept me humble. The camera lifecycle needed five separate fixes backgrounding, mute, ended, pagehide, and an explicit resume flow each one pinned with a WebKit regression test before the production deploy.

Accomplishments that i'm proud of

1. Real demand signals, honestly reported. 9 of 10 moderated interviewees said they'd buy the exact product ARU picked, and ~40 street interviews in Hongdae, Gangnam and Myeongdong turned into active engagement and on the spot waitlist signups and the repo's research note states the limits of that evidence as plainly as the wins.

2. It's live, and it's real. ARU runs in production today The full journey (scan → survey → report → routine → check-in) works on a real phone, with no account and no API keys required.

3. Verified, not asserted. 297 unit and contract tests, 42 Playwright mobile E2E tests, a WebKit camera-lifecycle suite, and a 180-combination text-fit matrix (9 routes × 5 locales × 4 viewports, 44px touch targets at 320px). Production ships behind CSP, a firewall, Supabase RLS on nine tables, and per-IP rate limits.

4. A compliance gate you can't talk your way past. What the AI is allowed to say is pinned by automated tests, not a style guide. In a category built on overclaiming, my favorite feature is the one that refuses to.

*5. Five languages, one product. * English, Korean, Japanese, Chinese, and Arabic with a full right to left layout, each authored for its own word order and conventions, not machine translated.

What i learned

The biggest lesson came from user interviews, not code. In moderated sessions, I sat down with 10 people, had them scan and react to their recommendations, and 4 to 5 said they'd buy the specific product ARU picked. Not "cool scanner" the pick was doing the work. That reframed the whole product for me: the scan is the hook, the purchase moment is the product. (And to be honest about it: that's stated intent from a small sample, not a conversion rate — (https://github.com/seonkistall/aru-buildweek/blob/main/docs/buildweek/user-research.md, the write-up in the repo says exactly that.)

Then I took ARU to the streets. I went to Hongdae, Gangnam, and Myeongdong, the neighborhoods where visitors to Korea actually shop and introduced the product to about 40 people, walking up to strangers and letting them try it on their own phones. What I heard went straight back into the build: because Codex made iteration so fast, feedback from an afternoon of street interviews could ship the same week. And people didn't just answer politely. They leaned in, asked where they could download it, and signed up for the waitlist on the spot. That was the moment this stopped feeling like a hackathon project, the loop of talk to real users → hear what they actually need → build it with Codex → put it back in their hands is the experience I'll carry out of Build Week.

The other lesson: in anything health adjacent, restraint builds more trust than confidence. Users respond better to "here's what I can actually see today" than to a confident guess. Making the app demote its own low confidence readings was one of the best product decisions in the project.

What's next for ARU (아름다운 루틴, 'beautiful routine' in Korean)

A manual concierge round personally sourcing and ordering for a small group of users, to turn stated intent into real transaction data. Finishing the physical device camera matrix, verifying email delivery end to end, and shipping the Android app: the signed bundle and the full Play submission pack are done, and only the developer identity verification step remains.

Beyond that, I'm treating ARU as a company, not a hackathon repo. I'll keep improving the product with what the waitlist and street interviews teach me, and in parallel use GPT to automate the marketing side generating and testing short-form content and localized campaigns across all five languages, so a one person team can realistically chase viral distribution. If the concierge round and the waitlist keep converting the way the street interviews suggest, my goal as an entrepreneur is to scale this up and raise a seed round and turn ARU into the honest K-beauty companion for everyone who lands in Korea.

Built With

Share this project:

Updates