The bottleneck moved

In December 2024, I published a post arguing that AI coding assistants would transform rather than replace software developers. It was a reasonable piece. It was also, in the way that reasonable pieces often are, a little cowardly. ...

May 20, 2026 · 4 min

Building "Who Should Be President?" in a morning, on Cloudflare

This project was built entirely in Claude Code with the Cloudflare MCP server — not a line of code was written by hand. Given the low stakes — a novelty site about South African politics — the brief was simple: make it fun, make it fast, and see how far you get in a morning. To write this post, I handed Claude the project chat transcripts and asked it to pull out the parts worth explaining. What follows is the result. ...

May 19, 2026 · 14 min

Reverse-engineering my router's secret API so an AI could watch it

My home fibre drops. Not constantly — but regularly enough that I’ve developed a habit of opening the router admin page when Netflix stalls, just to confirm what I already suspect. The TP-Link ER605 I use is a decent small-business router: dual WAN, PPPoE on WAN1 for fibre, DHCP on WAN2 for a mobile backup. When the fibre goes down the router fails over silently. The backup connection works. Everything sort of continues — browsing is slower, calls drop, but nothing catastrophically fails. The problem is I don’t know it happened until much later, and I can’t easily tell how long it was down for. The only real evidence is a log line buried in the router’s syslog: 2 2026-02-23 12:35:14 PPPoE Client WARNING [7C-F1-7E-74-E5-52]: PPPoE <account>@isp.co failed to connect to the server because sending PADI times out. I wanted to fix this. I wanted an email the moment the fibre dropped, hourly reminders while it was still down, and a “connection restored” email with total downtime included. Could I write a script that polled the router? This is the story of using Claude Code to figure out how — starting from nothing and ending, 35 minutes later, with working code. ...

May 16, 2026 · 12 min

Party of One - How the Constitutional Court manufactured a right to be an independent candidate

In June 2020, the Constitutional Court handed down New Nation Movement NPC and Others v President of the Republic of South Africa and Others [2020] ZACC 11. The order, in the part everyone quotes, says this: It is declared that the Electoral Act 73 of 1998 is unconstitutional to the extent that it requires that adult citizens may be elected to the National Assembly and Provincial Legislatures only through their membership of political parties. But neither the court, not anyone else, actually read the Electoral Act. ...

May 16, 2026 · 17 min

Politics in Robes

A Political Critique of Maya CJ’s Judgement in EFF v Speaker (CCT 35/24) The first judgment in Economic Freedom Fighters and Another v Speaker of the National Assembly and Others [2026] ZACC 17 is being read, in the public conversation, as a vindication of constitutional accountability against a recalcitrant parliamentary majority. That reading is comfortable, and it is wrong. It is comfortable because it tracks an emotionally satisfying narrative: a powerful President accused of corruption, a governing party closing ranks, and a Chief Justice who refuses to let the matter rest. It is wrong because it mistakes the form of Maya CJ’s judgment for its substance. The substance, prised free of its rhetorical packaging, is a piece of constitutional politics. The first judgment delivers, by judicial means, a censure of President Ramaphosa that the National Assembly declined to deliver politically. It is not the role of the Constitutional Court to be the appeals branch of a defeated opposition motion. Maya CJ’s judgment treats the Court as though it were. ...

May 11, 2026 · 14 min

The limit is your validation criteria, not the agent

Eno Reyes gave a short talk recently that deserves more attention than it got. He is co-founder and CTO of Factory — a company building autonomous software engineering agents, founded in 2023, whose main product is a coding agent called Droid. His argument is deceptively simple: the frontier of what AI agents can do is not a function of model capability. It is a function of how verifiable your environment is. ...

December 29, 2025 · 4 min

AI is blowing up the software stack

AI is blowing up the software stack. Not only by creating more code, but by making all code cheaper. The act of writing software is rapidly commoditising. What used to take months now takes minutes. The bottleneck is no longer development…it’s validation and verification. As AI pushes out more code, faster than humans can reason about, the real leverage shifts to testing, validation, reliability, and security. The winners won’t be the ones who ship the most code, but the ones who can trust what they ship. ...

November 18, 2025 · 1 min

The TDAID Manifesto

Test-Driven AI Development: A New Contract Between Human and Machine A note for readers who don’t know me: this was first written for an internal work blog, where my colleagues could read it in the spirit it was intended. I’m publishing it here unchanged. The manifesto form is deliberate. It is overstated on purpose — pitched to drag the Overton window on what “coding with AI” should mean, not offered as a finished doctrine. I still stand by every claim; I just want to flag that the volume is turned up for rhetorical effect. Read it as a provocation, not a sermon. ...

November 10, 2025 · 9 min

Test-Driven Development in the Age of AI: Why Natural Language Can't Replace Formal Specifications

I recently worked on a project where I wrote the unit tests first, then had Claude Code generate the implementation that passed those tests. The experience crystallized something I’ve been thinking about: natural language is fundamentally too ambiguous to be an effective specification language for software, no matter how smart our LLMs become. This isn’t a hot take about current AI capabilities. This is a statement about linguistics. ...

October 31, 2025 · 6 min

Are We Re-Inventing Linguistics?

Every time I have read a new post offering advice on how to work with an LLM, be it with prompts or context, I just couldn’t shake the feeling that there was some unifying “theory of language” that explained what made a prompt good or bad. ...

August 12, 2025 · 11 min