Fit Check
A stylist called Rehan, living on WhatsApp. Send a photo, it asks where you are going, then tells you what is working, what is not, and how to fix it.
It runs on Lua’s shared test number. The pre-filled message binds your thread to Rehan, then a photo gets you a real fit check. No signup, no app.
The opinion you actually want is the one a stylish friend would text back. So build it where the friend already lives.
Fit
Check
A stylist called Rehan, living on WhatsApp. Send a photo, it asks where you are going, then tells you what is working, what is not, and how to fix it.
Talk to it on WhatsApp↗SEND THE PRE-FILLED MESSAGE · THEN SEND A PHOTOIt runs on Lua’s shared test number. The pre-filled message binds your thread to Rehan, then a photo gets you a real fit check. No signup, no app.
The opinion you actually want is the one a stylish friend would text back. So build it where the friend already lives.
Three reasons nobody gets an honest answer about their outfit.
The group chat is not a stylist
Send a mirror selfie to five friends and you get five reassurances. Nobody wants to be the one who says the jacket is wrong, so the feedback is warm and useless.
A general chatbot never asks where you are going
It will rate an outfit without knowing the occasion. The same kurta is a nine at a mehendi and a four in a boardroom, so a rating with no context is just noise.
Nobody installs an app for one outfit
The decision takes thirty seconds and happens at the door with keys in hand. Any product that needs a download has already lost to the mirror.
None of this needed a new app. It needed a better friend, in a thread that was already open.
01
The product surface is prose.
My instinct was to look for the file where you write "if the user sends a photo, then search the style guide". That file does not exist. The agent reads the tool’s description and the skill’s context in plain English and decides for itself when to call them. So the behaviour lives in a forty-line persona, not in logic: the tone, the occasion-first rule, the four-part output, and the boundaries are all written rather than programmed. Iterating on this product meant editing prose, which is why a designer with no engineering background could own it end to end.
if (hasPhoto) {
searchStyleGuide()
}CODE THAT DOES NOT EXISTNo routing logic, no conditionals, no handler. Nothing in the codebase decides when a tool runs.
description: "Search the style guide before rating any fit."ENGLISH, READ BY THE MODEL
The description field is not documentation. It is the routing logic, and writing it well is a UX writing problem.
02
It refuses to rate anything until it knows where you are going.
The single biggest quality lever, and the one guardrail worth enforcing twice. The same outfit is excellent for one occasion and wrong for another, so a verdict without context is worthless. The requirement is written into the persona and repeated in the skill context, because a single instruction buried in a long prompt gets diluted.
Relaxed setting, sneakers read intentional, the whole thing lands.
Sneakers pull it casual in a room where everyone else stepped up.
So the first reply is never a rating. It is a question.
03
Retrieval that carries taste, not facts.
Most retrieval demos fetch documents to answer factual questions. Here it encodes opinion. Fourteen hand-written rules turn a general model into this particular stylist, with consistent views on volume, undertone, footwear formality and kurta length. Without them the advice is competent and anonymous. With them it is specific, repeatable and mine, and it treats Indian ethnic wear as a first-class case rather than an afterthought. Change the rules and you change the stylist, which means the product extends by writing rather than by coding.
Search is semantic, not keyword. A query like "beige kurta with sneakers for a daytime wedding" retrieves the footwear and ethnic-wear rules even though neither word appears in it.
04
Most of the plan turned out to be the platform’s job.
I designed the architecture before reading the platform properly, which meant designing around capabilities it already had. Every deletion below came from learning the primitives rather than building past them.
Final footprint: four TypeScript files, one skill, two tools, roughly two hundred lines including comments.
05
Push stages. Promote publishes.
I pushed changes, tested on WhatsApp, and got the old behaviour back repeatedly. Versioning was enabled on the project, which silently turns the auto-deploy flag into a no-op, so the code was only ever staged. Three commands, and only the last one is the one that goes live.
On any versioned platform, confirm which command actually goes live. "It deployed" and "it is live" are different claims.
On an agent platform, the product is written, not coded.
Persona, tool descriptions, skill context and knowledge entries are where the behaviour actually lives, and all four are writing tasks. Which puts a designer closest to the product, not furthest from it.