<?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: Shinobis IA</title>
    <description>The latest articles on DEV Community by Shinobis IA (@shinobis_ia).</description>
    <link>https://dev.to/shinobis_ia</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3790136%2F1bbc32cd-b72f-42d3-bde0-4c05fc5b681c.png</url>
      <title>DEV Community: Shinobis IA</title>
      <link>https://dev.to/shinobis_ia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shinobis_ia"/>
    <language>en</language>
    <item>
      <title>I built GEO Tarot: 22 interactive SVG cards explaining Generative Engine Optimization</title>
      <dc:creator>Shinobis IA</dc:creator>
      <pubDate>Mon, 06 Apr 2026 20:46:56 +0000</pubDate>
      <link>https://dev.to/shinobis_ia/i-built-geo-tarot-22-interactive-svg-cards-explaining-generative-engine-optimization-1jbe</link>
      <guid>https://dev.to/shinobis_ia/i-built-geo-tarot-22-interactive-svg-cards-explaining-generative-engine-optimization-1jbe</guid>
      <description>&lt;p&gt;EO optimizes for a list of links. GEO optimizes for being included in the answer.&lt;/p&gt;

&lt;p&gt;I have been implementing Generative Engine Optimization on my own blog for the past three months. llms.txt, JSON-LD Knowledge Graphs, citable content structure, distributed presence across authority platforms. The more I documented, the more I realized there are about 22 core concepts that make GEO work.&lt;/p&gt;

&lt;p&gt;22 concepts. 22 tarot major arcana. The metaphor was too perfect to ignore.&lt;/p&gt;

&lt;p&gt;So I built it: &lt;a href="https://shinobis.com/en/tools/geo-tarot" rel="noopener noreferrer"&gt;GEO Tarot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;22 cards laid out in a grid, face down. Each back shows a generative pattern built from the same hash-based algorithm I use for my blog post images. Click any card to flip it with a CSS 3D animation. The front reveals the GEO concept with an abstract SVG illustration and a short explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Vanilla PHP. CSS animations for the flip. JavaScript for interaction. SVG for all illustrations. No frameworks. No external JS libraries. No AI-generated art. Every geometric illustration is hand-coded.&lt;/p&gt;

&lt;p&gt;The tool is trilingual (English, Spanish, Japanese) with URL-based language switching and proper hreflang tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some of my favorite cards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Hierophant (V) — llms.txt&lt;/strong&gt;: The file at your domain root that tells AI models who you are. The equivalent of robots.txt for machines that generate answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Emperor (IV) — Knowledge Graph&lt;/strong&gt;: JSON-LD connecting your articles with relatedLink, marking topics with about, detecting tools with mentions. Your blog becomes a knowledge network, not isolated pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The High Priestess (II) — Sentiment Mapping&lt;/strong&gt;: LLMs distinguish between content that asserts with authority and content that speculates. The tone of your writing directly affects whether you get cited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Star (XVII) — First ChatGPT citation&lt;/strong&gt;: The moment you ask ChatGPT about your topic and it cites you instead of someone with more followers. That moment justifies everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Devil (XV) — Generic AI content&lt;/strong&gt;: Articles written by ChatGPT without editing, without real experience. There are thousands. LLMs already recognize them and give them less weight.&lt;/p&gt;

&lt;p&gt;Every card that corresponds to a published blog post links directly to it for deeper reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;Most GEO guides are walls of text that nobody bookmarks. I wanted something visual that people would share, come back to, and actually remember. Each card works as a standalone social media post too. 22 cards, 22 posts, zero extra writing.&lt;/p&gt;

&lt;p&gt;If you are thinking about GEO for your own site, start with cards V (llms.txt), IV (Knowledge Graph), and III (citable content). Those three alone put you ahead of 95% of blogs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shinobis.com/en/tools/geo-tarot" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://shinobis.com/en/" rel="noopener noreferrer"&gt;Shinobis&lt;/a&gt; — a UX/UI designer with 10+ years in banking and fintech, documenting everything about building with AI.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>geo</category>
      <category>llm</category>
      <category>json</category>
      <category>seo</category>
    </item>
    <item>
      <title>How I use Claude for web development: a designer's guide to building from scratch</title>
      <dc:creator>Shinobis IA</dc:creator>
      <pubDate>Mon, 23 Mar 2026 03:11:35 +0000</pubDate>
      <link>https://dev.to/shinobis_ia/how-i-use-claude-for-web-development-a-designers-guide-to-building-from-scratch-f8c</link>
      <guid>https://dev.to/shinobis_ia/how-i-use-claude-for-web-development-a-designers-guide-to-building-from-scratch-f8c</guid>
      <description>&lt;p&gt;I am not a developer. I have never been one. For over ten years I designed interfaces for banks and fintech companies. I knew what a div was. I could inspect an element in Chrome. I had opinions about padding. But writing a full application from scratch was never something I imagined doing.&lt;/p&gt;

