<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>mirfmaster</title><description>Thoughts on distributed systems, software architecture, and building things that last.</description><link>https://mirfmaster.pages.dev/</link><item><title>Heyho testing from the admin pages</title><link>https://mirfmaster.pages.dev/blog/heyho-testing-from-the-admin-pages/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/heyho-testing-from-the-admin-pages/</guid><pubDate>Sun, 24 May 2026 14:26:00 GMT</pubDate></item><item><title>Git Bisect: Finding the Commit That Broke Everything</title><link>https://mirfmaster.pages.dev/blog/git-bisect-workflow/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/git-bisect-workflow/</guid><description>A regression was three weeks old. Manual inspection would take hours. Git bisect found the culprit in 5 minutes and 7 binary searches.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate></item><item><title>The Art of Saying No to Features (Without Burning Bridges)</title><link>https://mirfmaster.pages.dev/blog/saying-no-to-features/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/saying-no-to-features/</guid><description>Every &apos;yes&apos; is a &apos;no&apos; to something else. Learning to decline feature requests constructively was the most valuable skill I developed this year.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Adding View Transitions to a Static Astro Site</title><link>https://mirfmaster.pages.dev/blog/astro-view-transitions/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/astro-view-transitions/</guid><description>View Transitions turned our multi-page site into a single-page-app feel without any framework. Here&apos;s the minimal setup.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Writing Error Messages That Actually Help Debugging</title><link>https://mirfmaster.pages.dev/blog/write-good-error-messages/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/write-good-error-messages/</guid><description>A good error message tells you what failed, why it failed, and what to do about it. Most error messages I see only do the first.</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Calling Rust from Python: A Practical FFI Walkthrough</title><link>https://mirfmaster.pages.dev/blog/python-rust-ffi/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/python-rust-ffi/</guid><description>We replaced a 200-line Python hot loop with 50 lines of Rust and got a 40x speedup. Here&apos;s the exact FFI setup.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Hello World</title><link>https://mirfmaster.pages.dev/blog/hello-world/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/hello-world/</guid><description>My first blog post. Excited to start sharing my thoughts!</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Retrospective: The Rewrite That Didn&apos;t Ship</title><link>https://mirfmaster.pages.dev/blog/retrospective-rewrite/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/retrospective-rewrite/</guid><description>We spent four months rewriting a working system. It never shipped. Here&apos;s what we should have done instead.</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Rate Limiting at the Reverse Proxy: Our Nginx Config</title><link>https://mirfmaster.pages.dev/blog/nginx-rate-limiting/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/nginx-rate-limiting/</guid><description>Application-level rate limiting burned CPU cycles. Moving it to Nginx cut response times and simplified our code.</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate></item><item><title>A Practical Testing Pyramid for REST APIs</title><link>https://mirfmaster.pages.dev/blog/testing-strategy-for-apis/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/testing-strategy-for-apis/</guid><description>Unit tests caught logic bugs. Integration tests caught wiring bugs. E2E tests caught nothing but added 20 minutes to CI. Here&apos;s what we changed.</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Reading List 2025: Books That Changed How I Build Software</title><link>https://mirfmaster.pages.dev/blog/reading-list-2025/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/reading-list-2025/</guid><description>Six books from 2025 that actually changed how I approach design, code, and collaboration — with specific takeaways from each.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Structured Logging: The One Observability Investment That Paid Off</title><link>https://mirfmaster.pages.dev/blog/observability-with-structured-logs/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/observability-with-structured-logs/</guid><description>Switching from text to structured JSON logs made debugging faster. Adding trace IDs made it instant. Here&apos;s the migration.</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Using Branded Types to Prevent Unit Confusion in TypeScript</title><link>https://mirfmaster.pages.dev/blog/typescript-branded-types/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/typescript-branded-types/</guid><description>When a stringly-typed user ID and order ID look the same to the compiler, bad things happen. Branded types catch these at compile time.</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Regaining Deep Work After Moving to a Distributed Team</title><link>https://mirfmaster.pages.dev/blog/building-habit-of-deep-work/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/building-habit-of-deep-work/</guid><description>Async communication is great for flexibility but terrible for focus when every Slack notification feels urgent. Here&apos;s what I changed.</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Debugging a CPU Spike on Linux: A Practical Walkthrough</title><link>https://mirfmaster.pages.dev/blog/linux-process-monitoring/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/linux-process-monitoring/</guid><description>A service&apos;s CPU spiked to 100% every hour. strace showed the culprit in 30 seconds. Here&apos;s the full investigation from top to flamegraph.</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Why Our HPA Was Scaling Too Slowly (and How We Fixed It)</title><link>https://mirfmaster.pages.dev/blog/kubernetes-horizontal-scaling/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/kubernetes-horizontal-scaling/</guid><description>The Horizontal Pod Autoscaler was reacting 4 minutes late. The fix was one YAML field we&apos;d ignored.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate></item><item><title>TIL: jq Recipes for Everyday JSON Wrangling</title><link>https://mirfmaster.pages.dev/blog/til-shell-jq-json/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/til-shell-jq-json/</guid><description>Five jq patterns I use daily — from extracting fields to reshaping nested JSON into CSV.</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Four Redis Caching Strategies and When to Avoid Them</title><link>https://mirfmaster.pages.dev/blog/redis-cache-strategies/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/redis-cache-strategies/</guid><description>Cache-aside, read-through, write-through, and write-behind — each solves a different problem. Here&apos;s where each one broke for us.</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Design Tokens in Tailwind: A System That Scales</title><link>https://mirfmaster.pages.dev/blog/tailwind-design-tokens/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/tailwind-design-tokens/</guid><description>Raw Tailwind classes are fast to write but hard to maintain. Design tokens bridge the gap between designer intent and utility classes.</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Zero-Downtime Database Migrations: Our Rollback Strategy</title><link>https://mirfmaster.pages.dev/blog/database-migration-rollbacks/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/database-migration-rollbacks/</guid><description>A failed migration doesn&apos;t have to mean downtime. Here&apos;s how we structure migrations so every change is safely reversible.</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate></item><item><title>RSC After Six Months: What Surprised Me Most</title><link>https://mirfmaster.pages.dev/blog/react-server-components-thoughts/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/react-server-components-thoughts/</guid><description>Server Components change how you think about the network boundary. Six months in, here&apos;s what still catches me off guard.</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate></item><item><title>What On-Call Fatigue Taught Me About System Design</title><link>https://mirfmaster.pages.dev/blog/on-call-fatigue/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/on-call-fatigue/</guid><description>After a particularly bad on-call week, I realized the alerts were the symptom, not the problem. The system needed redesign, not more monitoring.</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate></item><item><title>What I Learned From &apos;Staff Engineer&apos; by Will Larson</title><link>https://mirfmaster.pages.dev/blog/staff-engineer-readings/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/staff-engineer-readings/</guid><description>The Staff Engineer title doesn&apos;t come with a playbook. Larson&apos;s book collects org patterns from real staff-plus engineers at tech companies.</description><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Designing API Rate Limits: Token Bucket vs Sliding Window</title><link>https://mirfmaster.pages.dev/blog/api-rate-limit-strategies/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/api-rate-limit-strategies/</guid><description>Token bucket is simple. Sliding window is fair. Here&apos;s the trade-off we made and why we ended up keeping both.</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Shaving 200MB Off Our Docker Image With Multi-Stage Builds</title><link>https://mirfmaster.pages.dev/blog/docker-multi-stage-builds/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/docker-multi-stage-builds/</guid><description>Our Go binary was 18MB, but the image was 1.2GB. Multi-stage builds brought it to 22MB. Here&apos;s the exact Dockerfile.</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Slashing CI Times With Smart Caching in GitHub Actions</title><link>https://mirfmaster.pages.dev/blog/github-actions-caching/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/github-actions-caching/</guid><description>Our CI was taking 12 minutes per push. Caching dependencies and build artifacts brought it to 3 minutes. Here&apos;s the cache-key strategy.</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Tuning PgBouncer for a Read-Heavy API</title><link>https://mirfmaster.pages.dev/blog/postgresql-connection-pool-tuning/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/postgresql-connection-pool-tuning/</guid><description>We cut p99 query latency by 40% just by changing three PgBouncer settings. Here&apos;s the before and after.</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate></item><item><title>A Circuit Breaker Implementation in Go That Saved Our Uptime</title><link>https://mirfmaster.pages.dev/blog/circuit-breaker-pattern/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/circuit-breaker-pattern/</guid><description>When a downstream dependency started failing, the circuit breaker pattern prevented cascading failures across three services.</description><pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Why I Started Writing in Public (and What Changed)</title><link>https://mirfmaster.pages.dev/blog/learning-in-public/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/learning-in-public/</guid><description>Writing in public forces clarity. After six months, I understand topics better, get feedback faster, and have a searchable reference of what I&apos;ve learned.</description><pubDate>Sat, 20 Sep 2025 00:00:00 GMT</pubDate></item><item><title>One Index That Fixed a 5-Second Query</title><link>https://mirfmaster.pages.dev/blog/sql-query-optimization/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/sql-query-optimization/</guid><description>A dashboard query was timing out. EXPLAIN ANALYZE showed a sequential scan on a 2M-row table. One index brought it to 8ms.</description><pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Context Cancellation in Go: Three Patterns I Use Every Day</title><link>https://mirfmaster.pages.dev/blog/go-context-patterns/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/go-context-patterns/</guid><description>Context cancellation is easy to get wrong. Here are three patterns that survived production — and one that didn&apos;t.</description><pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Notes on DDIA Chapters 5-6: Replication and Partitioning</title><link>https://mirfmaster.pages.dev/blog/ddia-replication-chapters/</link><guid isPermaLink="true">https://mirfmaster.pages.dev/blog/ddia-replication-chapters/</guid><description>Replication strategies are trade-offs between consistency, latency, and availability. Here&apos;s what I took away from Kleppmann&apos;s deep dive.</description><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate></item></channel></rss>