<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering on Lorbic</title><link>http://localhost:1313/categories/engineering/</link><description>Recent content in Engineering on Lorbic</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 13 Aug 2026 18:00:00 +0530</lastBuildDate><atom:link href="http://localhost:1313/categories/engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>How Go Channels Actually Work</title><link>http://localhost:1313/go-channels-deep-dive/</link><pubDate>Thu, 13 Aug 2026 18:00:00 +0530</pubDate><guid>http://localhost:1313/go-channels-deep-dive/</guid><description>&lt;p>A single unbuffered channel send without an active receiver is enough to silently lock up a production worker pool, leaking memory until your service gets killed by the OS kernel.&lt;/p>
&lt;p>On the surface, Go channels look simple: they synchronize concurrent execution without manual mutex management. But under heavy load, a minor oversight in channel sizing or worker coordination blocks the scheduler, leaks memory, or crashes processes with runtime panics.&lt;/p>
&lt;p>&lt;picture class="optimized-image-container">&lt;source srcset="http://localhost:1313/go-channels-deep-dive/go-scheduler-meme_hu_524f15f4ab89fd6f.webp 480w, http://localhost:1313/go-channels-deep-dive/go-scheduler-meme_hu_50f95d885458376d.webp 646w" sizes="(max-width: 800px) 100vw, 800px" type="image/webp">&lt;img src="http://localhost:1313/go-channels-deep-dive/go-scheduler-meme_hu_50f95d885458376d.webp" width="646" height="797" alt="The Go scheduler coordinating 10,000 goroutines on a single-core CPU" loading="eager" decoding="async" fetchpriority="high" class="img-fluid" />
 &lt;/picture>&lt;/p></description></item><item><title>Part 6: Simulating a Living Facility: Room Derivation, Sunlight Spillover, and Positional SFX</title><link>http://localhost:1313/modular-missions-floodfill-audio-raylib/</link><pubDate>Mon, 10 Aug 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/modular-missions-floodfill-audio-raylib/</guid><description>&lt;p>Generating a raw matrix of integer tiles gives you a map layout, but it doesn&amp;rsquo;t give you a living environment. When I loaded my first level into &lt;em>Derelict Facility&lt;/em>, the engine had no concept of what a &amp;ldquo;Laboratory&amp;rdquo; or a &amp;ldquo;Reactor Room&amp;rdquo; was. It just saw a flat array of walls and floors.&lt;/p>
