Weeknotes from Buttondown

Archive

July 5, 2021

It is OKR season at my day job and so it is OKR season in Buttondown as well. I think I am actually making a pretty good go of it, this time around:

Two meaty projects (maybe a month each?), two smaller (maybe one-to-two-weeks each?) projects.

Free post
#54
July 6, 2021
Read more

June 14, 2021

Anyway, my goal for this week: pushing out some customer portal changes! My goal for the end of the week is to allow all premium subscribers to pause, upgrade, and downgrade their subscriptions: mostly this means a lot of transactional emails and web hook unit tests left to write.

I did it!

And, uh, not too much else. It was a week of emails (things are still fairly downbeat, but it happened to be a particularly voluminous week, the kind where the raw count is static but the “amount of thinking per email” spiked up), setting up a new laptop (I love my Mac mini to death, I really do, but the M1 MacBook Air feels almost comically performant in comparison. I bought it on a lark knowing that it was hard to justify, and yet I think I’ll be spending more time coding on it than on my Mac mini!), getting some nice press (I landed a fairly meaty mention in the , which is the kind of thing that I don’t know impacts me in a serious way besides SEO juice but certainly feels good!).

Free post
#53
June 15, 2021
Read more

June 7, 2021

This coming week, there’s something vaguely time-sensitive on the horizon! Heroku is changing how they handle DNS registration for custom domains, which means I need to send out a bunch of relatively urgent (“take this action by July 31st…”) comms to everyone using custom domains. I’ll also use it as an opportunity to tweak how I’m handling the Heroku flow, since it relies on a couple bad assumptions (that get invalidated after this Heroku change) and is flaky in a painful way. So that (plus Roadmap V2, as aforementioned) should be on the ship list this week: though it’s going to be a long weekend and the start of a new month, which means I’ll be a little more spread thin than usual.

Hey, I did both of these things!

First, the Heroku changes. These were largely boring and good; I got to clean up some tech debt and improve the custom domain onboarding interface as I built it out, which is always nice. Exogenous event as impetus for tech debt pay down is rare, but I have to celebrate it when it happens.

Premium post
#52
June 8, 2021
Read more

May 31, 2021

That being said, it’s time for some dessert work! Maybe I’ll treat myself to cleaning up some of my dropdown CSS or messing around with the search bar UI, which has somehow already becoming stale. Either way, I’m going to grant myself a bit of a reprieve from the weekly goal: as long as I push the roadmap changes live, that’ll be good enough.

Well, it is 6.20pm on Sunday as I write this, and I have two items left on my list:

Premium post
#51
June 1, 2021
Read more

May 24, 2021

It turns out the trick to completing a daunting project is roughly threefold:

  1. Whine about it a bit in various public forms
  2. Ignore all outside stimuli (and by “all outside stimuli” I expressly mean Twitter and emails and not, say, a corgi mewling for attention)
Premium post
#50
May 25, 2021
Read more

May 18, 2021

Sorry for the radio silence last week. A double-dosed Weeknotes this time around, as recompense, focusing on two fairly divergent workstreams — one that has been occupying my coding time and one that has been occupying my thinking time.

Vue migration.

I’m desperate to onboard to Headless UI, a very useful set of components that let me unship a lot of cruft (I have home-baked popovers that are awful, I have home-baked modals that are awful, etc. etc.)

Premium post
#49
May 18, 2021
Read more

May 4, 2021

(Fool that I am, I wrote this on Sunday and checked it off of my todo list without actually scheduling the dang thing. Apologies!)

All of that is to say, I think the DNS work is a worthy goal for the week ahead. Once that lands, I think I’ll be in a good spot to spend May on dessert work: JavaScript exfiltration, support for attachments, that sort of thing.

Free post
#48
May 5, 2021
Read more

April 26, 2021

This coming week, though — bug fixes. For real this time: I need to ameliorate some of the incoming customer service and bug fixes are the way to go. Honest! I’m building out a Things project and everything!

