<?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: devjiro</title>
    <description>The latest articles on DEV Community by devjiro (@devjiro).</description>
    <link>https://dev.to/devjiro</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%2F3776278%2F5c92df2c-751b-42df-90d8-a986f8c6efbd.png</url>
      <title>DEV Community: devjiro</title>
      <link>https://dev.to/devjiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devjiro"/>
    <language>en</language>
    <item>
      <title>I analyzed 40 OpenClaw use cases — 92.5% don't need OpenClaw</title>
      <dc:creator>devjiro</dc:creator>
      <pubDate>Sat, 14 Mar 2026 15:02:38 +0000</pubDate>
      <link>https://dev.to/devjiro/i-analyzed-40-openclaw-use-cases-925-dont-need-openclaw-4b2o</link>
      <guid>https://dev.to/devjiro/i-analyzed-40-openclaw-use-cases-925-dont-need-openclaw-4b2o</guid>
      <description>&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I was looking at the &lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases" rel="noopener noreferrer"&gt;awesome-openclaw-usecases&lt;/a&gt; repo — 40 real-world use cases for OpenClaw. It looked like a goldmine of automation ideas.&lt;/p&gt;

&lt;p&gt;But then I noticed something: almost none of them actually &lt;em&gt;need&lt;/em&gt; OpenClaw. The "skills" are just API wrappers. The "memory system" is just file storage. The "sub-agents" are just parallel tasks. Every capability they depend on exists in any capable AI agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Found
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classification&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Agent-agnostic&lt;/strong&gt; (works anywhere)&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Partial&lt;/strong&gt; (swap one tool)&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;42.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenClaw-dependent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only 3 out of 40 use cases genuinely require OpenClaw. The rest? They work with Claude Code, Codex, Cursor, or any agent with shell access + LLM reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Context Efficiency Problem
&lt;/h2&gt;

&lt;p&gt;So I extracted the 37 agent-agnostic use cases. But dumping 37 guides into one skill file would burn ~30,000 tokens every invocation. That's wasteful.&lt;/p&gt;

&lt;p&gt;Instead, I used an &lt;strong&gt;Index Skill Pattern&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; is just a table of contents (~1,200 tokens)&lt;/li&gt;
&lt;li&gt;Each use case lives in its own file under &lt;code&gt;usecases/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Only the selected file gets loaded on demand (~800 tokens)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;93% context savings&lt;/strong&gt; vs monolithic
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not-need-claw/
├── SKILL.md          # Index skill (~1,200 tokens)
└── usecases/         # 37 use cases (loaded on-demand)
    ├── second-brain.md
    ├── self-healing-home-server.md
    └── ... (35 more)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Social Media&lt;/strong&gt; (4): Reddit/YouTube digest, X analysis, tech news aggregation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative &amp;amp; Building&lt;/strong&gt; (5): Podcast pipeline, game dev, content factory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure &amp;amp; DevOps&lt;/strong&gt; (2): Self-healing server, n8n orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity&lt;/strong&gt; (18): Second brain, CRM, meeting notes, habit tracker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research &amp;amp; Learning&lt;/strong&gt; (7): arXiv reader, RAG knowledge base, idea validator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance&lt;/strong&gt; (1): Polymarket autopilot&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add devjiro76/not-need-claw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/devjiro76/not-need-claw" rel="noopener noreferrer"&gt;devjiro76/not-need-claw&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Looking for community contributions — if you have agent-agnostic use cases that work across platforms, PRs welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;not-need-claw is open source. I'd love to hear your feedback!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built a Retro FPS That Turns Your Git Repo Into a Shooting Game</title>
      <dc:creator>devjiro</dc:creator>
      <pubDate>Wed, 11 Mar 2026 16:09:35 +0000</pubDate>
      <link>https://dev.to/devjiro/i-built-a-retro-fps-that-turns-your-git-repo-into-a-shooting-game-1oef</link>
      <guid>https://dev.to/devjiro/i-built-a-retro-fps-that-turns-your-git-repo-into-a-shooting-game-1oef</guid>
      <description>&lt;p&gt;What if your git history was a first-person shooter?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SHOT MY GIT&lt;/strong&gt; turns any GitHub repo into a retro FPS game. Bug-fix commits become bosses. Your code commits become bullets. Shoot your way through 10 waves of bugs.&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.amazonaws.com%2Fuploads%2Farticles%2Fj6i9w8fetd96rt844jh3.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fj6i9w8fetd96rt844jh3.gif" alt="demo" width="760" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://devjiro76.github.io/shot-my-git/" rel="noopener noreferrer"&gt;https://devjiro76.github.io/shot-my-git/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paste any public GitHub repo URL and hit FIGHT.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter a GitHub repo URL (e.g. &lt;code&gt;facebook/react&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The app fetches commits via GitHub REST API&lt;/li&gt;
