Writing
Notes and long-form
79 articles

mobile ·
The check-in app is one web page and two wrappers
A tablet by the door where members check themselves in. It started as a Next.js app, then became an iOS and an Android app that render exactly that page in a WebView and carry no product logic at all. The most instructive part was the subsystem I built, tested, shipped and deleted eight days later.

ai ·
A year with Codex, a week with Astra

ai ·
Onboarding took two days. Now it takes two hours.

on-premise ·
A door on someone else's network

cost ·
$58 a month to keep one container awake

cloud run ·
Ready is not alive

ci/cd ·
Nobody has a service-account key

ai ·
The CSV importer that proposes and never executes

postgresql ·
The RAG client was stealing my connections

google cloud ·
The project quota that killed Shared VPC

ai ·
Five assistants, one loop

nestjs ·
Express 5, Fastify 5, and the adapter I did not swap

ai ·
AGENTS.md, or writing for a reader that forgets

typescript ·
They ported tsc to Go

redis ·
Redis is open source again, and I have stopped keeping score

ai ·
The block images are generated now

ai ·
A tool call is just a schema

kafka ·
ZooKeeper is gone

sdk ·
A batch of ten, a flush timer, and the event that did not fit

messaging ·
One topic, three regions, and the policy that took the longest

databases ·
Aurora DSQL, and the clock doing the hard part

redis ·
A week of alternatives, and the migration I did not make

nestjs ·
NestJS over plain Express

analytics pipeline ·
The tunnel that starts on our side

postgresql ·
Two years later, MERGE grew the clauses I wanted

elasticsearch ·
Elasticsearch came back

embedded analytics ·
The filter you can see is not the one that matters

redis ·
Redis changed its licence, and the fork was already warm

ci/cd ·
Auto-merging a pull request nobody wrote

aws proton ·
Proton opens the pull request. You own everything after it.

lookml ·
Promoting a dashboard is a string replacement

redis ·
Valkey exists now

platform engineering ·
The button in Port and the service it makes

go ·
Go changed a loop, and nothing broke

opentofu ·
The fork shipped

c# / .net ·
.NET 8, Native AOT, and what a container actually costs

automation ·
The snapshot restore was the easy half

queues ·
BullMQ, and the Mongo queue I did not use

migration ·
The cutover was a connection string

terraform ·
The licence changed under the state file

kafka ·
The bridge release arrived

terraform ·
The import block, and the resources nobody wrote down

next.js ·
The App Router went stable. My site did not move.

rust ·
A weekend with Rust, and the index that stopped cloning

typescript ·
TypeScript 5.0 and the decorators that are finally the real ones

go ·
Errors are values. Go 1.20 made them a list.

eventbridge ·
EventBridge Pipes, and the Lambda I deleted

kafka ·
Kafka without ZooKeeper, for new clusters only

c# / .net ·
.NET 7, and the string literal I stopped escaping

postgresql ·
MERGE is not the upsert you already had

self-hosted runners ·
Self-hosted runners, one deployment per product

mongodb ·
MongoDB 6.0, and the change stream that can show you the before

node.js ·
Node 18 shipped fetch and a test runner. I kept one.

terraform ·
Terraform learned to say what it assumed

kubernetes ·
The dockershim went away and my images did not notice

lucene ·
Every string search I did not have to write

c# / performance ·
The Java port we could not make fast enough

ci/cd ·
GitHub Actions over Jenkins

groovy ·
Groovy everywhere, with one large asterisk

python ·
Two hundred lines of PowerShell I could not test

windows / containers ·
Windows containers, Linux containers, and when a small Windows VM wins

pipelines ·
The scheduled job on the Windows agent

spark / hadoop ·
I wrote a Spark job. The stack trace was Hadoop.

spark ·
The cluster went away. The shuffle did not.

jenkins ·
A Windows agent for Jenkins, from bare VM to online

c# / architecture ·
C# without the class hierarchy

retrospective ·
A year of automating a flat

c# / .net ·
.NET 6 makes small services simpler

infrastructure ·
The same stack, written twice

memorydb ·
Redis you are allowed to lose, and Redis you are not

step functions ·
A ten minute wait should not cost you Lambda time

serverless ·
SAM and Serverless Framework, on the same flat

infrastructure ·
The template I wrote and the one AWS ran

serverless ·
EventBridge cannot tell you when the sun sets

.net / containers ·
Running .NET 5 in Linux containers—and measuring its memory

c# / .net ·
C# 9 and .NET 5: less ceremony, useful improvements

alexa ·
A smart home skill is a router and a contract

migration ·
The migration tool that could not phone home

leadership ·