kikoolz
  • Home
  • Blog
  • About
© 2026 Kenneth Kikoole. All rights reserved.

Blogs

Explore my thoughts on design, development, and technology

Mar 18, 2025
237

Everything That Can Go Wrong With JWTs (And How to Not Let It)

JWTs are everywhere and most implementations have at least one subtle security bug. Here's a complete implementation with the mistakes explained so you understand why each decision matters.

Read more →

Dec 24, 2025 236

The TypeScript Utility Types I Actually Use Every Week

TypeScript ships with 20+ utility types. Most tutorials show you all of them once. Here are the ones that show up constantly in real codebases, with the patterns that actually make them useful.

May 14, 2025 104

I Stopped Using ORMs. Then I Started Again. Here Is Why

Raw SQL is honest and powerful. It's also not where you want to be writing your 40th pagination helper. A pragmatic look at when ORMs help and when they get in your way.

Apr 12, 2026 24

Error Handling in TypeScript That Actually Scales

try/catch everywhere is not a strategy. Here is a typed error handling approach borrowed from Rust that makes failures explicit, composable, and impossible to accidentally ignore.

Sep 9, 2025 17

Setting Up a Monorepo That Doesn't Make You Want to Quit

Turborepo makes monorepos manageable. But the setup decisions you make in week one affect you for years. Here's what I'd do differently if I were starting from scratch.

Jul 23, 2025 11

Postgres Full-Text Search Is Better Than You Think (Until It Isn't)

Before you spin up Elasticsearch or Typesense, try Postgres. It handles more search use cases than most people expect and I'll show you where it falls over so you know when to move on

Apr 8, 2025 18

Offloading CPU Work to Web Workers Before Your UI Freezes

The main thread is for user interactions. Long-running JavaScript tasks block it and create janky, unresponsive UIs. Here is a practical guide to Web Workers when you need them and how to use them without losing your mind.

Nov 19, 2024 14

Feature Flags Without the Platform: A Practical Implementation

You don't need LaunchDarkly to ship safely behind flags. Here's a Postgres-backed feature flag system with gradual rollouts, user targeting, and a management UI that you can own and operate yourself.

Jul 16, 2024 23

Six Months With React Server Components: The Honest Assessment

I shipped two production apps with RSC in the past six months. Here's what the mental model shift actually feels like, where I got burned, and whether I'd do it again.

Apr 12, 2026 24

One Schema to Rule Both Ends: Sharing Zod Validation Across Frontend and Backend

You have Zod validating your API on the backend. You have a form on the frontend. They model the same data. Here is how to share them without ending up with two diverging sources of truth.

Sep 3, 2025 44

Your App Is Probably Misconfigured for Database Connections

Connection pool misconfiguration is one of the most common sources of production database issues and one of the least discussed. Here is what actually happens under the hood and how to get it right.

Jun 23, 2025 20

Building a Rate Limiter in Redis That Actually Holds Up

The sliding window algorithm, why fixed windows have a nasty edge case, and how to implement both in Redis with Lua scripts so they're atomic.

Mar 11, 2025 12

Building a CLI Tool That People Actually Enjoy Using

The gap between a CLI that works and a CLI that people want to use comes down to a handful of decisions around output, error messages, interactivity, and discoverability. Here's what I've learned building internal tools.

Oct 12, 2024 23

Optimistic UI Updates Are Harder Than They Look

React Query makes optimistic updates look trivial in the docs. Here's what happens when you actually ship them to production.

Jan 29, 2026 35

WebSockets vs Server-Sent Events: Stop Defaulting to WebSockets

WebSockets are the reflex answer to real-time features. They're also overkill for most of what people actually build. Here's how to think about the tradeoff and when SSE is the better tool.

Aug 6, 2025 19

Building an Image Upload and Optimization Pipeline That Doesn''t Embarrass You

Raw user-uploaded images sent straight to a CDN is the saddest pattern in web development. Here is a proper pipeline — client-side validation, server-side processing, multiple formats, and a delivery setup that actually makes pages fast."

Jun 12, 2025 10

Caching Is a Spectrum: Picking the Right Strategy for Each Layer

No-cache and cache-forever are both wrong most of the time. Here is a mental model for HTTP caching, stale-while-revalidate, and in-memory caching that maps to actual use cases.'

Jan 1, 2025 23

Container Queries Finally Make Component-Driven CSS Make Sense

Media queries were always the wrong abstraction. We've been designing components based on the viewport when we should have been designing them based on their container. Container queries fix that.

Aug 14, 2024 16

Writing Code That Is Testable Without Making It Unreadable

Most untestable code is untestable for the same reasons. Here's how to apply dependency injection in TypeScript without going full enterprise-architecture on a simple Node.js app.