[ WRITING ]
Blogs
Notes on backend systems, AI automation, integrations, and content architecture.
[Sep 2026]
My Portfolio Became a Content System
How I split editorial content, UI text, Content Media, and Design Assets so each system owns what it can change.SanityAstroContent ArchitectureTypeScriptCloudflare[Sep 2026]
One Content Contract Across System Boundaries
How one Content Contract keeps Sanity, Snapshot Query, and Astro aligned without coupling their implementations.TypeScriptZodSanityGROQArchitecture[Sep 2026]
The Display Content Seam That Kept Astro Pages Small
Why a render-ready Display Content seam keeps route resolution, media preparation, featured selection, and page chrome out of Astro pages.AstroTypeScriptSanityArchitectureFrontend[Sep 2026]
Rich Content Without a Page Builder
How Portable Text provides rich editorial writing while keeping layout decisions in the frontend instead of the CMS.SanityPortable TextAstroContent ArchitectureTypeScript[Sep 2026]
Fresh Content Without Runtime CMS Reads
How publish-triggered builds keep a static Astro site fresh without making every public request depend on Sanity.AstroSanityCloudflareGitHub ActionsStatic Generation[Sep 2026]
Why I Deleted a Publish Pipeline Before Launch
Why I removed a pre-launch Publish Gate Worker and kept only the Snapshot Query and validation logic the portfolio needed.Cloudflare WorkersSanityGitHub ActionsArchitectureYAGNI[Jun 2026]
Taming AI Support Bots with a Retrieval Confidence Gate
How deterministic distance-threshold gating stops out-of-domain hallucinations before the LLM ever gets called.PythonRAGChromaDBGeminiAISupport Automation[May 2025]
What I Learned Building a Multi-Domain Triage Agent with Google ADK and Local RAG
ADK limitations, embedding model tradeoffs, and why sequential multi-agent pipelines beat single-step structured output for reliability.PythonGoogle ADKRAGChromaDBGeminiAIMulti-Agent