prq: A tool for recycling worktrees
prq is a PR queue with warm worktrees and tmux notifications
Projects, notes, and articles from my work as a Software Engineer.
prq is a PR queue with warm worktrees and tmux notifications
A vibe-coded script reminding me to close the windows as it gets warm is still useful after a year
Download audiobooks from Libby to listen offline
Managing stacked Merge Requests with git branchless
Mark files as generated for easier review in Github and Gitlab
My feelings about AI are complicated
A couple of simple techniques for getting better results from Claude Code
A TypeScript pattern for ensuring that two types are the same.
A git alias to use changeset descriptions as commit messages
Nx supports inferring tasks by looking at config files, but that's backwards. Better to infer the configs themselves.
Using self-hosted Counterscale to track page views on my blog
Can we create a tool that allows users to specify constraints in a spreadsheet and then solve them?
Make Result types in TypeScript as ergonomic as Rust's ? operator
An app to load music and audiobooks onto Shokz OpenSwim headphones
Schedule talks for a multi-track conference with an eye to avoiding conflicts
What I wish I'd known before having a baby
Use dotbot to link your dotfiles to the right spots on macOS, Linux and Windows
Setting up neovim smart-splits with kitty on macOS
VS Code Rewrap is a handy extension for wrapping long comments in your code.
Astro View Transitions can break Alpine.js components. Here's how to fix it.
Setting up a JavaScript package repo with multiple packages, TypeScript, testing, codegen, and automatic releases
Can we solve the Letter Boxed puzzle with a regex?
Custom matcher for checking if a Promise is settled (either resolved or rejected).
A look at the challenges faced by the Grammarly for Developers team when fixing a bug in the Grammarly Text Editor Plugin.
How to recover a lost git commit message
I've been swimming a lot recently. I find swimming to be pretty boring, so I've been listening to music with swim headphones to occupy my mind. A few weeks ago, my cheapo headphones were stolen from the side of the pool. To replace them, I bought some Shokz OpenSwim headphones. Wow, these are so much better.
A comparison of two tools for managing version numbers and changelogs in a monorepo
Contentful's migration strategy is lacking. Here's how I've worked around it.
How to pass an array as a parameter to a raw SQL query in Rails
A C++ library for safely invoking external commands and pipelines.
A comparison of Alpine.js and Stimulus.js for adding interactivity to server-rendered pages (Alpine.js wins IMO).
How to avoid CORS restrictions by setting up a proxy with AWS Cloudfront
Clipbox is a little utility that I've been using in some form or another for years. It is a utility that provides a keyboard shortcut to select a region of the screen, upload the screenshot to a server, and put a link to the image on your clipboard.
Save a snapshot of an Aurora Serverless database to an S3 bucket
Solving a difficult problem with Aurora Serverless
A technique for breaking bash pipelines into smaller, more easily debuggable pieces.
Use parcel to build a browser extension with Vue
Convert between lat-lng, web mercator tiles, and pixel coordinates.
A coworker had a question about combining the values from multiple javascript Promises. I've tried to cull the interesting Promise construction out of the original problem, and came up with an example about pizza.
A technique for getting work done in the face of overwhelming challenges.
We'll explore two different approaches to solving the same problem: Inheritance and Composition. At first glance, the Inheritance example looks more correct and is a bit shorter. I want to convince you that the Composition approach is more correct.
Using linear programming to schedule a medical residency program
Migrating a small ASP.NET web api from .NET Framework 4.6 to .NET Core.
Using CloudFront to host a single-page web app and avoid CORS issues
A list of software I find useful for programming on MacOS, circa 2018.