Hey, I did this! I picked out the five most noxious bugs (in terms of “time I have to spend answering questions around them” and also “embarrassment that they are extant bugs”) and by Sunday I had fixed four out of them. The fifth is — perhaps, dear reader, you are familiar with this one! — the whole “cursor randomly jumps to the top of the textarea” bug, which I am still as of yet unable to reproduce. There is even an entire about this of bug, which was both heartening (I am not the only one!) and disheartening (this may remain forever unsolved!)

Free post
#47
April 27, 2021
Read more

April 19, 2021

I wrote last week that my Big Goal for this week was to take care of the three most noxious bugs I deal with and to, well, stay sane. Neither of these things happened! It was a very busy week — lots of support requests to answer, lots of day job work, lots of accumulated fatigue — and I mostly did my best to keep my head above water.

When I have tough weeks, I fall back into a familiar holding pattern: working on things that seem neat rather than important or urgent. This week’s subject of neatness is at least one that I’ve been discussing and thinking about at length lately:

Free post
#46
April 20, 2021
Read more

April 12, 2021

On the face of it, this didn’t feel like a productive week. I did get two things of note done:

  1. I shipped the standalone checker infrastructure I mentioned. I punted on some of the trickier (and less important) architectural questions, like how to declare reactions to check failures; I realized it was more important for me to just get the infrastructure live and working and that more nuanced iterations would only come with experience. (To wit: there have been a lot of fast-follows, such as me immediately adding the ability to track how long a check has failed or being able to re-run checks through the admin interface.)
Free post
#45
April 13, 2021
Read more

April 5, 2021

Pay-what-you-want is live! There are still some fast-follows that I want to add, as alluded to in the blog post, but overall I’m satisfied with things. (In the…48 hours since public launch, I’m sitting a little shy of $5,000 being committed through PWYW, which is higher than I expected!)

It is always tricky to know when to call it a day here. I could have spent this week working on fast-follows, and the fact that so many of them have been explicitly called out in questions I’ve received post-launch is a sign that maybe I should have spent the extra day documenting upsell CTAs or adding more details to the post-upsell email. All of those tasks feel granular and snackable, though: they don’t require the dedicated level of flow and focus that actually hunkering down and shipping PWYW did.

Free post
#44
April 6, 2021
Read more

March 29, 2021

I got a surprising amount of work done in the past week on pay-what-you-want! This is good. This kind of feature work is not what I am particularly good at lately: the ratio of “staring and thinking” to “coding” weighs heavily in the favor of the former, and I am guilty of getting bored of staring and thinking and trundling off to some well-scoped problem that I can just crank out in a few hours.

In fact, if you wanted to, you could enable PWYW right now — it’s live in Paid Subscriptions. This is also the kind of feature where me saying “oh I’m done!” presages the majority of the work. Wiring together the billing code and the settings code is the easy part: then it’s like, oh right I need to update four FAQ pages and write a blog post and most of the subscription interface is built on the assumption that everyone is on the same price so I need to add more details to the NotesModal and also the subscription confirmation email and I’ve been to revamp the premium subscription email to look nice and have GIFs so I might as well roll that into this work and oh this means I need to start slurping up custom plans from Stripe to populate the various modals and emails so — [exhales].

Free post
#43
March 30, 2021
Read more

March 22, 2021

There are quite a few apocryphal quotes around “overnight success taking ten years”, and that’s kind of what this past week felt like: it took me I think around a year and a half to get my first $1,000 MRR on Buttondown (still one of my proudest moments as a developer ever!) and then things happen and I get a marginal $1,500 MRR in the span of a single week. Phrasing this as “MRR went up nearly 25%” is less visceral and more directionally accurate, but also much less fun.

Mostly what that meant was randomization: I wrote last week about my humble ambitions of puttering around on some small paper cuts and tech debt tasks while I set my brain to work thinking about a revised analytics stack in the background. Neither parts of that came to pass: I spent a tremendous amount of time on the operational and onboarding side (pulling in archives is easy; matching existing Stripe subscriptions is less so) and what little time remained was on figuring out what a new revised roadmap would look like.

