Jan 21, 2026
Microservices
Authentication between microservices is one of those things that seems simple until you actually try to implement it.
We went through 4 different patterns over 18 months. Each one solved some problems but created new ones. Here’s what we learned, and what we eventually settled on.
The problem You have 15 microservices. API Gateway authenticates users with JWT. But how do internal services verify requests from each other?
Service A needs to call Service B. Service B needs to know:
...
ReadJan 20, 2026
NodeJS
Incident Report: Node.js Memory Leak Analysis Date: 2026-01-20
Severity: P1 (Production Impact)
MTTR: 14 days
Root Cause: Event listener leak in WebSocket handler
Timeline of Events Day 1 - Jan 6, 09:30 UTC
Monitoring alerts: API instances restarting every 6 hours Memory usage shows sawtooth pattern (gradual climb, sudden drop) Initial hypothesis: Database connection leak Day 3 - Jan 8
Ruled out database connections (pool metrics normal) Added heap profiling to staging environment Identified EventEmitter instances growing unbounded Day 7 - Jan 13
...
ReadJan 19, 2026
Redis
Common Redis Caching Mistakes (Q&A Format) Q: Our Redis instance is 32GB but our database is only 8GB. Is this normal? A: No, this is a red flag indicating poor cache hygiene.
We encountered this exact scenario. Investigation revealed cache entries from:
Users inactive for 18+ months Deleted/banned accounts Test accounts from 2023 Orphaned session data Problem root cause: Missing TTL (Time To Live) on cache entries.
# ❌ Wrong - lives forever redis.set(cache_key, json.dumps(data)) # ✅ Correct - expires after 1 hour redis.setex(cache_key, 3600, json.dumps(data)) Impact: Set appropriate TTLs → 40% memory reduction immediately.
...
ReadJan 8, 2026
PostgreSQL
Executive Summary This document analyzes a three-month production deployment of PostgreSQL JSONB columns, documenting performance issues encountered, indexing strategies implemented, and architectural patterns that proved effective. The findings are relevant for teams considering JSONB for schema flexibility in high-traffic applications.
Key Metrics:
Initial table size: 2M records Average JSONB column size: 50KB Write throughput: 10K updates/minute Query degradation: 200ms → 14s (70x regression) Background and Context In Q4 2025, our engineering team migrated user preference storage from normalized columns to JSONB format. Primary motivation was reducing schema migration overhead as product requirements evolved.
...
ReadJan 7, 2026
React
Took me six months to actually understand RSC. Not the “I read the docs” understanding - the visceral “oh THAT’S why” moment that only comes from shipping code.
The docs make it sound simple: server components render on the server, client components run in the browser. Cool. Useless explanation.
Here’s what actually clicked for me.
The mental model that stuck Stop thinking about server vs client components. Think about where the data lives.
...
ReadJan 6, 2026
Docker
Step-by-Step Guide: Optimizing Docker Build Performance Introduction Problem Statement: Docker builds taking 8+ minutes per PR, causing CI bottlenecks and increased costs.
Solution Overview: Reduce build time to 40 seconds through multi-stage builds, BuildKit caching, and proper layer optimization.
What You’ll Need:
Docker 20.10+ (for BuildKit support) Basic understanding of Dockerfile syntax A Next.js or Node.js application (examples are adaptable to other frameworks) Expected Time Investment: 2-3 hours for implementation and testing
...
ReadJan 5, 2026
API
Rate limiting seems simple until it isn’t. We thought we had it figured out - Redis counters, sliding windows, the works. Then a client with a distributed system hit our API and everything fell apart.
What we built initially Standard stuff. Token bucket in Redis:
def check_rate_limit(api_key: str) -> bool: key = f"rate_limit:{api_key}" current = redis.get(key) if current and int(current) >= 100: # 100 req/min return False pipe = redis.pipeline() pipe.incr(key) pipe.expire(key, 60) pipe.execute() return True Worked great in testing. 100 requests per minute per API key, clean reset every minute.
...
ReadJan 4, 2026
TypeScript
Learning TypeScript Generics Through Real Examples Introduction: Why Generics? Let’s start with a question I get asked all the time:
“I’ve been writing TypeScript for a year, but I still don’t really understand generics. Should I just copy-paste them from Stack Overflow?”
Short answer: No. Let me show you why generics exist and when you actually need them.
Part 1: The Problem Generics Solve Imagine you’re building a simple data fetching function. Let’s start without generics:
...
ReadJan 3, 2026
Database
Indexes are supposed to make queries fast. Sometimes they make them slower. Here’s what I wish someone told me before I tanked production performance trying to “optimize” our database.
The query that started it all Support said the admin dashboard was timing out. Found this in the slow query log:
SELECT * FROM orders WHERE customer_id = 12345 AND status IN ('pending', 'processing') AND created_at > '2025-12-01' ORDER BY created_at DESC LIMIT 20; Took 8 seconds on a table with 4 million rows. Obviously needs an index, right?
...
ReadJan 2, 2026
Git
Everyone tells you to avoid git rebase. “It’s dangerous!” “You’ll lose commits!” “Just merge!”
I used to think that too. Then I joined a team that rebases everything and our git history is actually readable. Here’s what changed my mind.
The merge commit mess This was our git log before rebasing:
* Merge branch 'feature/user-auth' |\ | * Fix typo in button text | * Update tests | * Merge main into feature/user-auth | |\ | |/ |/| * | Merge branch 'fix/header-spacing' |\ \ | * | Adjust header margin * | | Merge branch 'feature/notifications' |\| | | |/ |/| See those merge commits? They add zero value. Just noise. Finding where a feature was added means clicking through 5 merge commits.
...
Read