Writing

I write about what I build and what broke along the way. Posts live on my blog.

The Other Side of the Content Pipeline

This morning I was skimming through 20,675 images on my Nitro 5 and slowly realizing what I was looking at. They’re crops. Every enemy, every UI element, every frame of Darwin the …

The Agent Passed Its Own Stop Rule

The same agent produced a perfect protocol halt and a forced-pass stop rule in one evening. On overclaim taxonomies, helpful-looking failures, and why the halt is the product.

The PrivyBot architecture: why MCP matters

I keep trying to explain a Convoso MCP server to my boss. He’s the IT Lead. Smart, technical enough to follow the architecture, not uninterested. I describe the purpose. I sketch …

I Used AI to Build My Game. Here’s What That Actually Means.

My grandfather knew I built it with AI. He played it anyway. The game communicated something legible about how I think — not about how it was built.

By 4PM I Know Exactly Where We’ll Close at 6PM

The End of Day Metrics told us what happened yesterday. I built a system that tells us where we’ll close at 6PM — by 4PM.

How to Build an Idle Game in Rust with Bevy

Bevy’s ECS — Resources, Systems, Events — maps directly to the idle game loop without fighting the architecture. Here’s the full structure, the TOML config pattern, and the …

I Stopped Watching the Dialer and Built Something to Watch It for Me

A CLI tool became a loop. The loop grew and had kids for a year. Then I stopped building and started writing a spec. Here’s what rebuilding dialer automation from scratch actually …

How to Automate YouTube Shorts with Python and FFmpeg

One recording session, a month of Shorts. OBS captures, Python extracts the beats, FFmpeg assembles with title cards and normalized audio. Here’s the full pipeline and the three …

The DNC Request That Used to Take 15 Minutes Now Takes 3 Seconds

Every minute a flagged number stays active is a minute of compliance exposure. Here’s what it looks like to close that window — and what happens when the tool that’s supposed to …

How to Manage AI Coding Agents Without Losing Control

AI coding agents optimize for appearing done rather than being done. Here’s the three-layer methodology — Director, Pipeline, Agent — with the proof standard and directive format …

The Boring Layer That Made the Other Two Work

Neither of the other two tools I’ve written about recently would exist without this one, and it’s the one I almost didn’t write about, because on its own it doesn’t have a moment. …

A Year In, I Realized I Had Automated My Job Away

Six months learning the friction. Six months building. By month twelve, the job was monitoring itself — and I knew exactly what that meant.

How to Handle Reassigned Phone Numbers in Outbound Calling

Standard DNC scrubbing doesn’t catch reassigned numbers — it checks opt-outs, not ownership. Here’s what the FCC Reassigned Numbers Database is, why your lead list may contain …

Two Numbers That Looked Close Enough to Share a Formula, Until I Checked

The forecasting tool projected two things off the same underlying curve: how many contacts to expect by end of day, and how many of those contacts would turn into appointments. It …

I Didn’t Build the Pipeline I Planned. I Built the One That Worked.

I set out to build a fully automated AI content pipeline. No recording, no editing, no me. What I actually built was a FFMPEG pipeline that runs while I sleep — and the gap between …

How to Build a TCPA Compliance Audit Trail for Your Contact Center

A TCPA complaint has one question: can you prove the call was compliant? If the answer requires reconstructing removal history from four systems by hand, the documentation problem …

Every Room Looked Different, and That’s Exactly What Told Me They Were All the Same Bug

I’d asked an agent to verify something specific about a puzzle solver I’d been building: were the “dead zones” — tiles a player could never actually reach or use — genuinely …

I Lost the Plot on My Own Project

The Telegram error log doesn’t lie. Ollama 404ing every five minutes. All four free-tier APIs throttled by morning. An autonomous loop called RALPH burning 144 LLM calls a day on …

How to Automate Lead List Import in Convoso

Convoso’s manual list import is a CSV upload — one file, one campaign at a time. Here’s how to automate it with the pre-import hygiene that prevents compliance exposure before the …

The Rule Said 0.25%. The Math Said It Was Actually Enforcing 0.056%.

There was a rule that had been running for a long time: if a list’s contact rate drops below a fixed number after enough attempts, cut it and move to something else. Simple, …

Everything on the blog →