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