&lt;p>If a player flipped a power terminal inside a room, I had no clean way to know which room lights or doors to toggle without scanning the whole map grid on every frame. If an alarm fired down the hall, it played at full volume regardless of where the player was standing.&lt;/p></description></item><item><title>Designing a Distributed Job Scheduler in Go: Partitioning, Locking, and Backpressure</title><link>http://localhost:1313/designing-a-distributed-job-scheduler/</link><pubDate>Sun, 09 Aug 2026 14:00:00 +0530</pubDate><guid>http://localhost:1313/designing-a-distributed-job-scheduler/</guid><description>&lt;p>Linux &lt;code>crontab&lt;/code> is one of the most elegant pieces of software ever written for single-host automation. It is simple, clear, and has kept Unix systems running reliably since 1975.&lt;/p>
&lt;p>The problem starts when we take a single-host tool and deploy it across a multi-node cloud setup.&lt;/p>
&lt;p>In &lt;a href="http://localhost:1313/how-multi-tenant-saas-works/">Relay&lt;/a>, a multi-tenant AI API gateway system design, background jobs power core operations: every top of the hour, a job rolls up raw API usage tokens into tenant billing metrics; every 15 minutes, another job scans for expired API keys and purges them from cache; every 30 seconds, a health checker pings upstream LLM provider endpoints.&lt;/p></description></item><item><title>Part 5: From Terminal Cells to Sprite Maps: Font Fallbacks and Auto-Tiling</title><link>http://localhost:1313/autotiling-sprites-font-fallbacks-raylib/</link><pubDate>Sun, 09 Aug 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/autotiling-sprites-font-fallbacks-raylib/</guid><description>&lt;p>Building a terminal-based engine in pure ASCII looks cool for about five minutes. Then you try rendering a complex facility map with corners, T-junctions, and status icons, and raw character cells start feeling incredibly limiting.&lt;/p>
&lt;p>Two specific problems hit me immediately when I tried switching to Raylib for graphics. First, drawing wall tiles manually by hand in level files meant placing 16 different corner variations by hand. Second, when I tried rendering a 🚨 warning emoji alongside FiraCode monospace text, Raylib just rendered a missing glyph box (&lt;code>?&lt;/code> or &lt;code>□&lt;/code>).&lt;/p></description></item><item><title>Part 4: Refactoring to SoA ECS: Bitmasks and Flat Component Arrays</title><link>http://localhost:1313/structure-of-arrays-ecs-bitmasks-golang/</link><pubDate>Sat, 08 Aug 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/structure-of-arrays-ecs-bitmasks-golang/</guid><description>&lt;p>When I started building &lt;em>Derelict Facility&lt;/em>, my initial instinct for game actors was standard Object-Oriented design: create an &lt;code>Entity&lt;/code> struct, add pointers for position, sprite, and stats, and store them in a slice (&lt;code>[]*Entity&lt;/code>).&lt;/p>
&lt;p>It worked fine for five entities. But as soon as I added automated doors, save terminals, and active power grids across a 1000-tile map, keeping track of separate heap pointers became a headache. My Go profiler showed GC pauses spiking while the CPU spent more time chasing heap pointers across non-contiguous memory than actually updating game state.&lt;/p></description></item><item><title>Designing a Usage-Based Billing Pipeline for SaaS</title><link>http://localhost:1313/designing-a-usage-based-billing-pipeline-for-saas/</link><pubDate>Sat, 01 Aug 2026 17:26:52 +0530</pubDate><guid>http://localhost:1313/designing-a-usage-based-billing-pipeline-for-saas/</guid><description>&lt;p>In &lt;a href="http://localhost:1313/posts/2026-07-01-how-multi-tenant-saas-works/" data-preview-title="How Multi-Tenant SaaS Actually Works" data-preview-desc="A complete system design of Relay, a multi-tenant AI API gateway. Covers multi-tenant database architecture (silo vs pool vs bridge), API key authentication, provider routing with failover, dual-layer rate limiting, token-based billing, response caching, row-level security, tenant provisioning, and observability. Full Postgres schemas, mermaid diagrams, and Go snippets included." data-preview-time="37 min read">How Multi-Tenant SaaS Actually Works&lt;/a>, I left one major promise unfulfilled at the end: &lt;em>&amp;ldquo;Billing is an entire system design on its own. The billing pipeline gets its own post.&amp;rdquo;&lt;/em>&lt;/p></description></item><item><title>Couchbase Index Best Practices and Query Performance Tuning</title><link>http://localhost:1313/couchbase-index-best-practices-performance-tuning/</link><pubDate>Fri, 31 Jul 2026 23:00:00 +0530</pubDate><guid>http://localhost:1313/couchbase-index-best-practices-performance-tuning/</guid><description>&lt;p>Most Couchbase performance tickets I have seen end the same way: someone adds more nodes, the dashboard looks a little better for a week, and the same query shows up in the slow log a month later. The node count was never the problem. The index was.&lt;/p>
&lt;p>This is a working reference, not an essay. I already wrote &lt;a href="http://localhost:1313/what-couchbase-taught-me-about-system-thinking/">the reflective version&lt;/a> of what indexing in Couchbase teaches you about systems in general. This post skips the reflection and gets straight to the decisions: which index type to reach for, how to order composite keys, how to tell if a query is actually using what you built, and which four or five mistakes account for most of the slow queries you will ever debug. Couchbase&amp;rsquo;s own documentation is the primary source for the recommendations below. Every example runs against &lt;code>travel-sample&lt;/code>, the sample bucket Couchbase ships with every install, so you can paste these into your own cluster and see the plan yourself.&lt;/p></description></item><item><title>API Design for Backend Systems</title><link>http://localhost:1313/api-design-for-backend-systems/</link><pubDate>Sun, 26 Jul 2026 19:00:00 +0530</pubDate><guid>http://localhost:1313/api-design-for-backend-systems/</guid><description>&lt;p>A few weeks ago I designed &lt;a href="http://localhost:1313/how-multi-tenant-saas-works/">Relay&lt;/a>, a multi-tenant AI API gateway, as a system design exercise. That post covered the database, the auth, the billing. It did not cover the thing every one of those systems is sitting behind: the API itself.&lt;/p>
&lt;p>Here is the question that post left open. When someone builds &lt;code>GET /v1/requests&lt;/code> to list a tenant&amp;rsquo;s API call history, what should that endpoint actually look like? Offset or cursor pagination? What does the response envelope contain? What happens when Relay needs to add a filter that does not fit in a query string? What does a webhook payload look like when Relay tells a tenant &amp;ldquo;your batch job finished&amp;rdquo;? None of that is specific to AI gateways. It is the same decisions every backend API makes, made badly often enough that &amp;ldquo;REST API&amp;rdquo; has become a phrase that means &amp;ldquo;JSON over HTTP, structure unspecified.&amp;rdquo;&lt;/p></description></item><item><title>Cache-Driven Development: Saving Your Database From Itself</title><link>http://localhost:1313/cache-driven-development/</link><pubDate>Wed, 22 Jul 2026 12:00:00 +0530</pubDate><guid>http://localhost:1313/cache-driven-development/</guid><description>&lt;p>There is a moment in every backend engineer&amp;rsquo;s life when their database starts refusing connections.&lt;/p>
&lt;p>Picture 2 a.m. on a Tuesday. The app is operating under normal traffic, nothing unusual. But the database connection pool is saturated. Queries are timing out. The monitoring dashboard shows 50,000 database operations per second, far beyond what the system should be handling.&lt;/p>
&lt;p>When someone pulls the slow-query logs, the pattern is immediately clear. The same query appears thousands of times:&lt;/p></description></item><item><title>Designing a Distributed Rate Limiter with Redis</title><link>http://localhost:1313/designing-a-rate-limiter/</link><pubDate>Tue, 07 Jul 2026 17:00:00 +0530</pubDate><guid>http://localhost:1313/designing-a-rate-limiter/</guid><description>&lt;p>There is a class of bugs that only happen at midnight.&lt;/p>
&lt;p>Your API has a rate limit: 1000 requests per minute. A client hits 999 at 11:59:59 PM, then fires another 999 at 12:00:00 AM. Two windows, two clean counters, all 1998 requests allowed. Your database gets a spike it was never designed to handle, and you spend the next hour wondering how your rate limiter let this through.&lt;/p>
&lt;p>It did let it through. You just did not know it.&lt;/p></description></item><item><title>How Multi-Tenant SaaS Actually Works</title><link>http://localhost:1313/how-multi-tenant-saas-works/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0530</pubDate><guid>http://localhost:1313/how-multi-tenant-saas-works/</guid><description>&lt;p>For the past month I have been reading about multi-tenant SaaS architecture. Not as an academic exercise. I kept running into the same questions on every project I looked at: where exactly does tenant data go, how do you stop one customer&amp;rsquo;s bug from becoming every customer&amp;rsquo;s problem, how does billing actually work at the database level. The blog posts I found were either too abstract or skipped the hard parts entirely.&lt;/p></description></item><item><title>So, We Are Writing Efficient Software Again</title><link>http://localhost:1313/so-we-are-writing-efficient-software-again/</link><pubDate>Wed, 17 Jun 2026 20:00:00 +0530</pubDate><guid>http://localhost:1313/so-we-are-writing-efficient-software-again/</guid><description>&lt;p>I wanted to upgrade the RAM in my PC.&lt;/p>
&lt;p>Nothing fancy. I bought 32GB in 2024 and I wanted to double it. I opened a tab, checked the price, and closed the tab. Then I sat quietly for a moment.&lt;/p>
&lt;p>The same 32GB kit I bought in 2024 now costs more than double. DDR5 prices have gone up roughly 400% since mid-2025 [1]. DDR4 is not much better. A kit that cost $60–$90 in late 2025 now sells for $150–$180 [2].&lt;/p></description></item><item><title>Constructing Concurrent Inverted Indexes in Go</title><link>http://localhost:1313/constructing-concurrent-inverted-indexes-in-go/</link><pubDate>Tue, 16 Jun 2026 22:00:00 +0530</pubDate><guid>http://localhost:1313/constructing-concurrent-inverted-indexes-in-go/</guid><description>&lt;p>I spent a Saturday afternoon benchmarking a concurrent inverted index and discovered that a single &lt;code>sync.RWMutex&lt;/code> starts to break down at roughly 4 concurrent readers. The degradation is not linear. It is not graceful. It is a cliff.&lt;/p>
&lt;p>The inverted index is one of the oldest data structures in information retrieval. It maps terms to the documents that contain them, forming the backbone of every search engine from Elasticsearch to Lucene to Google&amp;rsquo;s earliest prototypes. The data structure itself is simple. Making it fast under concurrent load is not.&lt;/p></description></item><item><title>A Love Letter to the L1 Cache</title><link>http://localhost:1313/love-letter-to-the-l1-cache/</link><pubDate>Mon, 15 Jun 2026 19:00:00 +0530</pubDate><guid>http://localhost:1313/love-letter-to-the-l1-cache/</guid><description>&lt;p>I recently spent four hours staring at a benchmark that didn&amp;rsquo;t make sense.&lt;/p>
&lt;p>It started while working on &lt;a href="https://github.com/vikash-paf/derelict-facility" target="_blank" rel="noopener noreferrer">Derelict Facility&lt;/a>, my grid-based game engine in Go. I was trying to tighten the main update loop, specifically the part that iterates over every entity on the map each frame. I pulled out a small benchmark to isolate the cost, and something looked wrong.&lt;/p>
&lt;p>I had two Go structs. They held the exact same data: two booleans and a 64-bit integer. I was iterating over a slice of 10 million of these structs, doing a simple addition. They should have been identical in performance.&lt;/p></description></item><item><title>Wireless ADB When Your Network Fights You</title><link>http://localhost:1313/til/2026-06-15-wireless-adb-over-wifi/</link><pubDate>Mon, 15 Jun 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/til/2026-06-15-wireless-adb-over-wifi/</guid><description>&lt;p>Wireless ADB keeps timing out if you run a VPN or something like Cloudflare WARP. The issue is that these tools route all traffic through a tunnel and block direct peer-to-peer connections on your local network.&lt;/p>
&lt;p>The fix is a one-time USB handshake to tell the device to listen on TCP before you go wireless.&lt;/p>
&lt;hr>
&lt;h2 id="step-1-usb-handshake">Step 1: USB handshake&lt;a class="anchorjs-link" href="#step-1-usb-handshake" aria-label="Link to section: Step 1: USB handshake">&lt;/a>&lt;/h2>&lt;p>Connect your device via USB (USB debugging must be on). Then run:&lt;/p></description></item><item><title>Why Explaining Technical Difficulty is Hard</title><link>http://localhost:1313/why-explaining-technical-difficulty-is-hard/</link><pubDate>Thu, 14 May 2026 01:00:00 +0530</pubDate><guid>http://localhost:1313/why-explaining-technical-difficulty-is-hard/</guid><description>&lt;p>&amp;ldquo;Can we just add a real-time visitor counter to the homepage? It&amp;rsquo;s just a query, right&amp;rdquo;?&lt;/p>
&lt;p>Every engineer has heard some variation of this. On the surface, the logic is sound. You have data, you have a UI, and you want to connect them. In the world of business requirements, this is a solved problem. You write a line of code, and the feature exists.&lt;/p>
&lt;p>But your database doesn&amp;rsquo;t care about business logic. It cares about &lt;strong>Infrastructure Constraints&lt;/strong>.&lt;/p></description></item><item><title>Just About Go Time</title><link>http://localhost:1313/just-about-go-time/</link><pubDate>Sun, 10 May 2026 22:00:00 +0530</pubDate><guid>http://localhost:1313/just-about-go-time/</guid><description>&lt;p>Time is an illusion. Or more accurately, time is a political consensus poorly masquerading as physics.&lt;/p>
&lt;p>&lt;picture class="optimized-image-container">&lt;source srcset="http://localhost:1313/just-about-go-time/time-theory-meme_hu_c027f9156a69cf21.webp 480w, http://localhost:1313/just-about-go-time/time-theory-meme_hu_c74845a5e28401ee.webp 800w, http://localhost:1313/just-about-go-time/time-theory-meme_hu_22fbca4a5f8175a5.webp 1200w, http://localhost:1313/just-about-go-time/time-theory-meme_hu_c495ad8b67b2bacf.webp 1222w" sizes="(max-width: 800px) 100vw, 800px" type="image/webp">&lt;img src="http://localhost:1313/just-about-go-time/time-theory-meme_hu_c495ad8b67b2bacf.webp" width="1222" height="1514" alt="Time is relative, absolute, and a scam" loading="eager" decoding="async" fetchpriority="high" class="img-fluid" />
 &lt;/picture>&lt;/p>
