Posts
Longer explorations of technical problems, interesting tools, and things I've learned along the way. Also available as RSS.
Why I Use Pi
What made me switch coding agents and why I stayed
Coding Agents at Team Scale
Maintenance matters more than setup: keeping context fresh as codebases evolve
The Infrastructure Around Your AGENTS.md
Your AGENTS.md is not enough. Leverage deterministic tools to enforce rules
Skills for Domain-Specific Knowledge
Progressive disclosure for coding agents: load context only when needed
Your AGENTS.md can be shorter now
The new wave of coding models needs less hand-holding than you think
Smaller and simpler feedback loops
How coding agents changed the way I worked
Upgrading the nvim-treesitter plugin
Fixing nvim-treesitter after the master-to-main rewrite
Using AI for Tooling: Building Developer Tools for Cube
Improving productivity by improving processes around development
Chaos and Order: A game against AI
Making games with LLMs
Enabling font ligatures for GitHub Monaspace in Ghostty
Enabling Monaspace's stylistic sets for code ligatures in Ghostty
Using named captures to extract information from ruby strings
Parsing structured strings with Ruby's named regex captures instead of split
Changing perception of objects by overriding the inspect method
Making Ruby value objects look like constants by overriding inspect
Using Rails's Attributes API to serialize Value Objects
Serializing value objects into ActiveRecord models with the Attributes API
Three ways to ignore files in Git
.gitignore, .git/info/exclude, and core.excludesfile
Postgres timestamp ranges in Ecto
Building a custom Ecto type for Postgres timestamp ranges
Namespaced Rails validators
A Rails source spelunking find: custom validators can be namespaced with ::
A global .gitignore
Setting up a global .gitignore to keep editor and OS files out of every repo