Writing
Blog
Just some thoughts.
Compounding Two Weeks of Infrastructure
Two weeks where the knowledge system, the financial platform, and the Atlassian integration all grew up at once. The capstone: every Claude Code session now writes its own journal entry.
Debugging NSTextView Inside SwiftUI
NSRulerView breaks NSTextView when hosted in SwiftUI. Fifteen attempts to add line numbers. The fix was to stop using the ruler entirely.
Tracking What Claude Code Actually Does
Two bash hooks, a REST API, and JSONL files in the vault. Activity telemetry for AI coding sessions, so you know what happened after the context window closes.
Building a Knowledge System That Compounds
An Obsidian vault, a CLI, 40 skills, and a feedback loop that turns debugging sessions into reusable knowledge. None of it was planned.
Debugging Claude Code's Bypass Permissions Regression
bypassPermissions configured correctly in both places. Blue dialogs on every command anyway. The fix requires a third key the docs don't mention.
Replacing Dia's New Tab With a Bookmark Grid
A Chrome extension that gives Dia browser the new tab page it should have had: pinned bookmarks, sections, drag-to-reorder, and a workaround for a quirk nobody documented.
vaultctl: Config and Frontmatter
v0.4.0 adds config and meta commands: one line to set up your vault path, one line to read or write any frontmatter field. Also: gray-matter will silently corrupt your dates.
Debugging LazyLibrarian's Silent Config System
LazyLibrarian's config silently ignores your settings: no errors, no warnings. Found it by reading Python inside the Docker container.
Building a D&D Dungeon Master Skill for Claude Code
305 JSON files, campaign state management, ElevenLabs narration. Session 1: Selena fell 30 feet in the first ten minutes.
Scheduling Jobs With Gemini CLI and Cron
Cron, bash, and Gemini CLI headless mode. No orchestrator, no SaaS, no daemon. Just crontab and a free API key.
Testing Umami for Privacy-Friendly Analytics
Umami on the site. Open-source, privacy-first, zero cookies, no consent banner. Setup notes.
Replacing the Obsidian MCP Server With a CLI
MCP servers for Obsidian keep breaking in Claude Code. vaultctl is what replaced it, stateless, filesystem-only, no server to crash.
Building a Full Analytics Platform Inside NetSuite (in ES5)
A multi-tab professional services analytics dashboard with AI analysis inside a 20-year-old ERP. One giant ES5 file at a time. Notes on what worked.
Building This Site
The stack and architecture behind testinginproduction.co.
Glossary
Every technical term on this site, defined. Hover any teal term in a blog post to see its definition; this page collects them all in one place.