<?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: qcrao</title>
    <description>The latest articles on DEV Community by qcrao (@qcrao).</description>
    <link>https://dev.to/qcrao</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%2F3895196%2Fdc8d29f7-4dbf-4ec7-a679-d9d3fa85ba0b.jpg</url>
      <title>DEV Community: qcrao</title>
      <link>https://dev.to/qcrao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qcrao"/>
    <language>en</language>
    <item>
      <title>Why I Run Claude Code in Git Worktrees (And You Probably Should Too)</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 23 May 2026 04:04:48 +0000</pubDate>
      <link>https://dev.to/qcrao/why-i-run-claude-code-in-git-worktrees-and-you-probably-should-too-3307</link>
      <guid>https://dev.to/qcrao/why-i-run-claude-code-in-git-worktrees-and-you-probably-should-too-3307</guid>
      <description>&lt;p&gt;For the first month I used Claude Code, I ran it the way I ran every other coding tool: from my repo's root directory, one session at a time. It worked. But every time Claude was halfway through a feature and I needed to pop over to main to fix a typo in production, I'd hit the same wall — stash, checkout, find that Claude's session was now confused about what branch it was on, lose context, swear quietly.&lt;/p&gt;

&lt;p&gt;The fix turned out to be a Git feature that's been in the toolbox since 2015 and that I had never used: &lt;strong&gt;git worktree&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What git worktree actually does
&lt;/h2&gt;

&lt;p&gt;A worktree is a second (third, tenth) working directory attached to the &lt;em&gt;same&lt;/em&gt; &lt;code&gt;.git&lt;/code&gt; folder. Different directory, different branch checked out, same repo history. Disk usage is minimal — only the working files duplicate, not the object database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# from inside your main repo&lt;/span&gt;
git worktree add ../myrepo-hotfix main
git worktree add ../myrepo-feature-x &lt;span class="nt"&gt;-b&lt;/span&gt; feature/x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have three sibling directories, each on its own branch, each fully usable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for Claude Code
&lt;/h2&gt;

&lt;p&gt;Once you have worktrees, the workflow becomes obvious: &lt;strong&gt;one worktree per Claude session&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/work/myrepo-worktrees
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/work/myrepo
git worktree add ../myrepo-worktrees/feat-auth &lt;span class="nt"&gt;-b&lt;/span&gt; feat/auth
git worktree add ../myrepo-worktrees/feat-billing &lt;span class="nt"&gt;-b&lt;/span&gt; feat/billing
git worktree add ../myrepo-worktrees/hotfix-prod &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/prod

&lt;span class="c"&gt;# now spin up three Claude sessions in three terminals&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/work/myrepo-worktrees/feat-auth &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/work/myrepo-worktrees/feat-billing &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/work/myrepo-worktrees/hotfix-prod &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each Claude session is rooted in a different directory, on a different branch, with its own file context. They cannot step on each other's edits. The &lt;code&gt;"branch is already checked out at..."&lt;/code&gt; error goes away because each worktree owns its branch. And when one agent finishes, merging is a normal &lt;code&gt;git merge&lt;/code&gt; — no branch acrobatics needed.&lt;/p&gt;

&lt;p&gt;For me this turned "one feature at a time" into "three parallel features all day", and the only thing it cost was 200 MB of duplicated &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tmux setup that made it click
&lt;/h2&gt;

&lt;p&gt;I wrap the three sessions in a tmux window so I can glance at all three at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux new-session &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; claude-pool
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool &lt;span class="s1"&gt;'cd ~/work/myrepo-worktrees/feat-auth &amp;amp;&amp;amp; claude'&lt;/span&gt; C-m
tmux split-window &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool &lt;span class="s1"&gt;'cd ~/work/myrepo-worktrees/feat-billing &amp;amp;&amp;amp; claude'&lt;/span&gt; C-m
tmux split-window &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool &lt;span class="s1"&gt;'cd ~/work/myrepo-worktrees/hotfix-prod &amp;amp;&amp;amp; claude'&lt;/span&gt; C-m
tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; claude-pool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three panes, three agents, zero context collision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;node_modules&lt;/strong&gt;: each worktree needs its own. Either eat the disk cost or use &lt;code&gt;pnpm&lt;/code&gt; with a shared store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.env files&lt;/strong&gt;: these are gitignored, so they don't follow you into a new worktree. Symlink or copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt;: git hooks live in &lt;code&gt;.git/hooks&lt;/code&gt; which is &lt;strong&gt;shared&lt;/strong&gt; across worktrees. Test once, runs for all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removing a worktree&lt;/strong&gt;: never &lt;code&gt;rm -rf&lt;/code&gt; the directory. Use &lt;code&gt;git worktree remove &amp;lt;path&amp;gt;&lt;/code&gt; so Git's bookkeeping stays consistent, or you'll see &lt;code&gt;worktree is dirty&lt;/code&gt; errors later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When it's overkill
&lt;/h2&gt;

&lt;p&gt;If you only ever run one agent at a time and you're not context-switching across hotfixes, plain branches are fine. Worktrees pay off when &lt;strong&gt;parallelism × interruption rate&lt;/strong&gt; is high — which, with AI agents, it nearly always is.&lt;/p&gt;




&lt;p&gt;I ended up cataloging every git worktree command, every common error, and the setups for Cursor / Codex / OpenCode too over at &lt;a href="https://www.gitworktree.org" rel="noopener noreferrer"&gt;gitworktree.org&lt;/a&gt; — the &lt;a href="https://www.gitworktree.org/ai-tools/claude-code" rel="noopener noreferrer"&gt;Claude Code + worktree guide&lt;/a&gt; is the one I refer back to most.&lt;/p&gt;