&lt;li&gt;Bug-fix commits (&lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;hotfix&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;...) spawn as &lt;strong&gt;bosses&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your feature/refactor commits become &lt;strong&gt;bullets&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Shoot through 10 waves of increasingly tough bugs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Bosses Have Tiers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MINI&lt;/td&gt;
&lt;td&gt;1-2 files changed&lt;/td&gt;
&lt;td&gt;Straight line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;3-5 files&lt;/td&gt;
&lt;td&gt;Zigzag pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ELITE&lt;/td&gt;
&lt;td&gt;6+ files or 100+ line changes&lt;/td&gt;
&lt;td&gt;Circle strafing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEGA&lt;/td&gt;
&lt;td&gt;Merge commits, 10+ files&lt;/td&gt;
&lt;td&gt;Charge attack + escorts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Bullets Show Real Code
&lt;/h3&gt;

&lt;p&gt;Every bullet you fire displays actual content from your commits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function/class names extracted from diffs&lt;/li&gt;
&lt;li&gt;Commit messages and SHAs&lt;/li&gt;
&lt;li&gt;Insertion/deletion stats&lt;/li&gt;
&lt;li&gt;Color-coded by commit type (feature=cyan, refactor=yellow, test=blue)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three.js&lt;/strong&gt; with low-res render target for pixel art aesthetic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas2D -&amp;gt; CanvasTexture&lt;/strong&gt; for text sprite rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite + TypeScript&lt;/strong&gt; for the build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub REST API&lt;/strong&gt; (no backend, fully static)&lt;/li&gt;
&lt;li&gt;Deployed on &lt;strong&gt;GitHub Pages&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Git Events as Environmental Effects
&lt;/h2&gt;

&lt;p&gt;The game world reacts to your repo's git history:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; - Two text sprites collide and explode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch&lt;/strong&gt; - Y-shaped fork appears in the sky&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag&lt;/strong&gt; - Golden version number drops from above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matrix rain&lt;/strong&gt; - Actual diff code rains in the background&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For Private Repos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
npm run extract -- /path/to/your/repo
# generates git-data.json, drag &amp;amp; drop it into the game

Links

- Live: https://devjiro76.github.io/shot-my-git/
- Source: https://github.com/devjiro76/shot-my-git

---
This was a weekend experiment to make git history more visceral. Every developer has fought bugs — now you can literally shoot them.

Try it with your own repo and let me know your kill count.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>threejs</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Pixel Art Village Where AI Characters Have Real Emotions</title>
      <dc:creator>devjiro</dc:creator>
      <pubDate>Thu, 05 Mar 2026 19:02:16 +0000</pubDate>
      <link>https://dev.to/devjiro/i-built-a-pixel-art-village-where-ai-characters-have-real-emotions-ccg</link>
      <guid>https://dev.to/devjiro/i-built-a-pixel-art-village-where-ai-characters-have-real-emotions-ccg</guid>
      <description>&lt;p&gt;Last weekend I fell into a rabbit hole: what if game characters didn't just have scripted reactions, but actually &lt;em&gt;felt&lt;/em&gt; things?&lt;/p&gt;

