SWShi Warreninwslabs.hashnode.dev·Sep 25 · 6 min readI Stopped Treating AI Outputs as the End of the WorkflowWhen I started building AIMakeTattoo, I thought about the product as a group of separate tools. One workflow started with a text idea. Another let someone begin with a photo or reference image. Anothe00
SWShi Warreninwslabs.hashnode.dev·Aug 28 · 5 min readI Built the Same “Modify” Feature Twice. The User Contract Was Completely Different.When I first added a “Modify” feature to my tattoo product, I assumed the interaction pattern would be reusable. Both workflows looked similar on the surface: generate an image keep the result descri00
SWShi Warreninwslabs.hashnode.dev·Aug 15 · 6 min readI Needed AI Image Editing. I Didn't Want to Build an Image EditorI already had a working image generation flow. Users could describe a tattoo idea, choose a style, generate a result, and try again if they wanted another direction. That was enough until I started no00
SWShi Warreninwslabs.hashnode.dev·Aug 7 · 10 min readYour AI Generation Endpoint Probably Needs a State Machine, Not Another try/catchMost AI generation endpoints look simple in the first version. A request comes in, you call the model, wait for the result, and return it. Something like this: try { const result = await generateIma00
SWShi Warreninwslabs.hashnode.dev·Jul 30 · 11 min readBuilding an Image-to-Tattoo Workflow Without Turning It Into a Generic Image FilterI recently added an Image to Tattoo workflow to AIMakeTattoo. From the user’s point of view, the feature is simple: upload a photo or sketch, choose a tattoo style, adjust a few controls, and generate00