Writing on design, frontend engineering, and building products.
How I built BusyChat's retrieval pipeline — crawling a site, chunking it, embedding into a vector store, and serving grounded answers instead of hallucinations.
Why I built Bindery — a plugin that lets developers declare exactly what a client can edit, so custom themes stay custom and clients still get to change their own text.
How BusyChat decides what a user actually wants — pairing an LLM intent classifier with a vector fallback, and the off-by-one bug that crossed the wires.
Turning any WooCommerce product into a bookable experience — the data model, the calendar, and the edge cases that make booking software genuinely hard.
How BusyChat streams chat answers token-by-token from a Cloudflare Worker using Server-Sent Events — and the deploy gotcha that cost me an afternoon.
Good answers depend entirely on good retrieval. Notes on metadata indexing, filtered vector queries, and a schema-drift bug that silently returned nothing.
Giving AI agents real tools inside WordPress with the Model Context Protocol — so an assistant can actually do work in a page builder instead of just describing it.
How building small, reusable plugins across client projects cut repeat work, kept behavior consistent, and let me hit tight timelines without cutting corners.
Decoupling the frontend from WordPress with Next.js and Gatsby — what you gain, what you trade away, and when it's actually worth the extra plumbing.
Shipping one codebase to Windows, macOS and Linux with Electron — the main/renderer split, packaging, and keeping a web stack feeling native.