&lt;p&gt;Not "if health &amp;lt; 20 then scared" kind of feelings. Something more like: a brooding introvert who slowly warms up to someone who keeps being kind, but snaps hard when betrayed. A resilient gym coach who barely flinches at insults. A shy librarian who experiences the deepest joy from simple affection.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Persona World&lt;/strong&gt; -- a pixel art village where 12 AI characters live, wander, interact, and develop real emotional states.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Looks Like
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fe93ajy0g6o3fh2lhecx2.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.amazonaws.com%2Fuploads%2Farticles%2Fe93ajy0g6o3fh2lhecx2.png" alt="Village overview with 12 characters wandering around" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each character walks around the village, and when they meet, they autonomously decide what to do -- based on their personality. You can see their current emotion floating above their head.&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.amazonaws.com%2Fuploads%2Farticles%2Fep8cig99ywf4jubcglwz.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.amazonaws.com%2Fuploads%2Farticles%2Fep8cig99ywf4jubcglwz.png" alt="Character detail panel showing emotional state and relationships" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on any character to inspect their inner world: their VAD (Valence-Arousal-Dominance) emotional state, personality traits, and how they feel about every other character.&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.amazonaws.com%2Fuploads%2Farticles%2F3620m9biio5ca6n4fuk1.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F3620m9biio5ca6n4fuk1.gif" alt=" " width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Emotions Work
&lt;/h2&gt;

&lt;p&gt;Each character has a &lt;a href="https://en.wikipedia.org/wiki/HEXACO_model_of_personality_structure" rel="noopener noreferrer"&gt;HEXACO&lt;/a&gt; personality profile -- six dimensions that shape how they respond to everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Openness&lt;/strong&gt; -- creative vs. conventional&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conscientiousness&lt;/strong&gt; -- disciplined vs. spontaneous&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraversion&lt;/strong&gt; -- outgoing vs. reserved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agreeableness&lt;/strong&gt; -- cooperative vs. competitive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neuroticism&lt;/strong&gt; -- sensitive vs. calm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honesty-Humility&lt;/strong&gt; -- sincere vs. pragmatic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an interaction happens (praise, tease, betray, etc.), an emotion engine computes the character's response using a 9-dimensional cognitive appraisal model. The result isn't a simple label -- it's a continuous emotional state in VAD space that shifts based on personality, current mood, and history.&lt;/p&gt;

&lt;p&gt;For example, "Nyx" -- an introverted, sensitive poet (N=0.85, E=0.15) -- reacts to betrayal with the most intense emotional response in the entire village. Meanwhile "Rex" -- a resilient extraverted coach (E=0.95, N=0.25) -- barely registers the same event.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Interesting Part
&lt;/h2&gt;

