Compass Navigation Streamline Icon: https://streamlinehq.com
applied cartography

A month of OpEx quick wins

I spent the past few weeks chasing quick OpEx wins for sport, having felt a nagging sensation that the orchards of our org were a little too-laden with low-hanging fruit. I've already written about one of them — self-hosting GitHub Actions — but here are a few more that I wanted to write down before I forget.


1. Per-seat pricing in Vercel

Buttondown uses Vercel for the docs and marketing site as well as for our Storybooks. Vercel's Pro plan requires you to pay $20/month per seat. There's a "viewer" role that you can assign to users which gives them access to view stuff, but they can't trigger deployments.

To get around this, I pushed a change to programmatically trigger deploys via GitHub Action rather than using their standard Git integration. What's more, this means we get to consolidate our CI logic a bit — which solves a long-standing annoyance of mine, having queued builds sit and wait for ten minutes only to get ignored because they're irrelevant to the given PR.

2. Sentry migration + logging

We were on an old plan that charged us way more, so I migrated us to the most recent pricing grid. (Not downgraded, mind you — just moved to the current pricing, which happened to be cheaper. The joys of being a long-tenured customer.)

After that, I took a look at the long pole in our usage-based billing, which was logs. Turns out 30% of our log volume was a duplicate wide event — one request.started for every request.finished. We never actually need those or look at them, so I removed that.

3. S3 to R2

We started using R2 for managing our frontend build tarballs that get deployed to Heroku. But really, that was a Trojan horse for a larger migration: getting off of S3 entirely in favor of R2.

R2 has a reverse backfill thing and is also compatible with S3's API, so I didn't even have to change any code — just a bunch of keys. The net result was a ~$300/month S3 bill getting chopped down to $20.

4. Obsidian Publish to Bun

While I still like Obsidian for writing internal docs, my love of their Publish plugin has come to an end. I replaced it with a hundred-line Bun build script — not unlike the one powering this very blog — and saved $10/month.

5. RQ to Postgres

Unshipped RQ entirely as a task runner in favor of Postgres. (I need to write more about this in general.) The noteworthy bit is that we went from paying a comical amount for a tiny bit of Redis hardware — roughly $250/month for two gigs of RAM — to $25/month.


All in all:

Change Before After Savings
Self-hosted CI runners $300/mo $100/mo $200/mo
Vercel seats $200/mo $40/mo $160/mo
Sentry plan + logs $200/mo $80/mo $120/mo
S3 → R2 $300/mo $20/mo $280/mo
Obsidian Publish → Bun $10/mo $0/mo $10/mo
Redis → Postgres (RQ) $250/mo $25/mo $225/mo
Total $1,260/mo $265/mo $995/mo

All in all, a latte shy of one thousand bucks a month for what was probably, in aggregate, a single day of work.


About the Author

I'm Justin Duke — a software engineer, writer, and founder. I currently work as the CEO of Buttondown, the best way to start and grow your newsletter, and as a partner at Third South Capital.

Colophon

You can view a markdown version of this post here.