&lt;p&gt;If you've got your own worktree tricks for AI agents, drop them in the comments — always looking for the next 10% of speedup.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>git</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why backstory drafting comes before scene rendering in Comicorys pipeline</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:46:32 +0000</pubDate>
      <link>https://dev.to/qcrao/why-backstory-drafting-comes-before-scene-rendering-in-comicorys-pipeline-4dfm</link>
      <guid>https://dev.to/qcrao/why-backstory-drafting-comes-before-scene-rendering-in-comicorys-pipeline-4dfm</guid>
      <description></description>
    </item>
    <item>
      <title>Why Comicory uses six panels as the default ceiling for AI comic pages</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:42:25 +0000</pubDate>
      <link>https://dev.to/qcrao/why-comicory-uses-six-panels-as-the-default-ceiling-for-ai-comic-pages-1mpm</link>
      <guid>https://dev.to/qcrao/why-comicory-uses-six-panels-as-the-default-ceiling-for-ai-comic-pages-1mpm</guid>
      <description></description>
    </item>
    <item>
      <title>Why Comicory keeps text bubbles separate from panel generation</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:38:24 +0000</pubDate>
      <link>https://dev.to/qcrao/why-comicory-keeps-text-bubbles-separate-from-panel-generation-10am</link>
      <guid>https://dev.to/qcrao/why-comicory-keeps-text-bubbles-separate-from-panel-generation-10am</guid>
      <description></description>
    </item>
    <item>
      <title>Why TubeVocab caches flashcards in the browser instead of relying on the backend</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:34:33 +0000</pubDate>
      <link>https://dev.to/qcrao/why-tubevocab-caches-flashcards-in-the-browser-instead-of-relying-on-the-backend-3aaf</link>
      <guid>https://dev.to/qcrao/why-tubevocab-caches-flashcards-in-the-browser-instead-of-relying-on-the-backend-3aaf</guid>
      <description></description>
    </item>
    <item>
      <title>Why I scoped TubeVocab to YouTube only and skipped TikTok and Bilibili</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:29:58 +0000</pubDate>
      <link>https://dev.to/qcrao/why-i-scoped-tubevocab-to-youtube-only-and-skipped-tiktok-and-bilibili-3mkh</link>
      <guid>https://dev.to/qcrao/why-i-scoped-tubevocab-to-youtube-only-and-skipped-tiktok-and-bilibili-3mkh</guid>
      <description>&lt;p&gt;The most common feedback on a YouTube-based vocabulary tool is some version of "this is great, can you add TikTok next?" Or Instagram Reels. Or Bilibili for Chinese learners. Or Netflix. Or any platform with subtitled video.&lt;/p&gt;

&lt;p&gt;I considered all of them. I built TubeVocab as a YouTube-only product on purpose. The decision was less about engineering effort and more about content quality and learner outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Captions are not a commodity
&lt;/h2&gt;

&lt;p&gt;A vocabulary tool that mines comprehensible input from video stands or falls on caption quality. Without a clean caption track, every downstream feature — click-to-flashcard, dictation, cloze tests, vocabulary in context — degrades.&lt;/p&gt;

&lt;p&gt;YouTube's caption ecosystem has three things going for it that other platforms do not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A massive base of human-edited captions from creators who care about accessibility and SEO.&lt;/li&gt;
&lt;li&gt;Automatic captions that, while imperfect, are usable for popular speakers and standard accents.&lt;/li&gt;
&lt;li&gt;A long-standing public API that lets a learning tool read the caption track without scraping fragile HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TikTok captions are heavily auto-generated, often inaccurate, and frequently burned into the video as visual overlays rather than text. Instagram captions are similar. Netflix subtitles are high quality but locked inside DRM. Bilibili has good captions but a Chinese-speaking user base that is not the dominant target for an English learning tool.&lt;/p&gt;

&lt;p&gt;A vocabulary tool built on the wrong caption source is built on sand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch time and content length matter
&lt;/h2&gt;

&lt;p&gt;YouTube is unique among video platforms in the variety of content length it supports. A learner can find a five-minute explainer or a ninety-minute documentary on essentially any topic, in any English accent.&lt;/p&gt;

&lt;p&gt;Vocabulary acquisition through video requires extended exposure to coherent speech. A ten-second TikTok cannot give a learner the same kind of language exposure that a fifteen-minute YouTube video can. The information density per minute is similar, but the contextual scaffolding inside a longer video helps learners attach new words to surrounding ideas.&lt;/p&gt;

&lt;p&gt;A tool that depends on long-form context simply works better on a platform that hosts long-form content. Scoping &lt;a href="https://www.tubevocab.com" rel="noopener noreferrer"&gt;TubeVocab&lt;/a&gt; to YouTube made each saved word more useful, because each word came from a more complete contextual moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Focused scope beats feature breadth
&lt;/h2&gt;

&lt;p&gt;There is a familiar pull in product design to support every adjacent platform "for completeness". The downside is that completeness drains energy from the depth of the experience on any single platform.&lt;/p&gt;

&lt;p&gt;For TubeVocab, supporting YouTube alone means I can build features that exploit YouTube specifically: deep linking to a specific second of a video, channel-aware vocabulary grouping, recommendation against a learner's watched list, transcript-level cloze tests. Each of those would have to be reinvented per platform if the tool tried to serve all video sources at once.&lt;/p&gt;

