Make Your Codebase Inevitable 
 In the previous post , I narrowed the
harness down to the parts that matter most: Skills and Loop. Skills are what the agent knows. Loop
is the cycle it runs and when it checks itself. The codebase supplies much of the raw material for
both. 
 An agent enters each session without the tribal knowledge you carry between tasks. You are…
What’s Inside the Harness 
 In March I published
 Building Your Own Agent Harness .
A harness, I said, is the skills, workflows, and methodology that teach your agent how you think and
how you build. Since then, harness has taken on a different meaning: Claude Code, Codex, Cursor,
the whole runtime wrapped around a model. In my terms, that combination is the agent. You…

 
 
 
 
 


 Test behaviour, not implementation 
 Most testing arguments get lost in theoretical minutiae and miss the point: validating correctness.
Testing units at every level makes tests brittle and code resistant to change. Testing full vertical
slices is too coarse - it’s hard to cover invariants and edge cases. 
 What you want is…
Are we microservice yet? More services than people. 
 The number of services in your system is not the flex you think it is. 
 A recent Wise post flexing about how they have over 1000 services and 950 engineers triggered a pet
peeve about how teams treat service count as some sort of badge of how well they are doing
microservices. Like that is the goal in and of itself and not a…
Building Your Own Agent Harness 
 I’ve been trying to write about coding agents for a while. Each time I sit down, the ground has
shifted. The models change, my own workflow changes, and whatever I had to say feels stale before I
finish saying it. 
 But one thing has stayed constant through all of it: the agents that produce good work are the ones
that know how I work. My…
Scaling a Double-Entry Ledger for a Massive PSP 
 In Part 1 , we built a real-time double-entry
ledger using optimistic locking. We benchmarked it and found it handles 160-440 req/sec depending
on contention, with zero errors and stable tail latencies. But benchmarks on localhost are one
thing. Production at PSP scale is another. 
 This post answers the question: Can this…
Optimistic Locking in a Double-Entry Ledger 
 Ledgers are a deceptively simple problem to tackle. At a certain scale, leveraging a simple
 SELECT FOR UPDATE works perfectly well—wrap everything in a transaction, and move on. 
 But the moment you need concurrent writes to the same accounts, hundreds of transactions per second,
and real-time balance consistency—everything changes.…
Relational DynamoDB: Advanced Patterns and Production Realities 
 In Part 1 , we covered the fundamental tradeoffs.
In Part 2 , we built
GitHub’s backend. Now let’s talk about what happens when you’re running this in production. 
 These are the sharp edges that separate successful DynamoDB implementations from disasters. Hot
partitions that throttle your…
Relational DynamoDB: Building GitHub’s Backend in DynamoDB 
 In Part 1 , we covered why DynamoDB forces you to
think differently—you design for access patterns, not flexibility. Now let’s put that into practice
by building something real: GitHub’s backend. 
 This implementation is based on the GitHub metadata example from
 The DynamoDB Book by Alex…
Relational DynamoDB: When DynamoDB Stops Being Simple 
 Let’s be clear about something upfront: if you’re using DynamoDB as a simple key-value store—storing
session data, caching API responses, or managing user preferences—you don’t need any of this. Just
use the AWS SDK directly. Store your items, retrieve them by ID, and move on with your life. 
 But the moment…
Events vs Commands: The Distinction Everyone Always Forgets 
 Here’s the thing about event-driven architecture, everyone keeps shooting themselves in the foot by
mixing up events and commands. I’ve seen this pattern dozens of times: a team starts with
EventBridge, everything looks great, then six months later they’re drowning in hidden dependencies
and wondering…
EDA for the Rest of Us: Operational Challenges 
 This is the final post in the “EDA for the Rest of Us” series. We’ve covered
 Event Design Patterns ,
 Communication Patterns , and
 Consumption Patterns . Now for the critical
part: evolving your architecture as your business grows. 
 You’ve built a successful event-driven system. It’s…
EDA for the Rest of Us: Consumption Patterns 
 This is part 4 of the “EDA for the Rest of Us” series. Previously, we covered
 Event Design Patterns (how to structure
events) and Communication Patterns (how
events flow between services). Now we’re tackling the consumption side - where those beautifully
designed events meet the harsh reality of production…
EDA for the Rest of Us: Communication Patterns 
 This is part 3 of the “EDA for the Rest of Us” series. If you haven’t read
 A Guide for the Confused and
 Event Design Patterns , I recommend starting
there as we’ll build on those concepts. 
 In my previous post, we explored event design patterns - how to structure the information in your
events.…
EDA for the Rest of Us: Event Design Patterns 
 This is part 2 of the “EDA for the Rest of Us” series. If you haven’t read
 A Guide for the Confused , I recommend
starting there as we’ll build on those concepts. 
 The most important decision in event-driven architecture isn’t which technology to use, it’s what
information to put in your…
EDA for the Rest of Us: A Guide for the Confused 
 Over the past couple of months I’ve been trying to figure out what it means to have an event-driven
architecture (EDA)? If you read books on the topic like
 Event-Driven Microservices 
and
 Flow Architectures 
you’d think that unless you’re running Apache Flink and Kafka you’re somehow doing it…
Just use Make as your Task Runner 
 Make is ubiquitous on *nix systems, and it’s a great way to automate tasks. Every language
ecosystem has it’s own set of tools to build, format, lint, test, and deploy code. But every project
has the same set of tasks that need to be done. And I’m just not smart enough to remember the
correct encantations to invoke to run them.…
An Idiots Guide to mocking HTTP with MSW 
 I recently had some real trouble getting MSW to work with my tests. It seems like I ran into a few