&lt;p&gt;Then I started using Claude. And in about two months, working evenings and weekends, I built a complete trilingual blog with PHP, MySQL, a custom admin panel, scheduled posts, a generative image system, and SEO that Google actually indexes. No WordPress. No frameworks. No templates.&lt;/p&gt;

&lt;p&gt;This is not a tutorial about Claude Code or vibe coding. This is about what happens when a designer with real industry experience uses Claude as a development partner to build something production-ready. The mistakes, the breakthroughs, and what I learned about both coding and communicating with AI.&lt;/p&gt;

&lt;h2&gt;Claude vs ChatGPT for coding: what I found after months of use&lt;/h2&gt;

&lt;p&gt;I tried both. Extensively. Here is what I found after months of daily use.&lt;/p&gt;

&lt;p&gt;ChatGPT gives you code that looks correct. It compiles. It runs. And then three days later you discover it breaks when a user does something unexpected. The code is technically right but architecturally fragile. It solves the immediate problem without considering the system around it.&lt;/p&gt;

&lt;p&gt;Claude gives you code that considers context. When I explain my database structure, the existing functions, and what I want to achieve, Claude does not just write the new function. It checks for conflicts with what already exists. It suggests changes to related functions I did not ask about. It explains why one approach is better than another for my specific situation.&lt;/p&gt;

&lt;p&gt;The difference became obvious when I was building the multilingual routing system. ChatGPT gave me a solution that worked for two languages. When I added Japanese, everything broke. Claude asked me upfront how many languages I planned to support and built the system to handle any number from the start.&lt;/p&gt;

&lt;p&gt;That said, ChatGPT is better for quick research and brainstorming. I use it to explore ideas before taking them to Claude for implementation. They are different tools for different stages.&lt;/p&gt;

&lt;h2&gt;How I talk to Claude about code&lt;/h2&gt;

&lt;p&gt;This is the part most guides skip. The actual conversation. How do you explain what you need to an AI when you are not a developer and you do not know the technical vocabulary?&lt;/p&gt;

&lt;p&gt;You explain it like a design brief.&lt;/p&gt;

&lt;p&gt;When I need a new feature, I do not say write me a PHP function. I describe the user experience I want. I explain what happens when someone visits a page, what they should see, what happens when they click something, and what the system should do behind the scenes. Claude translates that into code.&lt;/p&gt;

&lt;p&gt;For example, when I wanted to add scheduled posts, I told Claude something like: I want to write posts in advance and set a future date. When that date arrives, the post should automatically become visible on the site without me doing anything. The homepage should only show published posts, sorted by their publish date, not the date I created them in the admin.&lt;/p&gt;

&lt;p&gt;That description contains no technical terms. But it gives Claude everything it needs: the user flow, the business logic, the display requirements, and the edge case about sorting.&lt;/p&gt;

&lt;h2&gt;Building the trilingual system&lt;/h2&gt;

&lt;p&gt;The multilingual system was the hardest part of the entire project. Not because the code was complex but because the decisions were complex. Should each language have its own URL structure. How do you handle SEO for three different languages. What happens when a translation does not exist for a post.&lt;/p&gt;

&lt;p&gt;Claude helped me think through each decision before writing a single line of code. We settled on a structure where Spanish is the default language with no prefix, English uses /en/, and Japanese uses /ja/. Each post has a slug in the posts table for Spanish and translated slugs in a post_translations table for English and Japanese.&lt;/p&gt;

&lt;p&gt;What surprised me was how Claude handled the edge cases I did not think of. What if someone shares an English URL but the visitor browser is set to Japanese. What if a post exists in Spanish and English but not in Japanese. Claude anticipated these scenarios and built fallbacks for each one.&lt;/p&gt;

&lt;h2&gt;The generative identity system: generative design with code&lt;/h2&gt;