&lt;p&gt;Depth on one platform beats shallow coverage of five.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exception is the rule
&lt;/h2&gt;

&lt;p&gt;Plenty of learners genuinely watch a mix of YouTube and other video sources. For those learners, TubeVocab covers only part of their habit. That is fine. A vocabulary tool does not need to capture every word the learner ever encounters. It needs to capture enough words, often enough, with enough context, to build a useful flashcard deck and a stable review habit.&lt;/p&gt;

&lt;p&gt;For learners whose YouTube watching is a meaningful chunk of their English input, scoping to YouTube is plenty. For learners whose YouTube watching is incidental, no tool would help much anyway.&lt;/p&gt;

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

&lt;p&gt;Picking the right single platform and building deeply on it is a more honest strategy than trying to be everywhere. It also keeps the development surface small enough that a tiny team can ship real improvements every week instead of patching integration breakage on five different APIs.&lt;/p&gt;

&lt;p&gt;For a vocabulary tool, content quality and content length determine the ceiling. YouTube wins on both, by a margin that makes adding TikTok or Bilibili a worse product, not a more inclusive one.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>product</category>
      <category>sideprojects</category>
      <category>startup</category>
    </item>
    <item>
      <title>Why TubeVocab keeps the dictionary popup quiet instead of overwhelming learners</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sun, 17 May 2026 17:25:58 +0000</pubDate>
      <link>https://dev.to/qcrao/why-tubevocab-keeps-the-dictionary-popup-quiet-instead-of-overwhelming-learners-26oi</link>
      <guid>https://dev.to/qcrao/why-tubevocab-keeps-the-dictionary-popup-quiet-instead-of-overwhelming-learners-26oi</guid>
      <description>&lt;p&gt;Most dictionary popups inside language-learning tools try to do too much at once. Click a word and you get the translation, three definitions, four example sentences, frequency rank, etymology, conjugation table, audio button, save button, and a related-words list. All at once, all on the same panel.&lt;/p&gt;

&lt;p&gt;It looks generous. It actually breaks the moment of reading.&lt;/p&gt;

&lt;p&gt;When I built the click-to-look-up popup for TubeVocab, I started with that maximalist design and slowly stripped it down. The version that actually retains learners is intentionally quiet: one translation, one short example, one save button. Everything else lives behind a single tap.&lt;/p&gt;

&lt;h2&gt;
  
  
  A popup is a reading interruption, not a reference page
&lt;/h2&gt;

&lt;p&gt;When someone watches a YouTube video with subtitles and clicks an unknown word, they are not opening a dictionary. They are buying themselves a half second of clarification so they can keep watching.&lt;/p&gt;

&lt;p&gt;If the popup contains a dense reference layout, three things happen, all of which break the loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The video stays paused longer than the learner intended.&lt;/li&gt;
&lt;li&gt;The learner starts reading the popup instead of returning to the subtitle.&lt;/li&gt;
&lt;li&gt;The cognitive load of choosing what to read inside the popup competes with the cognitive load of the next subtitle line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The popup is a tooltip, not a destination. Treating it like a destination is the most common mistake in this kind of interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defaults should match the dominant intent
&lt;/h2&gt;

&lt;p&gt;Among learners hovering over an unknown word, the dominant intent is "what does this mean, roughly, so I can keep going". Maybe 80 percent of clicks fit that pattern.&lt;/p&gt;

&lt;p&gt;A smaller share genuinely wants to dive in: see all senses of the word, hear it pronounced multiple ways, check a usage table, save it with context, compare regional variants. That is real, but it is the minority intent.&lt;/p&gt;

&lt;p&gt;A good popup serves the majority intent in zero clicks and the minority intent in one click. A bad popup serves both at the same time and accidentally serves neither.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the quiet popup actually contains
&lt;/h2&gt;

&lt;p&gt;The default state in &lt;a href="https://www.tubevocab.com" rel="noopener noreferrer"&gt;TubeVocab&lt;/a&gt; shows a single line for the most common translation, a single line for a short usage example pulled from the subtitle context, and a small heart icon to save. Nothing else.&lt;/p&gt;

&lt;p&gt;If the learner wants more, a single tap expands the panel into the fuller reference view with all senses, all examples, the audio button, and the save-with-tags flow. Tapping outside collapses it back to quiet mode.&lt;/p&gt;

&lt;p&gt;That structure rewards both modes of attention. A learner who clicks ten unknown words in a five-minute video gets ten near-instant peeks. A learner who pauses on one fascinating word can drill in without losing the rest of the popup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quieter the default, the higher the volume
&lt;/h2&gt;

&lt;p&gt;Counterintuitively, the quieter default produced higher save rates and longer session lengths. Two reasons.&lt;/p&gt;

&lt;p&gt;First, learners click more unknown words because the cost of clicking is genuinely low. Volume goes up, which is exactly what a vocabulary tool needs to build up a meaningful flashcard collection.&lt;/p&gt;

&lt;p&gt;Second, the few learners who care about deep reference do not feel locked out. The fuller view is still there, just intentionally one tap away.&lt;/p&gt;

&lt;p&gt;A maximalist popup feels generous on the surface and exhausting in practice. A quiet popup feels minimal at first and rewards extended use.&lt;/p&gt;

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

&lt;p&gt;Reference data in a learning tool should be layered, not dumped. The first layer is the answer to the question the learner actually asked: what does this word mean. Every additional layer should require a deliberate gesture to unlock.&lt;/p&gt;

