<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Warren</title>
    <description>The latest articles on DEV Community by Warren (@warrenshi).</description>
    <link>https://dev.to/warrenshi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3922196%2F08d1e44b-ced3-418d-8627-8d790b70dadb.jpg</url>
      <title>DEV Community: Warren</title>
      <link>https://dev.to/warrenshi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/warrenshi"/>
    <language>en</language>
    <item>
      <title>I Built a Roman Numeral Tattoo Generator, Then Realized Conversion Was the Easy Part</title>
      <dc:creator>Warren</dc:creator>
      <pubDate>Wed, 22 Jul 2026 07:25:15 +0000</pubDate>
      <link>https://dev.to/warrenshi/i-built-a-roman-numeral-tattoo-generator-then-realized-conversion-was-the-easy-part-5ac</link>
      <guid>https://dev.to/warrenshi/i-built-a-roman-numeral-tattoo-generator-then-realized-conversion-was-the-easy-part-5ac</guid>
      <description>&lt;p&gt;I thought a Roman numeral tattoo generator would be a very small feature.&lt;/p&gt;

&lt;p&gt;The original workflow looked obvious:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a date&lt;/li&gt;
&lt;li&gt;Convert it into Roman numerals&lt;/li&gt;
&lt;li&gt;Show the result&lt;/li&gt;
&lt;li&gt;Let the user copy or download it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The conversion logic itself was not difficult.&lt;/p&gt;

&lt;p&gt;What surprised me was that users were not really asking only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is this date in Roman numerals?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They were also asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Will this still work as a tattoo?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second question changed the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first problem was not Roman numerals
&lt;/h2&gt;

&lt;p&gt;It was date ambiguity.&lt;/p&gt;

&lt;p&gt;A date like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;04/11/1992
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April 11, 1992&lt;/li&gt;
&lt;li&gt;November 4, 1992&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both interpretations are valid depending on the user’s country.&lt;/p&gt;

&lt;p&gt;A converter can produce a mathematically correct result for the wrong intended date.&lt;/p&gt;

&lt;p&gt;The safer workflow begins with the date written in words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;April 11, 1992
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then each section can be converted separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4 → IV
11 → XI
1992 → MCMXCII
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final month-day-year version becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IV · XI · MCMXCII
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conversion is correct only after the date order is clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roman numerals do not preserve modern digits
&lt;/h2&gt;

&lt;p&gt;Another source of confusion is zero.&lt;/p&gt;

&lt;p&gt;Traditional Roman numerals do not have a standard symbol for zero.&lt;/p&gt;

&lt;p&gt;That means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;09 → IX
2004 → MMIV
2020 → MMXX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users sometimes expect every modern digit to remain visible in the converted result.&lt;/p&gt;

&lt;p&gt;Roman numeral conversion works with the value of the complete number, not each individual digit.&lt;/p&gt;

&lt;p&gt;This is a small historical detail, but it matters when the result may become permanent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correct conversion was still not enough
&lt;/h2&gt;

&lt;p&gt;Once the date was correct, the next questions appeared:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should the date use dots, slashes, or spaces?&lt;/li&gt;
&lt;li&gt;Should it be month-first or day-first?&lt;/li&gt;
&lt;li&gt;Should the full date be used, or only the year?&lt;/li&gt;
&lt;li&gt;Will the chosen font remain readable at tattoo size?&lt;/li&gt;
&lt;li&gt;Is the date too long for the wrist?&lt;/li&gt;
&lt;li&gt;Should the layout be horizontal or stacked?&lt;/li&gt;
&lt;li&gt;Will repeated &lt;code&gt;I&lt;/code&gt; characters merge together?&lt;/li&gt;
&lt;li&gt;Is the preview a design idea or a final stencil?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the tool was no longer just a converter.&lt;/p&gt;

&lt;p&gt;It had become a small planning workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separators change the design more than expected
&lt;/h2&gt;

&lt;p&gt;The same date can look very different depending on the separator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IV · XI · MCMXCII
IV / XI / MCMXCII
IV – XI – MCMXCII
IV | XI | MCMXCII
IV XI MCMXCII
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dots feel compact and classical.&lt;/p&gt;

