<?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: Ai_horizontis</title>
    <description>The latest articles on DEV Community by Ai_horizontis (@ai_horizontis).</description>
    <link>https://dev.to/ai_horizontis</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%2F4020113%2Ff2f264d3-278c-4fdf-926f-c39848187920.jpeg</url>
      <title>DEV Community: Ai_horizontis</title>
      <link>https://dev.to/ai_horizontis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ai_horizontis"/>
    <language>en</language>
    <item>
      <title>I Was Wrong About LLMs and Pixel Art: A Discovery</title>
      <dc:creator>Ai_horizontis</dc:creator>
      <pubDate>Tue, 07 Jul 2026 19:37:42 +0000</pubDate>
      <link>https://dev.to/ai_horizontis/i-was-wrong-about-llms-and-pixel-art-a-discovery-4o5c</link>
      <guid>https://dev.to/ai_horizontis/i-was-wrong-about-llms-and-pixel-art-a-discovery-4o5c</guid>
      <description>&lt;p&gt;Everyone generating AI pixel art uses diffusion models: Stable Diffusion with LoRAs, Midjourney, Scenario.com, Triko.ai. I did too. And the results were always the same: beautiful individual sprites, but completely broken tilesets. Colors that don't match between tiles. Edges that don't align. Palette drift across the sheet. Hours of manual cleanup.&lt;br&gt;
Then I accidentally discovered something that shouldn't work: large language models generating pixel art via HTML output.&lt;br&gt;
This shouldn't work. LLMs are text models. They don't "see" images. They predict tokens. Asking GPT-4o to draw a 32x32 stone wall pixel-by-pixel should produce garbage.&lt;br&gt;
It doesn't.&lt;/p&gt;

