Writing & Ideas

Thoughts on AI engineering, LLM systems, and building software that scales.

A dark workshop filled with hand tools hanging on a pegboard and wood pieces on a workbench
October 5, 2026

Building an MCP Server in Python

Most MCP tutorials show you a “hello world” tool — one function, two arguments, a print statement — and stop right where the actual …

MCP Python AI Agent Tools
A pair of hands typing on a laptop keyboard at a desk
October 3, 2026

Human-in-the-Loop Agents with LangGraph

The pitch for autonomous agents is always “it handles the whole task end to end.” The reality of shipping one is that almost nobody …

LangGraph AI Agents Postgres
An abstract image of a network of interconnected dots
October 1, 2026

LangChain vs LangGraph: When You Actually Need a Graph

Ask a team why they moved from LangChain to LangGraph and you’ll usually get a shrug and “the agent kept doing weird stuff.” That …

LangGraph LangChain AI Agents
A close-up of a padlock securing a door
September 30, 2026

Multi-Tenant RAG: Metadata Filtering Without Leaking Data

A multi-tenant RAG system has a failure mode that single-tenant systems don’t: it can produce an answer that’s fluent, well-cited, and …

RAG AI Engineering Backend Development
A yellow dead end road sign
September 28, 2026

Why Your RAG Retrieves the Wrong Chunks

“The model is hallucinating” is the default diagnosis when a RAG system gives a wrong answer, and it’s usually the wrong one. …

RAG AI Engineering Backend Development
Laptop screen displaying performance analytics graphs and data visualizations
September 26, 2026

Evaluating a RAG Pipeline: Recall@k, MRR, Faithfulness

Most teams “evaluate” their RAG pipeline by asking it a handful of questions, reading the answers, and deciding whether it feels right. …

RAG AI Engineering Backend Development
Close-up of a stopwatch face against a dark background
September 25, 2026

Reranking in RAG: When It's Worth the Latency

“Add a reranker” has become the default answer to “our RAG answers aren’t great,” in roughly the same way “add an …

RAG AI Engineering Backend Development
A magnifying glass resting beside a gray laptop computer
September 24, 2026

Hybrid Search: Combining BM25 and Vectors in Postgres

The pitch for vector search is that it understands meaning, not just keywords — ask about “canceling a subscription” and it’ll find …

RAG PostgreSQL AI Engineering
Diagram of ticket text entering the Jev model and leaving as a typed billing decision with 0.91 confidence
September 19, 2026

Jev by TypeSafe: Typed AI Decisions for Backends

Most of the LLM calls in a production backend aren’t asking for prose. They’re asking for a decision: which queue does this ticket go to, …

AI Engineering LLM AI Agents
A neatly organized stack of printed paper sheets
September 18, 2026

Chunking Strategies for RAG, Benchmarked on Real Documents

Most RAG postmortems start in the wrong place. Someone swaps the embedding model, adds a reranker, tunes the prompt, and the retrieval quality barely …

RAG AI Engineering Backend Development
Extreme macro close-up of a computer RAM memory module's circuit board and chips
September 13, 2026

Celery + Redis Gotchas Nobody Warns You About

Redis is the default broker for most new Celery projects, and for good reason — it’s already in the stack for caching, it’s fast, and …

Celery Redis Python
A vintage twin-bell alarm clock with Roman numerals on a plain white background
September 12, 2026

Celery Retries, Backoff, and Dead-Letter Queues

The default retry behavior most teams ship with Celery is max_retries=3 and nothing else — no backoff, no jitter, no distinction between “the …

Celery Python Task Queues