Work
Projects
A selection of things I've built, contributed to, or am currently working on. Source code available on request.
vaultctl
A filesystem-only CLI and web viewer for Obsidian vaults. Search notes, manage tags, check vault health, read and write frontmatter. Built to replace a broken MCP server with something that actually works. TypeScript monorepo, 157 tests, JSON output by default.
gemini-jobs
Schedule AI prompts as cron jobs using Gemini CLI's headless mode. Write bash scripts, schedule them with crontab, get timestamped logs. Includes a runner that bridges cron's minimal environment, built-in templates, log rotation, and a doctor command. Published to npm.
TTRPG Engine
A setting-agnostic tabletop RPG engine powered by Claude. Write your world as JSON, plug it in, play via CLI or web. Streaming narrative, tool-driven state management, ElevenLabs TTS. Ships with a demo one-shot (The Sunken Flagon). 82 tests.
Dia Home
A Chrome extension that replaces the new tab page in Dia browser with a searchable grid of pinned bookmarks. Keyboard navigation, right-click context menus, search engine toggle, cross-device sync. Vanilla JS, no build step, no dependencies.
paranoia
A font tester for tattoo design. 80+ fonts across 9 categories, live controls for weight, size, spacing, and case. SVG export with embedded fonts for tattoo artists, stencil mode, shortlist and side-by-side comparison. Single HTML file.
NetSuite Suitelets
Internal analytics tools built as single-file SuiteScript 2.1 Suitelets. Data Auditor for project health across Jira, Tempo, and NetSuite. Financial Workbook for revenue reconciliation. Time Auditor for contribution tracking. AI analysis via N/llm. All ES5.
test01
A 2D pixel-art life sim in Godot 4.5. 320x180 viewport at 4x integer scale, event bus architecture, GDScript throughout. Building it with my wife. Early foundations.
testinginproduction.co
This site. Next.js 16, TypeScript, Tailwind CSS v4, MDX blog. Dark-only, statically generated, deployed on Vercel.