gotchas that I’ll try to explain here. 
 For context, I’m using Vitest as my test runner and
 openapi-react-query to make my API calls. 
 MSW not matching any of my requests 
 After setting up MSW as per the docs 
…
Deploying NodeJS with pnpm and tsx 
 In the previous post we packaged our NodeJS application as a single “binary” by bundling
everything into single file that can deployed without the need to for the node_modules .
Unfortunately this is a bit of an esoteric way to package a NodeJS application, with many packages
relying on the node_modules to be included on disk.…
Building NodeJS Apps with ESBuild and Docker 
 NodeJS is famous for it’s the ridiculous size of the node_modules , which can easily baloon into a
gigabyte of files on disk. In the frontend world it is common to treat your final app as essentially
a compiled binary, packaging and compressing the application and it’s depencdencies into a single
file. 
…
Python, Poetry and Docker. 
 Building docker images for Python projects that use Poetry is surprisingly unclear ,
considering to it should be the default way to build and deploy Python projects. This is my attempt
at clearing things up and providing a simple default way to build images. 








 




 
 
 
 
…
The 3 pillars of observability in Quarkus 
 Quarkus 
 Quarkus is part of a new crop of lightweight, fast, container first Java frameworks. Designed to cut
out the cruft of legacy frameworks like Spring Boot and
built from the ground up on battle tested libraries from Vert.x and
 Microprofile . 








 




 
 
…
Adding OpenAPI Specs to Finatra 
 OpenAPI (A.K.A. Swagger ) is an
industry standard way to describe HTTP API’s, this can in turn be used to generate documentation,
clients to consume the API in many languages and even stub implementations of the server in many
languages. The advisability of the last point depends on your view of the Specification driving
the Implemetation…
Unit Testing: Ain’t nobody got time for that! 
 Saving time by skipping unit tests, the misguided guide to software development 
 Unit Testing despite it’s origins in Extreme Programming over 20 years ago, and the pervasiveness of
Agile Methodologies in Software Development management, is still viewed by far too many developers
and managers as unnecessary burden on the…
How to find what you are looking for? 
 Search is often the first experience a user has with your site. Providing a good search experience
is vital to the continued success of your product. 








 




 
 
 
 
 
 


 Being such a core part of our user experience, it is important that the code…
Apache Camel Part II: TDDing CSV Parsing 
 
 Apache Camel Series : This post forms part of a series of blog posts about writing a “Real
World Application” with Apache Camel. Covering topics like Persistence, Testing, IoC, API
Integration and “Big Data”. Using the example of processing the NYC Trip Data , you can follow
my progress here 
 
 TDD is…
Efficient XML Parsing with Java. 
 For a language that likes XML so much, it was rather difficult to find an efficient and elegant way
to parse it. 
 There’s more than one way to parse XML? 
 There are 2 ways to work with XML documents, read the full document and build a full DOM object
representing the document or read the document as stream extracting what you need from…
Apache Camel Part I: Guicing Camel 
 
 Apache Camel Series : This post forms part of a series of blog posts about writing a “Real
World Application” with Apache Camel. Covering topics like Persistence, Testing, IoC, API
Integration and “Big Data”. Using the example of processing the
 NYC Trip Data , you can follow my
progress here 
 
 DI /…
EIP and Apache Camel 
 Apache Camel is an incredible piece of software that allows you to easly define complex EIP
workflows with absolute ease. 
 Wait! What?! Yeah, that was a fare amount of jargon. 
 I’m going to try break that down and show that hiding under all that stuffy looking jargon is a
pretty jus framework for solving some very common problems. 
 Enterprise…
Wordpress Done Right 
 Wordpress is 22% of the internet, that is insane. It’s so popular because it makes it so easy for a
layman to make a website. The problem is hosting and maintanence, there just doesn’t seem to be any
sort of complete (at least to my standards) guide on how to do it right. This my guide on how to
host a multi-site wordpress installation. 
…
WebAudio fun with a theremin 
 This is simply a more complete / working demo of the one
 Mozilla have
made, it acts as simple demostration of the WebAudio API. 
 The theremin is an oscillator for a given wave function, controlled by the dropdown. The gain
(volume) and frequency of the oscillator are controlled by the X and Y position of the mouse pointer
over the canvas…
Build your own Heroku with Dokku 
 Heroku is great! Until you want to build something mildly complex or off script. 
 It provides a great platform to quickly deploy prototypes witten in pretty much any langauge via
git. This allows you to focus on your app and getting your ideas out there IRL. But as with most
magic bullets you quickly start to run into their limitations. 
…
Deploying a static site to S3 
 Static stite generators are a great, simple way to manage simple websites for the technically savy.
S3 is a great way to host static content on the web. 
 Prerequisites 
 
 An AWS account 
 A static website 
 
 I’m not going to cover creating a website with a static site generator,
 jekyll and hugo are both great options.…
Troll people with OmniSharp Emacs 
 As great an IDE Visual Studio is; I’ve never been able to be as comfortable in it as I am when
coding in emacs. Over the years I’ve made various attempts to code C# from Emacs and make Visual
Studio as comfortable to use as Emacs, to no avail. 
 Finally Emacs has a mode that supports C# well enough for me to give it a go again.…
You can follow my experimentations and contributions on github . 
 Featured Projects 
 
 exchequerio - Real-time double-entry ledger
platform for PSPs and marketplaces, built with Fastify, Drizzle, and PostgreSQL. 
 seshat - A learning project exploring distributed
systems: building a Redis-compatible key-value store with Raft consensus in Rust (work in
progress). 
…

 
 
 
 
 


 This is my personal blog, where I hope to write about things I learn on the way to being a better
developer. 
 Apparently teaching is a great way to learn, I guess this is my attempt to teach myself what I do
and why it was done.