Writing
Articles
Essays on thinking clearly, working for yourself, and doing real work while AI rewrites the rules. Two decades of them.

Bootstrapped vs. Self-Funded
Bootstrapped and self-funded get used interchangeably, but they're not the same thing. Here's the real difference and why it matters.
2023.08.31Read →
Deploying Middleman Sites on Hatchbox
How to deploy a Middleman static site on Hatchbox with a custom build script, plus auto-deploying on every git push - after ditching Heroku.
2023.08.21Read →
Disable Attachments in the Trix Editor
A drop-in Stimulus controller that strips the attachment button, blocks pasted images, and disables file uploads in Rails' Trix editor.
2023.07.05Read →
Opportunity Cost and Letting Go: How to Profit from Your Stalled Projects
You want your time back so you can focus on other things. How do you do it though? Learn how in this article
2023.06.21Read →
The 15-Minute Meeting: Change Your Workday, Change Your Life
Most meetings do not need an hour. Set your default to 15 minutes, give every meeting a goal and a leader, and block them into one part of the day.
2023.05.09Read →
How to Migrate to Rails Encrypted Attributes
How to migrate an existing unencrypted Rails column to Rails 7's built-in encrypted attributes without breaking data already in the database.
2023.04.26Read →
Status Updates Should Be 60-90 Seconds
Standup status updates should take 60-90 seconds per person, no more. Longer updates waste everyone's time - save the deep dives for after the meeting.
2023.04.10Read →
Building a Stronger Mind and Body: Reflections on 1000 Days of Working Out
I worked out for 1000 days straight, this is what I learned about myself mentally, physically and more …
2023.03.28Read →
HowTo: Setup Tailwind CSS 3 with Middleman
A step-by-step guide to wiring Tailwind CSS 3 into a Middleman static site with an external_pipeline, plus the gotchas I hit and a ready-to-fork template.
2022.08.02Read →
MultiTenant PgSearch: A How To
How to scope Rails PgSearch multisearch results to a tenant: add an account_id column, wire up additional_attributes, and rebuild the index right.
2022.03.28Read →
PgSearch multisearch with ActionText::RichText
How to make a Rails model's ActionText::RichText field searchable with PgSearch by hooking multisearchable into its on_load initializer.
2022.03.27Read →
How to Fix – NameError: uninitialized constant Vips on Heroku
Fixing NameError: uninitialized constant Vips on Heroku for a Rails 7 app: the ruby-vips gem, an Aptfile, and two buildpacks in the right order.
2022.02.10Read →