Product manager. I build the tools I want to use, and document them as though someone else will have to maintain them.
Most of this runs on my own infrastructure: a Proxmox cluster on ZFS with 15+ containerised services. The common thread across these projects is working out where a language model genuinely helps, where deterministic code is the better answer, and where a human should stay in the loop, and then writing down why.
Syntaxxed — A local-first VS Code extension for deciding what source code actually leaves your machine before it reaches an AI coding tool. Pick outline, logic or full source per file, preview the exact redacted payload, and let an authenticated loopback-only MCP gateway serve Claude Code or Cursor richer views only when I approve them. Credentials and private-key material are matched out of file contents and filenames alike, and high-risk paths cannot be re-included. The documentation is explicit that redaction is defence in depth rather than a guarantee, because a novel or encoded credential can still pass a known pattern. Public preview at 0.3.0, with a CLI and a GitHub Action. TypeScript, source-available under a portfolio-evaluation licence.
Tandoor Photo Importer — Photograph a page from a cookbook, extract the text with Tesseract, structure it with a local model, and create the recipe only after I have confirmed it. The model never receives the image, and inference is loopback-only by default so a configuration mistake cannot send anything off-host. Python, MIT.
YouTube to Tandoor Importer — Turns cooking videos into reviewed recipes, using captions where they exist and a Whisper transcript where they do not, then a schema-constrained extraction. Source instructions are treated as untrusted input, and nothing is written without review. Python.
Pocket Player — A native Windows client for Navidrome libraries, so listening to my own music does not mean managing a browser tab. Rust owns credentials and networking so neither reaches the webview. Ships a product specification, architecture decision records, and an honest account of what is not finished. Alpha, unreleased. Tauri, Rust and TypeScript, MIT.
Atlas-o-meter — A shared behaviour and reward tracker my wife and I use to keep track of our son's week. Two users, one SQLite database, passkeys and OIDC for sign-in, and a backup path I have actually tested. Next.js and TypeScript.
