Posts

Thoughts on software, agent loops, and building businesses.

July 9, 2026

Hourly SQLite backups to object storage with Kamal

One small service takes a consistent snapshot with VACUUM INTO, verifies it, gzips it, and ships it to Hetzner Object Storage every hour. No extra infra, no host cron.

July 5, 2026

My session died after every deploy

Two small Rails defaults made auth feel flaky: a browser-session cookie and an implicit secret setup.

July 4, 2026

Catch N+1 queries early with the Bullet gem

Bullet flags N+1 queries and needless eager loading while you develop, and fails your test suite when one slips through. Here's how I wired it into a Rails 8 app.

July 4, 2026

Automatic Rails deploys with Kamal and GitHub Actions

Moving from laptop deploys to deploy-on-merge: build on the runner, push to GHCR, ship to Hetzner, ping Telegram.

June 20, 2026

Kamal deploy says green. HTTPS is broken.

The health check and SSL provisioning race on first deploy, and how to catch it before your users do.

June 15, 2026

Getting the most out of your Claude Max plan

How I stopped slamming into the 5-hour usage cap, and trimmed a surprising amount of wasted compute along the way.

May 18, 2025

Redirect naked domain to www with Kamal

A quick recipe for redirecting your naked domain to the www subdomain when deploying Rails with Kamal.

April 21, 2025

Zero-downtime Rails deploys on a single VM: Hetzner and Kamal

How to set up a Hetzner server and ship your first Rails deploy with Kamal.

April 8, 2025

Build a photo gallery in Rails with Cloudinary (free tier)

Notes to my future self on building a photo gallery in Rails with Cloudinary, using a single bucket for dev and prod to stay on the free tier.

April 1, 2025

How to replace email in git history

Change your Git commit history email using git-filter-repo. A step-by-step guide with setup, usage, and common issues to watch out for.

March 30, 2025

Automate releases with GitHub Actions and release-please

Set up automated versioning and changelogs with release-please and GitHub Actions, driven entirely by your conventional commits.

November 1, 2023

Load-more pagination with React Query and Rails

Implementing 'load more' pagination with React Query's useInfiniteQuery against a Ruby on Rails back-end.

October 9, 2023

SPACE metrics for engineering teams

The SPACE productivity framework for engineering teams, broken down across five dimensions.

August 31, 2023

How to add Google Sign-In to Rails without Devise

Implement Google login on your Ruby on Rails app with pure Omniauth, no Devise required.

July 5, 2023

Rails: auto-formatting on VSCode

Use Syntax Tree to auto-format your Ruby on Rails files on Visual Studio Code, and stop arguing about formatting in code review.

June 26, 2023

Using ActiveSupport in plain Ruby scripts

How to use ActiveSupport's convenience methods in plain Ruby, without pulling in all of Rails.