<?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: shi warren</title>
    <description>The latest articles on DEV Community by shi warren (@shi_warren_01ffb98ae5d415).</description>
    <link>https://dev.to/shi_warren_01ffb98ae5d415</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: shi warren</title>
      <link>https://dev.to/shi_warren_01ffb98ae5d415</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shi_warren_01ffb98ae5d415"/>
    <language>en</language>
    <item>
      <title>AI image generation is easy. Building the handoff layer is harder.</title>
      <dc:creator>shi warren</dc:creator>
      <pubDate>Wed, 17 Jun 2026 12:05:35 +0000</pubDate>
      <link>https://dev.to/shi_warren_01ffb98ae5d415/ai-image-generation-is-easy-building-the-handoff-layer-is-harder-16p0</link>
      <guid>https://dev.to/shi_warren_01ffb98ae5d415/ai-image-generation-is-easy-building-the-handoff-layer-is-harder-16p0</guid>
      <description>&lt;p&gt;AI image generation is easy. Building the handoff layer is harder.&lt;/p&gt;

&lt;p&gt;A few days ago, I launched and continued testing a small AI tattoo idea tool.&lt;/p&gt;

&lt;p&gt;At first, I thought the main challenge would be image quality.&lt;/p&gt;

&lt;p&gt;Can the model generate something that looks good?&lt;/p&gt;

&lt;p&gt;Can it follow the selected style?&lt;/p&gt;

&lt;p&gt;Can it produce a clean result?&lt;/p&gt;

&lt;p&gt;Those things matter, but after testing more real workflows, I realized they are only part of the product.&lt;/p&gt;

&lt;p&gt;The harder problem is this:&lt;/p&gt;

&lt;p&gt;An AI image is not automatically useful just because it looks interesting.&lt;/p&gt;

&lt;p&gt;For this project, I did not want the tool to simply generate an image and stop there.&lt;/p&gt;

&lt;p&gt;A tattoo image can be useful in different ways. Some users may save it as a strong direction. Some may bring it to an artist. Some may use it only to compare styles, placement, or lettering ideas.&lt;/p&gt;

&lt;p&gt;So the product question became less about:&lt;/p&gt;

&lt;p&gt;“Is this the final design?”&lt;/p&gt;

&lt;p&gt;And more about:&lt;/p&gt;

&lt;p&gt;“What does this output help the user decide next?”&lt;/p&gt;

&lt;p&gt;That distinction changed how I looked at almost every part of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The image is not the end of the workflow
&lt;/h2&gt;

&lt;p&gt;A user does not just need an image.&lt;/p&gt;

&lt;p&gt;They need something they can bring into a decision.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;What is the core idea?&lt;/li&gt;
&lt;li&gt;What style direction does it suggest?&lt;/li&gt;
&lt;li&gt;Is the design too detailed for the intended size?&lt;/li&gt;
&lt;li&gt;Does the lettering stay readable?&lt;/li&gt;
&lt;li&gt;What should be adjusted before it becomes a real tattoo?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A generated image alone does not always answer those questions.&lt;/p&gt;

&lt;p&gt;So I added a small “copy brief” action after generation.&lt;/p&gt;

&lt;p&gt;Instead of only downloading or sharing the image, users can copy a short artist-facing brief. It includes the original idea, the selected style direction, the detail level, the composition direction, and notes about what may need to be refined.&lt;/p&gt;

&lt;p&gt;The important part is that this brief is not an AI prompt.&lt;/p&gt;

&lt;p&gt;It is not a long disclaimer either.&lt;/p&gt;

&lt;p&gt;It is meant to be a handoff note.&lt;/p&gt;

&lt;p&gt;That felt like a small feature, but it made the tool feel much closer to a real workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interface language changes the mental model
&lt;/h2&gt;

&lt;p&gt;Another thing I noticed was that the wording of the interface changed how people used the tool.&lt;/p&gt;

&lt;p&gt;For the tattoo lettering tool, the first version had one mixed input field. A user might type the exact words they wanted, but also add instructions like “with soft shading” or “no extra words”.&lt;/p&gt;

&lt;p&gt;That sounds simple, but for image models it creates ambiguity.&lt;/p&gt;

&lt;p&gt;Which part is the text to render?&lt;/p&gt;

&lt;p&gt;Which part is only visual direction?&lt;/p&gt;

&lt;p&gt;So I split the lettering workflow into two fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact Text&lt;/strong&gt; — the words that should appear in the lettering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporting Details&lt;/strong&gt; — optional visual direction like shading, spacing, ornaments, or underline flourishes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That small change made the product clearer.&lt;/p&gt;

&lt;p&gt;The user is no longer writing a generic AI prompt. They are deciding what text they might use, and then adding visual guidance around it.&lt;/p&gt;