&lt;p&gt;Slashes resemble a modern written date.&lt;/p&gt;

&lt;p&gt;Spaces create a minimal look, but the date sections may become less obvious.&lt;/p&gt;

&lt;p&gt;Vertical lines create stronger separation, but they can also resemble the Roman numeral &lt;code&gt;I&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A tiny separator that looks clear on a large screen may nearly disappear when the design is reduced to tattoo size.&lt;/p&gt;

&lt;p&gt;Punctuation is not only decorative. It affects readability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Font previews can be misleading
&lt;/h2&gt;

&lt;p&gt;A Roman numeral date often contains repeated straight characters.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VIII · III · MMXXIII
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can look clear in a large digital preview.&lt;/p&gt;

&lt;p&gt;At a smaller physical size, the repeated &lt;code&gt;I&lt;/code&gt; characters may become difficult to count.&lt;/p&gt;

&lt;p&gt;Decorative fonts create additional risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thin serifs may disappear&lt;/li&gt;
&lt;li&gt;Gothic details may merge&lt;/li&gt;
&lt;li&gt;Script flourishes may cross the numerals&lt;/li&gt;
&lt;li&gt;Narrow spacing may make separate date sections look connected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A visually impressive font is not automatically a practical tattoo direction.&lt;/p&gt;

&lt;p&gt;The user still needs to evaluate the design at approximately the intended physical size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Placement changes the format
&lt;/h2&gt;

&lt;p&gt;A short year such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MMXXIV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can fit into many small placements.&lt;/p&gt;

&lt;p&gt;A full date such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XII · XXVIII · MMXXIV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;needs significantly more width.&lt;/p&gt;

&lt;p&gt;Trying to force both into the same small wrist layout usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller characters&lt;/li&gt;
&lt;li&gt;Tighter spacing&lt;/li&gt;
&lt;li&gt;Thinner lines&lt;/li&gt;
&lt;li&gt;Less readable separators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A stacked layout may work better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XII
XXVIII
MMXXIV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user may also decide that the year alone carries enough meaning.&lt;/p&gt;

&lt;p&gt;The best format depends on the body area, not only the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  A generated image is not a final tattoo stencil
&lt;/h2&gt;

&lt;p&gt;This became an important product boundary.&lt;/p&gt;

&lt;p&gt;A digital preview can communicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The date&lt;/li&gt;
&lt;li&gt;The general font direction&lt;/li&gt;
&lt;li&gt;Spacing preferences&lt;/li&gt;
&lt;li&gt;Separator style&lt;/li&gt;
&lt;li&gt;Horizontal or vertical layout&lt;/li&gt;
&lt;li&gt;Supporting visual details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it does not fully account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Body curvature&lt;/li&gt;
&lt;li&gt;Physical line thickness&lt;/li&gt;
&lt;li&gt;Skin movement&lt;/li&gt;
&lt;li&gt;Healing&lt;/li&gt;
&lt;li&gt;Long-term readability&lt;/li&gt;
&lt;li&gt;The tattoo artist’s technique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I stopped describing the output as a final tattoo design.&lt;/p&gt;

&lt;p&gt;The more accurate role is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A visual reference to discuss with a tattoo artist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The artist may still redraw the lettering, increase the spacing, simplify details, or change the size.&lt;/p&gt;

&lt;p&gt;That is not a failure of the generator. It is part of adapting a digital concept to skin.&lt;/p&gt;

&lt;h2&gt;
  
  
  I separated it from the general tattoo generator
&lt;/h2&gt;

&lt;p&gt;Originally, Roman numerals could have remained one option inside a larger AI tattoo tool.&lt;/p&gt;

&lt;p&gt;But the user intent was different.&lt;/p&gt;

&lt;p&gt;Someone searching for a Roman numeral tattoo usually already knows the core subject.&lt;/p&gt;

&lt;p&gt;They are not asking the system to invent a dragon, flower, or abstract concept.&lt;/p&gt;