&lt;p&gt;An image I genereated is a complete sci-fi industrial tileset. 20+ tiles. Consistent palette. Tileable edges. Themed variations (walls, floors, pipes, control panels, debris, broken glass). Generated in a single shot. By GPT-4o. Via HTML.&lt;br&gt;
I tested the same prompt on Claude Sonnet 4.6 and Gemini Flash. Same quality. Same coherence. Three different model architectures, same result. This isn't a GPT-specific trick , it's a capability of modern LLMs that nobody seems to be using.&lt;br&gt;
The Problem with Diffusion for Pixel Art&lt;br&gt;
Diffusion models are trained on natural images. Even with pixel art LoRAs, they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't respect grid alignment  (pixels blur, anti-aliasing creeps in)&lt;/li&gt;
&lt;li&gt;Don't maintain palette consistency across multiple tiles in a sheet&lt;/li&gt;
&lt;li&gt;Can't do tileable edges: each tile is generated in isolation&lt;/li&gt;
&lt;li&gt;Produce "pixel-ish" art, not real pixel art with deliberate pixel placement
Scenario.com and Triko.ai solve this with custom-trained diffusion models and fine-tuned LoRAs. They charge $20-30/month. The results are good. But they require training data, GPU infrastructure, and a team of ML engineers.
What LLMs Do Differently
When you ask an LLM to generate pixel art via HTML, something interesting happens:&lt;/li&gt;
&lt;li&gt;The LLM understands structure semantically.It knows what a "wall corner" looks like conceptually. It knows what "tileable" means. It knows what "palette consistency" means. Diffusion models don't, they only know pixel patterns.&lt;/li&gt;
&lt;li&gt;The LLM plans the whole tileset. When you ask for 20 themed tiles, it generates them as a coherent set, not 20 independent sprites. The palette is shared. The style is shared. The edges align.&lt;/li&gt;
&lt;li&gt;HTML tables/divs enforce pixel-perfect output. Each cell is exactly 1 pixel. No anti-aliasing. No blur. Real pixel art.&lt;/li&gt;
&lt;li&gt;The LLM follows constraints. "Use 8 colors max", "32x32 tiles", "sci-fi industrial theme" are all respected. Diffusion models struggle with hard constraints.
The Prompt (Yes, I'm Sharing It)
This isn't a secret sauce, it’s just structured prompt engineering. Here's the exact prompt I used:
I need to obtain a PNG containing the tileset for creating the rooms and everything. Tile size: 32x32 pixels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 1: Search the web for how to make tilesets. Step 2: Generate the HTML code that produces a large PNG to import into Godot with all the tiles, each 32x32, organized thematically.&lt;/p&gt;

&lt;p&gt;Here are the tiles you must create, no exceptions, maximum attention. Maintaining the same style. Sci-fi / industrial / laboratory theme. Generate the HTML code to produce them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transition Pieces (for autotiling)

&lt;ul&gt;
&lt;li&gt;90° internal corners (concave)&lt;/li&gt;
&lt;li&gt;Wall terminations (cap pieces)&lt;/li&gt;
&lt;li&gt;T-junctions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Depth and variety tiles (backgrounds)

&lt;ul&gt;
&lt;li&gt;Ventilation duct block&lt;/li&gt;
&lt;li&gt;Exposed wiring block&lt;/li&gt;
&lt;li&gt;Control panel / terminal block&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gameplay mechanic tiles

&lt;ul&gt;
&lt;li&gt;Booster block (with inclined thruster)&lt;/li&gt;
&lt;li&gt;Kinetic battery housing&lt;/li&gt;
&lt;li&gt;Partially open bulkhead&lt;/li&gt;
&lt;li&gt;Plasma barrel support frame&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Decorative elements

&lt;ul&gt;
&lt;li&gt;Industrial debris block&lt;/li&gt;
&lt;li&gt;Broken glass variant&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wear variants (texture aging)

&lt;ul&gt;
&lt;li&gt;Heavy rust wall variant&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Maintain the same style and palette throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;If you  an indie developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You can generate complete tilesets in 2 minutes&lt;/strong&gt; instead of drawing them for 8 hours&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost is $0&lt;/strong&gt; with free-tier API access (GPT-4o, Claude, Gemini all have free tiers)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality is professional&lt;/strong&gt; : I've shown these to pixel artists and they couldn't tell it was AI-generated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tileability is native&lt;/strong&gt; : edges align perfectly because the LLM plans the whole sheet&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're an AI researcher:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;This is a capability of LLMs that's underexplored.&lt;/strong&gt; The image generation community is fixated on diffusion. LLMs as pixel art generators is a different paradigm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It works across model families.&lt;/strong&gt; GPT-4o, Claude, Gemini, GLM-4.6 — all produce similar quality. This suggests it's an emergent capability of large language models, not a quirk of one model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The constraint-following is the key.&lt;/strong&gt; Hard constraints (palette, grid, tile size) are where LLMs beat diffusion.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open ChatGPT, Claude, or Gemini (any modern LLM with web access)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste the prompt above&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace the theme with whatever you need (fantasy dungeon, cyberpunk city, medieval village)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the HTML output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Render it in a browser and screenshot, or use html2canvas to export as PNG&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import into Godot/Unity/GameMaker as a tileset&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total time: 5 minutes. Total cost: $0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Questions
&lt;/h2&gt;

&lt;p&gt;I don't have all the answers. Some things I'm still not completely sure about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Animation frames&lt;/strong&gt;: can LLMs generate consistent sprite sheets with walk/idle/attack cycles?  No&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Larger tile sizes&lt;/strong&gt;: does this work at 64x64? 128x128? Yes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Style transfer&lt;/strong&gt;: can you give an LLM a reference image and ask it to match the style? Yes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Character sprites&lt;/strong&gt;: does this work for characters, or only environmental tiles? It works better for enviroment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you experiment, share your results. I'm curious what the community finds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;We've been so focused on diffusion models for AI art that we've missed what LLMs can do. They're not just text generators. They're structured output generators. And pixel art is, fundamentally, structured output: a grid of colored cells with semantic meaning.&lt;/p&gt;

&lt;p&gt;Maybe the future of AI pixel art isn't better diffusion models. Maybe it's better prompts.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm sharing this openly because I think the indie game dev community deserves free, high-quality asset generation. If you found this useful, follow me on &lt;a href="https://x.com/Ai_horizontis" rel="noopener noreferrer"&gt;https://x.com/Ai_horizontis&lt;/a&gt; for more AI experiments. I'll be posting more discoveries as I explore them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4lmyrrzb7z4yf669byf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4lmyrrzb7z4yf669byf.png" alt=" " width="256" height="128"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rnpyq1yrqim5cgvuvpe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rnpyq1yrqim5cgvuvpe.jpeg" alt=" " width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
