<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ahmed Hamza Writing</title><description>Technical notes, project retrospectives, and practical engineering writing.</description><link>https://hamza.my.id/</link><item><title>Why Chrome extension UI automation becomes whack-a-mole</title><link>https://hamza.my.id/writing/why-chrome-extension-ui-automation-is-whack-a-mole/</link><guid isPermaLink="true">https://hamza.my.id/writing/why-chrome-extension-ui-automation-is-whack-a-mole/</guid><description>Notes from building AI Studio Prompt Library: scoped MV3 messaging, layered DOM selectors, Angular form events, and user-controlled selector fallbacks.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate></item><item><title>Why long-form TTS needs a queue, not repeated paste-and-generate</title><link>https://hamza.my.id/writing/voxinfinity-browser-session-tts-queue/</link><guid isPermaLink="true">https://hamza.my.id/writing/voxinfinity-browser-session-tts-queue/</guid><description>How VoxInfinity turns Inworld AI&apos;s homepage TTS widget into a browser-session queue for books, articles, long notes, direct requests, and playback.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate></item><item><title>Why Naive RAG Fails for Coding Agents (And building AST-aware retrieval instead)</title><link>https://hamza.my.id/writing/why-naive-rag-fails-for-coding-agents/</link><guid isPermaLink="true">https://hamza.my.id/writing/why-naive-rag-fails-for-coding-agents/</guid><description>Standard text splitting destroys code context. Notes on building Satori, moving past naive RAG, and enforcing deterministic tool contracts for MCP agents.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate></item><item><title>Why PromptReady needed an offline Markdown baseline first</title><link>https://hamza.my.id/writing/building-promptready-offline-first-markdown-capture/</link><guid isPermaLink="true">https://hamza.my.id/writing/building-promptready-offline-first-markdown-capture/</guid><description>How PromptReady moved past generic page cleanup by making local Markdown capture, source metadata, fallback selection, and AI cleanup boundaries explicit.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate></item><item><title>When local capture failed: empty shells, lazy pages, and fixture tests</title><link>https://hamza.my.id/writing/when-local-capture-failed-empty-shells-and-fixture-corpus/</link><guid isPermaLink="true">https://hamza.my.id/writing/when-local-capture-failed-empty-shells-and-fixture-corpus/</guid><description>Notes on turning PromptReady&apos;s weak page captures into explicit deep-capture policy, rendered fixtures, diagnostics, and repeatable no-network tests.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate></item><item><title>Why AI cleanup should not be the extraction engine</title><link>https://hamza.my.id/writing/why-ai-cleanup-needed-an-offline-baseline/</link><guid isPermaLink="true">https://hamza.my.id/writing/why-ai-cleanup-needed-an-offline-baseline/</guid><description>How PromptReady changed AI cleanup from raw HTML rewriting into a quality-gated pass over a local Markdown baseline.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>Why semantic code search is not enough for coding agents</title><link>https://hamza.my.id/writing/building-satori-agent-safe-code-retrieval/</link><guid isPermaLink="true">https://hamza.my.id/writing/building-satori-agent-safe-code-retrieval/</guid><description>Notes on building Satori around deterministic MCP workflows, exact reads, stale-index warnings, and bounded retrieval contracts.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate></item><item><title>When index cleanup lies, agents make unsafe decisions</title><link>https://hamza.my.id/writing/debugging-satori-index-lifecycle/</link><guid isPermaLink="true">https://hamza.my.id/writing/debugging-satori-index-lifecycle/</guid><description>A practical note on debugging Satori&apos;s clear/reindex path by treating remote vector state as an explicit lifecycle contract.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why MCP CLIs fail when stdout is treated like logs</title><link>https://hamza.my.id/writing/mcp-stdio-contracts-and-satori-cli/</link><guid isPermaLink="true">https://hamza.my.id/writing/mcp-stdio-contracts-and-satori-cli/</guid><description>Notes on turning Satori&apos;s shell CLI into a disciplined MCP wrapper with stdout safety, dynamic bootstrap, and deterministic exit behavior.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why this portfolio is a public engineering notebook</title><link>https://hamza.my.id/writing/why-im-building-hamza-my-id/</link><guid isPermaLink="true">https://hamza.my.id/writing/why-im-building-hamza-my-id/</guid><description>A practical note on making hamza.my.id useful through project evidence, technical notes, and restrained design instead of generic portfolio polish.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why frontend-heavy engineers need backend contract discipline</title><link>https://hamza.my.id/writing/backend-notes-from-a-frontend-heavy-engineer/</link><guid isPermaLink="true">https://hamza.my.id/writing/backend-notes-from-a-frontend-heavy-engineer/</guid><description>Notes on moving deeper into backend work by treating APIs, validation, schema design, and failure states as product contracts.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why &quot;full-stack&quot; is only useful when the product path is clear</title><link>https://hamza.my.id/writing/from-frontend-heavy-to-full-stack/</link><guid isPermaLink="true">https://hamza.my.id/writing/from-frontend-heavy-to-full-stack/</guid><description>A practical framing of moving from frontend depth into full-stack product engineering without pretending every layer has equal depth.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why a 1500+ article migration needed a workflow, not just Puppeteer</title><link>https://hamza.my.id/writing/puppeteer-nodejs-content-migration/</link><guid isPermaLink="true">https://hamza.my.id/writing/puppeteer-nodejs-content-migration/</guid><description>Notes from turning a large WordPress migration into a resumable Node.js automation pipeline with logs, checkpoints, and browser boundaries.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Why state-heavy interfaces fail without named events</title><link>https://hamza.my.id/writing/what-angular-and-ngrx-taught-me-about-state-management/</link><guid isPermaLink="true">https://hamza.my.id/writing/what-angular-and-ngrx-taught-me-about-state-management/</guid><description>Practical lessons from Angular and NgRx on making product behavior visible through actions, reducers, selectors, and predictable UI states.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate></item></channel></rss>