Turning product data into user understanding, without the hallucinations.

Personal Project·2026–now·Web App·view project ↗

Problem

I'veseenthispatternacrossalotofproductteams.Theydotheresearch,buttherestoftheteamendsupignoringtheresults.Notbecausetheydon'twanttouseit,butbecausetheycan'tevenconnectwhattheyfoundwiththedecisionsinfrontofthem.ThepersonaendsupinaFigmafileoraPPT.TheinterviewtranscriptsliveinaNotiondocthatnoteventhepersonwhodidtheinterviewgoesbacktorevisit.

Irealizedthegapwasn'teffort,itwashowthatdatareachedtheteam.SoIbuiltResense:tohelpproductteamsgetvaluefromwhattheyalreadyhad,withoutneedingaspecialisttointerpretitorspendinghoursonapersonaartifactthatendsupinthebottomdrawer.

The AI stack

ThegenerationpipelinemapsrawproductdatathroughJTBDandanti-optimismguardrails,structuringitintoSyntheticUsersviaOpenRouterwithClaudeSonnetinproductionandGeminiFlashindevelopment.Ifoundthetwo-modelstrategythroughtesting:deviterationneededspeed,productionneededreasoningqualityforcomplexsynthesis.Theyservedifferentjobs.

RAG-poweredevaluationretrievesrelevantsourcechunkstogroundpatternanalysisinactualuserdata.Thisiswhatletsnon-specialistproductteamstrusttheoutput:everyinsighttracesbacktoasource.

Promptcachingdoestwothings:itreducestokencostandcutsresponselatencyby63%.Onaresearchtoolwherepeoplearewaitingforasynthesisbeforeameeting,thatspeedmattersasmuchasthecontentitself.

EveryrequestgoesthroughaBYOKlayerforthefreetier:usersbringtheirownAPIkey(OpenRouter,Anthropic,OpenAI,orGoogle),whichneverleavesthebrowser.Auto-detectionrouteskeystotherightprovider.Theserverneverstoresorlogsguestkeys.

The design decisions

Calibratingtrustwasthehardestdesignproblem.LLMsfeelauthoritativeevenwhenthey'reguessing,sothebiggestriskintheproductwasdeliveringoutputsthatteamsusedwithoutquestioning.Ilandedonthreesystemsthataddressthisdirectly.

Sourcecitationsperattribute:everyinsightinaSyntheticUserprofilelinksbacktothesourceitcamefrom.Inferredfieldsaretagged[Inferred]intheoutput.Usersseeexactlywhatcamefromtheirdataandwhatwasmodelinference.

Theanti-optimismguardrailisanexplicitprohibitionlistinthesystemprompt:fourpatternsthatmakeagenerationinvalid.Thelayerforcesthemodeltodescribefrictionpointsasspecificsituations,when,where,whathappens.Ifafrictionpointistoovague,thegenerationfailsvalidation.

Thetriangulationscoremeasuressourcediversity(behavioral,attitudinal,contextual)withamultiplier:onesourcetypeyields0.6xconfidence,threetypesyield1.0x.TheConfidenceBadgecomponentrendersthisasawarning,informational,orconfirmationstate,andshowsexactlywhichsourcetypesaremissing.

Evaluationandimprovementsareoffthecriticalpath,triggeredon-demand.Themodelcallforprofilescloses,thenuserscantriggeraseparatecallforpatternsandrecommendationswhentheyneedit.Twosecondsondemandkeepsthemainloopfast,whichiswheretheteamspendsmostoftheirtime.

The failure mode

Whenthemodeldoesn'thaveenoughdatatogenerateareliableSyntheticUser,itsaysso.IbuiltaDataHintpanelthatsurfacesthreesignals:ananalysisofwhat'smissing,thespecificdatatypesneeded,andasuggestedresearchquestiontogogetthem.Thepanelusesprogressivedisclosure.Theanalysisisvisiblebydefault.Thegapsandsuggestedquestionexpandoninteraction.

Idecidedthatshowingalow-qualitySyntheticUserwithnosignalsofuncertaintywasmoredangerousthanbeinghonestaboutinsufficientdata.Teamsthattrustbadresearchmakeworsedecisions,andavoidingthatwasexactlythepoint.

BeforeanyuserdatareachestheLLM,ananonymizerstripsPII:emails,BrazilianCPFnumbers,phonenumbers,IPaddresses,andnamesincontext.Themodelreceivesonlyanonymizedtext.Dataatrestusesfield-levelencryption.Ihavenoaccesstorawusercontent.Thatcostsmeadminconvenience.Itwasworthit.

How I work with AI

Resensedidn'tstartasaproduct.Itstartedasmyownprocess.SyntheticUsersarehowIgetafirstreadonwhoI'mdesigningforinhoursinsteadofweeks,thenIvalidatetheonesthatmatterwithrealpeople.Astartingpoint,notareplacementforresearch.

Thesameinstinctrunsthroughtherestofmywork.IprototypenavigableflowsinClaudeCodeandCursor,soengineeringgetssomethingtheycanclickthroughinsteadofastaticscreen,whichiswherehandoffsusuallybreak.AndIbuiltadesignagentthatcarriesmydesignprinciplesandasetofSyntheticUsersascontext,runningconceptandusabilitychecksagainstthembeforeIsitdownwitharealuser.WhenIcompareditsverdictstorealsessions,theylandedcloseenoughtotrustasafirstpass.

AIisn'tastepIboltontotheend.It'sintheresearch,theprototype,andthetest,soIspendmytimeonthedecisionsinsteadofthesetup.

What's next

IwantSyntheticUsersthatevolveontheirownasnewproductdatacomesin,withoutmanualregeneration.Andaresearchagentthatlearnsfromcorrectionsignalsandsuggestswhattovalidatenextbasedonthegapsitalreadyflagged.Thegoalisasystemthatgetsmoreusefulthemoretheteamusesit.

next read

Coisas.space

Coisas.space is a product that uses AI to categorize every saved link and let you chat with what you've saved, to actually learn from it. Matching is semantic: ask about React and it surfaces links that never mention React in the title. I used AI across the whole process, from research to ideation to testing.