Journal
Posts and long-form series on AI, startups, venture capital, and more.
All Posts
Your API Is Already an MCP Server
Emit's MCP server is an endpoint inside the existing FastAPI app, not a separate package. Why in-process beats a sidecar for a small API-first product.
Bradley-Terry: Maximum Likelihood Ratings on an Elo Scale
Bradley-Terry fits every comparison at once instead of nudging after each game. Adding it to elote, and the four design choices that made it usable next to Elo.
Five Backtest Invariants Worth Enforcing In Code
A backtest simulates information availability, and every way it leaks the future flatters your returns. Five invariants, each with the test that pins it.
Evergreen 1.7 Lets the Phone Do the Work
Evergreen 1.7 turns the iPhone from a place you look things up into a place you actually get things done, plus a handful of fixes worth having.
Same App, Ten Years Apart
Pedal Wrencher in 2015 and in 2026: identical product, zero shared code. What a decade of stack turnover actually bought, and what it didn't.
PyGeoHash v3.3.2: Reliability at the Edges
PyGeoHash v3.3.2 continues the reliability run with antimeridian fixes and stricter validation, plus native ARM64 wheels and smoke-tested artifacts.
Summer Reading List 2026
Summer reading on wisdom, land, higher education, and a return to the Hitchhiker's Guide, plus finally finishing a book I started ages ago.
Cache Keys Must Come From the Resolved Call
A memoization decorator that reads kwargs cannot see positional arguments, so distinct calls collide. How to build keys from the bound signature instead.
The Kelly Criterion With Real Payoffs and Real Fees
The Kelly formula everyone quotes assumes you lose your entire stake. With real loss multipliers and fees the sizing changes. Deriving the general form.
The Billing Bug You Can't Have
How emit's prepaid credit system makes overdrawing impossible under concurrency, using an append-only ledger and one carefully shaped SQL update.