&lt;p&gt;They need help with a narrower sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meaningful date
→ correct conversion
→ visual format
→ readable reference
→ artist discussion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That justified a dedicated page and workflow.&lt;/p&gt;

&lt;p&gt;It also made the interface simpler.&lt;/p&gt;

&lt;p&gt;The tool did not need every control from the general tattoo generator. It needed controls and explanations specifically related to dates and lettering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SEO lesson was similar
&lt;/h2&gt;

&lt;p&gt;At first, I treated several search terms as variations of the same keyword:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Roman numeral converter&lt;/li&gt;
&lt;li&gt;Roman numeral tattoo generator&lt;/li&gt;
&lt;li&gt;Roman numeral tattoo font&lt;/li&gt;
&lt;li&gt;Roman numeral date tattoo&lt;/li&gt;
&lt;li&gt;Roman numeral tattoo creator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the intent behind them is not identical.&lt;/p&gt;

&lt;p&gt;A generic converter answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What number does this become?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A tattoo-focused tool must also address:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should this date be presented?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Format&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;Spacing&lt;/li&gt;
&lt;li&gt;Readability&lt;/li&gt;
&lt;li&gt;Placement&lt;/li&gt;
&lt;li&gt;Verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most useful landing page is not the one that repeats “Roman numeral tattoo generator” the most.&lt;/p&gt;

&lt;p&gt;It is the one that resolves the decisions hidden inside that search.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product improved when it made fewer promises
&lt;/h2&gt;

&lt;p&gt;The earliest framing was close to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Generate a Roman numeral tattoo design.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds stronger, but it is also less accurate.&lt;/p&gt;

&lt;p&gt;The current framing is closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Convert a meaningful date, compare visual directions, and prepare a clearer reference for your tattoo artist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is less dramatic, but it reflects the real workflow better.&lt;/p&gt;

&lt;p&gt;It also avoids implying that a digital preview should be tattooed directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would build first now
&lt;/h2&gt;

&lt;p&gt;If I were rebuilding the feature from the beginning, I would prioritize:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An unambiguous date input&lt;/li&gt;
&lt;li&gt;Clear month-day-year and day-month-year handling&lt;/li&gt;
&lt;li&gt;Separate conversion of the month, day, and year&lt;/li&gt;
&lt;li&gt;Full-date and year-only comparisons&lt;/li&gt;
&lt;li&gt;Several simple separator formats&lt;/li&gt;
&lt;li&gt;Readability guidance&lt;/li&gt;
&lt;li&gt;A clear “visual reference, not final stencil” boundary&lt;/li&gt;
&lt;li&gt;A compact summary the user can discuss with an artist&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would not begin with dozens of decorative styles.&lt;/p&gt;

&lt;p&gt;Correctness and clarity are more valuable than visual variety when the output represents a permanent date.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;The code that converts a date into Roman numerals was the easiest part.&lt;/p&gt;

&lt;p&gt;The real product work was identifying all the decisions surrounding that conversion.&lt;/p&gt;

&lt;p&gt;This pattern appears in many small tools.&lt;/p&gt;

&lt;p&gt;A user may arrive asking for a simple output, but the useful product often needs to support the next decision as well.&lt;/p&gt;

&lt;p&gt;For this tool, the real workflow was not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date → Roman numerals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date
→ verified meaning
→ Roman numeral format
→ readable visual reference
→ tattoo artist adaptation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I eventually turned that workflow into a small &lt;a href="https://aimaketattoo.com/roman-numeral-tattoo-generator" rel="noopener noreferrer"&gt;Roman numeral tattoo generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The conversion still takes seconds.&lt;/p&gt;

&lt;p&gt;Understanding what the user actually needs around it took much longer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>seo</category>
      <category>product</category>
    </item>
    <item>
      <title>I Split One Tattoo Text Tool Into Three Different Workflows</title>
      <dc:creator>Warren</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:43:37 +0000</pubDate>
      <link>https://dev.to/warrenshi/i-split-one-tattoo-text-tool-into-three-different-workflows-2n25</link>
      <guid>https://dev.to/warrenshi/i-split-one-tattoo-text-tool-into-three-different-workflows-2n25</guid>
      <description>&lt;p&gt;At first, I assumed every tattoo text tool could share one simple workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enter text, choose a style, and preview the result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That assumption worked for an early version.&lt;/p&gt;

