Owning the output when you use AI agents
Saying 'my agent did it' can make it easier to distance ourselves from the work we submit. I'm looking at ownership of that output and where delegating to agents overlaps with leadership.
Experimenting with automatic memory in Codex and Claude
After rewriting my skills and clearing memory, Codex and Claude felt better to use. My next experiment is to disable automatic memory, informed by research on context and memory poisoning.
Getting sudo to use Touch ID on macOS
macOS can authenticate sudo with Touch ID through pam_tid.so. The update-safe setup is one line in /etc/pam.d/sudo_local, with the normal password prompt left as a fallback.
Excluding Shunt data from Time Machine backups
How Shunt uses APFS copy-on-write data volumes, how those differ from sparse container disks, and which reproducible data I exclude from Time Machine.
Using banked Codex usage resets
How I redeemed a promotional Codex usage reset in July 2026, what changed in my usage balance, and why the value depended on when I used it.
Your experience is a runtime dependency
AI agents are already very capable, but they don't automatically have the judgement that makes you effective in your current role. Skills and agent instructions are how you package that experience so the agent can use it.
Getting cmux to hand HTML files back to my real browser
cmux 0.64.5 flipped the default for opening local HTML files: they now preview inside cmux instead of launching your system browser. One settings key flips it back.
How to fix GoHighLevel (GHL) emails going to spam
Checking GoHighLevel sending-domain authentication, restoring a missing DKIM record, and interpreting mail-tester results after the fix.
Explaining the engineering work behind AI-generated prototypes
AI can shorten the path to a working prototype. I think developers need to make the remaining work on reliability, security, and maintainability clearer when discussing delivery.
Managing OpenClaw From My Mac Without Running It Locally
I edit OpenClaw scripts and configuration on my Mac, then use an SSH wrapper to test and run them on the homebox server that holds the services and runtime state.
Migrating from Ghostty to cmux
cmux is built on libghostty and reads my existing ~/.config/ghostty/config, so the move from Ghostty was effectively a relaunch. Here is what it actually got me: workspaces with PR status in the sidebar and an embedded browser for opening plans and PRs next to the terminal that owns them.
How copilot_here filters Docker requests through a socket broker
Why I built a brokered Docker socket instead of sharing the raw one, how the two-phase request inspection works, and the limits of those checks.
Setting Up Docker-in-Docker in copilot_here
Step-by-step guide to enabling the brokered Docker socket, configuring image allowlists, and tuning privilege controls per repo.
Making Claude’s research cache an on-demand skill
I kept my research cache and skills, but removed the global trigger that made Claude load them on every task. Here is what worked, what added friction, and why I now invoke research when needed.
Reducing package supply-chain risk with release-age checks and lockfiles
Configuring a delay before adopting new package versions, keeping repeatable installs with lockfiles, and understanding what these controls can and cannot prevent.
Fixing Microsoft Teams tab loading failures (Ocdi error)
How to fix the "There was a problem reaching this app" error and "failed reason: Ocdi" in Microsoft Teams configurable tabs.
Building a custom Claude Code status line
Claude Code gives you a JSON blob and a shell script hook. I used it to build a multi-line status line with repo info, GitButler branches, cost tracking, and rate limits in one session.
Next.js + TinaCMS on GitHub Pages behind a Cloudflare Worker
The gotchas I hit deploying a Next.js static export site with TinaCMS to GitHub Pages, proxied through a Cloudflare Worker — and how I fixed them.
Ghostty tab titles from git repo names
Using a zsh hook and Ghostty configuration to show the git repo name in terminal tab titles.
My dotfiles setup: how I manage my dev environment
I've been asked about my dotfiles a few times, so here's the full breakdown — GNU Stow for symlinks, multi-identity Git, 1Password SSH, AI agent configs, and a bunch of shell tricks I've picked up along the way.
Migrating my terminal setup to Ghostty, Zinit, and Starship with Claude
How I used Claude Code to migrate my terminal and shell configuration, preserve my existing integrations, and check the result.
copilot_here: Q1 2026 Updates - Package Managers, Golang, Podman & More
Q1 2026 brings copilot_here to your favorite package managers (Homebrew, WinGet, .NET tool), adds Golang support, enables Podman and OrbStack as container runtimes, and introduces model configuration.
AI as an abstraction layer: reviewing outcomes and implementation
How AI-assisted development compares with earlier abstractions such as SMTP libraries, and why I expect more of our work to involve specifying and verifying outcomes.
Fixing iTerm2 Initial Directory: When the UI fails, use the Shell
Using iTerm2’s Send text at start setting to open new terminal sessions in a chosen working directory when the Initial Directory setting does not take effect.
Resetting Tailscale on Windows after a 503 no-backend error
How to check the Tailscale Windows service and reset local state when the client stays on Starting with a 503 no-backend error, including the re-registration consequences.
Troubleshooting Docker containers starting before an NFS mount
Why a Docker container can use a local directory when its NFS share is not mounted, how to check the backing filesystem, and the limits of create_host_path: false.
Fixing Kiota integer properties generated as UntypedNode
How ASP.NET Core JSON number handling affects OpenAPI schemas and Kiota integer properties, and what changing to strict number handling means for existing clients.
The Day of the Year Fitness Challenge
Starting a new year usually comes with big fitness goals that fizzle out by February. I'm trying something different this year—a challenge that scales with me, starting with just 1 second of effort.