&lt;p&gt;A vocabulary tool is not a dictionary. It is a reading aid. Designing the dictionary popup to behave more like a reading aid and less like a dictionary is what made TubeVocab finally feel calm to use, even when learners click dozens of words inside a single video.&lt;/p&gt;

</description>
      <category>design</category>
      <category>learning</category>
      <category>sideprojects</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why dialogue placement is the hardest part of AI comic generation</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 16 May 2026 15:43:47 +0000</pubDate>
      <link>https://dev.to/qcrao/why-dialogue-placement-is-the-hardest-part-of-ai-comic-generation-3lga</link>
      <guid>https://dev.to/qcrao/why-dialogue-placement-is-the-hardest-part-of-ai-comic-generation-3lga</guid>
      <description>&lt;p&gt;If you ask people what is hard about AI comics, most will say character consistency. That is a real problem, but it is not the worst one in practice.&lt;/p&gt;

&lt;p&gt;The harder problem, in my experience building Comicory, is dialogue placement.&lt;/p&gt;

&lt;p&gt;Putting words inside a comic panel sounds trivial. It is one of the parts that breaks down most often, and when it breaks down the whole page reads wrong, even if every individual panel looks beautiful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speech bubbles are constraint puzzles
&lt;/h2&gt;

&lt;p&gt;A speech bubble is not just a graphic. It is a constraint that ties together text length, panel composition, character position, reading order, and the actual story logic.&lt;/p&gt;

&lt;p&gt;A bubble needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sit somewhere that does not cover the speaker's face.&lt;/li&gt;
&lt;li&gt;Not cover other important visual information in the panel.&lt;/li&gt;
&lt;li&gt;Point clearly to the speaker.&lt;/li&gt;
&lt;li&gt;Be readable in size and contrast.&lt;/li&gt;
&lt;li&gt;Fit the text without overflowing or shrinking the font.&lt;/li&gt;
&lt;li&gt;Come before the next bubble in reading order.&lt;/li&gt;
&lt;li&gt;Match the tone of the line (a whisper bubble looks different from a shout).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each constraint sounds simple. Together, they collide. A model that generates a perfect-looking panel often leaves no room for the bubble, or covers the character's mouth, or breaks the reading order with the next panel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Text rendering is still unreliable inside images
&lt;/h2&gt;

&lt;p&gt;A second problem is that most image models still cannot reliably render text inside the generated image.&lt;/p&gt;

&lt;p&gt;Even when the model places a bubble shape correctly, the letters inside it may be unreadable. Half a word missing. A weird artifact. A misspelling.&lt;/p&gt;

&lt;p&gt;For a comic, this is not cosmetic. The dialogue is half the storytelling. A misread bubble flips the meaning of a panel.&lt;/p&gt;

&lt;p&gt;That is why most working systems, including &lt;a href="https://www.comicory.com" rel="noopener noreferrer"&gt;Comicory&lt;/a&gt;, do not let the image model write the text at all. The model produces an empty bubble or a marked region. The actual text is composited on top by a typography layer that knows about font, kerning, and bubble fit. That gives clean, predictable letters.&lt;/p&gt;

&lt;p&gt;But it also moves the hard problem somewhere new. Now the bubble shape and position have to match a text length that was decided separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Length mismatch breaks everything
&lt;/h2&gt;

&lt;p&gt;The most common failure is the mismatch between the planned dialogue length and the visual space the model leaves for it.&lt;/p&gt;

&lt;p&gt;Imagine the storyboard says character A has a four-word line. The model generates a panel with a small empty corner for the bubble. Fine. Then in iteration, the user rewrites the line to eighteen words. Suddenly there is no room. The compositor either shrinks the text until it is unreadable, or overflows the panel art.&lt;/p&gt;

&lt;p&gt;Solving this is not a one-shot problem. The system has to negotiate between text length and panel composition at every revision step. It needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How big can this bubble grow before it hits important art?&lt;/li&gt;
&lt;li&gt;How much of the panel is safe to cover?&lt;/li&gt;
&lt;li&gt;Should the bubble break across multiple shapes if the line is long?&lt;/li&gt;
&lt;li&gt;Should the line be split into two bubbles for the same speaker?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a layout engine, not a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading order is a separate layer
&lt;/h2&gt;

&lt;p&gt;Even if every single bubble fits, the bubbles in a multi-panel page must follow a reading order. Western comics read left to right, top to bottom. Within a panel, bubbles read roughly the same way.&lt;/p&gt;

&lt;p&gt;A model that generates panels in isolation has no incentive to keep this order consistent. Panel 1 might have its bubble in the top right, while panel 2 has it in the bottom left, and the eye has to ricochet around the page.&lt;/p&gt;

&lt;p&gt;Reading order is the cheap part to fix if the system explicitly models it. It is hard to fix if you only realize after rendering that the page is unreadable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the product actually has to do
&lt;/h2&gt;

&lt;p&gt;So the working pipeline for dialogue in an AI comic ends up doing more layout work than image generation work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decide dialogue lines per panel during the storyboard stage, so the rendering stage knows how much room each bubble needs.&lt;/li&gt;
&lt;li&gt;Tell the image model to leave clear, neutral space in a specific region of each panel.&lt;/li&gt;
&lt;li&gt;Composite the real text in a typography layer that the user can tweak font, size, and shape on.&lt;/li&gt;
&lt;li&gt;Validate that no bubble covers an important face or hand.&lt;/li&gt;
&lt;li&gt;Validate reading order across the page.&lt;/li&gt;
&lt;li&gt;Provide a small editor so the user can drag a bubble or split a long line into two.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are heroic. All of them are essential. Skip any one and the page reads worse than a manually drawn comic by an amateur.&lt;/p&gt;

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

