Writing
Blog
Just some thoughts.
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.
Moving File Writes Out of Claude Code Hooks, and Four Other Patterns
Hooks that wrote my daily note hit races and schema errors. Make them append and POST, let a server write. Plus path guard, MCP stdout, SuiteQL paging, dedupe.
Adding Line Numbers to an NSTextView in SwiftUI Without NSRulerView
An NSRulerView left a SwiftUI-hosted NSTextView blank. Draw the numbers in lineFragmentPadding instead, then restore the scroll settings.
Tracking Claude Code Sessions With Two Hooks and a JSONL Buffer
Log Claude Code tool calls: a PostToolUse hook buffers JSONL, a Stop hook posts it to a local server. The code, and two bugs that made the flush send nothing.
Turning Claude Code Sessions Into Skills and Vault Notes
Fixes found in a Claude Code session vanish when it ends. A prompt hook, two extraction skills, an Obsidian vault and a stateless CLI keep them.
Claude Code in VS Code Ignores bypassPermissions Without a Third Key
Both VS Code bypass settings set, permission prompts anyway. Add skipDangerousModePermissionPrompt, top level, to ~/.claude/settings.json and quit VS Code.
Replacing Dia's New Tab Page by Intercepting chrome://start-page/
In February 2026 Dia ignored chrome_url_overrides.newtab and opened chrome://start-page/ instead. Redirect that URL from a tabs.onUpdated listener.
Setting the vaultctl Vault Path Once, and Stopping gray-matter Rewriting Dates as Timestamps
vaultctl config set saves the vault path where agents and cron can find it. Writing frontmatter with gray-matter turns untouched dates into ISO timestamps.
LazyLibrarian Overwrites config.ini Edits on Shutdown: Use writeCFG
Edit LazyLibrarian's config.ini while it runs and the next docker stop writes over it. Stop the container first, or change values with the writeCFG API.
Building a D&D Dungeon Master in Claude Code That Looks Up Every Number
A Claude Code skill that runs D&D 5e: rules looked up, never guessed, state in JSON files, outcomes decided before the roll, narration in the background.
Scheduling Gemini CLI Prompts With Cron and a Wrapper Script
gemini -p works in a terminal and prints nothing under cron: a minimal PATH and no API key. The wrapper that fixes it, then the macOS and quota traps.
Adding Umami to Next.js Without the CSP Blocking It
Umami is one Script tag in Next.js. A strict CSP lets it load, then silently blocks its beacon. Allow gateway.umami.is in connect-src and check the network tab.
Replacing an Obsidian MCP Server With a Stateless CLI
Issue #9176: an Obsidian MCP server dies with BrokenPipeError in Claude Code CLI, closed without a fix. A CLI that reads the vault and exits does the job.
Building Analytics Inside NetSuite With an Iframe Loader and N/llm
A Suitelet that loads six saved searches takes about a minute. Serve a spinner and an iframe first, ship the data as inline JSON, send N/llm monthly values.
next-mdx-remote 6 Deletes Braces From Your Prose
A Next.js 16 MDX blog on Vercel, and five things that broke with no error: braces, tables, Resend sends, a deleted env var and the CSP.