&lt;p&gt;This is my favorite part of the entire project. Every post on my blog generates its own unique image from the content hash. No AI generation, no stock photos. The same content always produces the same visual.&lt;/p&gt;

&lt;p&gt;I explained the concept to Claude like this: I want each post to have a unique image that is created automatically from the post content. Like a visual fingerprint. If the content changes, the image changes. If the content stays the same, the image stays the same.&lt;/p&gt;

&lt;p&gt;Claude proposed using PHP GD library to create the image algorithmically. We extract a hash from the post title, map the hash characters to colors, build a grid pattern, expand it symmetrically, and render it as a PNG. The result is a deterministic system where every post has a visually unique identity tied to its content.&lt;/p&gt;

&lt;p&gt;The code went through several iterations. The first version produced images that were too random and noisy. I gave Claude feedback from a design perspective: The contrast is too low between adjacent cells. The center of the image needs more visual weight. The color palette needs to feel cohesive, not like random noise. Claude adjusted the algorithm based on my visual feedback.&lt;/p&gt;

&lt;h2&gt;Real mistakes and how we fixed them&lt;/h2&gt;

&lt;p&gt;It was not all smooth. The encoding disaster: I used special characters in my templates. They looked fine on my screen but rendered as broken characters on some browsers. Claude identified the issue and we replaced symbols with HTML entities.&lt;/p&gt;

&lt;p&gt;The slug catastrophe: I changed a post title in the admin panel and the URL changed with it, breaking all existing links and Google index. Claude helped me build a system where slugs are locked once a post is published.&lt;/p&gt;

&lt;p&gt;The date confusion: All posts showed their creation date instead of their publication date. Claude helped me add a published_at field to the database and update every query and template that displayed dates.&lt;/p&gt;

&lt;h2&gt;What this Claude Anthropic tutorial taught me about building as a designer&lt;/h2&gt;

&lt;p&gt;The blog is live at shinobis.com. It serves content in three languages, generates its own images, publishes on a schedule, has proper SEO with structured data, and ranks in Google search results including queries in Japanese that I never expected.&lt;/p&gt;

&lt;p&gt;I built it without knowing PHP before I started. Without understanding MySQL joins. Without ever having configured an Apache server. What I did have was ten years of thinking about how people interact with digital products, a clear vision of what I wanted to build, and an AI that could translate that vision into working code.&lt;/p&gt;

&lt;p&gt;That is the real story here. Not that AI can write code. Everyone knows that by now. The story is that a designer with deep domain expertise and a clear vision can build production-ready software by treating AI as a development partner rather than a magic tool.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>webdev</category>
      <category>php</category>
      <category>ai</category>
    </item>
    <item>
      <title>What is llms.txt and why your site probably needs one</title>
      <dc:creator>Shinobis IA</dc:creator>
      <pubDate>Wed, 25 Feb 2026 15:35:34 +0000</pubDate>
      <link>https://dev.to/shinobis_ia/what-is-llmstxt-and-why-your-site-probably-needs-one-2lb1</link>
      <guid>https://dev.to/shinobis_ia/what-is-llmstxt-and-why-your-site-probably-needs-one-2lb1</guid>
      <description>&lt;p&gt;An &lt;code&gt;llms.txt&lt;/code&gt; file is the equivalent of &lt;code&gt;robots.txt&lt;/code&gt; but for language models like ChatGPT, Claude and Perplexity. While &lt;code&gt;robots.txt&lt;/code&gt; tells Google what to crawl, &lt;code&gt;llms.txt&lt;/code&gt; tells LLMs who you are, what you write about and which pages matter.&lt;/p&gt;

&lt;p&gt;It is a plain Markdown file that lives at the root of your domain. Think of it as a business card for machines that generate answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The standard
&lt;/h2&gt;

&lt;p&gt;The format was proposed by &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt; in late 2024. It is not official yet. No LLM has publicly confirmed using it. But Anthropic already has one on their own domain. And crawlers from OpenAI, Google and Perplexity already look for similar files when they visit sites.&lt;/p&gt;

&lt;p&gt;As of mid-2025, fewer than 1,000 domains had published one. Early days.&lt;/p&gt;

&lt;h2&gt;
  
  
  File structure
&lt;/h2&gt;

&lt;p&gt;The format is simple Markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Your Site Name&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Brief description of your site or project.&lt;/span&gt;