&lt;p&gt;The flashy demos of AI comics all show character art. The unglamorous reality is that dialogue placement determines whether the page is actually readable.&lt;/p&gt;

&lt;p&gt;For Comicory, treating bubbles as a real layout problem, not a rendering hint, was one of the larger architectural decisions. The model produces art and space. The typography layer produces text and bubble shape. The product glues them together with constraints the user can override.&lt;/p&gt;

&lt;p&gt;Image quality matters. Character consistency matters. But until the words sit cleanly in the right place at the right time, no amount of pretty art makes the page feel like a comic.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>showdev</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why I avoided gamification in a vocabulary tool for adult learners</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 16 May 2026 15:42:51 +0000</pubDate>
      <link>https://dev.to/qcrao/why-i-avoided-gamification-in-a-vocabulary-tool-for-adult-learners-dl6</link>
      <guid>https://dev.to/qcrao/why-i-avoided-gamification-in-a-vocabulary-tool-for-adult-learners-dl6</guid>
      <description>&lt;p&gt;When you build a language learning product in 2026, the default playbook is gamification. Streaks, leagues, mascots, daily quests, lives, hearts, gems. The big apps have proven that this stuff drives retention.&lt;/p&gt;

&lt;p&gt;I left almost all of it out of TubeVocab on purpose.&lt;/p&gt;

&lt;p&gt;That decision was not about being contrarian. It was about who the tool is actually for. The learners I had in mind are adults who already know they want to improve their English, who already have other reasons to come back, and who are easy to push away with the wrong kind of pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gamification optimizes for app opens, not for learning
&lt;/h2&gt;

&lt;p&gt;The honest version of streak-based design is that it optimizes a metric. The metric is daily app opens. The user opens the app every day to protect their streak, even if all they do is tap through five seconds of trivial review.&lt;/p&gt;

&lt;p&gt;That is good for engagement charts. It is not always good for learning.&lt;/p&gt;

&lt;p&gt;A vocabulary tool used three minutes a day for ninety days in a row will probably teach less than a tool used twenty focused minutes three times a week. The shorter sessions are easier to fake, easier to skim through, and easier to do on autopilot. The user feels productive because the streak says so, but the words do not stick any harder than before.&lt;/p&gt;

&lt;p&gt;For an adult learner, this matters. They have limited study time. They cannot afford to feel productive while learning nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streak anxiety pushes the wrong users away
&lt;/h2&gt;

&lt;p&gt;The other failure mode of streak systems is that they punish exactly the people you want to retain.&lt;/p&gt;

&lt;p&gt;A serious adult learner often has a busy week. A work trip, a sick kid, a deadline. They skip three days. They come back to the app and their 87-day streak is gone. The mascot is sad. There is a tiny offer to "restore" the streak.&lt;/p&gt;

&lt;p&gt;For some users this works. For others, the streak collapse becomes the moment they delete the app. The signal they receive is: this tool punishes me for being human. That feeling is hard to unwind.&lt;/p&gt;

&lt;p&gt;I would rather have a learner come back after two weeks, find their saved words exactly where they left them, and feel welcomed than chase them with a guilt-trip notification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adults already know why they are here
&lt;/h2&gt;

&lt;p&gt;Children and teenagers often need a reason to start studying. Gamification creates that reason. Adults usually do not.&lt;/p&gt;

&lt;p&gt;A working adult who installs an ESL tool already has a clear motivation. Maybe they want a job in an English-speaking team. Maybe they want to watch their favorite YouTubers without subtitles. Maybe they want to read research papers more comfortably. They came to &lt;a href="https://www.tubevocab.com" rel="noopener noreferrer"&gt;TubeVocab&lt;/a&gt; with a goal.&lt;/p&gt;

&lt;p&gt;Adding gems and leagues on top of that goal can dilute it. The user starts optimizing for the in-app reward instead of the actual outcome they came for. The product becomes a slot machine wearing an education costume.&lt;/p&gt;

&lt;p&gt;I would rather make the underlying activity satisfying than wrap a thin layer of dopamine on top of weak content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What replaces gamification
&lt;/h2&gt;

&lt;p&gt;Removing streaks does not mean removing motivation. It means moving the motivation closer to real progress.&lt;/p&gt;

&lt;p&gt;A few things I lean on instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show what the learner can now read or watch that they could not before. Concrete capability change is the strongest motivator for adults.&lt;/li&gt;
&lt;li&gt;Show their saved words in context, with the real video and timestamp where they captured each one. A learner remembers the moment a word was first useful much better than a number.&lt;/li&gt;
&lt;li&gt;Make review feel light when life is busy. Five minutes is a fine session, not a failure compared to twenty.&lt;/li&gt;
&lt;li&gt;Default to recall correctness, not session length. A learner who reviewed two words deeply did more than a learner who skimmed twenty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is flashy. None of it puts a mascot on the home screen. That is fine. The reward is supposed to come from the learning, not from the app.&lt;/p&gt;

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

&lt;p&gt;Gamification works. It is also extremely easy to overdo, and the cost falls on the exact users who would have stuck around without it.&lt;/p&gt;

&lt;p&gt;For TubeVocab specifically, I am building for adult learners who use real YouTube content. They are picky, busy, and skeptical of edtech tricks. Treating them like adults turns out to be a stronger retention strategy than turning the app into a streak treadmill.&lt;/p&gt;

