Essays
Introducing Indic Smart Turn: Turn Detection for Indian Languages
A voice agent has to decide at every pause whether the caller has finished speaking. I trained an open model that makes that call for English and eleven Indian languages, from real phone conversations.
Decision Models for Agentic Online Evaluation
I scored every trace of a live research agent with three decision models and two LLM judges. Cheap enough to stop sampling, but no judge could reliably flag a wrong answer without a reference.
Building Retold: Agent Memory That Decides Before It Retrieves
An earlier essay of mine found five agent memory systems returning records on turns that needed none. Retold decides before it searches. What it does, where it stands, and where I could use help.
Building Compass: An Open System One Model
Compass picks from answers your application defines. It uses Qwen3.5-4B, returns calibrated probabilities, and serves the public System One API.
Related Is Not Useful: Agent Memory Systems in 2026
Eight families of agent memory, one transcript, and five systems measured at their documented defaults. All five return results for a turn that asks nothing of memory, and none surfaces the stored rule that would have changed the answer.
LLM Inference: Post-Training Quantization
Shrinking a model's weights after training costs some quality and buys back size and speed. Six methods measured against the same unquantized model: what each one does, what it costs, and why getting the measurement right turned out to be harder than any of the methods.
LLM Inference: Speculative Decoding
A small model guesses ahead, a large model checks the guesses in bulk. The answer is identical and it arrives 1.8x sooner. The cost is compute you pay for and throw away.
LLM Inference: KV Caching
Why a model repeats the growing conversation while it writes, how a KV cache avoids the waste, and why the memory bill decides how many people a GPU can serve at once.
Evaluation Is a Necessary Design Problem
Speech recognition, synthesis, the language model and retrieval each admit a different kind of evidence. The arithmetic was never the hard part. Deciding what to measure was.
The Recorder in the Room: Rebuilding One Video From Separate Streams
Daily charges more to record a call than to host it. So I built the recorder. Putting the streams back on one timeline was the hard part.
To Notify or to Deliver: Realtime Chat Without WebSockets
How inbound WhatsApp messages reach an open chat screen using SSE and Redis pub/sub, and why some events carry the message itself instead of just announcing it.
The Blind Index: Prefix Search Without Plaintext
How to build prefix-search over encrypted messages in Postgres using blind indexing and n-gram tokens, without storing any plaintext.
The Boring Answer to MCP Context Bloat
How to build prefix-search over encrypted messages in Postgres using blind indexing and n-gram tokens, without storing any plaintext.
Blue/Green Is Not a Button: Upgrading RDS Postgres 13 to 17
AWS says the switchover takes under a minute. That part is true. It is also the cheapest part of the upgrade.
Searchable PII Encryption in Postgres
How we encrypted PII so a leaked database dump reveals nothing, while prefix search, sorting, and filtering all kept working.
Notes on Data Archival: Keeping Postgres Lean Without Downtime
Freeing up an RDS running out of disk space by archiving 8M rows to S3, and the three gotchas that stood in the way: concurrent index creation, hourly batching, and VACUUM FULL.
Boost your Image Classification Model
Techniques for improving deep learning image classifier accuracy: progressive resizing, transfer learning, mixup augmentation, and test-time augmentation.
Metrics to Evaluate Your Machine Learning Algorithm
A practical guide to the most important evaluation metrics for ML models and when to use each one.
Training a Deep Learning Model on Handwritten Characters using Keras
Building a labeled dataset from handwritten character images and training a deep learning model with Keras from scratch.