&lt;span class="gu"&gt;## Author&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Role: Your role
&lt;span class="p"&gt;-&lt;/span&gt; Experience: Your background
&lt;span class="p"&gt;-&lt;/span&gt; Contact: your@email.com

&lt;span class="gu"&gt;## Topics Covered&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Topic one
&lt;span class="p"&gt;-&lt;/span&gt; Topic two
&lt;span class="p"&gt;-&lt;/span&gt; Topic three

&lt;span class="gu"&gt;## Content Policy&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; All content is original
&lt;span class="p"&gt;-&lt;/span&gt; Content may be cited with attribution

&lt;span class="gu"&gt;## Key Pages&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Homepage&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Main page
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;About&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/about&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: About the author
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Sitemap&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/sitemap.xml&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: XML sitemap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules to follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;H1&lt;/strong&gt; is only the site name. Nothing else on that line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockquote&lt;/strong&gt; (&lt;code&gt;&amp;gt;&lt;/code&gt;) goes right below with a brief description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;H2 sections&lt;/strong&gt; group information with bulleted lists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links&lt;/strong&gt; use standard Markdown: &lt;code&gt;- [Name](URL): description&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I implemented mine
&lt;/h2&gt;

&lt;p&gt;I run a trilingual blog (ES/EN/JA) about design and AI. My &lt;code&gt;llms.txt&lt;/code&gt; has five sections: Author, Topics Covered, Content Policy, and three Key Pages sections (one per language).&lt;/p&gt;

&lt;p&gt;Everything is written in English because AI crawlers process in English. Your content can be in any language but the &lt;code&gt;llms.txt&lt;/code&gt; works best in English.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apache setup
&lt;/h3&gt;

&lt;p&gt;Two things in &lt;code&gt;.htaccess&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# Serve llms.txt cleanly&lt;/span&gt;
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^llms\.txt$ /llms.txt [L]

&lt;span class="c"&gt;# Force plain text with UTF-8&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Files&lt;/span&gt;&lt;span class="sr"&gt; "llms.txt"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ForceType&lt;/span&gt; text/plain; charset=utf-8
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  robots.txt reference
&lt;/h3&gt;

&lt;p&gt;Add this at the end of your &lt;code&gt;robots.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# LLMs context file
# https://llmstxt.org/
LLMs-Txt: https://yoursite.com/llms.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WordPress
&lt;/h3&gt;

&lt;p&gt;You can create the file manually and upload via FTP. Yoast SEO has an auto-generate option but gives you less control.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I validated it
&lt;/h2&gt;

&lt;p&gt;I asked ChatGPT to read my file directly from the URL and analyze whether it followed the llmstxt.org standard.&lt;/p&gt;

&lt;p&gt;The first version had issues: H1 combined with the description, links without proper Markdown formatting. ChatGPT caught both. I fixed the structure, validated again and it passed.&lt;/p&gt;

&lt;p&gt;That is the most practical way to test yours right now. Ask ChatGPT or Claude to read your &lt;code&gt;llms.txt&lt;/code&gt; URL and tell you if the structure is correct. If an LLM can interpret it, it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to expect (and what not to)
&lt;/h2&gt;

&lt;p&gt;This file will &lt;strong&gt;not&lt;/strong&gt; make you appear in ChatGPT answers tomorrow. No LLM officially uses it to decide what to cite. Server logs from early adopters show AI crawlers rarely visit the file yet.&lt;/p&gt;

&lt;p&gt;But the cost is minimal: one text file, thirty minutes, zero risk. If the standard gets adopted, you are ready. It is like having a sitemap before Google formally required one.&lt;/p&gt;

&lt;p&gt;The worst case: nothing happens. The best case: when LLMs start looking for this file, yours is already there.&lt;/p&gt;