“Change your roadmap entirely based on an influx of one specific customer demographic” is kind of a giant warning sign, and I don’t think I did anything too drastic: the on my new list are things that I slated for this half anyway, they just seem suddenly new and more important.

Free post
#42
March 23, 2021
Read more

March 14, 2021

Last week, I wrote:

There is some bug bashing that needs to take place, but I think finally tackling multiple-newsletter creation in a less janky way than “log out, create a new newsletter, and paste that API key in” feels like a good candidate. (And no, of course that’s not because I received two support emails about it this morning. Why would you even ask that?)

And I appear to be in the position now for the second week in a row that a chunk of work I pegged at being a solid week’s worth of work ended up being about an hour’s. When I thought about it in the abstract, “newsletter creation from the perspective of an already-registered user” felt hairy and complex and prone to lots of yak-shaving. When I actually sat down to work on it and start figuring out the data modeling, it turns out it’s quite simple: newsletters need a name and a username to be created, and that’s it. The rest can be handled just by the existing settings interfaces (which, don’t get me wrong, need some TLC, but that’s an orthogonal problem) — there’s no point recreating all of those form inputs just to have them in a multi-stage modal or whatever.

Free post
#41
March 15, 2021
Read more

March 7, 2021

Last week, I mentioned that I was gearing up for a week of frustrating (and hopefully rewarding) Heroku spelunking: dusting off the proverbial (and I guess literal — I had to update a couple dependencies) toolbox and going to town.

…

It was a one-liner, I think.

Not even a one-liner, the kind of one-line change that you arrive at with a sense of exhausted satisfaction after many hours down in the Performance Mines: a stupid, idiotic one-liner, a “oh my god of it’s this issue, why didn’t I just look at this sooner”. The in this case was a timeout set by , the web server I run around Django — it was set to kill any requests after , whereas Heroku had a hard timeout of .

Free post
#40
March 8, 2021
Read more

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:

Free post
#39
March 1, 2021
Read more

February 21, 2021

This has been quite the week!

I’m in the final stages of a pretty fun high touch sales deal. I spent twelve hours assembling IKEA furniture in my basement. I shipped Importing V2. My dog got neutered. I’m in the final stages of delivering on a very fun and philosophically well-placed partnership with an analytics provider.

(Okay, some of those aren’t related to Buttondown.)

Premium post
#38
February 22, 2021
Read more

September 29, 2020

Buttondown’s newest mascot.

My latest of reasons for being bad at writing is the most adorable yet: Telemachus, my ten-week-old corgi puppy. He is a very sweet dumb fluffball, with some strengths:

Free post
#37
October 1, 2020
Read more

September 8, 2020

Customer service, that old devil.

I was relatively sunny and awash with optimism last week. I owe a lot of this to a new strategy I was trying out to preserve focus, which was to ignore my inbox except in the mornings and evenings: rather than keep the inbox open in a tab all day and respond reactively (and get randomized) by emails, I was going to just batch-respond twice a day and ignore my email otherwise.

This was working very well until Thursday morning, on which I awoke to....72 emails, what I think is a new record. These weren’t all bad emails — some were pleasant compliments, some were error notifications, some were interview requests. But a lot of them were serious and required work, and it was all a little overwhelming.

And for those of you reading this email who might have been in the cohort of 72, I promise you: I love you, and don’t bedrudge you at all! This is a me problem, not a you problem.

Free post
#36
September 9, 2020
Read more

September 2, 2020

Logging and monitoring misadventures.

Buttondown has been slow and flaky recently. I feel pretty confident that this is due to increasing volume: the ‘odd’ HN hug has become a daily occurrence, and the load coming from Mailgun/SES, while spiky, scales linearly with traffic. This is manifesting in a painful ways: spats of timeouts and dropped connections.

Previously, this has been a problem I’ve scaled my way out of: Buttondown sits on a half-dozen Heroku boxes and then I bump that up to a dozen until things stop complaining. That steady state has shifted, though: instead of going from 6 to 12, I’m finding myself going from 12 to 24, and even then there’s a lot of pain.

This is not uncommon, and there’s a playbook for this:

Premium post
#35
September 3, 2020
Read more

August 2, 2020

