Heroku Dataclips Clone In Sinatra

Pair programmed with OpenAI's ChatGPT

Schedule Deno Builds with GitHub Actions

Daily deploys with Deno and GitHub Actions' scheduled workflows

Fly.io Multi-Region Ruby with Postgres Read Replicas

Serve a web app from multiple Fly.io regions and route read requests to Postgres read replicas when possible

Heroku Postgres Restore to Staging and Development

Restore a production database into staging and development environments

Postgres-Backed Job Queue in Ruby

Persist jobs in a Postgres queue and work them with the Ruby Postgres driver

Cache API Calls

Cache HTTP GET response bodies to improve performance and avoid hitting rate limits

SSH Key with Ed25519

Make ~/.ssh/authorized_keys look nicer

Postgres Visualize Slow Queries

A fast feedback loop for writing SQL in Vim and visualizing Postgres EXPLAIN output

Configure Vim for React and TypeScript

Syntax highlight, tab complete, auto-fix, lint, and jump to definition, implementation, and references

Heroku Postgres Read Replica with Rails

Read and write to a Heroku Postgres database as primary and read from a follower in targeted call sites

Postgres concat_ws() Function

Use concat_ws() instead of concat() to avoid ugly output

Postgres \set Variable

In psql, set variables and reference them

Run SQL from Vim

Run SQL against a Postgres database from Vim

Format SQL in Vim

Format SQL on save in Vim

Heroku to Slack with AWS Lambda

When my production app processes change state on Heroku, I want to be notified in Slack


A secure runtime for JavaScript and TypeScript

Thin API Clients

When to access an API with a specialized library and when to write a custom thin client

Pull Requests and Kanban

End-to-end with a kanban board, GitHub code review, continuous integration, and continuous delivery

Update a GitHub Fork

Keep it synced with the upstream repository

Block with /etc/hosts

Block ads, trackers, and malicious websites with /etc/hosts

Spell Check in Vim

Avoid mistakes when editing prose in Markdown files and Git commit messages


My laptop repo sets up a macOS machine as a software development environment


How we organized our code into a monorepo at our startup and how it evolved over time

Process Model

Define Unix processes in a manifest named Procfile and use tools to manage those processes


Dirs and files matching the patterns defined in this file are ignored for git commits, ag searches, and fzf searches

ASDF Version Manager

Set up and configure ASDF as a version manager for multiple programming languages

DNS to CDN to Origin

Rather than pointing DNS directly to an origin server, point it to a CDN that pulls content from the origin

Align Markdown Tables in Vim

Align GitHub-Flavored Markdown tables in Vim in a few quick keystrokes

Reduce Heroku Slug Size

Steps to resolve the 'Compiled slug size: 300.1M is too large (max is 300M)' error

Retention Curves

How to build a retention curve chart in Google Sheets from a Mixpanel tabular cohort report

Full Text Search with Postgres

Speed up Postgres full-text searches with a tsvector column as cache and trigger to keep the cache updated

Test Mock vs. Stub vs. Spy

Tradeoffs for unit tests that use mocks, stubs, or spies

North Star Metric

How many people get authentic value from our product?

Search Projects in Vim

Search a project for files, text, or word under cursor

Run Tests in Vim

Runs focused tests from Vim with a keystroke

Create Indexes Concurrently

Use Postgres' CONCURRENTLY option for CREATE INDEX to avoid locking writes to a table

Wrap Text in Vim

Wrap text to set textwidth with visual select and gq

Sort Lines in Vim

Sort lines alphabetically with visual select and :sort

Four-Phase Test

A pattern for Ruby unit tests (but not integration tests)


Extend a Ruby object's responsibilities without subclassing

Pessimistic Operator

Stabilize Ruby dependencies with the pessimistic operator and Semantic Versioning

Config Block

Configure a Ruby library

Mystery Guest

An anti-pattern in Ruby tests that hides cause and effect