Everything I’ve published, in one place. Posts on this site appear in the archives and in the RSS feed; the rest lives on project sites and is indexed here so nothing gets lost between platforms.
Most of it argues one thing from different directions: a decision belongs where its authority already lives.
Essays — data and systems architecture
On this site. Browse the archives for the full list.
- The Lakehouse Publishes. Applications Decide Locally. — August 2026. A shared lakehouse masters and publishes governed context asynchronously; each application accepts the subset it needs into its own boundary and decides locally against operational state and accepted context together. An upstream outage becomes bounded freshness lag instead of an outage of your own.
- Operational and Analytical Are Not Separate Architectures — July 2026. The operational/analytical split organizes teams but misdescribes the system: applications observe and act, a shared substrate remembers and synthesizes, and knowledge returns to change the next decision. The complete unit of architecture is the information ecosystem.
- Decoupling Compute and Storage in Postgres: The Architectural Implications of Databricks Lakebase — February 2026. What compute–storage separation changes about what a PostgreSQL database is, and what that means for anyone who deploys to one.
- Why We Are Still Getting Database Deployments Wrong in 2026: The Limits of External State Management — February 2026. Why a migration tool standing outside the database cannot hold an accurate model of what happened inside it, and what the alternative looks like.
Articles — PostgreSQL deployment engineering
On the pgmi project blog, written around pgmi, an open-source PostgreSQL-native execution fabric I build and maintain. Every example is verified against a live PostgreSQL instance.
- Your Deployment Is a PostgreSQL Program — August 2026. Every migration tool is a program that executes your SQL. Invert the control flow and deployment policy becomes SQL the project owns, while the tool keeps only a narrow execution mechanism.
- Scenario-Tree Testing in PostgreSQL: Every Authored Branch, Shared History, Before COMMIT — August 2026. Express branching business scenarios as a directory tree and walk it with savepoints, so each branch inherits its history instead of rebuilding it — and let the walk decide whether the deployment commits.
- The Request Becomes a Transaction — August 2026. A transactional API has two halves. Keep the network edge at the edge; give the transactional operation to PostgreSQL, where its authority already lives. Every declared outcome then becomes provable in the same transaction.
- Your ALTER TABLE Is Fast. The Queue Behind It Is Not. — August 2026. How a PostgreSQL lock queue turns a six-millisecond schema change into a sixteen-second outage, and the two moves that bound the damage.
- Your Transaction Boundary Belongs in the Program, Not the Filename — August 2026. A phased schema change spans transactional and non-transactional work. Most tools express that as metadata; it belongs in the SQL program itself.
- Your Migration Numbers Are a Distributed Counter Without Coordination — July 2026. What migration-number collisions reveal about identity, ordering, and where the resulting invariants get enforced.
- From Seed Scripts to Desired-State Reference Data in PostgreSQL — July 2026. Version the catalog that should exist, not the procedure that inserts it — and validate, diff, load, and reconcile it inside one transaction.
- AI agents write PostgreSQL like Python — July 2026. Field notes from a production review of an AI-written PostgreSQL backend: exceptions as control flow, casts that turn bad requests into 500s, and the handler discipline that contains them.
- Test PostgreSQL migrations before COMMIT — July 2026. PostgreSQL’s transactional DDL lets you assert against the migrated schema inside the deployment transaction, so a failing check means the deployment never happened.