&lt;p&gt;The boring version is also the honest one: design for the learning outcome, surface concrete capability gains, and trust adult learners to come back when the product earns it.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>product</category>
      <category>sideprojects</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why splitting storyboard from rendering beats one mega-prompt for AI comics</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 16 May 2026 15:26:04 +0000</pubDate>
      <link>https://dev.to/qcrao/why-splitting-storyboard-from-rendering-beats-one-mega-prompt-for-ai-comics-31jo</link>
      <guid>https://dev.to/qcrao/why-splitting-storyboard-from-rendering-beats-one-mega-prompt-for-ai-comics-31jo</guid>
      <description>&lt;p&gt;The most tempting way to build an AI comic generator is also the worst one: take a paragraph of story, send it to an image model, and ask for a finished page.&lt;/p&gt;

&lt;p&gt;It feels like magic when it works. It almost never works.&lt;/p&gt;

&lt;p&gt;The story-to-page mega-prompt collapses for the same reason that one-shot UI generation collapses. Too many constraints land on the model at once, and the model has no clean way to negotiate them. So I separated storyboard from rendering early in Comicory, and that single split made everything downstream more controllable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mega-prompt confuses two different jobs
&lt;/h2&gt;

&lt;p&gt;A comic page is doing two unrelated things at the same time.&lt;/p&gt;

&lt;p&gt;One job is structural. How many panels are on the page. What each panel is about. Who is in it. What they are doing. Where the camera sits. What the dialogue is.&lt;/p&gt;

&lt;p&gt;The other job is visual. The actual drawing. Lighting. Style. Character likeness. Background detail. Lettering.&lt;/p&gt;

&lt;p&gt;These two jobs need different reasoning. Structure is closer to a writer's mental model. Rendering is closer to an illustrator's. Asking one prompt to do both forces the model to do both at once, and the result is usually a compromise that satisfies neither.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storyboard is cheap, rendering is expensive
&lt;/h2&gt;

&lt;p&gt;There is also a cost asymmetry that the mega-prompt ignores.&lt;/p&gt;

&lt;p&gt;Generating a structural storyboard, even with a strong language model, is fast and cheap. It is essentially a long-form structured response: panel count, panel descriptions, dialogue, camera notes.&lt;/p&gt;

&lt;p&gt;Generating the actual panel images is slow and expensive. Every retry costs real money and real time.&lt;/p&gt;

&lt;p&gt;If both happen inside one big prompt, every visual retry forces the structural decisions to be rolled too. That is wasteful, and it makes the workflow harder to debug. The user cannot tell whether the failure was a story problem or an image problem.&lt;/p&gt;

&lt;p&gt;Splitting them gives the system a chance to validate the cheap part before paying for the expensive part. The structural storyboard can be checked, edited, or regenerated quickly. Only when it is acceptable does the system commit to rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The user is the right person to gate the transition
&lt;/h2&gt;

&lt;p&gt;Even with a perfect model, the storyboard stage should usually be visible to the user.&lt;/p&gt;

&lt;p&gt;This sounds like extra friction, but it is exactly where the user wants control. People bring a specific story idea to a comic tool. They have opinions about pacing, about how a beat lands, about which panel should be a close-up. They do not have opinions about brush stroke density.&lt;/p&gt;

&lt;p&gt;A short, readable storyboard, presented as a list of panels with a one-line summary and the dialogue for each, gives them a place to spend that attention. They can tweak panel count, rewrite a line, swap a camera angle, before any image is generated.&lt;/p&gt;

&lt;p&gt;That is also the part of &lt;a href="https://www.comicory.com" rel="noopener noreferrer"&gt;Comicory&lt;/a&gt; that benefits the most from a fast iteration loop. Storyboard edits should feel like editing a doc, not like negotiating with an image model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendering inherits a clear contract
&lt;/h2&gt;

&lt;p&gt;Once the storyboard is settled, the rendering stage has a much smaller and clearer job.&lt;/p&gt;

&lt;p&gt;For each panel, it receives an explicit description, a character reference, a camera intent, and the dialogue that must fit. It does not have to invent the page structure or guess what the user meant. It just has to draw the one panel.&lt;/p&gt;

&lt;p&gt;That clean handoff makes character consistency easier. It makes panel composition easier. It makes targeted regeneration possible, because the storyboard remains the source of truth across retries.&lt;/p&gt;

&lt;p&gt;It also makes the system easier to reason about. If a panel renders badly, the question is just "did the rendering stage do its job for this panel description?" There is no ambiguity about whether the story intent was right.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in the product
&lt;/h2&gt;

&lt;p&gt;In Comicory the pipeline ends up roughly like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the user's story or prompt and produce a structural storyboard.&lt;/li&gt;
&lt;li&gt;Show the storyboard to the user so they can edit panel count, descriptions, and dialogue.&lt;/li&gt;
&lt;li&gt;Lock the storyboard.&lt;/li&gt;
&lt;li&gt;Render each panel against the locked storyboard, reusing the same character reference.&lt;/li&gt;
&lt;li&gt;Allow per-panel regeneration without changing the rest of the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step is its own product surface. Each can be improved on its own. The model does not have to be a comic genius. It just has to be reliable at each stage.&lt;/p&gt;

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

&lt;p&gt;The biggest mistake I see in AI comic demos is collapsing storyboard and rendering into one heroic prompt and then blaming the model when it fails.&lt;/p&gt;

