Real-world Backend Engineering
Production-minded notes on failures, tradeoffs, performance, and the decisions behind reliable systems.
JSON to Java, Kotlin and TypeScript in the Browser: What JSON2Class Infers and Where It Stops
Technically reviewed Every code sample was produced by running app/src/lib/jsonClassCore.js from the json2class repository under Node.js 20 and pasting the output unedited; regenerated 2026-09-17 against the build that fixes array widening, Kotlin imports and the Markdown column label, with 47 core tests and 309 repository tests passing, and verified live in the deployed bundle
A walk through the type inference behind JSON2Class, a browser-only JSON to class generator I build and maintain: the Java, Kotlin and TypeScript it emits for one order payload, the annotation directives you can write inside the JSON, how array element types widen across every element, and the limits that remain before you paste production data into it.
Recently published
Latest articles
-
Temperature Scaling Under Data Drift: What Recalibration Fixes and What It Cannot
A reproducible NumPy lab: temperature scaling never changes accuracy, a temperature fitted on clean data stops working after covariate drift, and under concept drift the best temperature runs away because the model is wrong.

-
Canary Releases With Automated Rollback on Kubernetes: Flagger and Istio, Run and Recorded
A Flagger v1.45.0 + Istio 1.31.0 canary on kind: a healthy candidate promoted in five weight steps, a candidate returning HTTP 500 rolled back after five failed checks, the VirtualService weights at every step, and the metric-window mistake that almost rolled back the healthy one.

-
Server-Sent Events with Spring Boot WebFlux: A Tested Implementation and Its Limits
A Spring WebFlux SSE endpoint built with Reactor Sinks, verified in Chrome: named events, automatic reconnection, Last-Event-ID replay, and the sink behaviors that break shared streams.

-
Async Logging with the LMAX Disruptor in Java: What Blocks, What Drops, and What You Lose
A tested Disruptor 4.0.0 async logger: why ringBuffer.next() blocks when the buffer is full, how tryNext() drops, two ways to lose log lines silently, and a benchmark with stated boundaries.

-
Shadow Testing an AI Model: The Metrics, and the Two Ways the Shadow Lies
A reproducible NumPy lab that scores a production and a candidate model on the same request stream, computes the paired comparison a shadow run should produce, and shows two cases where the shadow verdict is wrong: label delay under a traffic-mix shift, and labels that only exist for what production approved.

Explore the archive
Engineering topics
Off the blog
Things I build
-
JSON2Class
Paste JSON, get an immutable Java DTO, a Kotlin data class, a TypeScript interface and a Markdown field table. Plus JSON diff, JSON Schema, Avro, Kafka message and JWT tools. Runs in the browser; nothing is uploaded.
-
Number Dodge
A 1–8 bluffing game for up to eight people: one player attacks four numbers, the rest dodge with one. No signup, no install, share a room link. Static ES modules with zero runtime dependencies.
