Blog
Notes on engineering, distributed systems, and AI-assisted development.
The AI-Assisted Development Lifecycle
A spec-driven, review-heavy workflow for shipping real features with Cursor, built around one idea: build the feature twice.
- Series · 3 parts
Idempotency in Practice
The exactly-once lie, a Stripe-style key store in Postgres, and Kafka’s exactly-once perimeter.
- Series · 4 parts
Airflow on Kubernetes
Deploying, scaling, and operating Apache Airflow on Kubernetes.
- Series · 3 parts
CRDTs from Scratch
Theory, code, and libraries for conflict-free replicated data types.
Turn Your Coding Agent into a Grounded Coding Assistant
Using Docs-MCP-Server to give a coding agent retrieval over real, up-to-date library docs, so it stops inventing APIs that don't exist.
- Series · 4 parts
Event Sourcing from the Ground Up
A log-shaped tour from foundations to CQRS to production realities.
A Self-Hosted Read / Listen / Ask Reader
One self-hosted web app for reading EPUBs and PDFs, listening with a local voice, and asking a local LLM about whatever you just selected.
- Series · 3 parts
Distributed Clocks and Ordering
Wall clocks, logical clocks, and the hybrid clocks production databases run on.
Software Engineering in the Time of AI
AI is already in the toolkit, but it isn't the revolution the marketing claims. Its value is automation, not intelligence, and the difference matters more every month.
Building a Vision-Language API to Convert PDFs into Markdown with SmolDocling
A small FastAPI wrapper around SmolDocling, a 256M-parameter vision-language model that converts PDF pages into structured Markdown (tables, equations, code blocks intact) without an OCR pipeline.
Monitoring Next.js with Prometheus in Kubernetes
Wiring Prometheus into a Next.js app via Server Actions and running the whole thing on a local Kind cluster.