2026 Blog Posts

These are my posts for 2026. Be sure to check out the rest of my blog if you can’t find what you’re looking for.

Building Modern APIs with FastAPI and Python
Building Modern APIs with FastAPI and Python

If you’re starting a new Python backend project today, you’re almost certainly going to use FastAPI. It has rapidly displaced older frameworks to become the industry standard for API development. The reasons are simple: it’s fast, it embraces modern Python type hints, and it does a …

Board Game Reviews: Mists Over Carcassonne
Board Game Reviews: Mists Over Carcassonne

Carcassonne is one of those games that’s been on countless family shelves for over two decades, building cities and stealing roads from one another with cheerful ruthlessness. Mists Over Carcassonne takes that familiar tile-laying foundation and does something unexpected with it: it turns you …

MySQL, PostgreSQL, and SQL Server: Choosing the Right Relational Database
MySQL, PostgreSQL, and SQL Server: Choosing the Right Relational Database

If you’ve been building software for any length of time, you’ve almost certainly worked with at least one relational database. There’s a good chance it was MySQL, PostgreSQL, or SQL Server. All three can store rows, run queries, and handle transactions, so it’s tempting to …

Beyond Graphs: An Introduction to Google's Agent Development Kit (ADK)
Beyond Graphs: An Introduction to Google's Agent Development Kit (ADK)

If you’ve spent any time building agentic systems lately, you’re likely familiar with LangGraph. It’s a powerful framework that treats agents as nodes in a graph, connected by edges that define the flow of execution and state. It’s robust, explicit, and extremely capable once …

Streaming State and Tokens in LangGraph
Streaming State and Tokens in LangGraph

If you’ve been following the earlier posts in this series, you’ll have built graphs that gather data, call tools, and produce structured output. Every one of those examples used .invoke(), which means the caller waits in silence until the entire graph finishes and then receives the final …

Why DynamoDB Feels Magical Until You Learn the Trade-Offs
Why DynamoDB Feels Magical Until You Learn the Trade-Offs

The first time I looked at DynamoDB, it felt like a golden unicorn. It promised fast access, huge scale, and very little operational effort. If you’re already building on AWS, it also feels like the natural choice because it fits so neatly into the rest of the platform.

Then the catch becomes …

Using Async Effectively in LangGraph
Using Async Effectively in LangGraph

In Seven Tips for Performant Async Python I focused on plain asyncio. That’s the right place to start, because LangGraph doesn’t replace Python’s event loop or make blocking code magically concurrent. If an async LangGraph node calls a blocking library, the graph still waits. If …

Regicide: A Fiendishly Fun Cooperative Card Game
Regicide: A Fiendishly Fun Cooperative Card Game

Cooperative card games live and die on one question: does every player feel useful? Regicide answers with a confident yes, and it does so with rules you can teach in five minutes and depth that keeps you coming back long after you have won your first game. Whether you are playing solo or with a …

Vector Databases: What They Are and How To Use Them
Vector Databases: What They Are and How To Use Them

In an earlier post we generated embeddings and searched them by computing cosine similarity across a small in-memory list. That approach is perfect for learning and prototyping, but it doesn’t scale. When your corpus grows to hundreds of thousands or millions of documents, iterating over every …

Seven Tips for Performant Async Python
Seven Tips for Performant Async Python

Adding async and await to a Python function feels like an easy win. You’ve heard it makes code faster, so you sprinkle the keywords in, run your program, and it seems to work. But async Python has a habit of looking correct while quietly running no better or even worse than the synchronous …

Building a Pipeline in LangGraph
Building a Pipeline in LangGraph

The earlier posts in this series built self-contained graphs: one graph, one task, one run. But real workflows often span multiple stages, where each stage produces output that the next stage needs. The pipeline pattern I describe here isn’t an official LangGraph pattern — it’s an …

Claude Code vs Codex: Recreating an Iconic Game
Claude Code vs Codex: Recreating an Iconic Game

If you grew up with a DOS machine in the early 1990s, there is a good chance you remember Gorillas. Two apes perched on rooftops, hurling explosive bananas across a city skyline — it shipped free with QBasic and it was many people’s first taste of programming a game, or at least playing one …