<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>oharu tech blog</title><description>Notes on Astro, TypeScript, AWS, and agentic tooling.</description><link>https://oharu121.com/</link><language>en-US</language><item><title>Dependabot minimum release age and auto-merge — the trap in a private repo</title><link>https://oharu121.com/blog/dependabot-minimum-release-age-auto-merge-private-repo/</link><guid isPermaLink="true">https://oharu121.com/blog/dependabot-minimum-release-age-auto-merge-private-repo/</guid><description>On a private repo the dependency graph is off by default, so Dependabot opened no npm pull request, and the auto-merge workflow merged 45s before CI finished.</description><pubDate>Mon, 17 Aug 2026 13:20:29 GMT</pubDate></item><item><title>Astro article badges from Vercel Web Analytics — resolved in the build, shipped as static HTML</title><link>https://oharu121.com/blog/astro-build-time-vercel-analytics-popular-article-badges/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-build-time-vercel-analytics-popular-article-badges/</guid><description>How this Astro blog badges its most-read articles: one Vercel Web Analytics query during the build, summed across three locales, baked into static HTML.</description><pubDate>Mon, 17 Aug 2026 09:00:50 GMT</pubDate></item><item><title>CLAUDE_PROJECT_DIR let me move my glossary out of a Claude Code skill — and stop approving every write</title><link>https://oharu121.com/blog/claude-code-project-dir-skill-glossary-approval-prompts/</link><guid isPermaLink="true">https://oharu121.com/blog/claude-code-project-dir-skill-glossary-approval-prompts/</guid><description>Claude Code treats .claude/ as a protected path, so allow rules cannot pre-approve writes there. Moving a mutable glossary out with CLAUDE_PROJECT_DIR.</description><pubDate>Mon, 17 Aug 2026 01:58:35 GMT</pubDate></item><item><title>How do Chrome DevTools MCP and Playwright MCP differ, and why I chose Chrome DevTools for my Astro blog</title><link>https://oharu121.com/blog/chrome-devtools-mcp-vs-playwright-mcp-astro-blog/</link><guid isPermaLink="true">https://oharu121.com/blog/chrome-devtools-mcp-vs-playwright-mcp-astro-blog/</guid><description>Chrome DevTools MCP and Playwright MCP expose different surfaces to a coding agent. What each gives you, and why an Astro blog kept one and denied the other.</description><pubDate>Sun, 16 Aug 2026 13:35:56 GMT</pubDate></item><item><title>A static Astro blog that counts likes — one Vercel route and Upstash Redis</title><link>https://oharu121.com/blog/astro-like-counter-upstash-redis-vercel-serverless-route/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-like-counter-upstash-redis-vercel-serverless-route/</guid><description>Adding a shared like counter to a fully static Astro site: one non-prerendered route, Upstash Redis key design, and the CI bugs that verifying it cost.</description><pubDate>Sun, 16 Aug 2026 07:27:12 GMT</pubDate></item><item><title>How I made Japanese search work by intercepting Pagefind&apos;s Enter key in the capture phase</title><link>https://oharu121.com/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</link><guid isPermaLink="true">https://oharu121.com/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</guid><description>Pagefind navigated away while an IME conversion was open. isComposing is necessary but not sufficient: WebKit fires compositionend before the keydown.</description><pubDate>Sat, 15 Aug 2026 14:03:15 GMT</pubDate></item><item><title>How I made Astro figures size themselves and enlarge on tap — intrinsic width, a native dialog, and @2x</title><link>https://oharu121.com/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</guid><description>Why width:100% blurred a 256px screenshot in Astro, and how a native dialog made every diagram readable on a phone. Seven measurements corrected the design.</description><pubDate>Sat, 15 Aug 2026 00:17:03 GMT</pubDate></item><item><title>Pagefind&apos;s stemming warning was a red herring — Japanese search broke on segmentation</title><link>https://oharu121.com/blog/pagefind-stemming-vs-segmentation-japanese-search-red-herring/</link><guid isPermaLink="true">https://oharu121.com/blog/pagefind-stemming-vs-segmentation-japanese-search-red-herring/</guid><description>Pagefind warned about missing stemming for Japanese and Chinese on every build. The real defect was a query and index tokenizer mismatch returning wrong pages.</description><pubDate>Fri, 14 Aug 2026 06:21:55 GMT</pubDate></item><item><title>git gc recovered 8.6 MB while I was investigating a 0.8 MB problem in git history</title><link>https://oharu121.com/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</link><guid isPermaLink="true">https://oharu121.com/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</guid><description>Chasing 1.6 MB of PNG blobs in git history found a repo that had never been packed. git gc recovered 8.6 MB; the rewrite I skipped was worth 0.8 MB.</description><pubDate>Thu, 13 Aug 2026 15:04:22 GMT</pubDate></item><item><title>Astro share buttons that pick their targets by language — a sticky rail on desktop, pills on mobile</title><link>https://oharu121.com/blog/astro-share-buttons-intent-urls-per-locale-targets/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-share-buttons-intent-urls-per-locale-targets/</guid><description>Share buttons in Astro built from intent URLs: a different target set per locale, a sticky icon rail on wide screens, and the endpoint drift found on the way.</description><pubDate>Thu, 13 Aug 2026 11:20:42 GMT</pubDate></item><item><title>Playwright as a measuring instrument — the i18n defect no static check can reach</title><link>https://oharu121.com/blog/playwright-i18n-svg-label-overflow-render-check/</link><guid isPermaLink="true">https://oharu121.com/blog/playwright-i18n-svg-label-overflow-render-check/</guid><description>Measuring translated SVG labels against their boxes with Playwright, and the two bugs that made the check report 37 pages clean while measuring nothing.</description><pubDate>Thu, 13 Aug 2026 01:21:47 GMT</pubDate></item><item><title>An Astro table of contents that keeps your place — scroll-spy, a shared rail, and dvh on mobile</title><link>https://oharu121.com/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</guid><description>Follow-the-reader scrolling, a shared rail, and the ::details-content box that silently ate a mobile max-height in an Astro table of contents.</description><pubDate>Thu, 13 Aug 2026 01:03:19 GMT</pubDate></item><item><title>Expressive Code in an Astro blog — filename tabs, file icons, and 97 unreadable fences</title><link>https://oharu121.com/blog/astro-expressive-code-snippet-ui-filename-tabs-file-icons/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-expressive-code-snippet-ui-filename-tabs-file-icons/</guid><description>Adopting Expressive Code in Astro 7: filename tabs, per-theme file icons, a Sätteri processor trap, and 97 fences Shiki was reading as a language name.</description><pubDate>Wed, 12 Aug 2026 13:12:24 GMT</pubDate></item><item><title>How a chain of failures produced the LLM (part 2) — from attention to the scaling revolution and alignment</title><link>https://oharu121.com/blog/llm-birth-history-turing-shannon-transformer-gpt3-part2/</link><guid isPermaLink="true">https://oharu121.com/blog/llm-birth-history-turing-shannon-transformer-gpt3-part2/</guid><description>From context to the finished LLM: the limits of RNNs, the birth of attention, the Transformer, GPT-3 scaling, RLHF alignment, and the era of efficiency.</description><pubDate>Wed, 12 Aug 2026 01:25:21 GMT</pubDate></item><item><title>How a chain of failures produced the LLM (part 1) — from the limits of maths to the geometry of meaning</title><link>https://oharu121.com/blog/llm-birth-history-turing-shannon-perceptron-word2vec-part1/</link><guid isPermaLink="true">https://oharu121.com/blog/llm-birth-history-turing-shannon-perceptron-word2vec-part1/</guid><description>The LLM as a by-product of unrelated problems: Turing on computability, Shannon on information, the perceptron, backpropagation, GPUs, and Word2Vec.</description><pubDate>Tue, 11 Aug 2026 13:23:50 GMT</pubDate></item><item><title>RAG vs fine-tuning for KB search — what fine-tuning actually learns, and when pure IR wins</title><link>https://oharu121.com/blog/rag-vs-finetuning-kb-search/</link><guid isPermaLink="true">https://oharu121.com/blog/rag-vs-finetuning-kb-search/</guid><description>Whether fine-tuning can replace RAG for knowledge base search: what fine-tuning actually learns, when pure IR or long context wins, and what each costs.</description><pubDate>Tue, 11 Aug 2026 06:07:58 GMT</pubDate></item><item><title>The HTTP QUERY method (RFC 10008) implemented in Python — how it differs from GET and POST</title><link>https://oharu121.com/blog/http-query-method-rfc10008-python-demo/</link><guid isPermaLink="true">https://oharu121.com/blog/http-query-method-rfc10008-python-demo/</guid><description>Implementing RFC 10008 HTTP QUERY in Python with Starlette: safe, idempotent, cacheable requests with a structured body, and how it complements GraphQL.</description><pubDate>Mon, 10 Aug 2026 15:47:19 GMT</pubDate></item><item><title>Deterministic AI agent tests with AIMock — mocking LLMs, vector DBs, MCP, and A2A on one port</title><link>https://oharu121.com/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</link><guid isPermaLink="true">https://oharu121.com/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</guid><description>AIMock mocks the whole AI stack on one port (LLM, vector DB, MCP, A2A), so an agent test suite runs in under three seconds with identical output every time.</description><pubDate>Mon, 10 Aug 2026 09:10:57 GMT</pubDate></item><item><title>Five rounds to a blog logo with an AI agent — the /logo skill and three scripts they left behind</title><link>https://oharu121.com/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</link><guid isPermaLink="true">https://oharu121.com/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</guid><description>Redesigning this blog&apos;s logo and code font with an AI agent: a broken SVG letterform, a regex bounding box, a wrong kanji, and the /logo skill it produced.</description><pubDate>Mon, 10 Aug 2026 05:33:43 GMT</pubDate></item><item><title>Autoregressive vs diffusion image generation — how gpt-image-1 and DALL-E 3 differ</title><link>https://oharu121.com/blog/autoregressive-vs-diffusion-image-generation-2026/</link><guid isPermaLink="true">https://oharu121.com/blog/autoregressive-vs-diffusion-image-generation-2026/</guid><description>Why gpt-image-1 and DALL-E 3 differ: autoregressive tokens vs iterative denoising, the discrete-vs-continuous wall, DiT, and the three-way 2026 market.</description><pubDate>Sun, 09 Aug 2026 16:17:48 GMT</pubDate></item><item><title>A 2 MB PNG became 316 KB WebP — but only before the first commit</title><link>https://oharu121.com/blog/png-to-webp-before-the-first-commit/</link><guid isPermaLink="true">https://oharu121.com/blog/png-to-webp-before-the-first-commit/</guid><description>Measuring PNG, JPEG and WebP for article figures, why re-compressing the PNG made it larger, and why converting an image git already tracks reclaims nothing.</description><pubDate>Sun, 09 Aug 2026 13:12:05 GMT</pubDate></item><item><title>Astro content collections instead of a CMS — MDX over Markdown, and where the foreign keys went</title><link>https://oharu121.com/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</link><guid isPermaLink="true">https://oharu121.com/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</guid><description>Why this trilingual Astro blog has no CMS: the directory layout images forced, MDX over Markdown, and a tag registry standing in for foreign keys.</description><pubDate>Mon, 03 Aug 2026 15:50:42 GMT</pubDate></item><item><title>A2A vs MCP — why agent-to-agent needs its own protocol, and why both chose HTTP over gRPC</title><link>https://oharu121.com/blog/a2a-mcp-complementary-agent-protocol-design/</link><guid isPermaLink="true">https://oharu121.com/blog/a2a-mcp-complementary-agent-protocol-design/</guid><description>Why MCP alone is not enough for agent-to-agent communication: peer equality, Agent Card discovery, async task state, and why both protocols chose HTTP.</description><pubDate>Mon, 13 Jul 2026 03:00:00 GMT</pubDate></item></channel></rss>