&lt;p&gt;It also made the internal prompt safer. The model now gets a clearer instruction: render the exact text once, and treat supporting details as visual direction, not words to draw.&lt;/p&gt;

&lt;p&gt;This is something I keep running into with AI tools.&lt;/p&gt;

&lt;p&gt;The internal model language is often not the same as the user’s workflow language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lettering has different failure modes than general image generation
&lt;/h2&gt;

&lt;p&gt;Tattoo lettering made this especially obvious.&lt;/p&gt;

&lt;p&gt;For a general tattoo concept, a little variation can be acceptable. If someone asks for a wolf and moon reference, the exact curve of the moon or the exact shape of the fur may vary, and the image can still be useful as a direction.&lt;/p&gt;

&lt;p&gt;Lettering is different.&lt;/p&gt;

&lt;p&gt;If the user enters a name, date, initials, Roman numerals, or a short quote, the text has to stay readable. It also has to avoid adding extra words.&lt;/p&gt;

&lt;p&gt;One test with a short numeric input showed this clearly.&lt;/p&gt;

&lt;p&gt;The model followed the instruction to render only the exact text, but it repeated the same text multiple times in a stacked layout.&lt;/p&gt;

&lt;p&gt;Technically, it did not add unrelated words.&lt;/p&gt;

&lt;p&gt;But it was still wrong for the product.&lt;/p&gt;

&lt;p&gt;That led to another prompt constraint: render the exact text once as one lettering design. Do not repeat, tile, stack, or turn it into a typography sample sheet.&lt;/p&gt;

&lt;p&gt;This was a useful reminder that constraints need to match the actual user expectation, not just the literal prompt.&lt;/p&gt;

&lt;p&gt;“Only draw this text” is not the same as “draw this text once as a usable lettering direction.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Not every user needs AI generation immediately
&lt;/h2&gt;

&lt;p&gt;Another useful lesson came from the free tattoo font preview page.&lt;/p&gt;

&lt;p&gt;Some users are not ready to generate a custom AI lettering image. They just want to type a name, date, initials, or a short quote and compare how it might feel in different tattoo-style fonts.&lt;/p&gt;

&lt;p&gt;That is a different workflow.&lt;/p&gt;

&lt;p&gt;So I kept the Tattoo Font Generator separate from the AI lettering tool.&lt;/p&gt;

&lt;p&gt;The free page is now more of an instant preview and export tool: users can compare font directions, copy the text, and download a simple PNG preview.&lt;/p&gt;

&lt;p&gt;The AI lettering tool is for the next step, when someone wants custom composition, shading, ornaments, layout, or supporting details.&lt;/p&gt;

&lt;p&gt;That separation matters.&lt;/p&gt;

&lt;p&gt;If every page becomes an AI generator, the product becomes harder to understand. Sometimes the better entry point is a simple browser-side preview tool that helps the user make an earlier decision.&lt;/p&gt;

&lt;p&gt;For this project, the free font preview is not a weaker version of the AI lettering generator.&lt;/p&gt;

&lt;p&gt;It is the previous step in the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model choice can change the product category
&lt;/h2&gt;

&lt;p&gt;One of the most useful issues came from a real user prompt.&lt;/p&gt;

&lt;p&gt;They tried an idea similar to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Albanian eagle with a background of national hero&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fine line version looked closer to a clean tattoo direction.&lt;/p&gt;

&lt;p&gt;The realism version, however, drifted into a dark poster-like image with a cinematic background.&lt;/p&gt;

&lt;p&gt;The prompt already asked for a standalone tattoo-style image on a plain white background, but the model still leaned toward a realistic illustration scene.&lt;/p&gt;

&lt;p&gt;That was a useful failure.&lt;/p&gt;

&lt;p&gt;For this product, “realism” does not mean “photorealistic poster”.&lt;/p&gt;

&lt;p&gt;It means a realistic tattoo-style direction that still works as something a person can evaluate, save, and bring into the next step.&lt;/p&gt;

&lt;p&gt;I changed the realism route away from the model that produced more cinematic images and toward one that produced cleaner, more design-like outputs. The results became less dramatic, but much closer to the actual product goal.&lt;/p&gt;

&lt;p&gt;That tradeoff was worth it.&lt;/p&gt;

&lt;p&gt;A better-looking image is not always the better product output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints are part of the product
&lt;/h2&gt;

&lt;p&gt;With AI image tools, it is tempting to think more freedom is always better.&lt;/p&gt;

&lt;p&gt;But for this use case, constraints are what make the output useful.&lt;/p&gt;

&lt;p&gt;The tool should avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;body mockups&lt;/li&gt;
&lt;li&gt;skin previews&lt;/li&gt;
&lt;li&gt;dark poster backgrounds&lt;/li&gt;
&lt;li&gt;accidental extra symbols&lt;/li&gt;
&lt;li&gt;misleading final-stencil claims&lt;/li&gt;
&lt;li&gt;exact copies of copyrighted characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those constraints make the output less flashy, but more useful for the intended workflow.&lt;/p&gt;

