<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[議事之峰 The Gentleman Tech Bro: Agentic doodling]]></title><description><![CDATA[英文為主。This is my haphazard exploration of agentic AI workflows. You may encounter a salad of esoteric problems that I try to solve with AI. Consider yourself warned :) ]]></description><link>https://thegentlemantechbro.substack.com/s/agentic-doodling</link><image><url>https://substackcdn.com/image/fetch/$s_!Lkxc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68b5d5f7-e61b-4ee5-8eb1-ea67ef2c12d2_160x160.jpeg</url><title>議事之峰 The Gentleman Tech Bro: Agentic doodling</title><link>https://thegentlemantechbro.substack.com/s/agentic-doodling</link></image><generator>Substack</generator><lastBuildDate>Sun, 24 May 2026 07:03:55 GMT</lastBuildDate><atom:link href="https://thegentlemantechbro.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[議事之峰 The Gentleman Tech Bro]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[thegentlemantechbro@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[thegentlemantechbro@substack.com]]></itunes:email><itunes:name><![CDATA[議事之峰 The Gentleman Tech Bro]]></itunes:name></itunes:owner><itunes:author><![CDATA[議事之峰 The Gentleman Tech Bro]]></itunes:author><googleplay:owner><![CDATA[thegentlemantechbro@substack.com]]></googleplay:owner><googleplay:email><![CDATA[thegentlemantechbro@substack.com]]></googleplay:email><googleplay:author><![CDATA[議事之峰 The Gentleman Tech Bro]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Agentic doodling #1: Claude Code helps me learn my 5th language]]></title><description><![CDATA[&#65288;&#33258;&#35069;&#26085;&#25991; AI &#23416;&#32722;&#21161;&#25163;&#65289;Adopting new tech, learning Japanese; what fun!]]></description><link>https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps</link><guid isPermaLink="false">https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps</guid><dc:creator><![CDATA[議事之峰 The Gentleman Tech Bro]]></dc:creator><pubDate>Wed, 18 Feb 2026 03:11:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ESac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Daaaamn I actually managed to combine my professional skills and amateur interest: using <a href="https://code.claude.com/docs/en/quickstart">Claude Code</a>, I made a web app to better learn Japanese <em>katakana</em> &#65288;&#29255;&#20206;&#21517;&#65289;. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ESac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ESac!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ESac!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ESac!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ESac!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ESac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1283095,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thegentlemantechbro.substack.com/i/187613264?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ESac!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ESac!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ESac!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ESac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94901102-0428-4872-b720-391cba7bf6ef_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://ollama.com/x/z-image-turbo">AI-generated</a> image, 6B models are dumb but I tried. Prompt: &#8220;A Japanese kana, say &#12354;, wreathed in otherworldly smoke, has phoenix wings on its back, rising from a tablet computer. Other than the phoenix wings, keep colors simple and non-vibrant. The focus should be on the kana.&#8221; </figcaption></figure></div><p> The app draws a random Japanese word from a predefined list, and asks me to type the <em>romaji</em> (romanization) of the word. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>For example, &#12507;&#12486;&#12523; = ho-te-ru which means &#8220;hotel&#8221;. Simple, right?</p><p>Turns out I had to navigate waves of challenges before reaching my goal. Here is the story of me learning Japanese and agentic AI workflows simultaneously.</p><h3>3-point summary, human crafted ;)</h3><ul><li><p>GenAI helps experts soar while entrapping amateurs in pipe dreams.</p></li><li><p>As soon as I ventured into areas beyond my tech expertise, AI hallucinations and my inability to diagnose errors began hindering the development process. </p></li><li><p>Nonetheless, agentic AI sped up development by 3-5x. Time to a Minimal Viable Product stands: 8 hours. </p><ul><li><p>Model chosen: <a href="https://ollama.com/library/gpt-oss">gpt-oss-120b</a> through <a href="https://docs.ollama.com/cloud">Ollama cloud</a>. </p></li><li><p>Yes, you can use Claude Code without <a href="https://claude.ai/">Claude</a> aka Anthropic&#8217;s proprietary LLM. Henceforth in this article, &#8220;Claude&#8221; is short for &#8220;Claude Code&#8221;.</p></li></ul></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thegentlemantechbro.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Wave 1: choose a tech stack (easy, right?)</h2><h4><strong>THE CATCH</strong></h4><p>I knew <em><strong>nothing</strong></em> about writing web apps before starting this project. As a data scientist I may have created the occasional <a href="https://streamlit.io/">Streamlit</a> app, but that experience is too infrequent to provide a mental model for &#8220;what to do&#8221; in general.</p><h4><strong>THE SOLUTION</strong></h4><p>I<strong> </strong>set Claude to <a href="https://code.claude.com/docs/en/common-workflows#how-to-use-plan-mode">Planning Mode</a> and asked it to consider web app frameworks that are 1) beginner-friendly; 2) suitable for local deployment. It settled on <a href="https://flask.palletsprojects.com/en/stable/">Flask</a> and rejected Streamlit, because of Flask&#8217;s minimalist nature.</p><p>Personally I think it is OK delegate the choice of framework to Claude, because&#8212;</p><ol><li><p>it is likely more knowledgeable than a <em><strong>complete</strong></em> novice like me;</p></li><li><p>the justifications are easily verifiable.</p></li></ol><p>Then, whenever I ran into bugs, I first let Claude identify their origin&#8212;and then pushed myself to <em>manually inspect and maybe fix them</em>. At first I tried to stay entirely within Claude for my workflow, but it was unable to fix many runtime issues that show up <em>visually</em> .</p><p>Maybe I should have given Claude access to my screen; the most it can see are diagnostic and error messages on the terminal. However being the Luddite that I am, that is <em>not</em> going to happen in the foreseeable future.</p><p>Nonetheless, the knowledge distilled from manual bug fixing has helped me understand my app and Flask better.</p><h4><strong>THE OUTCOME</strong></h4><blockquote><p><em><a href="https://flask.palletsprojects.com/en/stable/">Flask</a> app running locally on a given port, accessible through a browser</em></p></blockquote><p>Decorated Python functions in <code>main.py </code>provide all functionalities. For example, Claude decided that <code>sample()</code> would handle POST requests to <code>/check</code>.</p><pre><code>@app.route(&#8221;/check&#8221;, methods=[&#8221;POST&#8221;])
def sample()
    ...[Determine correctness of user input]...</code></pre><p>The visual interface, on other hand, is provided by Claude-generated HTML+CSS, within which are buttons that trigger GET requests to different parts of the app e.g., <code>/check</code>, <code>/reset.</code></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thegentlemantechbro.substack.com/p/agentic-doodling-1-claude-code-helps?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thegentlemantechbro.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Wave 2: hiccups in Japanese &#8212; the AI&#8217;s and mine</h2><h4><strong>THE CATCH</strong></h4><p>By my own design, I am supposed to provide the app with a list of Japanese words and their &#8220;ground-truth&#8221; <em>romaji</em> or romanization. The app then checks user input against the <em>romaji </em>of each word, and indicates &#8220;correct&#8221; vs &#8220;wrong&#8221;.</p><p>In practice, 60% of the list was generated by an LLM during development. Automation, yay?</p><p>The problem is &#8230; <em>I</em> don&#8217;t know how to express certain common sounds in <em>romaji</em>. To make matters worse, the LLM I chose isn&#8217;t completely solid or consistent on the subject either.</p><p>For example &#8212; &#12364;&#12387;&#12371;&#12358;&#65288;&#23398;&#26657;&#12289;school&#65289;where &#12387; is <strong>silent</strong> and indicates a brief pause. How do you indicate silence on a keyboard?</p><p>Another example&#8212; &#12365;&#12423;&#12358;&#65288;&#20170;&#26085;&#12289;today&#65289;where the small &#12424; assimilates into the preceding &#12365;. Am I supposed to type them as separate kana or some amalgamated version? </p><h4><strong>THE SOLUTION</strong></h4><p>Turns out, non-GenAI expert systems contain the requisite knowledge. I just need to tease it out of them.</p><p>My computer&#8217;s built-in Japanese input method came to rescue. With some trial-and-error I identified the multitude of letter combinations that produce the desired words and sounds. </p><p>Google Translate served as an addition source of knowledge For example, it represents &#12364;&#12387;&#12371;&#12358;&#65288;&#23398;&#26657;&#12289;school&#65289;as <em>gakko</em>, where the silent <em>tsu </em>&#12387; became the first of the two <em>k</em>&#8217;s. </p><p>It turns out to be a pattern: silent &#12387; &#8594; double the non-consonant letter of the next kana; in this case <em>ko </em>&#12371;. Once I can confidently type out similar words, I included them in my app.</p><h4><strong>THE OUTCOME</strong></h4><p>13 words in <em>hiragana</em> and <em>katakana</em>, respectively, giving a total of 26 words. </p><p>It is by no means scalable. I will find a way to teach an LLM to consistently notate <em>romaji</em>.</p><div><hr></div><h2>Wrapping up: model choice, good practices</h2><p>After overcoming Waves 1 and 2, I have arrived at a Minimal Viable &#8220;Product&#8221;&#8212; of which a screen recording can be found at the top or right below.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f978f483-8b7d-49f3-af82-d51ca4dc9b1b&quot;,&quot;duration&quot;:null}"></div><p>The whole exercise is a novice&#8217;s attempt to learn both Japanese and agentic AI workflows. Let me end this post with lessons I gleaned from building the web app.</p><ol><li><p><strong>I used <a href="https://ollama.com/library/gpt-oss">gpt-oss-120b</a> through <a href="https://docs.ollama.com/cloud">Ollama cloud</a>, and I now wonder if that is the most cost-effective option.</strong> </p><ol><li><p>While cheap relative to my usage&#8212;the Free plan is enough for a couple hours of hacking each day&#8212;it did hallucinate a few times, claiming to have accomplished things whilst sitting on its ass, sprouting confident BS.</p></li><li><p>Anthropic has just <a href="https://claude.com/blog/improved-web-search-with-dynamic-filtering">updated</a> Claude models to achieve the same outcomes with less agentic iterations and therefore tokens. In a nutshell: replacing a linear agentic loop with simultaneous instances of code writing + tool use <em>before</em> injecting context into an LLM.</p></li></ol></li><li><p><strong>Regardless of LLM chosen, it helps to /clear context and restart the chat at every &#8220;phase&#8221; of development.</strong> </p><ol><li><p>The purpose is to avoid encumbering the LLM with irrelevant context. This is especially important if you have a somewhat &#8220;dumb&#8221; model.</p></li><li><p>The break points could be the transition from planning to initial implementation; or it could be as simple as adding a new feature.</p></li><li><p>My unscientific heuristic: clear context before it gets 50% full.</p></li></ol></li></ol><p>And finally, be patient! This is new technology, bugs and hiccups are bound to crop up eventually. </p><p>Focus on boosting output while retaining human-in-the-loop. That, is how we grow creative and productive without incurring brain rot.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thegentlemantechbro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>