DEV Community

Cover image for The Hard Part Wasn’t Building More AI Features. It Was Connecting Their Outputs
Warren
Warren

Posted on

The Hard Part Wasn’t Building More AI Features. It Was Connecting Their Outputs

I had a bunch of tattoo tools that worked fine on their own.

A text-to-image generator.

An image-to-tattoo flow.

A lettering generator.

A font preview tool.

A tattoo try-on tool.

The problem was that every tool ended at its own result.

That was fine when the product was small.

It became awkward once the same actions started showing up after almost every result:

  • modify
  • save
  • download
  • share
  • try on

At some point I realized I wasn't really building separate tools anymore.

I was building different ways to produce the same kind of thing:

a tattoo result that the rest of the product should be able to keep working with.

The tool shouldn't own the result

My first mental model was basically:

AI Tattoo Generator → its result
Image to Tattoo → its result
AI Lettering → its result
Try On → separate tool
Enter fullscreen mode Exit fullscreen mode

Each flow worked, but the handoff between them was weak.

If someone started from a rough tattoo idea, generated something useful, and wanted to change it, the next step shouldn't feel like starting a new product.

The same was true if someone started from a photo or sketch.

The source was different.

The next actions were not.

That led me to a simpler model:

input → tattoo result → modify → try on → save / download / share
Enter fullscreen mode Exit fullscreen mode

The generator became less important than the result it produced.

A shared result model made the workflow easier to reason about

A simplified version of the idea looks something like this:

type TattooResult = {
  imageUrl: string
  source: "generator" | "image-to-tattoo" | "lettering"
  canModify: boolean
  canTryOn: boolean
  canSave: boolean
  canDownload: boolean
  canShare: boolean
}
Enter fullscreen mode Exit fullscreen mode

My real implementation isn't literally this interface.

The useful part was the change in thinking.

Instead of thinking:

this page owns this result

I started thinking:

this tool produces something the rest of the product can continue using

That made the downstream actions much easier to connect.

Image to Tattoo became a starting point, not an endpoint

This was especially obvious with image input.

A user can turn a reference image into a tattoo-style concept.

But the first output may only be 80% right.

Maybe the subject is correct but the style needs to change.

Maybe they want heavier outlines, less shading, or a different composition.

So the useful flow became:

reference image → tattoo design → modify → try on

Modify matters because it lets the user keep what already works instead of regenerating everything.

And once the design is close, it can move into a body placement preview.

That handoff ended up being more useful than treating Try On as a completely separate product.

The same pattern showed up in text tattoos

Text tattoos had a slightly different entry point.

Someone may not want to use an AI generation just to answer:

Which lettering direction fits this name or phrase?

So they can first compare tattoo font styles.

Once they have a direction, they can move the same text into a more custom lettering workflow.

There they can add things like:

  • flowers
  • symbols
  • flourishes
  • spacing
  • shading
  • ornamental elements

Then that result can also be modified and tried on.

So the flow becomes:

font preview → lettering → modify → try on

Again, the important part isn't any one feature.

It's that the output of one step is useful to the next one.

This changed what I build next

I used to ask:

What feature should I add next?

Now I ask:

If the user already has a useful result, what should they be able to do with it next?

That question has been much more useful.

It also helped me see the rest of AIMakeTattoo differently.

Roman numeral conversion, name tattoo tools, cost planning, generation history, and the generators aren't just isolated pages.

They are different entry points or supporting steps in the same planning process.

The product started as an AI tattoo generator.

It's gradually becoming a set of connected workflows around:

idea → design → refine → lettering / date → placement

The biggest improvement didn't come from adding one more AI feature.

It came from making the output of one feature useful to the next.

Top comments (0)