Roadmap angst.

So, first, the exciting news. (Well, exciting news for me): I’m taking next week off!

This, of course, means I’ll be spending more time than usual on Buttondown, retreating to the figurative backyard shed.

I was poking around my roadmap finding a couple interesting tasks to work on with my time. I think I’ll be able to fully ship internationalization and the remaining marketing work, but wanted a nice meaty project for the back half of the week: revised billing? Multiple users per account? A redesigned writing interface?

Free post
#34
August 3, 2020
Read more

July 26, 2020

Marketing, launched!

For once I was true to my word, and I launched.

In no real order, some takeaways thus far:

Free post
#33
July 27, 2020
Read more

July 19, 2020

Marketing, hovering over the “merge” button.

It is so tempting:

Free post
#32
July 19, 2020
Read more

July 14, 2020

Marketing V3, almost ready.

Feast upon these glorious screenshots:

Free post
#31
July 15, 2020
Read more

May 11, 2020

Apologies for the late weeknote. This has been a low-energy, high-email week, where I would look at the end of my to-do list, see “write Weeknote” alongside three other things, and sigh to myself as I opt to do precisely none of them. Sometimes you need to have low-bandwidth weeks!

I’m reminded of one of my favorite pieces by Patrick McKenzie, my coworker:

Free post
#30
May 7, 2020
Read more

April 27, 2020

First: hello from my new iPad keyboard. I’ll spare you the requisite bloviating about yet another piece of Apple hardware, but I quite like this one, and it means I can be a little more efficient shifting more and more non-development work away from my desktop. Notion works well; Mail works well; Zendesk works well. And thanks to Juno, I can even do some limited diagnostics/data exploration work!

Here’s a thing that I’ve known to be true for a while but have found to be particularly true in the past few weeks, as all element of my life bleed together: two hours is not the same thing as four chunks of thirty minutes.

Free post
#29
April 28, 2020
Read more

April 20, 2020

I spent this weekend refactoring how Buttondown handles archival imports!

First, what are archival imports?: if you bring your newsletter over from Mailchimp or Tinyletter (or, now, Substack, but we’ll get to that later) I have some janky logic to import your archives. This was, prior to this weekend, done in the span of an HTTP request, which was, uh, non-ideal: if you had a large (or even a not-so-large) archive, your import would probably time out and/or silently fail, leading to a customer email, leading to me importing your archives manually, which was pretty easy but definitely frictional.

A good rule of thumb I learned a number of years ago is to get the number of “things” in an HTTP request as low as possible: “things” are database calls, sure, and third-party requests, and file reads, and pretty much . HTTP requests should be granular, instant, and fail very rarely — all the important stuff associated with them should happen after the fact. My archival imports broke this rule with wild abandon.

Free post
#28
April 20, 2020
Read more

April 13, 2019

Reckless spending.

Buttondown has a new Twitter handle, which also marks my first (and, if I were to bet on it, last) foray into social media account purchasing.

I had had for a while and it was, you know, . The success or failure of an enterprise is not determined by the concision of its social media identifier, you know? But, because I am foolish, I wanted , and had a lingering to-do item to try and track down the owner.

Free post
#27
April 13, 2020
Read more

April 6, 2020

A short update this week, which perhaps belies the amount of work I got done last week; I think I managed to check off a roadmap item every day for the past seven days, which feels great. Some of the quarantine insularity is definitely getting to me, though — I’ve felt pretty dang tired today and yesterday, and am taking a mental health day tomorrow to noodle around in the house and do some reading.

(It is hard for me to remember how and when to rest, sometimes. Working from home exacerbates that.)

Testing and validation.

Free post
#26
April 7, 2020
Read more

March 30, 2020

Roads, being mapped.

I have spent all of two weeks with a public roadmap. Some notes thus far:

Free post
#25
March 30, 2020
Read more

March 15, 2020

A new workspace.

I’m writing from Seattle, which you may potentially know as “the COVID-19 epicenter of the United States.” I promise this will be the last mention of coronavirus in this newsletter, but I used my last “ignore social distancing at one’s own peril” pass this past weekend to go to a ghost-town version of IKEA and upgrade my home office to one that fits both me and my partner:

