Blog
Notes on things I built, broke, or talked myself out of buying. Newest first.
2026
- The one-word test that told me my delegate model didn't exist I told Claude Code to hand bounded coding work to Codex. A wrong path exited 127 and read as \"unavailable,\" a missing redirect hung forever, and the CPU meter could not tell a stall from a healthy run.
- The lock I added and reverted four minutes later A run lock for a scheduled agent was keyed on a live process. It went in at 09:12 and came out at 09:16, because on that box the process never dies.
- Timing language models with a bicycle essay and thirty facts about the Moon Three throwaway prompts, a speed meter that lied by a factor of five, and ten days of changing my agent's default model. A feel test, written down honestly.
- Three ways to break a rendered video in one week A pixel aspect ratio off by one part in 8,000, a GPU admission counter read one await too early, and a form field that sent null when it meant nothing. Three bugs in one video pipeline, September 18 to 20.
- Teaching an AI to play an old Flash game so I don't have to A Playwright bot drives Onslaught 2 inside Ruffle and asks a reasoning model where to put turrets. It never looks at the screen, and the bugs that mattered were about timing and keyboard focus.
- The papercuts I fixed in my own terminal agent this month A scroll bug, a speed meter that read 232,000 tok/s, a compaction setting I changed four times in two days, and one hotkey too many. Small fixes from using pi every day.
- Four AI coding agents, one repo full of rules for who gets to run I built a repo whose only job is telling Claude Code, Codex, Antigravity and OpenCode which of them handles what. Most of its history is me banning models, three times in 62 seconds.
- A Kanban Board My AI Agents Actually Use A two-person kanban that runs on a single Cloudflare Worker with D1, and that my AI agents edit directly through SQL because the browser UI is for the humans.
- From 15 Minutes of Hand-Editing to 100+ Videos a Day The full evolution of a YouTube content pipeline: script generation, batch image creation, SRT translation, and rendering at a scale where one human had to stop being the bottleneck.
- Reverse-Engineering a Tool That Was Too Fast We bought an AI image tool that ran suspiciously fast and showed no browser history. I spent weeks trying to figure out how — network sniffing, decompiling a Hermes-built client — and never fully did.
- Killing Infisical, Building My Own Secret Store I ran my secrets through Infisical for a year, then replaced it with a 300-line Node/Express daemon in an Alpine LXC — AES-256-GCM, an MCP interface, and the realization that a secret manager is just a tiny API.
- The SSO Autoclicker, and What MV3 Cost Me I turned two Tampermonkey userscripts into a Manifest V3 Chrome extension that clicks through my company's SSO silently — and reimplemented TOTP from scratch because MV3 won't let you fetch a CDN.
- Uploading to YouTube While I Sleep How we automated video uploads to a fleet of YouTube channels with an anti-detect browser, Playwright, and Windows Task Scheduler — and the one SRT bug that kept coming back to bite.
- The Client Who Found Us Himself A buyer paid for our tool through a middleman. When it broke, the middleman went silent — and the buyer tracked the developers down directly. What happened next changed how we do business.
- The One-Man Company Theory A conversation with Toản about turning side projects into subscriptions, what 'one-man company' actually means when AI does the work, and the uncomfortable gap between building tools and charging for them.
- Lab Census, Mid-2026: Eleven Containers and One Empty Chair A headcount of everything running on the Proxmox cluster right now — taken live from `pct list` — including the container that quietly replaced Pi-hole while nobody was looking.
- Giving My AI Agents a Shared Brain (Self-Hosted, Third Attempt) How my Claude Code and Antigravity sessions ended up sharing one long-term memory — a self-hosted Hindsight instance on a Proxmox LXC — after two failed prototypes.
- Shipping to the Living Room: When the Hard Part Is the Internet Deploying our GPU video app to a teammate's home box took an afternoon. Getting it onto the public internet — past CGNAT, two modems fighting over one IP, and a Viettel router with a genuine firmware bug — took the rest of the day.
- The PC I Didn't Buy A few days of hardware research, one month's salary saved, and the realization that the machine was never the point.
- The Power of GAS: Free Compute Hiding Inside Your Google Account Google Apps Script is the least glamorous platform I run code on, and possibly the highest-leverage: my lunch orders, inbox hygiene, and half my finance pipeline run on it — for free, with zero OAuth ceremony.
- Xu: Typing 'Lunch 80k' Is the Whole Interface My personal finance tracker's newest feature is deleting most of its own UI — an LLM chat tab that turns 'lunch 80k' into a drafted transaction waiting for one confirming tap.
- Putting My AI Agent on a Token Diet: 36,000 Commands Through RTK Every shell command my coding agent runs goes through a Rust proxy that compresses the output before the model reads it. Real numbers after months of use: 2.7 million tokens saved — and two gotchas that almost made me uninstall it.
- ai-bot: A Rust Telegram Bot Is the Front Door to My Money Stack Xu and Chia both have web UIs. Nobody in my house uses them. The interface everyone actually uses is a small Rust bot that turns Telegram messages into API calls — with an LLM doing the translation.
- What It Actually Takes to Ship a Virtual Microphone on Windows A friend asked for a real-time voice changer for livestreamers. The voice-changing part is easy. The 'appearing as a microphone' part is where Windows makes you pay.
- Tiền: The Robot That Reads My Bank's Email So I Don't Have To Banks won't give me an API, but they can't stop sending email. So a Cloudflare Worker parses every transaction alert, pings Telegram with category buttons, and routes the results to the rest of my money stack.
- Chia: I Built My Household a Splitwise That Lives in Telegram A Vietnamese bill-splitting app on Cloudflare Workers — live-editing Telegram notifications, Monday-morning debt reports via cron, and an inbox for machine-suggested expenses.
- The Hermes Experiment: An Agent That Hires Other Agents For two weeks in June, container 124 housed an AI orchestrator with its own browser, Telegram line, and shared memory — delegating coding work to headless Claude Code. Here's what worked, what hung for four hours, and why the container is gone.
- The Userscript Exoskeleton: Automating the Last Mile in the Browser Some automation can't live on a server — it has to happen inside the logged-in browser tab, between me and the web apps I'm forced to use. Tampermonkey is where those fixes live.
- Removing one coin from the backtest flipped the answer I asked an agent to find a paper trading setup with fewer bots. Its winner looked great until a test that deleted SOL from the universe showed one sleeve earning 96% of its profit from that one coin.
- Retiring the Baby Tracker: A Post-Mortem of a One-Day App I built a feeding tracker in a single day. It worked perfectly and died within weeks — killed by the one dependency I couldn't provision: spare attention at 3 AM.
- I Gave Claude Code a Telegram Number A 300-line Python bot on the Proxmox host turns my terminal coding agent into something I can text from anywhere — streaming its tool calls into the chat while it works on the lab.
- The GPON Stick Experiment: One Less Box, One Very Hot Dongle I tried to replace my ISP's ONU box with a Huawei MA5671A SFP stick in the MikroTik. It worked. Then it hit 80°C.
- The Lab Levels Up: Protected Power and Production Apps Going from a pile of parts to a protected, high-speed ecosystem running Pi-hole, Immich, and Firefly III.