&lt;p&gt;You can see mine live at &lt;a href="https://shinobis.com/llms.txt" rel="noopener noreferrer"&gt;shinobis.com/llms.txt&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I am a UX/UI designer with 10+ years in banking and fintech. I document the real process of integrating AI into design work at &lt;a href="https://shinobis.com" rel="noopener noreferrer"&gt;shinobis.com&lt;/a&gt;. Writing in Spanish, English and Japanese.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I built a system where each blog post generates its own unique image from a content hash</title>
      <dc:creator>Shinobis IA</dc:creator>
      <pubDate>Tue, 24 Feb 2026 19:42:25 +0000</pubDate>
      <link>https://dev.to/shinobis_ia/i-built-a-system-where-each-blog-post-generates-its-own-unique-image-from-a-content-hash-4den</link>
      <guid>https://dev.to/shinobis_ia/i-built-a-system-where-each-blog-post-generates-its-own-unique-image-from-a-content-hash-4den</guid>
      <description>&lt;p&gt;Every post on my blog has a unique square image. It looks like a QR code but it is not. The colors change from one post to another. And at the center, always the same kanji: 忍 (shinobi).&lt;/p&gt;

&lt;p&gt;These images are not designed manually. They are generated by the content itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I run a trilingual blog (Spanish, English, Japanese) about integrating AI into professional design work. I publish every three days. Creating a unique header image for each post in three languages was not sustainable.&lt;/p&gt;

&lt;p&gt;Stock photos felt generic. Midjourney images felt disconnected from the content. I wanted something that was automatic, unique to each post, and visually consistent across the entire site.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The system takes two inputs from each post: the title and the character count of the content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The title generates the pattern.&lt;/strong&gt; It gets hashed using MD5 and SHA1 chained together to produce enough data to fill a 32x32 grid (1024 cells). Each hexadecimal character from the hash maps to one of four cell states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Black cube&lt;/li&gt;
&lt;li&gt;Accent color cube&lt;/li&gt;
&lt;li&gt;Light gray cube&lt;/li&gt;
&lt;li&gt;Empty (white)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Change one word in the title and the entire pattern changes. The image is a visual fingerprint of the text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The character count determines the accent color.&lt;/strong&gt; Short posts are gold. Medium-length posts shift through cold blue and purple. Long posts become terracotta. If I ever write something really long, it will be mint green.&lt;/p&gt;

&lt;p&gt;The result: every post has a unique visual identity that is alive as long as the text is. If the article grows, the color shifts. If the title changes, the pattern regenerates completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kanji at the center
&lt;/h2&gt;

&lt;p&gt;Every image has a white space in the center with the kanji 忍. It reads "shinobi" in Japanese and means to persevere silently. It is the origin of the blog name and the visual anchor that connects all images regardless of how different their patterns are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical implementation
&lt;/h2&gt;

&lt;p&gt;The images are generated server-side with PHP and the GD library. Here is the basic flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Take post title
2. Generate hash: md5(title) + sha1(title) chained
3. Map each hex character to a cell state
4. Fill 32x32 grid on white canvas
5. Determine accent color from character count
6. Render kanji center with Noto Sans CJK font
7. Save as PNG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same image is used in three contexts: thumbnail on the homepage, header inside the post, and Open Graph card when someone shares a link on social media. One image, three uses, zero manual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not AI-generated images
&lt;/h2&gt;

&lt;p&gt;This is a blog about a designer working with AI. I use Midjourney and other tools daily for client work. But for the blog identity itself, I wanted something deterministic. Something where the relationship between content and visual is direct and explainable, not probabilistic.&lt;/p&gt;

&lt;p&gt;There is also a practical reason. With three languages and a new post every three days, I would need to generate or select 3 images every 72 hours. The generative system handles this automatically. I publish, the images appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;The entire blog is built from scratch. No WordPress, no frameworks, no JS build tools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (vanilla)&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;CSS (no preprocessors)&lt;/li&gt;
&lt;li&gt;GD library for image generation&lt;/li&gt;
&lt;li&gt;Noto Sans CJK for kanji rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;You can see the system in action at &lt;a href="https://shinobis.com" rel="noopener noreferrer"&gt;shinobis.com&lt;/a&gt;. Every post on the homepage has its own generated image. The &lt;a href="https://shinobis.com/en/generative-identity" rel="noopener noreferrer"&gt;generative identity page&lt;/a&gt; explains the full concept.&lt;/p&gt;

&lt;p&gt;If you want to implement something similar for your own project, the approach is simple: hash your content, map it to a grid, pick a color rule. The result gives any content platform a unique visual identity with zero ongoing effort.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I am a UX/UI designer with 10+ years in banking and fintech. I built this blog to document my real experience integrating AI into professional design workflows. Writing in Spanish, English and Japanese at &lt;a href="https://shinobis.com" rel="noopener noreferrer"&gt;shinobis.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>generativeart</category>
      <category>webdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
