Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for Ripple
Ripple — Phia Hackathon Write-Up April 19–20, 2026 | Phia HQ, Union Square, NYC Built by Riku Santa Cruz
WHY THIS PROBLEM
Shopping is inherently social, but the tools around it are not. You want to do something with someone — a date, a trip, a night out — and figuring out what to wear is either stressful or an afterthought. And when it comes to gifts, you know the person and you know the occasion, but you have no idea where to start.
Ripple solves both. It turns occasions into personalized outfit guides for everyone involved, and turns gift-giving from a guessing game into a curated experience.
The core insight: taste is transferable, but it's not identical. If one person buys a Nike Dri-FIT tee, their friend doesn't want the same shirt — they want the version of that energy in their own style. The job of the AI is to bridge that gap.
WHAT I BUILT
Ripple is a standalone social shopping platform with two modes:
Plans — You create a plan (date night, trip, concert), add friends, and Ripple automatically curates a personalized outfit guide for everyone based on their individual taste profiles and the occasion. If someone only wears sweats and athletic clothes, Ripple finds the "date night version" of that — a cleaner jogger, a premium tee, fresh sneakers — not dress pants. It stays in their lane but elevates for the moment.
Gift Mode — You enter a friend's name, budget, and gender. They receive a link to a style quiz (swipe yes/no on outfit photos). Based on their swipes, Claude generates a 5-product gift guide personalized to their taste. You buy directly from the guide.
Both modes share the same taste graph and matching engine. They are two entry points into the same product.
TECHNICAL STACK
Frontend: Next.js (App Router) + React + Tailwind CSS Backend: Python + FastAPI Database: SQLite AI: Claude API (claude-sonnet-4) — query generation, style matching, reason writing, vision analysis Product data: Serper Google Shopping API (live results, real URLs, real images) Image search: Google Cloud Discovery Engine (for quiz card images)
HOW IT WORKS
Taste Profiles Every user has a taste profile: style description, preferred brands, budget range, gender fit, and occasions. Profiles are built through the onboarding flow and can be enriched by submitting image URLs — Claude vision analyzes the image and extracts style signals ("flowy silhouette, muted earth tones, relaxed fit") that get folded into the profile.
Matching Engine (matcher.py) The core of the product. Three functions:
curate_event_items: Takes an event and all member profiles. For each member, Claude generates 3 short Google Shopping queries calibrated to their style and the occasion. All queries run in parallel via Serper. One Claude call per member writes reasons for each result. All members run simultaneously via ThreadPoolExecutor.
find_gift_guide: Claude generates 5 search queries based on the quiz swipe responses. All 5 Serper searches run in parallel. One Claude call writes reasons for all results at once.
generate_quiz_images: Claude generates 12 style cards for the quiz, each with a search query and an aesthetic label (e.g. "Airy Minimalist", "Clean Lines"). Labels describe the vibe, not the product.
Parallelization Everything that can run in parallel does. All Serper searches within a flow run simultaneously. For multi-member events, all members are curated simultaneously. Claude calls are batched — one call generates reasons for all products at once rather than one call per product. This brought curation time from 30–60 seconds down to 5–10 seconds.
Real Products An early version used Claude to generate product names, then fetched images by searching for those names. The names were hallucinated and the images never matched. I replaced the entire stack with Serper's Google Shopping API, which returns real products with real URLs, real prices, and real images from the same source, guaranteed to match.
Gift Guide Flow
- User A creates a gift → backend immediately starts pre-generating quiz image queries in a background thread
- User A shares the invite link with their friend
- Friend swipes yes/no on 12 style photos
- Backend immediately returns "Locking in your taste..." while gift guide generation runs asynchronously in a background thread
- User A's gift page polls every 3 seconds until the guide is ready
- User A sees 5 real products with clickable buy links
Plans Flow
- User creates a plan (name, occasion, location, members)
- Backend kicks off curation in a background thread immediately
- All members see the plan in their Plans tab (polls every 4 seconds)
- Each member sees their own personalized picks plus their friends' picks side by side
TECHNICAL CHALLENGES
Challenge 1: Server blocking on AI calls The purchase endpoint hung the entire server when Claude was called synchronously. FastAPI's BackgroundTasks didn't fully resolve it because they still run in the event loop. Fixed by using daemon threading.Thread — completely decoupled from FastAPI's event loop, so the server stays responsive while matching runs in the background.
Challenge 2: Image quality Getting images that actually matched the products took three full iterations:
- DuckDuckGo image search: caused OS-level process freezes on macOS
- Unsplash API: lifestyle photos, not product shots
- Google Cloud Discovery Engine: stale crawl index, returned category pages and 404s
- Final solution: Serper Google Shopping, which returns the exact image Google Shopping uses for each product — always a product shot, always matching the title
Challenge 3: Gift guide slowness Original flow: Claude picks queries sequentially, Discovery Engine searches sequentially, Claude picks the best result per query individually. For 5 products that was ~25–30 seconds. Fixed by: (1) pre-generating quiz queries in the background when the gift is created, (2) returning immediately from the quiz submit endpoint and running generation async, (3) parallelizing all 5 Serper searches, (4) replacing 5 individual Claude calls with 1 batch call for all reasons. Result: 5–8 seconds end to end.
Challenge 4: Style labels on the quiz Claude's image queries were product-search phrases ("structured shoulders", "crew neck"). When used as quiz card labels they were confusing and unappealing. Fixed by changing the generation format to return both a search query and a separate aesthetic label — Claude now writes labels like "Polished Casual" or "Effortless Minimalist" that describe the vibe.
Challenge 5: Real-time updates without websockets The backend does a lot of async work (curation, gift guide generation, matching). Rather than setting up websockets, the frontend polls every 3–4 seconds for anything that might have updated. Plans, gift guides, matches, connections, and the activity feed all update automatically without a page reload. The polling interval is fast enough to feel live but slow enough not to hammer the server.
Challenge 6: Occasion-aware style elevation The hardest AI problem: if someone only wears athletic clothes every day, what do they wear on a date night? A naive model would put them in dress pants, which is wrong. The prompt explicitly instructs Claude to "stay in their style lane but elevate for the occasion" — find the cleaner jogger, the premium tee, the fresh sneaker. The result should still feel like them, not like a costume. Getting this right required several iterations of prompt tuning.
GROWTH LOGIC
Every gift link is a cold acquisition — someone who has never used Ripple receives a personalized style quiz and gift guide. They see the product working before they ever create an account. The join prompt comes after the value, not before.
Every plan is a social signal — when one person adds a friend to a date night plan, that friend sees Ripple's value immediately. They didn't have to seek it out. It came to them through someone they trust.
The data flywheel: every swipe, every gift purchase, every plan created is a signal about taste. That data makes the matching better. Better matching makes the product more valuable. More value drives more users. More users drive more plans and more gifts. The loop compounds.
WHAT'S NEXT
- Native push notifications when a ripple lands or a plan is curated
- Taste graph visualization — see who in your network has the highest style compatibility
- Occasion calendar — birthdays, trips, and events trigger automated ripples at the right moment
- Retailer integrations — direct product feeds from brands for higher accuracy and affiliate revenue
- Group consensus — for plans, let the group vote on each other's picks
Log in or sign up for Devpost to join the conversation.