&lt;p&gt;What surprised me was watching the emergent dynamics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personality shapes everything.&lt;/strong&gt; The same action produces wildly different results depending on who receives it. "Affection" makes Nyx feel genuine joy (she rarely gets positive attention) but barely moves Miko (who's already emotionally stable).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationships accumulate.&lt;/strong&gt; Characters track how others have treated them. Over time, a character who receives mostly positive actions from someone will start preferring positive actions back. Negative spirals happen too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood is slow, emotion is fast.&lt;/strong&gt; A single insult doesn't ruin a character's day. But sustained negativity gradually shifts their baseline mood, which colors all future reactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 19 + Canvas 2D + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotion Engine&lt;/strong&gt;: &lt;a href="https://molroo.io" rel="noopener noreferrer"&gt;molroo&lt;/a&gt; SDK -- handles personality modeling, cognitive appraisal, and VAD emotion computation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendering&lt;/strong&gt;: Pixel art sprites on HTML Canvas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Cloudflare Pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The emotion engine does the heavy lifting. Each &lt;code&gt;interact()&lt;/code&gt; call sends an action with a 9-dimensional appraisal vector, and returns the character's new emotional state -- including discrete emotion labels, VAD values, mood shifts, and even somatic responses (physical sensations like "chest tightness" or "warm glow").&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It / Build Your Own
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;a href="https://persona-world.pages.dev/" rel="noopener noreferrer"&gt;persona-world.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/devjiro76/persona-world" rel="noopener noreferrer"&gt;github.com/devjiro76/persona-world&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole thing is open source. You can swap out the 12 characters with your own (just edit &lt;code&gt;src/data/personas.ts&lt;/code&gt;), change their personalities, or add new interaction types.&lt;/p&gt;

&lt;p&gt;To run it yourself, you just need an API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/devjiro76/persona-world.git
&lt;span class="nb"&gt;cd &lt;/span&gt;persona-world
npm &lt;span class="nb"&gt;install
cp&lt;/span&gt; .env.example .env  &lt;span class="c"&gt;# add your API key&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app auto-creates a world and seeds all 12 characters on first run.&lt;/p&gt;




&lt;p&gt;I'm curious -- has anyone else experimented with continuous emotion models in games or simulations? Most AI character systems I've seen use discrete states or simple sentiment. The VAD approach feels more natural but I'm still finding edge cases (surprise is nearly impossible to trigger, and "challenge" produces numbness instead of determination).&lt;/p&gt;

&lt;p&gt;Would love to hear thoughts or ideas.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I Built a Literary Analysis Dashboard with AI — Here's What I Learned</title>
      <dc:creator>devjiro</dc:creator>
      <pubDate>Mon, 02 Mar 2026 10:18:09 +0000</pubDate>
      <link>https://dev.to/devjiro/i-built-a-literary-analysis-dashboard-with-ai-heres-what-i-learned-22fm</link>
      <guid>https://dev.to/devjiro/i-built-a-literary-analysis-dashboard-with-ai-heres-what-i-learned-22fm</guid>
      <description>&lt;p&gt;What if you could upload a novel and get a full editorial-grade analysis — character maps, engagement curves, structural weaknesses — in minutes?&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://novelcat.io" rel="noopener noreferrer"&gt;Story Miner&lt;/a&gt;&lt;/strong&gt; to do exactly that. It's a web app that combines deterministic text analysis with LLM-powered narrative intelligence to give writers and editors deep insight into their stories.&lt;/p&gt;

&lt;p&gt;Here's a walkthrough of what it does and how it's built.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verdict — Strengths &amp;amp; Weaknesses at a Glance
&lt;/h2&gt;

&lt;p&gt;The first thing you see is a high-level report: what works, what doesn't, and actionable takeaways for the author.&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.amazonaws.com%2Fuploads%2Farticles%2Fda7eie1v78y2drtrvhyq.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.amazonaws.com%2Fuploads%2Farticles%2Fda7eie1v78y2drtrvhyq.png" alt="Verdict view showing strengths and weaknesses analysis of The Godfather" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is generated by feeding episode-level summaries through an LLM pipeline that identifies narrative patterns, then synthesizes them into a structured report.&lt;/p&gt;




&lt;h2&gt;
  
  
  Engagement Map — Where Readers Stay (and Where They Leave)
&lt;/h2&gt;

&lt;p&gt;This tab maps &lt;strong&gt;narrative structure&lt;/strong&gt; (Setup → Development → Crisis → Climax → Resolution) alongside an &lt;strong&gt;engagement timeline&lt;/strong&gt; that tracks sentiment, dialogue ratio, and pacing across every episode.&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.amazonaws.com%2Fuploads%2Farticles%2Fpt4pky3e5znlaymtwbmy.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.amazonaws.com%2Fuploads%2Farticles%2Fpt4pky3e5znlaymtwbmy.png" alt="Engagement Map showing narrative phases and engagement timeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The engagement scores use a hybrid approach: deterministic metrics (sentence length variance, dialogue density, vocabulary richness) combined with LLM-assessed emotional intensity. This gives a much more reliable signal than either approach alone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Character Craft — Relationship Graphs &amp;amp; Emotion Analysis
&lt;/h2&gt;

&lt;p&gt;Every character gets profiled: role classification (protagonist/supporting/antagonist), emotion distribution, co-appearance frequency, and an interactive relationship graph.&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.amazonaws.com%2Fuploads%2Farticles%2Fn8sm3vn48xty04ketirf.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.amazonaws.com%2Fuploads%2Farticles%2Fn8sm3vn48xty04ketirf.png" alt="Character Craft view with relationship graph and emotion analysis for Vito Corleone" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The relationship graph uses force-directed layout to show character clustering — you can immediately see which characters form tight groups and which are isolated.&lt;/p&gt;




&lt;h2&gt;
  
  
  4-Language Support — Instant Switching
&lt;/h2&gt;

&lt;p&gt;The entire analysis can be viewed in &lt;strong&gt;Korean, English, Japanese, and Chinese&lt;/strong&gt;. Switch languages from the header and all analysis content re-renders in the selected language.&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.amazonaws.com%2Fuploads%2Farticles%2Fy7ju76len1lz9umeepzq.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.amazonaws.com%2Fuploads%2Farticles%2Fy7ju76len1lz9umeepzq.png" alt="Japanese language view of the Weak Spots analysis" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This isn't just UI translation — the LLM analysis results are stored per-language, so the narrative insights themselves are generated natively in each language.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js 16, Tailwind CSS, shadcn/ui, Recharts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;FastAPI, SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Claude (narrative analysis), deterministic NLP pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Cloudflare Workers (web), Railway (API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;OpenNext for Cloudflare, Turbopack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Hybrid Analysis Pipeline
&lt;/h3&gt;

&lt;p&gt;The key architectural decision was splitting analysis into two phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deterministic phase&lt;/strong&gt; — keyword extraction (TF-IDF), character counting, co-occurrence matrices, topic modeling, sentiment scoring, style profiling. Fast, reproducible, and cheap.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM phase&lt;/strong&gt; — episode-by-episode narrative analysis, overall structure detection, character relationship inference, and the final editorial report. Expensive but insightful.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The deterministic data feeds into the LLM prompts as context, grounding the AI analysis in measurable textual features. This prevents hallucination about pacing ("the middle section drags") when the engagement metrics actually show it's fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-Language Result Storage
&lt;/h3&gt;

&lt;p&gt;Analysis results are stored with language-qualified keys (&lt;code&gt;report:en&lt;/code&gt;, &lt;code&gt;report:ja&lt;/code&gt;, etc.) in SQLite. The API tries the requested language first, then falls back to the default. This means you can analyze once and view in multiple languages without re-running the pipeline.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://novelcat.io" rel="noopener noreferrer"&gt;novelcat.io&lt;/a&gt;&lt;/strong&gt; — The demo includes a pre-analyzed sample (The Godfather screenplay) with all 4 languages ready. No signup required.&lt;/p&gt;

&lt;p&gt;The whole project is still in early stages (v0.1.0), but I'd love feedback on the analysis quality and what features would be most useful for writers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Claude Code in a weekend sprint. The AI wrote most of the code, I steered the product decisions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>We Pushed Claude to Generate as Much Documentation as Possible — And It Backfired</title>
      <dc:creator>devjiro</dc:creator>
      <pubDate>Sun, 22 Feb 2026 11:27:44 +0000</pubDate>
      <link>https://dev.to/devjiro/we-pushed-claude-to-generate-as-much-documentation-as-possible-and-it-backfired-4ifg</link>
      <guid>https://dev.to/devjiro/we-pushed-claude-to-generate-as-much-documentation-as-possible-and-it-backfired-4ifg</guid>
      <description>&lt;p&gt;When we first started integrating Claude into our development workflow, the idea seemed brilliant: let the LLM handle all the documentation. Write a function? Generate docs. Refactor a module? Generate docs. Rename a variable? Generate docs.&lt;/p&gt;

&lt;p&gt;We pushed hard. We prompted aggressively. And Claude delivered — more than we ever expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Documentation Avalanche
&lt;/h2&gt;

&lt;p&gt;Within a few months, our repository had accumulated an astonishing volume of documentation files. README files for every directory. Inline comments for every function. Architecture decision records. API references. Onboarding guides. Glossaries. Runbooks. Postmortems for incidents that had long since been forgotten.&lt;/p&gt;

&lt;p&gt;At first, it felt productive. It &lt;em&gt;looked&lt;/em&gt; like a mature, well-maintained codebase.&lt;/p&gt;

&lt;p&gt;But something was wrong.&lt;/p&gt;

&lt;p&gt;No human could actually read all of it. And — this is the part that stings — neither could the LLM. When we asked Claude to help with a refactor, the context window filled up just loading the documentation layer. The docs had become noise, crowding out the actual signal: the source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Source Moved On. The Docs Didn't.
&lt;/h2&gt;

&lt;p&gt;The real problem wasn't the volume. It was the drift.&lt;/p&gt;

&lt;p&gt;Our codebase kept evolving — new features, architectural pivots, dependency upgrades, renamed services. But the documentation? It stayed frozen at whatever moment Claude had generated it. There was no automated mechanism to detect that a doc was now stale. There was no diff that told us "this README no longer matches the module it describes."&lt;/p&gt;

&lt;p&gt;So we ended up with a documentation graveyard — hundreds of files that were &lt;em&gt;technically&lt;/em&gt; present but practically misleading. Worse than no documentation at all, because they created false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Refactoring Trap
&lt;/h2&gt;

&lt;p&gt;The consequences showed up most painfully during refactoring cycles.&lt;/p&gt;

&lt;p&gt;When a developer opened a module they hadn't touched in six months, they'd find three or four documentation files associated with it: one from the original implementation, one from a partial refactor, one that seemed like a summary of the other two. Each file had slightly different descriptions of how the system worked. Each contradicted the others in subtle ways.&lt;/p&gt;

&lt;p&gt;Which one was current? No one knew. &lt;/p&gt;

&lt;p&gt;So developers did what developers do under uncertainty: they ignored all of them and went straight to the code. The documentation was not just useless at this point — it was actively slowing people down by creating doubt and requiring manual cross-referencing.&lt;/p&gt;

&lt;p&gt;And then the same bugs came back. The same architectural mistakes. Because the lessons learned from the last refactor were buried in an outdated doc that nobody trusted anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Should Have Done
&lt;/h2&gt;

&lt;p&gt;We treated documentation like output, not like a living artifact.&lt;/p&gt;

&lt;p&gt;The mistake wasn't using Claude to write docs. Claude is genuinely excellent at drafting clear, structured documentation from code context. The mistake was treating every generated doc as "done" — then moving on without any strategy for keeping it synchronized with the source.&lt;/p&gt;

&lt;p&gt;Documentation needs ownership. It needs a lifecycle. If you can't commit to updating a doc when the code changes, you'd be better off with a short, manually-written doc that's actually accurate, than ten AI-generated docs that are confidently wrong.&lt;/p&gt;

&lt;p&gt;A few principles we've adopted since then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One source of truth per module.&lt;/strong&gt; One doc file, linked directly in the code, with a clear owner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs are part of the PR.&lt;/strong&gt; If you change behavior, you update the doc. No exceptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regularly audit and delete.&lt;/strong&gt; An outdated doc should be treated like dead code — remove it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Claude to draft, not to decide scope.&lt;/strong&gt; The LLM can write the words, but humans should decide what needs to be documented and at what granularity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real Lesson
&lt;/h2&gt;

&lt;p&gt;LLMs are remarkably good at generating documentation. That's precisely the danger.&lt;/p&gt;

&lt;p&gt;The ease of generation creates an illusion of completeness. You can produce a thousand words of polished, coherent documentation in seconds. It &lt;em&gt;feels&lt;/em&gt; like you've done the work. But documentation that isn't maintained is a liability, not an asset.&lt;/p&gt;

&lt;p&gt;We confused volume with value. And for a while, our codebase paid the price — in confusion, in duplicated effort, and in bugs that kept resurfacing because no one could find the lesson that had already been learned and written down, buried somewhere in a file that no one trusted anymore.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