&lt;p&gt;It also created a product that was too broad.&lt;/p&gt;

&lt;p&gt;A person comparing fonts, a person planning a name tattoo, and a person asking AI to create custom lettering may all type words into a box, but they are not trying to complete the same task.&lt;/p&gt;

&lt;p&gt;Over time, I split the original idea into three workflows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tattoo font preview&lt;/li&gt;
&lt;li&gt;Name tattoo planning&lt;/li&gt;
&lt;li&gt;AI tattoo lettering composition&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interfaces still overlap, but the expected outputs are very different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 1: Previewing tattoo fonts
&lt;/h2&gt;

&lt;p&gt;The first user already knows what text they want.&lt;/p&gt;

&lt;p&gt;Their main questions are usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does this word look like in script?&lt;/li&gt;
&lt;li&gt;Is Old English too heavy?&lt;/li&gt;
&lt;li&gt;Will this date remain readable?&lt;/li&gt;
&lt;li&gt;Should I use serif, sans serif, or handwritten lettering?&lt;/li&gt;
&lt;li&gt;Can I download a simple preview?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not require AI generation.&lt;/p&gt;

&lt;p&gt;It needs a fast font workbench:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter the text&lt;/li&gt;
&lt;li&gt;Browse font categories&lt;/li&gt;
&lt;li&gt;Adjust the size&lt;/li&gt;
&lt;li&gt;Compare readable options&lt;/li&gt;
&lt;li&gt;Download a simple preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output is intentionally limited.&lt;/p&gt;

&lt;p&gt;It is a font reference, not a custom tattoo composition.&lt;/p&gt;

&lt;p&gt;That distinction matters because adding flowers, shadows, frames, symbols, and decorative flourishes would make the tool slower and less predictable for users who only want to compare letterforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 2: Planning a name tattoo
&lt;/h2&gt;

&lt;p&gt;A name tattoo sounds like a font problem, but it often becomes a structure problem.&lt;/p&gt;

&lt;p&gt;Different inputs behave differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A short first name&lt;/li&gt;
&lt;li&gt;Initials&lt;/li&gt;
&lt;li&gt;Two names joined by an ampersand&lt;/li&gt;
&lt;li&gt;A hyphenated name&lt;/li&gt;
&lt;li&gt;A name with a date&lt;/li&gt;
&lt;li&gt;A longer multi-word phrase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, &lt;code&gt;Mia&lt;/code&gt; can support expressive script lettering.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;A.B. 2014&lt;/code&gt; usually needs a more compact and structured direction.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Mia &amp;amp; Noah&lt;/code&gt; introduces balance between two names.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Anne-Marie&lt;/code&gt; should not be treated the same way as two separate words.&lt;/p&gt;

&lt;p&gt;The useful part of a dedicated name workflow is not showing every available font. It is helping the user decide what kind of lettering direction fits the structure of the name.&lt;/p&gt;

&lt;p&gt;That led me to build a focused &lt;a href="https://aimaketattoo.com/name-tattoo-generator" rel="noopener noreferrer"&gt;Name Tattoo Generator&lt;/a&gt; that classifies the input and recommends a smaller set of directions.&lt;/p&gt;

&lt;p&gt;It does not try to replace the full font browser.&lt;/p&gt;

&lt;p&gt;It acts as a planning entry point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 3: Generating custom tattoo lettering
&lt;/h2&gt;

&lt;p&gt;The third user wants something beyond a font preview.&lt;/p&gt;

&lt;p&gt;They may ask for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A name with flowers&lt;/li&gt;
&lt;li&gt;A date with ornamental framing&lt;/li&gt;
&lt;li&gt;Chicano lettering with soft shading&lt;/li&gt;
&lt;li&gt;A phrase with controlled flourishes&lt;/li&gt;
&lt;li&gt;Initials combined with symbols&lt;/li&gt;
&lt;li&gt;A memorial composition&lt;/li&gt;
&lt;li&gt;A custom arrangement rather than a plain text sample&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where AI generation becomes useful.&lt;/p&gt;