&lt;p&gt;A tattoo-style image can help someone explore a direction, but the final tattoo still needs human judgment around placement, size, readability, and technique.&lt;/p&gt;

&lt;p&gt;This also made me add clearer wording around pop culture and copyrighted characters. If someone enters an IP-based idea, the tool should create an original tattoo-inspired direction, not an exact copy of a protected character.&lt;/p&gt;

&lt;p&gt;That boundary matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product is not just generation
&lt;/h2&gt;

&lt;p&gt;The biggest takeaway so far:&lt;/p&gt;

&lt;p&gt;The hard part of an AI image product is not always generating the image.&lt;/p&gt;

&lt;p&gt;The hard part is deciding what the image is supposed to help with next.&lt;/p&gt;

&lt;p&gt;For this project, the useful path is something like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea → visual direction → comparison → handoff → refinement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That means the product needs more than a generate button.&lt;/p&gt;

&lt;p&gt;It needs context, boundaries, readability guidance, style framing, export actions, and a better handoff layer.&lt;/p&gt;

&lt;p&gt;I am still early, but the launch feedback changed what I am optimizing for.&lt;/p&gt;

&lt;p&gt;Not just better images.&lt;/p&gt;

&lt;p&gt;Better decisions after the image.&lt;/p&gt;

&lt;p&gt;I recently launched this as a small project called AIMakeTattoo.&lt;/p&gt;

&lt;p&gt;The project is here if anyone is curious: &lt;a href="https://aimaketattoo.com" rel="noopener noreferrer"&gt;https://aimaketattoo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d be interested to hear how other people think about the handoff layer in AI tools, especially when the output needs to become part of a real-world workflow before it is used.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>indiehackers</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Google Indexed My Pages. Nobody Found Them.</title>
      <dc:creator>shi warren</dc:creator>
      <pubDate>Tue, 09 Jun 2026 09:16:12 +0000</pubDate>
      <link>https://dev.to/shi_warren_01ffb98ae5d415/google-indexed-my-pages-nobody-found-them-2h95</link>
      <guid>https://dev.to/shi_warren_01ffb98ae5d415/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>shi warren</dc:creator>
      <pubDate>Thu, 21 May 2026 04:49:33 +0000</pubDate>
      <link>https://dev.to/shi_warren_01ffb98ae5d415/ai-makes-building-faster-but-semantic-distribution-is-now-the-hard-part-3jc1</link>
      <guid>https://dev.to/shi_warren_01ffb98ae5d415/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>shi warren</dc:creator>
      <pubDate>Fri, 15 May 2026 08:49:20 +0000</pubDate>
      <link>https://dev.to/shi_warren_01ffb98ae5d415/most-people-search-remove-location-from-photo-not-exif-5186</link>
      <guid>https://dev.to/shi_warren_01ffb98ae5d415/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>
    <item>
      <title>Your photos may still contain GPS metadata after editing</title>
      <dc:creator>shi warren</dc:creator>
      <pubDate>Sat, 09 May 2026 17:09:15 +0000</pubDate>
      <link>https://dev.to/shi_warren_01ffb98ae5d415/your-photos-may-still-contain-gps-metadata-after-editing-242b</link>
      <guid>https://dev.to/shi_warren_01ffb98ae5d415/your-photos-may-still-contain-gps-metadata-after-editing-242b</guid>
      <description>&lt;p&gt;A lot of people assume cropping, resizing, or screenshotting a photo removes hidden information.&lt;/p&gt;

&lt;p&gt;That’s often not true.&lt;/p&gt;

&lt;p&gt;Many images still contain metadata like:&lt;/p&gt;

&lt;p&gt;GPS location&lt;br&gt;
device information&lt;br&gt;
timestamps&lt;br&gt;
camera details&lt;br&gt;
EXIF data&lt;/p&gt;

&lt;p&gt;In some cases that can unintentionally expose:&lt;/p&gt;

&lt;p&gt;where a photo was taken&lt;br&gt;
what device was used&lt;br&gt;
when it was captured&lt;/p&gt;

&lt;p&gt;I started noticing this more while working with:&lt;/p&gt;

&lt;p&gt;screenshots&lt;br&gt;
AI-generated images&lt;br&gt;
product demos&lt;br&gt;
travel photos&lt;br&gt;
shared work files&lt;/p&gt;

&lt;p&gt;One thing that surprised me is how many people don’t realize metadata exists until they accidentally leak something.&lt;/p&gt;

&lt;p&gt;Privacy tooling on the internet still feels mostly reactive instead of preventative.&lt;/p&gt;

&lt;p&gt;I think lightweight browser-side privacy workflows will become much more important as AI-generated and shared content keeps increasing.&lt;/p&gt;

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