Client
Personal project
Role
Product Designer
Industry
BeautyTech
Mobile Web
Product Design
UX Research
Barcode Scanner
User Testing
Cruelty-Free Beauty Scanner
A mobile-first web app that lets anyone scan a cosmetic barcode and instantly see if the brand is cruelty-free without opening Google, cross-referencing multiple sites, or knowing where to look. Built from scratch: from identifying the problem through YouTube research, to shipping a live product with a working barcode scanner.
<3 sec
scan to answer
3
corridor tests conducted
150+
brands in database

Context
I love perfume. One day I found out that some fragrances are tested on animals — and that led me down a rabbit hole. I discovered the concept of cruelty-free beauty, started researching which brands test and which don't, and eventually started a YouTube channel sharing my findings. What became clear quickly: this topic is significantly more developed in the US than in Europe. The tools that exist PETA's database, Leaping Bunny, Cruelty-Free Kitty are great resources, but they're built for desktop research, not for the moment you're standing in a store with a product in hand. That gap became the idea.
The problem
Getting a cruelty-free answer takes too long in the wrong moment. The peak moment of need is in a store, product in hand. The existing tools require navigating to a website, searching manually, and often cross-referencing multiple sources, because European brands are frequently missing from US-centric databases. I wanted to reduce that to a single scan.
Goals
What I wanted to achieve How I'd know it worked Make CF status accessible in the moment of purchase Works one-handed, result in under 10 seconds Cover European brands better than existing tools Own database built over several years of research Ship something testable, not just a prototype Live URL, real barcode scanner, shareable Validate the core mechanic before investing further Corridor testing with 3 real users
Process
Step 1 — First prototype: generated with AI
I had a clear idea but didn't have a detailed implementation plan. My first move was to describe the concept to Claude, the brand identity, the core flow, the visual palette I'd developed for a university project, and generate an initial version.
Looking at this version, I could see the structure was right. But visually it wasn't at the level I wanted. The UI needed significant work before I could show it to anyone.

Step 2 — UI refinement
I took the first version and focused purely on visual quality: typography hierarchy, spacing, component consistency, the way the brand identity translated to a mobile interface.
I used the color palette from my own diploma project an ethical beauty retail concept, which gave the app a grounded, intentional visual language rather than starting from scratch.

Step 3 — First real test: the database problem
I launched the refined version on Bolt to start testing it myself. The first major blocker: I couldn't get the database to connect reliably. The API kept failing due to CORS restrictions on the hosting environment.
Decision: Rather than blocking progress on a technical problem, I pivoted to a version with templated demo results. This was enough to demonstrate the core mechanic - scan a barcode, see a CF status without requiring live data.
This was a deliberate product decision: what's the minimum version that lets me test whether the core idea works?
Step 4 — Corridor testing with 3 users
I shared the demo version with 3 potential users and observed how they interacted with it. Key findings:
1. The home screen was adding friction, not value. Users wanted to scan immediately. The home tab with stats, recent history, a CTA card was a detour to the thing they actually came to do.
2. Saved/Favourites didn't make sense without login. Without authentication, the saved list resets on every session. Users noticed this felt broken. The feature needs proper infrastructure before it's useful.
3. The core mechanic worked. All three users understood what the app did within seconds and could complete a scan without guidance.
Step 5 — Structural redesign based on testing
I made two significant structural changes:
Removed the Home screen entirely. The scanner is now the first screen. The only second tab is About contextual information about what cruelty-free means and how to interpret results.
Removed Saved/Favourites. A broken feature is worse than no feature. This goes back when there's proper login infrastructure behind it.
The navigation went from 3 tabs to 2. Every interaction now starts at the scanner.

Step 6 — Bottom sheet instead of full-screen result
The result originally opened as a full-screen page, which meant navigating away from the scanner to read it, then navigating back to scan again.
I replaced this with a bottom sheet: the result appears over the active camera view. The scanner stays visible. One tap expands to full detail. One tap dismisses and continues scanning.
This was the single biggest improvement to the flow. What had been:
Scan → Navigate to result → Navigate back → Scan again
Became:
Scan → Sheet appears → Dismiss or read more

Step 7 — Migration to Vercel, final build
After the structural redesign, the barcode reader kept breaking on Bolt. I migrated to Vercel, rebuilt the final version there, and that's what's live now.
