Writing

Notes on building things

Occasional writing about engineering, AI-assisted development, and what I've learned building systems over the past twenty-five years.

When Code Gets Cheap, Architecture Gets Scarce
AI makes it easy to produce more code. It makes it harder to protect the shape of a system. That is the shift most engineering organizations have not fully priced in.
Repository Memory Makes AI More Useful — and More Dangerous
A repo-aware agent produces changes that look team-native. The problem is that "looks team-native" is not the same thing as "is correct."
The New Management Problem Is Not Adoption
Most teams are past "should we allow AI?" The harder question is where AI should operate with low friction — and where it does not.
Coding Got Faster. Delivery Did Not.
AI made output cheaper to produce. The bottleneck moved to review, validation, and judgment — and that is where the cost shows up.
Hard Corners of LLM Reconciliation
The specific ways the model got it wrong, and the specific prompt patterns that fixed each one. Everything below came from a ticket, a user report, or a suspicious log entry.
LLMs as Reconciliation Engines, Not Parsers
The naive framing treats unstructured-to-structured extraction as a parsing problem. It fails the moment a canonical record already exists. Here's the mental model that holds.
The Web Audio API's Sharp Edges — AudioWorklets, Feedback Loops, and Format Juggling
Building a browser test harness for a telephony audio pipeline exposed more bugs than Twilio ever would have. Here's what the Web Audio API teaches you the hard way.
The Full Pipeline — From WebSocket to Transcription
The plumbing that connects signal processing to transcription — WebSocket handler, speech segment accumulation, chunk alignment, and why the transcription call itself was the easiest part.
Pitch Detection and Auto-Calibration
How autocorrelation-based pitch detection and an ambient calibration window made a voice activity detector work across different acoustic environments.
Energy Alone Is Not Enough — The Signal Processing Behind a Voice Activity Detector
A single energy metric gets you to 90% accuracy. The remaining 10% — keyboard clicks, door slams, traffic — required understanding what actually makes speech different from noise.
Taming Telephony Audio — Mu-law, PCM, and the Conversion Gauntlet
The audio from Twilio wasn't PCM. Here's the silent bug that took time to surface, and the correct mu-law conversion that fixed it.
Why I Built a Custom Voice Activity Detector in Java
Twilio streams continuous audio. Transcription APIs bill by the minute. The gap between a working prototype and production-grade speech detection is where the interesting engineering lives.
Deploying AI to the Edge — Lessons from Cloudflare Pages + D1 + Vercel AI SDK
The gap between "it works locally" and "it works in production" is where side projects die. Here's a field guide for the specific gotchas of deploying LLM-powered apps on Cloudflare's edge.
Adding a Chat Assistant to My Personal Site — Architecture Decisions for a Solo Developer
A useful chat assistant is defined more by what it refuses to do than by what it can do.
I Built My Professional Landing Page Entirely with AI — Here's What Actually Worked
Most AI-generated content looks AI-generated. This one doesn't. The iterative process of getting voice, formatting, and editorial judgment right.
From Manual Analysis to AI-Powered Automation — A Practical Journey
How we redesigned analysis workflows for the Customer Success team, cutting roughly 40 hours of manual report work per month.
Published on Medium ↗