# Kirin Blog > A bilingual personal blog covering practical software development, AI, cloud infrastructure, and home automation. ## Site - Home: https://kirinnoblog.work/en - Sitemap: https://kirinnoblog.work/sitemap.xml - RSS: https://kirinnoblog.work/rss.xml?lang=en - Robots: https://kirinnoblog.work/robots.txt - ads.txt: https://kirinnoblog.work/ads.txt ## Main sections - Archive: https://kirinnoblog.work/en/archive - Contact: https://kirinnoblog.work/en/contact - Tag Cloudflare: https://kirinnoblog.work/en/tags/Cloudflare - Tag Next.js: https://kirinnoblog.work/en/tags/Next.js - Tag D1: https://kirinnoblog.work/en/tags/D1 - Tag SQLite: https://kirinnoblog.work/en/tags/SQLite - Tag ブログ運営: https://kirinnoblog.work/en/tags/%E3%83%96%E3%83%AD%E3%82%B0%E9%81%8B%E5%96%B6 - Tag 運用: https://kirinnoblog.work/en/tags/%E9%81%8B%E7%94%A8 - Tag IoT: https://kirinnoblog.work/en/tags/IoT - Tag ホーム自動化: https://kirinnoblog.work/en/tags/%E3%83%9B%E3%83%BC%E3%83%A0%E8%87%AA%E5%8B%95%E5%8C%96 - Tag AdSense: https://kirinnoblog.work/en/tags/AdSense - Tag AI Agent: https://kirinnoblog.work/en/tags/AI%20Agent - Tag FTS5: https://kirinnoblog.work/en/tags/FTS5 - Tag Herdr: https://kirinnoblog.work/en/tags/Herdr - Tag Raspberry Pi: https://kirinnoblog.work/en/tags/Raspberry%20Pi - Tag SEO: https://kirinnoblog.work/en/tags/SEO - Tag Vinext: https://kirinnoblog.work/en/tags/Vinext - Tag 安全設計: https://kirinnoblog.work/en/tags/%E5%AE%89%E5%85%A8%E8%A8%AD%E8%A8%88 - Tag 検索: https://kirinnoblog.work/en/tags/%E6%A4%9C%E7%B4%A2 - Tag AdBlock: https://kirinnoblog.work/en/tags/AdBlock - Tag AI: https://kirinnoblog.work/en/tags/AI - Tag bigram: https://kirinnoblog.work/en/tags/bigram - Tag Claude Code: https://kirinnoblog.work/en/tags/Claude%20Code - Tag Clawpatch: https://kirinnoblog.work/en/tags/Clawpatch - Tag Codex: https://kirinnoblog.work/en/tags/Codex - Tag Cookie同意: https://kirinnoblog.work/en/tags/Cookie%E5%90%8C%E6%84%8F - Tag Crawl4AI: https://kirinnoblog.work/en/tags/Crawl4AI - Tag Git: https://kirinnoblog.work/en/tags/Git - Tag Google Analytics 4: https://kirinnoblog.work/en/tags/Google%20Analytics%204 - Tag Google Search Console: https://kirinnoblog.work/en/tags/Google%20Search%20Console - Tag Hermes Agent: https://kirinnoblog.work/en/tags/Hermes%20Agent - Tag Husky: https://kirinnoblog.work/en/tags/Husky - Tag Jarvis: https://kirinnoblog.work/en/tags/Jarvis - Tag M5Stack: https://kirinnoblog.work/en/tags/M5Stack - Tag Nix: https://kirinnoblog.work/en/tags/Nix - Tag R2: https://kirinnoblog.work/en/tags/R2 - Tag React: https://kirinnoblog.work/en/tags/React - Tag SearXNG: https://kirinnoblog.work/en/tags/SearXNG - Tag sitemap: https://kirinnoblog.work/en/tags/sitemap - Tag SPA: https://kirinnoblog.work/en/tags/SPA - Tag SSH: https://kirinnoblog.work/en/tags/SSH - Tag Turnstile: https://kirinnoblog.work/en/tags/Turnstile - Tag TypeScript: https://kirinnoblog.work/en/tags/TypeScript - Tag wrangler: https://kirinnoblog.work/en/tags/wrangler - Tag アーキテクチャ: https://kirinnoblog.work/en/tags/%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3 - Tag アクセス解析: https://kirinnoblog.work/en/tags/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A7%A3%E6%9E%90 - Tag インデックス: https://kirinnoblog.work/en/tags/%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9 - Tag エアコン: https://kirinnoblog.work/en/tags/%E3%82%A8%E3%82%A2%E3%82%B3%E3%83%B3 - Tag セキュリティ: https://kirinnoblog.work/en/tags/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3 - Tag データベース: https://kirinnoblog.work/en/tags/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9 - Tag テスト: https://kirinnoblog.work/en/tags/%E3%83%86%E3%82%B9%E3%83%88 - Tag デプロイ: https://kirinnoblog.work/en/tags/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4 - Tag フロントエンド: https://kirinnoblog.work/en/tags/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89 - Tag リファクタリング: https://kirinnoblog.work/en/tags/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0 - Tag リモート開発: https://kirinnoblog.work/en/tags/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E9%96%8B%E7%99%BA - Tag 全文検索: https://kirinnoblog.work/en/tags/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2 - Tag 品質管理: https://kirinnoblog.work/en/tags/%E5%93%81%E8%B3%AA%E7%AE%A1%E7%90%86 - Tag 実装記録: https://kirinnoblog.work/en/tags/%E5%AE%9F%E8%A3%85%E8%A8%98%E9%8C%B2 - Tag 家庭菜園: https://kirinnoblog.work/en/tags/%E5%AE%B6%E5%BA%AD%E8%8F%9C%E5%9C%92 - Tag 広告: https://kirinnoblog.work/en/tags/%E5%BA%83%E5%91%8A - Tag 技術スタック: https://kirinnoblog.work/en/tags/%E6%8A%80%E8%A1%93%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF - Tag 技術メモ: https://kirinnoblog.work/en/tags/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2 - Tag 温度管理: https://kirinnoblog.work/en/tags/%E6%B8%A9%E5%BA%A6%E7%AE%A1%E7%90%86 - Tag 画像配信: https://kirinnoblog.work/en/tags/%E7%94%BB%E5%83%8F%E9%85%8D%E4%BF%A1 - Tag 自動水やり: https://kirinnoblog.work/en/tags/%E8%87%AA%E5%8B%95%E6%B0%B4%E3%82%84%E3%82%8A - Tag 認証: https://kirinnoblog.work/en/tags/%E8%AA%8D%E8%A8%BC - Tag 赤外線: https://kirinnoblog.work/en/tags/%E8%B5%A4%E5%A4%96%E7%B7%9A - Tag 開発メモ: https://kirinnoblog.work/en/tags/%E9%96%8B%E7%99%BA%E3%83%A1%E3%83%A2 - Tag 開発環境: https://kirinnoblog.work/en/tags/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83 - Tag 音声アシスタント: https://kirinnoblog.work/en/tags/%E9%9F%B3%E5%A3%B0%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88 - Tag 風呂自動化: https://kirinnoblog.work/en/tags/%E9%A2%A8%E5%91%82%E8%87%AA%E5%8B%95%E5%8C%96 ## Posts - Google Analytics 4 for Next.js: Consent, SPA Views, and Verification: https://kirinnoblog.work/en/posts/google-analytics-4-nextjs-blog-setup — Create a GA4 property and web data stream, configure the Measurement ID, gate loading on consent, prevent duplicate SPA page views, and verify the result in DebugView. - Google Search Console for Next.js: Ownership, Sitemap, URL Inspection: https://kirinnoblog.work/en/posts/google-search-console-nextjs-blog-setup — Verify a Next.js blog in Search Console, submit its bilingual sitemap, inspect URLs, and read performance without treating submission as an indexing guarantee. - A Japanese Bigram Index on D1 and FTS5: https://kirinnoblog.work/en/posts/d1-fts5-japanese-bigram-index — How normalized adjacent pairs are written to D1 FTS5 with a changes() guard, a separate restore builder, and snapshot-preserving backfill. - Using Herdr over SSH: Keep AI Agents Running on a Remote Server: https://kirinnoblog.work/en/posts/herdr-remote-ssh-persistent-agents — A primary-source guide to Herdr background sessions, detach, named sessions, and SSH remote attach for keeping AI coding agents running on a server. - Herdr for Claude Code and Codex: A Practical Guide: https://kirinnoblog.work/en/posts/herdr-ai-agent-terminal-multiplexer-guide — A primary-source introduction to Herdr for organizing Claude Code and Codex in workspaces, tabs, and panes, with installation, controls, and practical workflows. - Building a Trustworthy Jarvis Home Agent: https://kirinnoblog.work/en/posts/jarvis-home-agent-real-world-design — A field report on separating command transmission, software-known state, and physical verification across calendar, voice, and household-device workflows. - Garden Watering Safety: Sensors, Pumps, and Stop Conditions: https://kirinnoblog.work/en/posts/home-garden-automatic-watering-safety — A pre-automation safety review of M5Stack Unit Watering: calibration, short supervised trials, stop conditions, and unresolved hardware limits. - Air-Conditioner Control Design in One-Degree Steps: https://kirinnoblog.work/en/posts/air-conditioner-automation-temperature-control — An experimental one-degree control policy for one room, separating infrared transmission, assumed state, physical reception, and measured cooling. - Bath Automation Safety: Observe State Before Toggling: https://kirinnoblog.work/en/posts/bath-automation-state-safety — Why unknown-state toggles must not be retried, and why an unapproved remote prototype needs observation, explicit stopping, and supervised use. - Image Delivery with Next.js 16, Vinext, and Cloudflare R2: https://kirinnoblog.work/en/posts/nextjs-vinext-r2-image-delivery — Trace the production media pipeline from authenticated upload and WebP conversion through temporary R2, D1 claims, content-hash promotion, and same-origin delivery. - D1 Has No Down Migrations: A Forward-Only Recovery Strategy: https://kirinnoblog.work/en/posts/d1-forward-only-migration-rollback — The Wrangler D1 migration CLI has no down command. Use forward fixes, whole-database Time Travel, and schema compatibility without rewriting history. - Hydration-Safe UI with useSyncExternalStore: https://kirinnoblog.work/en/posts/usesyncexternalstore-hydration-safe-ui — A source-verified guide to hydration snapshots, stable subscriptions, and this blog’s cross-tab cookie-consent store. - No-Routes Worker Deploys: Verify the Active Version: https://kirinnoblog.work/en/posts/wrangler-versions-deploy-verification — For no-routes version uploads, verify the traffic allocation after versions deploy and require the intended Worker version to reach 100% before completion. - Admin Login with Turnstile, Email OTP, and a Code Fallback: https://kirinnoblog.work/en/posts/passwordless-admin-login-turnstile-otp — A source-aligned guide to request-bound Turnstile validation, D1-backed OTP throttling, a reusable code fallback, signed sessions, and remaining enumeration risks. - Japanese Full-Text Search on D1 with FTS5 Trigram: https://kirinnoblog.work/en/posts/d1-fts5-japanese-full-text-search — A D1 search route using LIKE for one or gramless two code points, bigram for valid pairs, trigram for longer terms, and path-specific fallbacks. - Building a Next.js Blog on Cloudflare Workers and D1: https://kirinnoblog.work/en/posts/cloudflare-workers-d1-nextjs-blog — A case study of this blog: architecture and design decisions for Cloudflare Workers, D1, R2, and a Next.js-compatible vinext runtime. - Six Guardrails for a Safe Next.js Blog Refactor: https://kirinnoblog.work/en/posts/refactoring-without-breaking — Six guardrails for safe refactoring: focused tests, fail-loud deploys, D1 forward recovery, small commits, and one full pre-push gate. - A Non-Blocking Ad-Block Notice with Bounded Detection: https://kirinnoblog.work/en/posts/adblock-gate-blog-method — How bait state, script lifecycle, grace periods, and bounded observers detect ad-delivery failures while keeping the article readable and offering retry or dismiss actions. - Two-stage commit and push gates with Husky and Clawpatch: https://kirinnoblog.work/en/posts/clawpatch-husky-prepush — The two-stage Husky gates used by this CMS: formatting, types, tests, and secret checks at commit time; structure, E2E, dependency audit, and review before push. - Operating D1 site search with FTS5: trigram, bigram, and LIKE: https://kirinnoblog.work/en/posts/fts5-trigram-bigram-search — An operations record for isolated public site search that selects LIKE, bigram, or trigram by normalized query shape without merging result sets. - This Blog's Stack: Next.js 16, Vinext, SearXNG, Crawl4AI: https://kirinnoblog.work/en/posts/kirin-blog-tech-stack-nextjs16-vinext-searxng-crawl4ai — An overview of the stack behind this blog: Next.js 16, Vinext, Cloudflare Workers, D1/R2, and admin-side SearXNG/Crawl4AI. - AdSense Publisher IDs, Slot IDs, and ads.txt: https://kirinnoblog.work/en/posts/adsense-slot-id-guide — A code-based guide to separating publisher IDs, ad-unit slot IDs, and ads.txt seller records, then verifying each source without claiming approval or fill. ## LLM usage notes - This is the English edition of a bilingual personal blog/CMS with CLI shell styling. - English article pages are canonical at /en/posts/; alternate-language pages use /ja/posts/. - Prefer sitemap.xml and RSS for complete crawling.