Free post
#24
March 16, 2020
Read more

March 8, 2020

Mic check.

Sorry for the, uh, [checks calendar] three month interruption in weekly Buttondown coverage.

I wrote some of this on Twitter, but it has been a period of vague and guilty restoration. I am not sure whether or not to call this writer’s block or developer’s block: I was fatigued, and busy, and could not muster the energy to do much of either.

Free post
#23
March 9, 2020
Read more

November 27. 2019

I am back from San Francisco! It was filled with Philz and, as always when I am removed from Seattle for too long, a deep sense of longing.

Instead, this week’s sense of chaos (or, a word that has alarmingly emerged into parlance, randomization) comes from home, where I am hosting my brother and parents. Family is, like any good thing, draining and rewarding.

Marketing?

Free post
#22
November 27, 2019
Read more

November 19, 2019

Project Honeypot

I integrated a new scimitar into my weapons rack of anti-spam measure: Project Honeypot, which is a crowdsourced database of malicious IP addresses. It looks like this has around a 70% crossover with my other main repository of bad actors, CleanTalk, which is nice.

Free post
#21
November 20, 2019
Read more

November 11, 2019

2020.

I am doing something that I have never done before with Buttondown, which is, uh, planning. This is all very uncharted and exciting. Here is what my plans look like at the moment:

Premium post
#20
November 12, 2019
Read more

November 3, 2019

Marketing!

Some people go out on Friday evenings; I was one of them once, letting off some steam after a long week with a coterie of cocktails and the effervescent Belltown nightlife.

Other people sit inside, unwinding with some tea (my partner has got me on this tea-with-honey kick, and I can honestly not tell the difference taste-wise but it’s certainly more hygge) and a blanket and a pleasant movie or RPG.

Premium post
#19
November 4, 2019
Read more

October 27, 2019

Marketing misadventures

What have I been doing in October (besides neglecting to update this newsletter?) Well, marketing things. Or things that, if I squint at them, I can call them marketing things.

Let me back up a bit. I’m in a new house, and one of my dreams for my starter home was to get a personal home gym. I don’t need much — a power rack, a bench, some dumbbells — but my basement is kinda janky in terms of layout and ceiling height. I found a compact rack by Rogue (costs around $3,000 and probably a handful more in terms of finishing the basement so I can do things like drop 315lbs without being terrified I am scarring my estate forever) — right at the same time I found a YMCA (costs around $50/mo) five blocks away from my place.

Free post
#18
October 28, 2019
Read more

September 16, 2019

Hello after a few weeks away! I spent two weeks in Japan, which was a trip of two fronts:

  1. A facsimile of a working vacation. (I spent the first week in Tokyo, working; I spent the second week in Kyoto, mostly avoiding work.)
  2. A test of how hands-off Buttondown ‘really’ was; could I ignore work and comms for a dozen days and come out fine?
Premium post
#17
September 17, 2019
Read more

August 20, 2019

Sorry for the hiatus last week. I bought a house. And moved into the house. This was delightful, and stressful, and I learned that I own entirely too many Magic Keyboards and 30-pin charges. (And entirely the right amount of books, which happens to be a quantity infeasible for moving.)

Being offline most of the week and weekend was tough, to be honest; it is not the most exciting thing to open a weeknote on, but I had two churns from fairly excited/well-fitting users that amounted to “you’ve been unresponsive for two days while I’m having a serious issue, boy bye”. This is fair! And it’s a bummer, and a systemic flaw — one that I know I harp on.

Free post
#16
August 21, 2019
Read more

August 6, 2019

Cancelling Project Eyeglass.

I wrote a couple weeks ago about Project Eyeglass, my attempt to build out an administrative metrics dashboard for Buttondown. This was going to give me a more data-driven view into things I should be caring about at this stage, like growth and user activity over time.

Free post
#15
August 7, 2019
Read more

July 29, 2019

I built what I like to call a dessert feature on Friday — Instagram embedding.

Free post
#14
July 30, 2019
Read more

