KIRITO
BLOG

THE BL<G>

Deep dives into modern web technologies, architectural patterns, and the ever-evolving landscape of software engineering.

PERN5 min

The Day PostgreSQL Row-Level Security Broke My API

Adding Row-Level Security to PostgreSQL seemed smart — until every API request started returning empty arrays and users thought their data was deleted.

#postgresql#pern#rls+2 more
Jun 10, 2026
READ MORE
Next.js5 min

The Day Next.js Middleware Destroyed My SEO

A simple middleware to handle authentication created a redirect loop that got 15,000 pages de-indexed from Google in 48 hours.

#nextjs#seo#middleware+2 more
Jun 10, 2026
READ MORE
DevOps6 min

The Kubernetes Rollout That Almost Ruined Black Friday

A simple kubectl rollout restart on Black Friday caused a 47-minute outage and $340,000 in lost sales — all because of a missing readinessProbe.

#kubernetes#devops#black-friday+2 more
Jun 10, 2026
READ MORE
Expo6 min

The Expo OTA Update That Broke Offline Mode for 10,000 Users

An innocent OTA update changed how AsyncStorage worked, causing 10,000 offline users to lose their data and making the app crash on launch.

#expo#react-native#ota-updates+2 more
Jun 10, 2026
READ MORE
Next.js5 min

The Next.js Server Action That Leaked User Emails to Google

A Server Action that fetched user profiles returned HTML with email addresses in the response, and Google indexed them all within hours.

#nextjs#server-actions#security+2 more
Jun 10, 2026
READ MORE
DevOps6 min

The 2.3GB Docker Image That Killed Our Deploys

A Node.js Docker image grew to 2.3GB, causing 25-minute deploys and $500/day in extra costs — until we discovered multi-stage builds.

#docker#devops#image-size+2 more
Jun 10, 2026
READ MORE
Expo7 min

The Push Notification That Woke Up 50,000 Users at 3 AM

A misconfigured cron job sent "Good morning!" notifications at 3 AM to 50,000 users. The uninstall rate went up 800% in 24 hours.

#expo#push-notifications#cron-jobs+2 more
Jun 10, 2026
READ MORE
MERN7 min

The Unhandled Promise Rejection That Killed Our Node.js Server

One missing .catch() caused our Node.js server to crash 47 times in one night. Each crash took 30 seconds to recover — 23 minutes of downtime total.

#nodejs#mern#promises+2 more
Jun 10, 2026
READ MORE
Git3 min

The Day Git Saved My 2 Hours of Work

A failed Husky pre-commit hook made me think I lost 18 files and 2 hours of work — until I discovered how Git stash saved everything.

#git#husky#lint-staged+2 more
Jun 10, 2026
READ MORE
MERN5 min

The MongoDB Aggregation Pipeline That Killed Our CPU for 3 Hours

A single aggregation pipeline with $lookup and $unwind brought our MongoDB CPU to 100% for 3 hours — all because of missing indexes and bad pipeline ordering.

#mongodb#aggregation-pipeline#performance+2 more
Jun 10, 2026
READ MORE
PERN4 min

The Prisma findUnique That Returned null (But the Data Existed)

A Prisma query kept returning null for records that definitely existed. The culprit? A case-sensitive UUID comparison between PostgreSQL and Node.js.

#prisma#postgresql#uuid+2 more
Jun 10, 2026
READ MORE
Next.js4 min

The Next.js Static Export That Generated 50,000 404 Pages

Setting output: "export" in Next.js seemed simple until Google indexed 50,000 404 pages because of a trailing slash mismatch.

#nextjs#static-export#trailing-slash+2 more
Jun 10, 2026
READ MORE
DevOps4 min

The GitHub Actions Secret That Printed to Logs (And We Rotated All API Keys)

A debug echo command printed our AWS secret key to GitHub Actions logs. Within 3 minutes, someone tried to launch 50 EC2 instances on our account.

#github-actions#secrets#aws+2 more
Jun 10, 2026
READ MORE
Expo4 min

The Expo Build That Failed Because of Metro’s Symlink Resolution

Using Yarn workspaces with Expo caused Metro to fail with "Unable to resolve module" – but only on CI, never locally. It took 2 days to find the symlink issue.

#expo#metro#symlink+2 more
Jun 10, 2026
READ MORE
PERN5 min

The PostgreSQL Check Constraint That Silently Corrupted User Data

A poorly written CHECK constraint accepted invalid data but rejected valid updates, corrupting 10,000 user records without any error message.

#postgresql#check-constraint#data-corruption+2 more
Jun 10, 2026
READ MORE
Next.js5 min

The Next.js Image Optimization That Brought Down Our Vercel Deployment

Adding next/image to 500 product images seemed fine until Vercel started timing out during build – because each image triggered a remote fetch.

#nextjs#image-optimization#vercel+2 more
Jun 10, 2026
READ MORE
DevOps4 min

The Docker Volume That Accumulated 200GB of Logs (And Killed the Server)

A Docker container wrote logs to an anonymous volume. 6 months later, that volume had 200GB of log files and brought the entire server down.

#docker#logs#disk-space+2 more
Jun 10, 2026
READ MORE
Expo4 min

The React Native FlatList That Re-rendered 1,000 Times Per Second

A FlatList with 2,000 items started re-rendering every frame, dropping to 5 FPS. The cause: an inline arrow function passed to renderItem.

#react-native#flatlist#performance+2 more
Jun 10, 2026
READ MORE
PERN4 min

The PERN Stack Authentication That Accepted Any Password (For 3 Days)

A typo in bcrypt.compare made it return true for any password. 1,200 user accounts were accessed without authorization before we caught it.

#pern#bcrypt#authentication+2 more
Jun 10, 2026
READ MORE
MERN3 min

The MongoDB Shard Key That Made 99% of Queries Scan Every Shard

Choosing the wrong shard key turned our 10-shard cluster into a broadcast storm – every query hit all shards, and response times went from 50ms to 5 seconds.

#mongodb#sharding#performance+2 more
Jun 10, 2026
READ MORE
PERN2 min

The Prisma Migration That Dropped a Production Column (No Way to Recover)

A Prisma migration that looked safe – renaming a column – turned into a silent data loss because we forgot to add a @map attribute. 50,000 rows lost their values.

#prisma#migration#data-loss+2 more
Jun 10, 2026
READ MORE
Next.js2 min

The Next.js Parallel Route That Caused an Infinite Loop (And Killed the Server)

Parallel routes in Next.js 14 seemed perfect for a dashboard layout – until a missing default.js file created an infinite rendering loop that maxed out CPU.

#nextjs#parallel-routes#infinite-loop+2 more
Jun 10, 2026
READ MORE
DevOps2 min

The Docker Network That Leaked Host Ports (And Exposed Redis to the Internet)

Using 'network_mode: host' on a Redis container seemed convenient – until we realized it exposed Redis directly to the public internet without authentication.

#docker#redis#network-mode-host+2 more
Jun 10, 2026
READ MORE
Expo3 min

The Expo Splash Screen That Never Hid (And Users Thought the App Was Frozen)

A misconfigured splash screen stayed visible forever on Android because we forgot to call 'SplashScreen.hideAsync()' after an async operation that threw an error.

#expo#splash-screen#android+2 more
Jun 10, 2026
READ MORE