&lt;p&gt;It also introduces a difficult problem: the model must distinguish between text that must appear and visual instructions that must not appear as extra words.&lt;/p&gt;

&lt;p&gt;A user might enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Exact Text:
Amelia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supporting Details:
Soft shading, subtle drips, wider spacing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a clear boundary, the model may try to render parts of the supporting description as text.&lt;/p&gt;

&lt;p&gt;The interface therefore separates two fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exact Text
&lt;/h3&gt;

&lt;p&gt;The characters that must appear exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supporting Details
&lt;/h3&gt;

&lt;p&gt;Instructions about decoration, spacing, mood, shading, symbols, and composition.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://aimaketattoo.com/ai-tattoo-lettering-generator" rel="noopener noreferrer"&gt;AI Tattoo Lettering Generator&lt;/a&gt; then builds a visual reference while trying to preserve the exact text character by character.&lt;/p&gt;

&lt;p&gt;This is a different product job from choosing a font.&lt;/p&gt;

&lt;p&gt;The output is no longer a simple preview. It is a custom visual direction that can support a later discussion with a tattoo artist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search data exposed the overlap
&lt;/h2&gt;

&lt;p&gt;One reason I revisited the product structure was that search engines continued associating name, font, lettering, and text-related queries with the same broad font page.&lt;/p&gt;

&lt;p&gt;Queries such as these can look similar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tattoo font generator
name tattoo generator
tattoo lettering generator
tattoo text generator
tattoo name creator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the interfaces implied by those searches are not identical.&lt;/p&gt;

&lt;p&gt;A font generator should optimize for comparison.&lt;/p&gt;

&lt;p&gt;A name generator should optimize for guidance.&lt;/p&gt;

&lt;p&gt;An AI lettering generator should optimize for custom composition.&lt;/p&gt;

&lt;p&gt;Trying to make one page serve every variation can produce a page that mentions everything but performs no single task particularly well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting pages is not always the answer
&lt;/h2&gt;

&lt;p&gt;This does not mean every keyword deserves its own route.&lt;/p&gt;

&lt;p&gt;Creating separate pages for small wording differences would produce thin and repetitive content.&lt;/p&gt;

&lt;p&gt;The split only made sense because the three workflows had different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User intent&lt;/li&gt;
&lt;li&gt;Interface requirements&lt;/li&gt;
&lt;li&gt;Output formats&lt;/li&gt;
&lt;li&gt;Product boundaries&lt;/li&gt;
&lt;li&gt;Next actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test I now use is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would this user need a meaningfully different workflow, or only different wording?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the workflow is the same, it should probably remain one page.&lt;/p&gt;

&lt;p&gt;When the controls and expected result are genuinely different, a separate tool may be justified.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;Many products begin with a broad input box because it is the fastest way to ship.&lt;/p&gt;

&lt;p&gt;That is useful for testing.&lt;/p&gt;

&lt;p&gt;But one input box can hide several distinct jobs.&lt;/p&gt;

&lt;p&gt;The next stage is not always adding more options to the same screen. Sometimes it means removing options and creating clearer paths.&lt;/p&gt;

&lt;p&gt;In this case, the final structure became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Font preview
→ Compare letterforms

Name planning
→ Choose a suitable direction

AI lettering
→ Build a custom visual composition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tools are related, but they no longer pretend to be the same product.&lt;/p&gt;

&lt;p&gt;That separation has made the interfaces easier to explain, easier to maintain, and more honest about what each output can actually do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently next time
&lt;/h2&gt;

&lt;p&gt;I would still start with one broad workflow.&lt;/p&gt;

&lt;p&gt;It is often the fastest way to learn whether users care about the problem at all.&lt;/p&gt;

&lt;p&gt;But I would pay closer attention to where users begin asking for different outcomes.&lt;/p&gt;

&lt;p&gt;Some users want speed and predictability.&lt;/p&gt;

