February 28, 2021
The coy way to phrase how this week went is that I blew my Heroku budget out of the water. I woke up on Friday morning to discover that I had been Fireballed, something that my 20-year-old self would have been much more thrilled about but is still none-the-less very cool and very valuable. Getting a low-orbit cannon of traffic thrown at the site is useful in two dimensions:
- Short-term, I got a whole slew of signups and social engagement. It is not obvious to me that this actually matters that much; I think out of the entire cohort I got three paid users, which is still, you know, nice, but Buttondown's onboarding is high-effort and high-touch and I don't think a prominent blog is going to be the thing that pushes someone into starting a newsletter or switching providers. (Well, clearly it pushes some people, but not a critical mass of folks.)
- Long-term, it dramatically helps SEO. Buttondown's organic reach is still not particularly good (it turns out naming your service after a common piece of mens apparel is not the ideal strategy!), and every backlink helps. I am also coming around to the "wait, what was that tool I heard about again?" philosophy of positioning, which is that if I can ingrain myself like a splinter into some prospective customer's psyche it makes things easier down the line.
One of the things Gruber called out in the post was that Buttondown kind of cops out a little with privacy opt-out (as opposed to tracking opt-in):
Translated to plain English: “Spy tracking allows you to know when each of your subscribers opens and reads your newsletter, including the ability to creep on them individually.” Buttondown’s privacy “win” is that it at least allows you to turn tracking off with a simple checkbox. Most services don’t. I can’t find any hosted service that doesn’t offer tracking period, or even defaults to no tracking.
It is tiring to make decisions, and it is easy to think from the outside that certain artifacts are deliberate as opposed to made from a lack of decision.
Analytics being opt-out wasn't deliberate: it's an artifact of that being originally implemented as an opt-out and then me not changing anything or revisiting it in the past three years.
One of the hurdles I have yet to overcome is the ability to constantly choose. As I juggle various hats — manager, engineer, tester, entrepreneur — the failure case I run into most is that I end up choosing paths of least resistance when I have engineering energy (tech debt; obvious feature additions; bug fixes.)
Anyway, I changed it! Blog post will be coming down the line shortly to get some marketing / content juice out of it, but opinionated defaults do matter and I think this is the right tactic both from a cynical and earnest point of view.
Beyond that, not much of note this week. A handful of bug fixes, and I think the next solid chunk of work I want to poke around is Heroku performance: I should not have to randomly scale up my dynos every time I get a surge of traffic. This is one of those unknown-unknown things: I'm pretty good at certain genres of Python profiling (database access, flamegraphs) and very bad at others (memory leaks, gunicorn.) I am worried this is going to be a project where I throw myself at it for ten hours and make no progress and learn nothing and just feel a little dejected; I am optimistic that, hey, maybe all I need to do is tweak a few configuration files and suddenly all the static content being served from Buttondown is perfect.
But this is the graph I'll end on — the one I want to solve:
See that spike up to 30s response times at 2.30pm? Time to figure out why that's happening!