Me, Myself, & I (also Claude Code for Designers class at Maven) · Personal · AI-assisted

Clean Shopper

Clean Shopper
Click to enlarge

A product research assistant for people who read ingredient labels and still don't trust what they find — built to test what it actually looks like to design with AI from the first decision, not just build with it.

Role
Designer & Builder
Team
Solo (with Claude Code as a collaborator)
Duration
April–July 2026 (~80% built in April; final polish late June–July)
Live site
clean-shopper-omega.vercel.app
Tags
Personal ProjectAIFull-Stack Build
Problem

Caring isn't the same as knowing

Somewhere in the last decade, a specific kind of shopper emerged: someone who's decided they care what's actually in their dish soap, their face wash, their kid's shampoo — but caring doesn't come with the ingredient literacy to act on it. What actually happens is five tabs open at once: a blog post, a Reddit thread, the EWG Skin Deep database, the product page, and a screenshot of an ingredient list you're squinting at, trying to remember if "fragrance" is the bad one or not.

Clean Shopper started from that specific frustration. The idea: describe what you're looking for — a dish soap, a face wash, something for the baby — and let the app do the cross-referencing. Evaluate the ingredients, weigh the safety concerns, and give a clean, honest answer: worth buying or not. Save it to a personal library, sorted by category, so the research you did once doesn't have to happen again next time you're standing in the aisle.

Process

Design decisions before a line of code

The project started in design, not in React. Before building anything, I ran a structured intake through a custom Claude Code skill — /project-context — that took a rough project brief and produced a formal context document: problem statement, ideal customer profile, pain points, open questions, and gaps. That document became the north star for every decision that followed about scope, tone, and what to build first versus what to defer.

The design system came next, generated through a second custom skill, /design-system-generator. It produced two artifacts: a browsable HTML file previewing the full visual language, and a markdown spec documenting every design token with the reasoning behind it — not just "primary color: sage green," but why sage, why paired with warm sand and soft teal. The palette was built to hold three feelings at once: safety, warmth, and clarity. No color that shouts. Poppins across the full type scale, set on a Major Third ratio. Shapes slightly rounded but not precious — 8px radius on cards and buttons, 16px on modals.

A component spec followed the design system, before any component existed: nine components — Button, InputField, SearchBar, SafetyBadge, CategoryTag, ProductCard, NavBar, EmptyState, Reveal — each documented with props, visual structure, states, and usage rules. The rule enforced throughout the build: check the spec before building any UI element, and if it exists, use it.

Architecture

How it's put together

01
Stack
React on the front end, Tailwind for styling, Supabase for auth and data persistence, the Claude API for the research feature, Vercel for hosting
02
Serverless AI layer
AI calls run through a serverless function at /api/chat.js rather than calling Anthropic from the browser — keeps the API key off the client and keeps local and production behavior identical
03
Local dev workaround
`vercel dev` conflicts with Create React App's dev server, so a small Express shim (dev-server.js) runs the serverless functions on port 3001, with CRA proxying /api/* requests to it
04
Auth-driven routing
An activeTab state in App.js — not React Router — sends unauthenticated users to the landing page, authenticated users to browse, and back to landing on sign-out
Key Decisions

Where the product actually earns its name

The "Ask AI" chat is where the product concept lives or dies. It's a conversation, not a search box. The user asks about a product, an ingredient, or a whole category — "is this baby wash actually clean" — and the assistant answers with reasoning, not just a rating.

Under the hood, the chat function has access to a Supabase tool that lets it query the actual product catalog. So when the user asks about something in the catalog, the model can look it up and cite what's there. When they ask about something outside it — an ingredient, a comparison, a general question — it answers from its own reasoning and flags that it's speaking generally.

Reasoning over rating is the actual design decision. The system prompt instructs the model to think like an ingredient-aware research assistant: cite the safety reasoning, don't just return a verdict. A verdict without reasoning is a coin flip the user has to trust. Reasoning is what lets them build their own literacy over time — which was the point.

Click to enlarge
Before & After

Two surfaces, two different jobs

The Landing Page
The Landing Page
Click to enlarge
Full-viewport video hero, a nav that turns from transparent to frosted glass on scroll (tracked via an IntersectionObserver on a sentinel div, not a scroll listener), and copy that runs more adversarial than the rest of the app — "The label is not on your side." The tone is intentional: this is the moment a visitor decides whether the problem is real to them.
The Product — Browse & Filter
The Product — Browse & Filter
Click to enlarge
144 seeded products across six categories, filterable by safety rating, category, and brand. Every product opens into a drawer showing the specific ingredients driving its rating, each with a risk-level tag and a short concern description.
Outcomes

What's live today

A marketing landing page, full Supabase auth, a seeded product catalog, and an agentic AI chat — all deployed and usable end to end.

144
Products seeded
Across six categories — personal care, home cleaning, baby care, kitchen, pet care, and food & pantry
6
Live features
Auth, browse, filters, ingredient drawers, saved products, and the Ask AI chat
~100
Commits
Across the initial build, feature additions, and QA passes
See it live

A free account is required to view the live site.

Learnings

Four takeaways from building with AI

01
The workflow is the productThe most durable thing I built wasn't Clean Shopper — it was the /project-context and /prompt-optimizer skills, plus the discipline of documenting the design system and component spec before writing code. Those are portable to any project. The app is one instance of the workflow; the workflow is the actual asset.
02
AI-assisted doesn't mean AI-decidedEvery UI decision in this project traces back to a document I wrote before Claude wrote any code — the context doc, the design system rationale, the component spec. When output went sideways, the fix was almost always upstream in the instructions, not downstream in the code.
03
Honesty about scope is a design decisionThe safety ratings in this demo are AI-generated, not sourced from EWG. Calling that out clearly — in this case study and in the app itself — was more important than pretending otherwise. Illustrative data is the honest scope for a demo whose job is to show what the experience feels like.
04
What's next, not what's finishedA shopping list — the natural extension of a saved-products library. Preference management for the standing rules a real user develops over time: ingredients to avoid, trusted brands, certifications they weight. And a closed loop where the AI chat doesn't just answer a question but produces a ranked shortlist from the catalog. The current build gets the concept legible; those three would get it useful.
Next project
Monetizing New Audiences with a Consolidated Stocks Experience