&lt;p&gt;Some want guidance.&lt;/p&gt;

&lt;p&gt;Some want a custom generated composition.&lt;/p&gt;

&lt;p&gt;Those differences should eventually appear in the interface.&lt;/p&gt;

&lt;p&gt;A broad MVP is useful for discovery.&lt;/p&gt;

&lt;p&gt;A clearer set of focused workflows is useful for growth.&lt;/p&gt;

&lt;p&gt;For AIMakeTattoo, the separation now looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the font workflow to compare letterforms&lt;/li&gt;
&lt;li&gt;Use the name workflow to narrow down a direction&lt;/li&gt;
&lt;li&gt;Use the AI lettering workflow to create a more customized visual reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next challenge is not adding more options.&lt;/p&gt;

&lt;p&gt;It is making each path easier to discover and making the handoff between them feel natural.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>product</category>
      <category>ai</category>
    </item>
    <item>
      <title>Google Indexed My Pages. Nobody Found Them.</title>
      <dc:creator>Warren</dc:creator>
      <pubDate>Tue, 09 Jun 2026 09:16:12 +0000</pubDate>
      <link>https://dev.to/warrenshi/google-indexed-my-pages-nobody-found-them-2h95</link>
      <guid>https://dev.to/warrenshi/google-indexed-my-pages-nobody-found-them-2h95</guid>
      <description>&lt;p&gt;A few weeks ago I thought I had a technical SEO problem.&lt;/p&gt;

&lt;p&gt;Pages weren't showing up.&lt;/p&gt;

&lt;p&gt;Search Console looked empty.&lt;/p&gt;

&lt;p&gt;So I spent a lot of time worrying about indexing.&lt;/p&gt;

&lt;p&gt;Then the pages finally got indexed.&lt;/p&gt;

&lt;p&gt;Nothing happened.&lt;/p&gt;

&lt;p&gt;That was the moment I realized indexing and understanding are completely different problems.&lt;/p&gt;

&lt;p&gt;I'm building a small browser-side utility.&lt;/p&gt;

&lt;p&gt;The product removes metadata from photos and documents.&lt;/p&gt;

&lt;p&gt;From a technical perspective the site was fine.&lt;/p&gt;

&lt;p&gt;Pages were crawlable.&lt;br&gt;
Sitemap was submitted.&lt;br&gt;
Search Console showed indexing progress.&lt;/p&gt;

&lt;p&gt;But search traffic still barely moved.&lt;/p&gt;

&lt;p&gt;At first I thought Google needed more time.&lt;/p&gt;

&lt;p&gt;Then I started looking at the queries that actually appeared.&lt;/p&gt;

&lt;p&gt;Something interesting showed up.&lt;/p&gt;

&lt;p&gt;Users searched for things like:&lt;/p&gt;

&lt;p&gt;"remove location from photo"&lt;/p&gt;

&lt;p&gt;"remove gps from image"&lt;/p&gt;

&lt;p&gt;"remove author from pdf"&lt;/p&gt;

&lt;p&gt;Almost nobody searched for:&lt;/p&gt;

&lt;p&gt;"metadata processing"&lt;/p&gt;

&lt;p&gt;"metadata extraction"&lt;/p&gt;

&lt;p&gt;"browser-side metadata cleanup"&lt;/p&gt;

&lt;p&gt;Those were the phrases I had been using when describing the product.&lt;/p&gt;

&lt;p&gt;The product and the user were talking about the same thing.&lt;/p&gt;

&lt;p&gt;Just in completely different languages.&lt;/p&gt;

&lt;p&gt;That changed how I think about SEO.&lt;/p&gt;

&lt;p&gt;I used to assume:&lt;/p&gt;

&lt;p&gt;Indexing&lt;br&gt;
→ Ranking&lt;br&gt;
→ Traffic&lt;/p&gt;

&lt;p&gt;Now it feels more like:&lt;/p&gt;

&lt;p&gt;Indexing&lt;br&gt;
→ Understanding&lt;br&gt;
→ Ranking&lt;br&gt;
→ Traffic&lt;/p&gt;