&lt;p&gt;The model is not the bottleneck. The architecture is.&lt;/p&gt;

&lt;p&gt;Once storyboard and rendering are separated, the model becomes a much more useful collaborator. The user gets a real place to apply taste. The system gets a clean contract between stages. The retries get cheaper. The final page gets better.&lt;/p&gt;

&lt;p&gt;That is the kind of structural decision that does not show up in a flashy demo, but determines whether the product is actually usable for someone trying to make a real comic.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why I chose human-edited subtitles over AI auto-captions for vocabulary mining</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 16 May 2026 15:23:48 +0000</pubDate>
      <link>https://dev.to/qcrao/why-i-chose-human-edited-subtitles-over-ai-auto-captions-for-vocabulary-mining-3lig</link>
      <guid>https://dev.to/qcrao/why-i-chose-human-edited-subtitles-over-ai-auto-captions-for-vocabulary-mining-3lig</guid>
      <description>&lt;p&gt;When I was prototyping TubeVocab, the obvious shortcut was to use YouTube's auto-generated captions for every video. They are free, they exist on almost every clip, and the API gives them back instantly.&lt;/p&gt;

&lt;p&gt;I tried that path for a few weeks. It did not survive contact with real learners.&lt;/p&gt;

&lt;p&gt;The vocabulary mining experience depends on subtitle quality much more than on UI polish, and human-edited subtitles consistently beat auto-captions in ways that matter to ESL learners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto-captions get the easy words right
&lt;/h2&gt;

&lt;p&gt;For clean studio audio with a single speaker, auto-captions are good enough. A YouTuber sitting in front of a microphone reading a script will produce captions that match the spoken words at 95 percent accuracy or better.&lt;/p&gt;

&lt;p&gt;That accuracy collapses when the audio is messy. Two speakers overlap. Background music kicks in. A guest has a strong accent. A scene cuts to street noise. Suddenly the caption track misses half a sentence, merges words, or hallucinates filler.&lt;/p&gt;

&lt;p&gt;Those are exactly the moments where a learner needs the most help. Easy sentences they can already follow. The hard sentences are the ones that need clean subtitles to be saved as a flashcard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The errors hurt the learning loop more than the UI
&lt;/h2&gt;

&lt;p&gt;A wrong transcription is not just inconvenient. It silently teaches the wrong thing.&lt;/p&gt;

&lt;p&gt;If the speaker says "I could have told you," and the caption says "I could of told you," and the learner clicks the phrase to save as vocabulary, they save a piece of folk-grammar that does not exist in formal English. They will be confused later when a teacher marks it wrong.&lt;/p&gt;

&lt;p&gt;If the speaker says a specialized term and the caption substitutes a similar-sounding common word, the learner saves the wrong word entirely. Their flashcard deck quietly fills with noise.&lt;/p&gt;

&lt;p&gt;That is a worse failure than a missing caption. A missing caption means the learner moves on. A wrong caption means the learner trusts it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-edited subtitles encode rhythm
&lt;/h2&gt;

&lt;p&gt;There is a second, less obvious reason human subtitles are better.&lt;/p&gt;

&lt;p&gt;Auto-captions split lines mostly by silence detection. A human editor splits lines by meaning and reading rhythm. They group a phrase like "as a matter of fact" on a single line. They break before a clause boundary, not in the middle of a noun phrase.&lt;/p&gt;

&lt;p&gt;That rhythm matters for ESL learning because most of the value comes from reading the line as a chunk, not as isolated words. When I save a phrase from &lt;a href="https://www.tubevocab.com" rel="noopener noreferrer"&gt;TubeVocab&lt;/a&gt;, I want the natural unit a fluent speaker would say in one breath, not whatever the silence detector happened to align with.&lt;/p&gt;

&lt;p&gt;Human captions preserve those chunks. Auto-captions chop them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of better subtitles
&lt;/h2&gt;

&lt;p&gt;The downside is obvious. Human-edited subtitles do not exist for most YouTube videos.&lt;/p&gt;

&lt;p&gt;A lot of educational creators upload only auto-captions, or no captions at all. A learner who only watches the top 1 percent of curated channels gets perfect subtitles. A learner who watches whatever interests them gets a mixed bag.&lt;/p&gt;

&lt;p&gt;So in practice the system has to handle three cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The video has good human subtitles. Use them directly.&lt;/li&gt;
&lt;li&gt;The video has only auto-captions. Use them, but flag the line as machine-generated so the learner knows to double-check before saving a flashcard.&lt;/li&gt;
&lt;li&gt;The video has no subtitles. Either skip it or run a higher-quality transcription pass before exposing it as a vocabulary mining source.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interesting product question is the second case. It is not honest to pretend the captions are clean. It is also not useful to refuse to work at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I show the learner
&lt;/h2&gt;

&lt;p&gt;The compromise I landed on is to render the subtitles as usual, but mark auto-captions visually so the learner knows what they are looking at. When they hover or click to save a phrase, the saved card carries metadata about whether the source was human-edited or auto-generated.&lt;/p&gt;

&lt;p&gt;That changes how the system can treat the saved item later. A learner reviewing a phrase saved from a human-captioned video can trust the original text. A phrase saved from an auto-captioned video can be re-checked against the audio before being promoted into spaced repetition.&lt;/p&gt;

&lt;p&gt;This is more work than treating every caption as equally valid. But it matches reality, and it stops the flashcard deck from filling with subtle errors over months of use.&lt;/p&gt;

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