&lt;p>If you&amp;rsquo;ve ever seen Dylan Beattie&amp;rsquo;s &amp;ldquo;Plain Text&amp;rdquo; &lt;a href="https://www.youtube.com/watch?v=gd5uJ7Nlvvo" target="_blank" rel="noopener noreferrer">talk&lt;/a>, you know that humans have spent centuries making data storage as complicated as possible. But text encoding has nothing on time zones.&lt;/p>
&lt;p>As engineers, we like to pretend that &lt;code>time.Now()&lt;/code> returns an objective truth. It doesn&amp;rsquo;t. It returns a snapshot of a highly contested, historically unstable set of political boundaries. In 2011, the island nation of Samoa decided they wanted to align their workweek with Australia rather than the United States. To do this, they didn&amp;rsquo;t just change their clocks; they completely skipped Friday, December 30th. At 11:59 PM on Thursday, the clock ticked over, and it was suddenly Saturday.&lt;/p></description></item><item><title>Building a Poor Document Store inside PostgreSQL</title><link>http://localhost:1313/building-a-poor-document-store-inside-postgresql/</link><pubDate>Sat, 09 May 2026 22:00:00 +0530</pubDate><guid>http://localhost:1313/building-a-poor-document-store-inside-postgresql/</guid><description>&lt;p>The marketing for &amp;ldquo;schemaless&amp;rdquo; architecture was brilliant. It promised speed, agility, and a life free from the tyranny of &lt;code>ALTER TABLE&lt;/code> migrations. When PostgreSQL introduced &lt;code>JSONB&lt;/code> in version 9.4, many developers saw it as a green light to treat Postgres like MongoDB.&lt;/p>
&lt;p>I’ve seen this pattern in dozens of codebases. It starts with a single &lt;code>metadata&lt;/code> column, but within months, the entire business logic is buried inside a 2MB JSON blob.&lt;/p></description></item><item><title>PostgreSQL Migrations in Go: Production Schema Patterns with Goose</title><link>http://localhost:1313/postgresql-migrations-in-go-production-schema-patterns-with-goose/</link><pubDate>Fri, 08 May 2026 22:00:00 +0530</pubDate><guid>http://localhost:1313/postgresql-migrations-in-go-production-schema-patterns-with-goose/</guid><description>&lt;p>Application code is stateless. You can tear down a container and spin up a new one in milliseconds without losing data. Databases are stateful. When you deploy new application logic that requires a new column, an index, or a table, you must transition the physical storage schema from state A to state B without destroying the underlying data or locking the system.&lt;/p>
&lt;p>This process is a database migration. Working with databases is the kind of thing I will gladly skip dinner for (:&lt;/p></description></item><item><title>Migrating Cloudflare to Terraform</title><link>http://localhost:1313/cloudflare-management-with-terraform/</link><pubDate>Tue, 28 Apr 2026 14:00:00 +0530</pubDate><guid>http://localhost:1313/cloudflare-management-with-terraform/</guid><description>&lt;p>A while back, I was tinkering in the Cloudflare dashboard and accidentally fat-fingered a DNS configuration. I didn&amp;rsquo;t realize the impact immediately, but I ended up taking down &lt;code>lorbic.com&lt;/code> for an hour.&lt;/p>
&lt;p>When I scrambled to fix it, I hit a wall: there was no &amp;ldquo;undo&amp;rdquo; button. There was no Git history to tell me what the record &lt;em>used&lt;/em> to point to, and no review to catch the mistake before I blew it.&lt;/p></description></item><item><title>Critical Rendering Path Optimization: 8 Proven Strategies to Boost Web Performance</title><link>http://localhost:1313/critical-rendering-path-optimization-8-proven-strategies-to-boost-web-performance/</link><pubDate>Sat, 11 Apr 2026 16:00:00 +0530</pubDate><guid>http://localhost:1313/critical-rendering-path-optimization-8-proven-strategies-to-boost-web-performance/</guid><description>&lt;p>&lt;strong>TL;DR:&lt;/strong> The Critical Rendering Path (CRP) is how browsers convert code into pixels. Optimizing it means reducing bottlenecks at five stages: Network, Parsing, Tree Building, Layout, and Paint. Use this guide to reduce First Contentful Paint by 40-60%, improve Lighthouse scores, and master the eight optimization strategies that separate fast sites from slow ones.&lt;/p>
&lt;p>To master web performance, stop guessing and start engineering. View the browser as a single-threaded virtual machine that must convert raw text into pixels 60 times per second. Every performance delay is a bottleneck in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path" target="_blank" rel="noopener noreferrer">&lt;strong>Critical Rendering Path (CRP)&lt;/strong>&lt;/a>.&lt;/p></description></item><item><title>A Tale of Web Vitals</title><link>http://localhost:1313/a-tale-of-web-vitals/</link><pubDate>Sat, 11 Apr 2026 14:30:00 +0530</pubDate><guid>http://localhost:1313/a-tale-of-web-vitals/</guid><description>&lt;p>&lt;strong>TL;DR:&lt;/strong> I achieved 95+ Lighthouse scores by removing abstractions and automating browser fundamentals. This guide details how to solve &lt;strong>LCP network discovery&lt;/strong>, &lt;strong>main thread congestion&lt;/strong>, and &lt;strong>third-party accessibility traps&lt;/strong> using Hugo pipelines and vanilla JavaScript.&lt;/p>
&lt;hr>
&lt;p>&amp;ldquo;Why is the LCP 4.2 seconds? It&amp;rsquo;s just a static site&amp;rdquo;.&lt;/p>
&lt;p>I was staring at a Lighthouse report that felt like an insult. &lt;strong>Lorbic.com is a zero-dependency Hugo site.&lt;/strong> No React, no heavy frameworks, just vanilla CSS and minimal JS. Yet, the mobile performance was tanking.&lt;/p></description></item><item><title>Why Your Goroutines Need a Speed Limit: Bounded Concurrency in Go</title><link>http://localhost:1313/bounded-concurrency-in-go/</link><pubDate>Fri, 10 Apr 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/bounded-concurrency-in-go/</guid><description>&lt;p>&lt;strong>TL;DR:&lt;/strong> Spawning &lt;code>go func()&lt;/code> without a limiter is a recipe for system collapse. This guide details how to use &lt;strong>Semaphores&lt;/strong> and &lt;strong>Worker Pools&lt;/strong> to prioritize predictable stability over absolute speed, protecting downstream dependencies from the thundering herd.&lt;/p>
&lt;hr>
&lt;p>It&amp;rsquo;s a rite of passage for every Go developer. You receive a list of 10,000 URLs to fetch or 50,000 rows to process. You wrap the workload in an unbounded &lt;code>go func()&lt;/code> loop, achieving maximum throughput in milliseconds.&lt;/p></description></item><item><title>Part 3: Casting Shadows Without Trigonometry: The Beauty of Integer Math</title><link>http://localhost:1313/casting-shadows-bresenham-integer-math/</link><pubDate>Tue, 07 Apr 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/casting-shadows-bresenham-integer-math/</guid><description>&lt;p>At the end of generating a procedural map for the &lt;em>&lt;a href="https://github.com/vikash-paf/derelict-facility" target="_blank" rel="noopener noreferrer">Derelict Facility&lt;/a>&lt;/em> engine, I had a sprawling interconnected maze of rooms and corridors. But there was a devastating problem: I could see everything.&lt;/p>
&lt;p>The entire map was rendered at once. It looked like a top-down blueprint, not a dark, atmospheric facility. I needed to implement Fog of War. I needed to treat the player character like a lighthouse in the dark.&lt;/p></description></item><item><title>Part 2: Decoupling the Renderer: Terminal to Raylib in One Interface</title><link>http://localhost:1313/decoupling-game-engine-renderer-raylib/</link><pubDate>Mon, 06 Apr 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/decoupling-game-engine-renderer-raylib/</guid><description>&lt;p>The biggest architectural mistake you can make when building a game engine is letting the game know how it is being drawn.&lt;/p>
&lt;p>When I started building the &lt;em>Derelict Facility&lt;/em> engine, the output target was a raw ANSI terminal. The engine calculated A* paths, resolved line-of-sight, and then spewed escape codes (&lt;code>\033[31m&lt;/code>) to &lt;code>os.Stdout&lt;/code>.&lt;/p>
&lt;p>Eventually, I hit the physical limits of terminal emulators: inconsistent character widths (especially for emojis), slow double-buffering, and a hard cap on frame rates. I needed to move to a real, hardware-accelerated graphics library like Raylib.&lt;/p></description></item><item><title>Part 1: Data-Oriented Design in Go: Why [][]Tile Destroyed My Game Engine</title><link>http://localhost:1313/data-oriented-design-go-contiguous-memory/</link><pubDate>Sun, 05 Apr 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/data-oriented-design-go-contiguous-memory/</guid><description>&lt;p>Most game development stories start the same way: install Unity, drag some sprites onto a canvas, and press Play.&lt;/p>
&lt;p>I wanted to understand the metal. I set out to build &lt;em>&lt;a href="https://github.com/vikash-paf/derelict-facility" target="_blank" rel="noopener noreferrer">Derelict Facility&lt;/a>&lt;/em>, a systems-level game engine from scratch in pure Go. No SDL, no OpenGL wrappers, no Ebiten. The goal wasn&amp;rsquo;t just to ship a game; the goal was to learn the memory layouts and I/O pipelines that modern engines hide behind friendly APIs.&lt;/p></description></item><item><title>10 years of lorbic.com architecture</title><link>http://localhost:1313/10-years-of-lorbic.com-architecture/</link><pubDate>Thu, 02 Apr 2026 12:00:00 +0530</pubDate><guid>http://localhost:1313/10-years-of-lorbic.com-architecture/</guid><description>&lt;p>&lt;picture class="optimized-image-container">&lt;source srcset="http://localhost:1313/10-years-of-lorbic.com-architecture/evolution_hu_c3df73cc291f2d3a.webp 480w, http://localhost:1313/10-years-of-lorbic.com-architecture/evolution_hu_d6eb9db6213c4dc9.webp 800w, http://localhost:1313/10-years-of-lorbic.com-architecture/evolution_hu_156b083258cf7313.webp 1200w, http://localhost:1313/10-years-of-lorbic.com-architecture/evolution_hu_abf66fd5579991cd.webp 3068w" sizes="(max-width: 800px) 100vw, 800px" type="image/webp">&lt;img src="http://localhost:1313/10-years-of-lorbic.com-architecture/evolution_hu_abf66fd5579991cd.webp" width="3068" height="800" alt="Lorbic Evolution: 2017 vs 2026" loading="eager" decoding="async" fetchpriority="high" class="img-fluid" />
 &lt;/picture>&lt;/p>
&lt;p>This post tracks four architectural rewrites of my personal site over ten years: moving from managed platforms (Blogger) to dynamic backends (Django), static site generators (Jekyll/Hugo), and finally to a custom, zero-dependency architecture built for absolute control and performance.&lt;/p>
&lt;hr>
&lt;h2 id="technical-context">Technical Context&lt;a class="anchorjs-link" href="#technical-context" aria-label="Link to section: Technical Context">&lt;/a>&lt;/h2>&lt;p>For an engineer, a personal site is the only project where you have absolute authority over the stack. There are no product managers, no legacy constraints, and no enterprise technical debt: you own the metal.&lt;/p></description></item><item><title>Kubernetes on WSL2 and the macOS tunnel</title><link>http://localhost:1313/kubernetes-on-wsl2-macos-access/</link><pubDate>Wed, 01 Apr 2026 22:00:00 +0530</pubDate><guid>http://localhost:1313/kubernetes-on-wsl2-macos-access/</guid><description>&lt;p>&lt;strong>TL;DR:&lt;/strong> I run &lt;strong>k3s&lt;/strong> on a Windows gaming PC via &lt;strong>WSL2&lt;/strong> to master Kubernetes networking without cloud costs. This guide details a secure access model using &lt;strong>SSH&lt;/strong> and &lt;strong>kubectl port-forward&lt;/strong> to bypass NAT boundaries and maintain technical sovereignty.&lt;/p>
&lt;hr>
&lt;p>This guide omits Kubernetes feature tutorials. Instead, it details how to architect an environment where Kubernetes can exist without auxiliary hardware, idle cloud bills, or hidden networking realities.&lt;/p>
&lt;p>I wanted to learn Kubernetes properly, which meant understanding how &lt;strong>scheduling&lt;/strong>, &lt;strong>access paths&lt;/strong>, and &lt;strong>network boundaries&lt;/strong> behave under real constraints. The problem was simple: I lacked a reasonable execution environment.&lt;/p></description></item><item><title>ClickHouse data masking with regex</title><link>http://localhost:1313/clickhouse-regex-data-masking/</link><pubDate>Tue, 31 Mar 2026 22:30:00 +0530</pubDate><guid>http://localhost:1313/clickhouse-regex-data-masking/</guid><description>&lt;p>If you&amp;rsquo;re running a production observability stack, you&amp;rsquo;ve already leaked PII. An engineer forgot to redact an email in a log line, or a JWT token ended up in a stack trace.&lt;/p>
&lt;p>In most databases, the only fix is to &lt;code>DELETE&lt;/code> the data—killing your metrics along with the sensitive info. But ClickHouse has a more elegant approach: &lt;strong>Data Masking Policies&lt;/strong>.&lt;/p>
&lt;p>By defining a policy at the role level, you can use regex to swap sensitive patterns with &lt;code>[REDACTED]&lt;/code> in real-time, before the query results even leave the server.&lt;/p></description></item><item><title>Understanding CPU Caches in Go</title><link>http://localhost:1313/cpu-caches-in-go/</link><pubDate>Tue, 31 Mar 2026 22:15:00 +0530</pubDate><guid>http://localhost:1313/cpu-caches-in-go/</guid><description>&lt;p>When you&amp;rsquo;re building Go services that handle millions of operations per second, the hardware beneath your abstractions starts to matter. Specifically, the CPU cache hierarchy, and whether your data fits in it.&lt;/p>
&lt;hr>
&lt;h4 id="the-hardware-context-its-not-just-ram">The Hardware Context: It&amp;rsquo;s Not Just &amp;ldquo;RAM&amp;rdquo;&lt;a class="anchorjs-link" href="#the-hardware-context-its-not-just-ram" aria-label="Link to section: The Hardware Context: It&amp;rsquo;s Not Just &amp;ldquo;RAM&amp;rdquo;">&lt;/a>&lt;/h4>&lt;p>Your server has 32GB or 64GB of RAM, but the CPU avoids touching it whenever possible. Instead, it works through a chain of caches:&lt;/p></description></item><item><title>ClickHouse vs. Postgres: When to Move Your Logs Out of a Relational DB</title><link>http://localhost:1313/clickhouse-vs-postgres-log-storage/</link><pubDate>Mon, 30 Mar 2026 22:45:00 +0530</pubDate><guid>http://localhost:1313/clickhouse-vs-postgres-log-storage/</guid><description>&lt;p>Postgres is the most reliable tool in my stack. It handles users, configurations, and complex relations without breaking a sweat. But databases, like any physical system, have a &amp;ldquo;design limit&amp;rdquo;. For Postgres, that limit usually appears when you try to use it as a dumping ground for high-velocity logs and metrics.&lt;/p>
&lt;p>When your &lt;code>ANALYZE&lt;/code> commands start taking minutes and your indexes consume more RAM than your data, you aren&amp;rsquo;t facing a Postgres bug; you&amp;rsquo;re facing an architectural mismatch.&lt;/p></description></item><item><title>WSL2 Is Slow? Fix /mnt/c/ File System Performance &amp; Go Latency</title><link>http://localhost:1313/wsl2-performance-tax-go-windows/</link><pubDate>Sun, 29 Mar 2026 22:30:00 +0530</pubDate><guid>http://localhost:1313/wsl2-performance-tax-go-windows/</guid><description>&lt;p>WSL2 (Windows Subsystem for Linux) has been a godsend for developers who love Linux tools but need/have a Windows environment. But for Go developers, WSL2 isn&amp;rsquo;t just a &amp;ldquo;transparent layer&amp;rdquo;. If configured incorrectly, it becomes the bottleneck that can slow down builds by 3x and introduce mysterious latency in networked services.&lt;/p>
&lt;p>This isn&amp;rsquo;t a failure of WSL2; it&amp;rsquo;s a failure of understanding the &lt;strong>9p boundary&lt;/strong>.&lt;/p>
&lt;div class="details-block reveal-item">
 &lt;details>
 &lt;summary>
 &lt;div class="summary-inner">
 &lt;span class="details-label">Glossary //&lt;/span>
 &lt;span class="details-title">What is the 9P Boundary?&lt;/span>
 &lt;svg class="svg-icon icon-plus" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">&lt;path d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z"/>&lt;/svg>
 &lt;svg class="svg-icon icon-minus" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">&lt;path d="M432 256c0 17.7-14.3 32-32 32H48c-17.7 0-32-14.3-32-32s14.3-32 32-32H400c17.7 0 32 14.3 32 32z"/>&lt;/svg>
 &lt;/div>
 &lt;/summary>
 &lt;div class="details-content">
 &lt;p>WSL2 is a Virtual Machine. To let that VM see your Windows files, Microsoft uses the &lt;strong>9P protocol&lt;/strong> (Plan 9).&lt;/p></description></item><item><title>AI Coding in 2026: Productivity Multipliers vs. Skill Replacements</title><link>http://localhost:1313/ai-coding-productivity-vs-skill/</link><pubDate>Sat, 28 Mar 2026 23:00:00 +0530</pubDate><guid>http://localhost:1313/ai-coding-productivity-vs-skill/</guid><description>&lt;p>&amp;ldquo;Write a REST API with authentication&amp;rdquo;.&lt;/p>
&lt;p>I hit enter. Thirty seconds later, Claude spat out 400 lines of perfectly formatted Go code. JWT middleware, password hashing, error handling, even rate limiting. It looked professional. It looked production-ready.&lt;/p>
&lt;p>It took me three hours to figure out why the token refresh logic had a race condition.&lt;/p>
&lt;p>This is AI-assisted coding in 2026. It&amp;rsquo;s not magic. It&amp;rsquo;s not a replacement. It&amp;rsquo;s a very fast junior developer that never gets tired, never complains, and confidently makes mistakes you won&amp;rsquo;t catch unless you actually understand the &lt;strong>architectural nuances&lt;/strong> of what you&amp;rsquo;re building.&lt;/p></description></item><item><title>Fast Docker CI: Stop Rebuilding Container Images on Every Commit</title><link>http://localhost:1313/stop-rebuilding-docker-images-runtime-containers/</link><pubDate>Sun, 15 Feb 2026 02:30:00 +0530</pubDate><guid>http://localhost:1313/stop-rebuilding-docker-images-runtime-containers/</guid><description>&lt;p>I used to rebuild my Docker image every time I fixed a typo. A one-line change meant waiting 2-3 minutes for Docker to rebuild layers, reinstall dependencies, and restart the container. I thought this was just the cost of containerized development.&lt;/p>
&lt;p>Then I discovered runtime containers. Same isolated environment, same reproducibility, but code changes reflect instantly. No rebuilds. No waiting. The runtime lives in the container, the code lives on the host.&lt;/p></description></item><item><title>Python Background Workers: Architecture, Queues, and Retry Strategies</title><link>http://localhost:1313/building-production-ready-background-workers-in-python/</link><pubDate>Sun, 01 Feb 2026 13:00:00 +0530</pubDate><guid>http://localhost:1313/building-production-ready-background-workers-in-python/</guid><description>&lt;p>I thought processing audio in the background was simple: spawn a thread, run the script, save the file. Then I hit 200 concurrent requests, and it failed epically.&lt;/p>
&lt;p>The CPU spiked to full usage because of pydub&amp;rsquo;s processing. The TTS API didn&amp;rsquo;t rate-limit me but, it was horribly slow. Then the jobs started failing. Half the jobs died silently. The other half wrote corrupted files because of race conditions I didn&amp;rsquo;t know existed. And when I deployed a little fix? The deployment killed in-flight jobs, leaving orphaned audio segments scattered across cloud storage directory.&lt;/p></description></item><item><title>Go Struct Field Alignment: How Memory Padding Wastes Your RAM</title><link>http://localhost:1313/go-struct-field-alignment/</link><pubDate>Sat, 24 Jan 2026 10:00:00 +0530</pubDate><guid>http://localhost:1313/go-struct-field-alignment/</guid><description>&lt;p>You write a struct to represent a database entity. Maybe 10 fields, maybe 20. What could possibly go wrong?&lt;/p>
&lt;p>Nothing, according to your tests. But somewhere in production, your heap is 30% larger than it should be, your Garbage Collector is working overtime, and your L1 cache is not used properly. The reason? &lt;strong>Invisible padding bytes&lt;/strong> silently inflating every instance of your struct.&lt;/p>
&lt;p>This is the story of struct field alignment: a memory optimization that costs nothing to implement but can significantly improve performance.&lt;/p></description></item><item><title>I Added Session Management to Aider</title><link>http://localhost:1313/aider-session-management/</link><pubDate>Thu, 15 Jan 2026 20:30:00 +0530</pubDate><guid>http://localhost:1313/aider-session-management/</guid><description>&lt;p>I&amp;rsquo;ve been using &lt;a href="https://aider.chat" target="_blank" rel="noopener noreferrer">aider&lt;/a> as my primary AI coding assistant for a while now. It&amp;rsquo;s the one tool that actually fits my workflow: terminal-based, Git-native, and it works directly on my local files. No copy-pasting into web forms. No context windows that forget everything. And not waiting for agents to keep thinking.&lt;/p>
&lt;p>But it was missing one thing that drove me crazy.&lt;/p>
&lt;h2 id="the-problem-context-evaporates">The Problem: Context Evaporates&lt;a class="anchorjs-link" href="#the-problem-context-evaporates" aria-label="Link to section: The Problem: Context Evaporates">&lt;/a>&lt;/h2>&lt;p>Here&amp;rsquo;s the scenario. I&amp;rsquo;m deep into a complex refactor. I&amp;rsquo;ve added 15 files to the chat, built up tons of context with the model, and we&amp;rsquo;re making real progress.&lt;/p></description></item><item><title>Can ClickHouse Replace Vector Databases? HNSW, Benchmarks &amp; SQL Setup</title><link>http://localhost:1313/clickhouse-as-a-vector-database/</link><pubDate>Wed, 14 Jan 2026 20:00:00 +0530</pubDate><guid>http://localhost:1313/clickhouse-as-a-vector-database/</guid><description>&lt;p>Everyone&amp;rsquo;s building AI apps now. And every AI app needs a place to stash embeddings. The instant your data grows beyond &amp;ldquo;fits in memory&amp;rdquo;, you need a vector database. Or do you?&lt;/p>
&lt;p>If you&amp;rsquo;re already running ClickHouse for analytics, here&amp;rsquo;s some good news: you might not need another database. ClickHouse can hold its own as a vector store. Not because it was built for it, but because it&amp;rsquo;s built to be fast at everything.&lt;/p></description></item><item><title>Memory Mechanics In Go - Stack vs Heap</title><link>http://localhost:1313/memory-mechanics-stack-vs-heap-in-go/</link><pubDate>Mon, 12 Jan 2026 00:10:00 +0530</pubDate><guid>http://localhost:1313/memory-mechanics-stack-vs-heap-in-go/</guid><description>&lt;p>We often talk about &amp;ldquo;fast&amp;rdquo; code in terms of Big O notation or algorithmic complexity. But in systems programming languages like Go, &amp;ldquo;fast&amp;rdquo; is often a function of &lt;em>where&lt;/em> your data lives in memory.&lt;/p>
&lt;p>When optimizing for high throughput, efficient loops and database indexes are only part of the story. Eventually, you have to talk about the Stack and the Heap.&lt;/p>
&lt;p>Understanding the difference isn&amp;rsquo;t just trivia. It is the difference between a service that hums along at 100k OPS with flat latency, and one that chokes on Garbage Collection (GC) pauses every few seconds.&lt;/p></description></item><item><title>OLTP vs OLAP - Why You Need Two Databases</title><link>http://localhost:1313/oltp-vs-olap-why-you-need-two-databases/</link><pubDate>Sun, 11 Jan 2026 21:00:00 +0530</pubDate><guid>http://localhost:1313/oltp-vs-olap-why-you-need-two-databases/</guid><description>&lt;p>At a recent ClickHouse conference in New Delhi, I attended this Saturday. There were many interesting sessions, but one that stood out was a talk on multi-tenant analytics at scale. I was reminded of a fundamental truth in backend engineering: &amp;ldquo;The database that runs your app cannot be the database that analyzes your app&amp;rdquo;.&lt;/p>
&lt;p>Early in a startup&amp;rsquo;s life, we shove everything into one database. User profiles, session data, logs, and analytics events all live in the same Postgres, Mongo, or Couchbase instance. It works, until it throttles.&lt;/p></description></item><item><title>Go Garbage Collector Mechanics: Pacer, GOGC, and Allocation Latency</title><link>http://localhost:1313/dont-take-out-the-garbage-go-gc-deep-dive/</link><pubDate>Wed, 07 Jan 2026 00:21:12 +0530</pubDate><guid>http://localhost:1313/dont-take-out-the-garbage-go-gc-deep-dive/</guid><description>&lt;p>In the world of high-throughput backend services, we often obsess over the usual suspects of performance: database indexing, network latency, and algorithmic complexity. But recently, while debugging our core gateway service (&lt;code>backend-gw&lt;/code>), I encountered a bottleneck that defied standard logic.&lt;/p>
&lt;p>The service was &lt;strong>CPU-bound&lt;/strong>, yet active heap usage was surprisingly low (~200MB). P99 latency was spiking at random intervals, but database queries were returning in milliseconds.&lt;/p>
&lt;p>The culprit was not the business logic. It was &lt;strong>memory management&lt;/strong>. I was effectively running a Denial-of-Service attack on my own runtime.&lt;/p></description></item><item><title>Introducing CouchLens: A Query Analysis Tool for Couchbase</title><link>http://localhost:1313/couchlens-couchbase-query-analysis-tool/</link><pubDate>Sun, 28 Dec 2025 20:00:00 +0530</pubDate><guid>http://localhost:1313/couchlens-couchbase-query-analysis-tool/</guid><description>&lt;p>CouchLens is a client-side web application for analyzing Couchbase N1QL query performance. You feed it JSON exports from &lt;code>system:completed_requests&lt;/code>, &lt;code>system:indexes&lt;/code>, and schema inference results. It parses execution plans, computes metrics, detects inefficiencies, and generates a report showing where your queries are slow.&lt;/p>
&lt;p>Everything runs in the browser. No data leaves your machine. The tool is a Progressive Web App, so you can install it and use it offline. The goal is to give database administrators and developers a way to understand query behavior without writing custom scripts or debugging raw JSON.&lt;/p></description></item><item><title>What Couchbase Taught Me About System Thinking</title><link>http://localhost:1313/what-couchbase-taught-me-about-system-thinking/</link><pubDate>Tue, 18 Nov 2025 02:20:06 +0530</pubDate><guid>http://localhost:1313/what-couchbase-taught-me-about-system-thinking/</guid><description>&lt;h2 id="couchbase-internals-indexes-queries-consistency-and-performance">Couchbase Internals: Indexes, Queries, Consistency, and Performance&lt;a class="anchorjs-link" href="#couchbase-internals-indexes-queries-consistency-and-performance" aria-label="Link to section: Couchbase Internals: Indexes, Queries, Consistency, and Performance">&lt;/a>&lt;/h2>&lt;h3 id="introduction">Introduction&lt;a class="anchorjs-link" href="#introduction" aria-label="Link to section: Introduction">&lt;/a>&lt;/h3>&lt;p>Over the last few years I&amp;rsquo;ve lived deep inside backend systems, and for the past year and a half Couchbase has been my daily companion. Working with Go services that depend on Couchbase taught me that the real lessons aren&amp;rsquo;t in the marketing slides or quick‑start guides. They&amp;rsquo;re in the internals: how indexes are built, how queries are planned, how consistency flags change the story, and how durability levels quietly decide whether your system survives a failure or not.&lt;/p></description></item><item><title>Understanding Private-Public Key Encryption</title><link>http://localhost:1313/private-public-key-encryption/</link><pubDate>Thu, 06 Nov 2025 22:01:23 +0530</pubDate><guid>http://localhost:1313/private-public-key-encryption/</guid><description>&lt;p>In today&amp;rsquo;s digital world, where secure communication, authentication, and data integrity are non-negotiable, &lt;strong>private-public key encryption&lt;/strong> (also called &lt;em>asymmetric cryptography&lt;/em>) plays a foundational role. From HTTPS in your browser to SSH logins, cryptocurrency wallets, and email encryption, this elegant cryptographic system enables trust without prior shared secrets.&lt;/p>
&lt;p>In this blog, we&amp;rsquo;ll dive into:&lt;/p>
&lt;ul>
&lt;li>The core concepts behind asymmetric encryption&lt;/li>
&lt;li>How it differs from symmetric encryption&lt;/li>
&lt;li>The mathematics (intuitively explained) behind popular algorithms like RSA and ECC&lt;/li>
&lt;li>Real-world examples and code snippets&lt;/li>
&lt;li>Common use cases and pitfalls&lt;/li>
&lt;/ul>
&lt;p>Whether you&amp;rsquo;re a curious beginner or a seasoned developer brushing up on fundamentals, you&amp;rsquo;ll find something valuable here.&lt;/p></description></item><item><title>The 5-Minute Refactor</title><link>http://localhost:1313/the-5-minute-refactor/</link><pubDate>Tue, 28 Oct 2025 02:01:23 +0530</pubDate><guid>http://localhost:1313/the-5-minute-refactor/</guid><description>&lt;h2 id="the-5-minute-refactoring-guide">The 5-Minute Refactoring Guide&lt;a class="anchorjs-link" href="#the-5-minute-refactoring-guide" aria-label="Link to section: The 5-Minute Refactoring Guide">&lt;/a>&lt;/h2>&lt;p>As experienced software engineers, we often face a dilemma: our codebases, like all physical systems, trend toward entropy. The gap between &amp;ldquo;getting it done&amp;rdquo; and &amp;ldquo;getting it right&amp;rdquo; grows, leading to sluggish feature delivery and inevitable technical debt. The solution isn&amp;rsquo;t a massive, heroic rewrite; it&amp;rsquo;s the disciplined, humble practice of &lt;strong>Kaizen&lt;/strong>, or continuous improvement.&lt;/p>
&lt;p>For Golang engineers, this translates to the &lt;strong>5-Minute Refactor&lt;/strong>: a daily commitment to making &lt;strong>one tiny, tangible, quality improvement&lt;/strong> to any code you touch. This practice leverages Go&amp;rsquo;s philosophy of simplicity to prevent decay and sharpen your engineering judgment, all in less time than it takes to make coffee.&lt;/p></description></item><item><title>I Built My Own Google Drive</title><link>http://localhost:1313/i-built-my-own-google-drive/</link><pubDate>Wed, 01 Oct 2025 02:02:23 +0530</pubDate><guid>http://localhost:1313/i-built-my-own-google-drive/</guid><description>&lt;h2 id="why-bother">Why Bother?&lt;a class="anchorjs-link" href="#why-bother" aria-label="Link to section: Why Bother?">&lt;/a>&lt;/h2>&lt;p>Whenever I want to download a folder from Google Drive, it starts zipping it for what feels like minutes, and then it downloads the whole zip. There&amp;rsquo;s no incremental download, and I can&amp;rsquo;t add it as a network drive for obvious reasons. These limitations are frustrating, but they also got me thinking: what if I could have a solution that&amp;rsquo;s more flexible, more customizable, and truly mine?&lt;/p></description></item><item><title>How to Resolve Huge Git Merge Conflicts Without Losing Your Mind</title><link>http://localhost:1313/resolving-huge-merge-conflicts/</link><pubDate>Thu, 17 Jul 2025 20:56:00 +0000</pubDate><guid>http://localhost:1313/resolving-huge-merge-conflicts/</guid><description>&lt;p>&lt;strong>How to Resolve Huge Git Merge Conflicts Without Losing Your Mind&lt;/strong>&lt;/p>
&lt;p>If you&amp;rsquo;ve ever been knee-deep in a long-lived branch merge and thought, &lt;em>&amp;ldquo;this can&amp;rsquo;t be what version control was meant for&amp;rdquo;&lt;/em>, you&amp;rsquo;re not alone. Git gives us powerful tools, but resolving large merge conflicts, especially during major migrations or rewrites can feel like surgery without anesthesia.&lt;/p>
&lt;p>In this post, we&amp;rsquo;ll walk through how to approach and resolve massive merge conflicts systematically. Not with hand-wavy advice, but with actual steps, real mental models, and clear visual understanding.&lt;/p></description></item><item><title>What Facebook's Memcache Taught Me About Systems Thinking</title><link>http://localhost:1313/scaling-memcache-facebook/</link><pubDate>Mon, 07 Jul 2025 14:03:00 +0000</pubDate><guid>http://localhost:1313/scaling-memcache-facebook/</guid><description>&lt;p>What Facebook&amp;rsquo;s Memcache Taught Me About Systems Thinking&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;The probability of reading transient stale data is a tunable parameter&amp;rdquo;. - Scaling Memcache at Facebook (NSDI, 2013)&lt;/p>&lt;/blockquote>
&lt;p>There&amp;rsquo;s a moment in every engineer&amp;rsquo;s life when a seemingly simple component like a cache, suddenly becomes the most complex piece in the stack. For me, that moment arrived reading Facebook&amp;rsquo;s paper on scaling Memcache.
I didn&amp;rsquo;t expect a key-value store to challenge my understanding of systems architecture. But this paper wasn&amp;rsquo;t about cache keys or TTLs. It was about what happens when infrastructure hits the limits of scale, physics, and human reliability.&lt;br>
What follows isn&amp;rsquo;t a summary. It&amp;rsquo;s a set of systems insights that stayed with me, principles that go deeper than code and that I now see everywhere.&lt;/p></description></item></channel></rss>