&lt;p&gt;And the understanding step is surprisingly slow.&lt;/p&gt;

&lt;p&gt;Especially for small sites.&lt;/p&gt;

&lt;p&gt;The weird part is that AI makes this easier to miss.&lt;/p&gt;

&lt;p&gt;Building is cheaper than ever.&lt;/p&gt;

&lt;p&gt;Adding another page takes minutes.&lt;/p&gt;

&lt;p&gt;Adding another feature takes hours.&lt;/p&gt;

&lt;p&gt;Adding another tool feels almost free.&lt;/p&gt;

&lt;p&gt;So it's easy to create more things.&lt;/p&gt;

&lt;p&gt;But search engines still need to understand what those things are.&lt;/p&gt;

&lt;p&gt;Lately I've been spending less time building pages and more time trying to understand how users describe the problem in their own words.&lt;/p&gt;

&lt;p&gt;That has probably taught me more than any SEO guide I've read so far.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>AI makes building faster, but semantic distribution is now the hard part</title>
      <dc:creator>Warren</dc:creator>
      <pubDate>Thu, 21 May 2026 04:49:33 +0000</pubDate>
      <link>https://dev.to/warrenshi/ai-makes-building-faster-but-semantic-distribution-is-now-the-hard-part-3jc1</link>
      <guid>https://dev.to/warrenshi/ai-makes-building-faster-but-semantic-distribution-is-now-the-hard-part-3jc1</guid>
      <description>&lt;p&gt;Shipping products feels dramatically easier now.&lt;/p&gt;

&lt;p&gt;Between AI coding tools, templates, and browser-side tooling, I can build and deploy things faster than ever.&lt;/p&gt;

&lt;p&gt;But distribution feels harder.&lt;/p&gt;

&lt;p&gt;Not technically harder.&lt;/p&gt;

&lt;p&gt;Semantically harder.&lt;/p&gt;

&lt;p&gt;A lot of the work now is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding how users actually search&lt;/li&gt;
&lt;li&gt;matching workflows instead of technical terms&lt;/li&gt;
&lt;li&gt;figuring out where intent really exists&lt;/li&gt;
&lt;li&gt;building trust before distribution channels suppress you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building became compressed.&lt;/p&gt;

&lt;p&gt;Attention became fragmented.&lt;/p&gt;

&lt;p&gt;Honestly feels like distribution is becoming the real product skill now.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Most people search “remove location from photo”, not “EXIF”</title>
      <dc:creator>Warren</dc:creator>
      <pubDate>Fri, 15 May 2026 08:49:20 +0000</pubDate>
      <link>https://dev.to/warrenshi/most-people-search-remove-location-from-photo-not-exif-5186</link>
      <guid>https://dev.to/warrenshi/most-people-search-remove-location-from-photo-not-exif-5186</guid>
      <description>&lt;p&gt;Most people search “remove location from photo”, not “EXIF”&lt;/p&gt;

&lt;p&gt;While building a metadata removal workflow, I realized something interesting:&lt;/p&gt;

&lt;p&gt;Most people never search for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EXIF&lt;/li&gt;
&lt;li&gt;IPTC&lt;/li&gt;
&lt;li&gt;document properties&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They search for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“remove location from photo”&lt;/li&gt;
&lt;li&gt;“hidden info in PDF”&lt;/li&gt;
&lt;li&gt;“remove GPS from image”&lt;/li&gt;
&lt;li&gt;“does this file still contain private data?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical layer and the user intent layer are often completely different.&lt;/p&gt;

&lt;p&gt;Developers think in systems.&lt;/p&gt;

&lt;p&gt;Users think in outcomes.&lt;/p&gt;

&lt;p&gt;That changed how I started thinking about both SEO and product design.&lt;/p&gt;

&lt;p&gt;A lot of users are not trying to “inspect metadata”.&lt;/p&gt;

&lt;p&gt;They’re usually just at the moment before sharing something publicly and wondering:&lt;/p&gt;

&lt;p&gt;“wait… is there still something hidden in this file?”&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>metadata</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