&lt;p&gt;The naive version of TubeVocab treated all YouTube subtitles as a uniform data source. The honest version treats them as a quality spectrum.&lt;/p&gt;

&lt;p&gt;For an ESL tool built on top of real videos, that distinction shows up everywhere: in the flashcards learners save, in the dictation lines they replay, in the sentences they trust as examples. A vocabulary tool is only as good as the text underneath it.&lt;/p&gt;

&lt;p&gt;That is why I now treat subtitle source quality as a first-class signal, not a free input I can use without thinking. It is one of the boring parts of building &lt;a href="https://www.tubevocab.com" rel="noopener noreferrer"&gt;TubeVocab&lt;/a&gt;, and one of the parts that quietly determines whether learners get value or get misled.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>sideprojects</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why single-panel editing matters more than perfect first-shot AI comics</title>
      <dc:creator>qcrao</dc:creator>
      <pubDate>Sat, 16 May 2026 15:08:17 +0000</pubDate>
      <link>https://dev.to/qcrao/why-single-panel-editing-matters-more-than-perfect-first-shot-ai-comics-o9p</link>
      <guid>https://dev.to/qcrao/why-single-panel-editing-matters-more-than-perfect-first-shot-ai-comics-o9p</guid>
      <description>&lt;p&gt;The biggest misunderstanding about AI comic generation is the expectation that the model should produce a finished page in one perfect pass.&lt;/p&gt;

&lt;p&gt;That is a nice demo. It is not how people actually make comics.&lt;/p&gt;

&lt;p&gt;Even with a strong image model, a comic page has too many fragile constraints: the character has to stay recognizable, the pose has to match the story beat, the camera angle has to vary, the background cannot contradict the previous panel, and the speech bubble has to leave enough room for readable text.&lt;/p&gt;

&lt;p&gt;One bad panel can ruin the page. That is why single-panel editing became one of the most important parts of Comicory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weak link is usually local
&lt;/h2&gt;

&lt;p&gt;When a generated comic page fails, it rarely fails everywhere.&lt;/p&gt;

&lt;p&gt;Panel 1 might have the right establishing shot. Panel 2 might capture the emotion. Panel 4 might land the joke. But panel 3 has the character facing the wrong direction, or the hand turns into an unreadable shape, or the room suddenly changes.&lt;/p&gt;

&lt;p&gt;Regenerating the entire page is wasteful. It throws away three good panels to fix one local problem.&lt;/p&gt;

&lt;p&gt;That matters for cost, but it matters even more for creative control. A user does not want to negotiate with the model from zero every time. They want to say: keep this page, fix this panel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency is easier when the edit boundary is small
&lt;/h2&gt;

&lt;p&gt;Character consistency is the headline problem in AI comics, but consistency is not only a model issue. It is also a workflow issue.&lt;/p&gt;

&lt;p&gt;If the whole page is regenerated, every panel has another chance to drift. The character's haircut changes. The jacket loses a stripe. The face becomes younger or older. The model may solve the original error while introducing two new ones.&lt;/p&gt;

&lt;p&gt;A smaller edit boundary reduces the blast radius. The system can preserve the panels that already work, reuse the same character reference, and focus the prompt on one scene.&lt;/p&gt;

&lt;p&gt;That is one reason &lt;a href="https://www.comicory.com" rel="noopener noreferrer"&gt;Comicory&lt;/a&gt; treats regeneration as a panel-level action instead of only a page-level action.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Good enough" needs a second pass
&lt;/h2&gt;

&lt;p&gt;Most AI image demos reward the first shot. You type a prompt, get a pretty image, and share it.&lt;/p&gt;

&lt;p&gt;Comics are different because they are sequential. A single pretty image is not enough. The panel must serve the story before and after it.&lt;/p&gt;

&lt;p&gt;A panel can be visually attractive and still fail the comic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The character looks away when the line implies direct confrontation.&lt;/li&gt;
&lt;li&gt;The camera repeats the same angle for three panels in a row.&lt;/li&gt;
&lt;li&gt;The mood is too dramatic for a small joke.&lt;/li&gt;
&lt;li&gt;The composition leaves no room for dialogue.&lt;/li&gt;
&lt;li&gt;The background implies a different location.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are editing problems. They need iteration, not just a better prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interface should assume revision
&lt;/h2&gt;

&lt;p&gt;Once I accepted that revision is normal, the product design changed.&lt;/p&gt;

&lt;p&gt;The important question became: how quickly can someone identify a weak panel, change only that panel, and keep the rest of the comic intact?&lt;/p&gt;

&lt;p&gt;That means the UI should make each panel feel addressable. The user should not have to restart from the story paragraph. They should be able to keep the script, keep the character identity, and adjust the one visual beat that missed.&lt;/p&gt;

&lt;p&gt;This also makes the tool less intimidating for non-artists. They do not need to understand model parameters. They just need a clear revision loop: pick panel, describe change, regenerate, compare.&lt;/p&gt;

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

&lt;p&gt;Perfect first-shot generation is still worth improving, but it is not the whole game.&lt;/p&gt;

&lt;p&gt;For real comic creation, control after generation is where the product starts to feel usable. Users forgive a model that needs one retry. They do not forgive a workflow that makes every retry destroy the parts they liked.&lt;/p&gt;

&lt;p&gt;That is why I now think of AI comic tools less like image vending machines and more like lightweight editing systems. The model creates the draft. The product decides whether the draft can become a finished comic without making the user fight the whole page again.&lt;/p&gt;

</description>
      <category>design</category>
    </item>
  </channel>
</rss>