July 22, 2019

I’m in the process of working out a two new business models for two new customers. Neither may come to pass, but they’re both fairly interesting in their own right:

  1. Heavily using Buttondown’s API as a “newsletter as a service” SaaS; automatically generating new newsletters for each premium user, registering new subscribers on their behalf, and sending emails at certain points. Here, the customer would basically be eschewing Buttondown’s UI entirely and just using it for all the other stuff; subscriber validation, email formatting and sending, that kind of thing.
Free post
#13
July 24, 2019
Read more

July 16, 2019

I have not worked on Buttondown very much the past two weeks, which has frankly been a bummer. I like working on Buttondown, and not being able to fit it into my days is more of a personal failure — work has been Good Busy, life has been awash in the kind of things that summer life is often awash in, and the Seattle summer days tick by. You blink and it is 7pm; you have more work to do, but also there is a grill and an unquenchable desire for hefeweizen.

There is a lag between process and results, though. Despite doing nothing in July, all of the things are good: customer support requests are down (thanks to the fruits of boring but necessary work three months ago), growth is slightly up (though it should be more!), and things are largely stable.

In some respects, my eyes are larger than my stomach. Take this, my WIP pull request for my metrics dashboard:

Premium post
#12
July 17, 2019
Read more

July 1, 2019

Welcome to July! I’m happy to be back in Seattle after a brief sojourn in San Francisco (as promised/warned, very little got done besides reading Lanny and Middlemarch in various SoMa bars). And this week will be similarly truncated, with me spending the back half of the week in Whistler, Canada with my partner and her family.

Costs, except less so.

Free post
#11
July 2, 2019
Read more

June 24, 2019

Hello from San Francisco! I’m here for three days for work, which will likely mean a surplus of Philz and staring idly at the Bay in lieu of ~actual work~ focused development time.

Which seems increasingly optimal, actually. My work on Buttondown over the past few months has stratified into two tiers: short bursts of administrative work (answering emails, doing operations tasks, filing bug reports) during the week with one or two big sprints of focused development work in the evenings (often Friday night, which is particularly nice because I’m so drained from the work-week that all I want to do is sit, have a Manhattan, and hack away on a well-defined problem.)

I haven’t read Deep Work and am not too enthralled by the legion of modern literature purporting to tell you “this is how you get stuff done”, but I am pretty convinced that one four-hour block is vastly superior to four one-hour blocks, and this week bore that out in fruit. I landed a whole of things about which I am excited:

Premium post
#10
June 25, 2019
Read more

June 17, 2019

Sorry for the lack of missive last week! It was particularly hectic — my day job was a little more chaotic than usual, my bike was tragicly stolen, and the Seattle summer, with all its rooftop grills and public park 5Ks, threatens to swallow every iota of free time into its drooling maw.

Feature complete.

Panoply — my pretentious codename for multiple newsletter support — is launched. It’s not particularly active yet — I have a dozen folks using it, which is great, and I need to open the floodgates to more — but it’s causing only a few bug reports and not a massive amount of bug reports as I had feared.

Free post
#9
June 18, 2019
Read more

June 4, 2019

Panoply!

I wrote last week that my singular mission was to work on Panoply (multiple newsletter support) and get it to a dogfood-ready stage. Lo and behold:

Free post
#8
June 5, 2019
Read more

May 28. 2019

“Blogging”.

I have about the urge to redesign a blog. It is a powerful thing to do, because it easy to convince yourself that easy technical tasks (rebuild some templates! write some CSS!) can act as levers for difficult non-technical ones (build inbound marketing funnels! proactively address support questions!)

Free post
#7
May 29, 2019
Read more

May 19, 2019

Outage.

I had a rough whoopsie last week:

Free post
#6
May 21, 2019
Read more

May 13, 2019

Money, part two.

I wrote last week about some basic cost-cutting measures:

Free post
#5
May 14, 2019
Read more
  Newer archives
 
Older archives
Find Weeknotes from Buttondown elsewhere: Twitter
Brought to you by Buttondown, the easiest way to start and grow your newsletter.