Transcript: Buttondown - Justin Duke
This episode is sponsored by MailTrap, an email delivery platform that developers love.
Try for free at mailtrap.io.
Hi, welcome to another episode of Django Chat, a podcast on the Django Web Framework.
I'm Will Vincent, joined by Carlton Gibson. Hi, Carlton.
Hello, Will.
And we're very pleased to welcome Justin Duke from Button Down. Welcome, Justin.
Thank you both for having me. I'm excited to be here.
thank you for coming on so tell us for the you listeners who perhaps don't know tell us
what button down is and how you that's on a django show for sure so button down is a email tool
similar to say mailchimp or tiny letter sub stack uh that the rich ecosystem of ways you can just
blast out emails to thousands of subscribers um all built on top of python and django over the
past couple of years have been experimenting with some of the more modern web stuff for the front
end, but the core backend, how we send our emails, how people view those emails, all that is running
through Django and running through Python. There you are. So I just have to jump into it. A
recurring theme on this show is people always say, but maybe Go is better. What are your current
thoughts on when you see something slow in your application and maybe the grass is greener over
there? You know, button downs at the phase of a product where it, I start to have to think about
scaling concerns and performance way more than say like three or four years ago, where it was
mostly around like, how do I hit product market fit? How do I iterate quickly? All the things
that I think Python is particularly good at. And even now that like, I am really, really
performance sensitive i still feel like there's upper echelons of software uh and just in terms
of raw volume where i think you hit the nuclear button of like we have to migrate off of the
language that we're using because this just like cannot scale but i think that is generally a
couple orders of magnitude larger than where most people abstractly think about it like 95 99 percent
of the time when i'm dealing with some sort of perf issue it's like the boring stuff right it's
like an n plus one query or something that can be solved at the database or caching layer i think
even even now even as we're handling so much traffic there are so many python level tools
that help you address kind of those those perf implications that uh i haven't really fantasized
about like oh let's just take this little subsystem and rewrite it in in go or rust like
that would have to be motivated by something other than pure performance seems a very mature outlook
well can i ask how many how many people are working on button down now because i know you
have some support staff is is it just you and engineering or what's the team size right now
we're around uh five to six folks who are working roughly full-time hours and then a uh a legion of
very lovely contractors doing stuff like support uh documentation and writing that sort of thing
The goal has always been keep it really tight knit and keep it really, I guess, small in terms of headcount.
I've worked at really large companies and I've learned a lot from that.
But one of the things that at least right now in my career I'm not super interested in doing is the startup hedonic treadmill of hire as many people as possible, spin them all up, spend all your time scaling and scaling and scaling.
I think this is my first time working this long on a product project or product that
has just a handful of folks and I think the the level of velocity and focus that you get out of
that is really really rewarding okay I want to jump in there because I'm um I I'm about 12 months
into bootstrapping a project just single-handedly and it's and it's part of the story there is that
we've gone back to htmx and template rendering and all the rest so I wasn't I didn't have to
take on a whole front end team to get as far as i've got um but one of the sort of take-homes i
think from my last year of experience of getting back to building with django rather than just
working on it is that really it's a force multiplier like there's no way i could have done
this what you know in another project and another with another thing i think and what's your
experience there i mean do you feel you know django helps you out in that in that keeping it tight
keeping it small absolutely i think the when i look back to the first say year or two years
building out button down i think something that i only really recognized in hindsight was how much
of this stuff just wasn't even a problem for me because it's something that the framework brought
for you like the classic example that i think is becoming more and more um relevant as like a lot
of full stack folks are opting towards like JS and using a purely JavaScript based framework is
like off which is like a really boring thing to talk about but when I first spun up button down
it's like all right well I have this built-in user model like I get some admin stuff for free like I
can plug in all off down the line to get in social login and all that stuff and like that was not like
a major consideration where I had to evaluate vendors and think about all these various things
it's just like well Django brings this in for me like even now as like I start to look at okay
parts of Django maybe we have to replace them with something that's like a little bit more
bespoke and home-baked the amount of early decision making and early build-out that you
don't have to do because Django has like really smart sensible defaults that will do like 95%
of what you need for you is really hard to beat yeah brilliant brilliant and then that begs the
of the question which bits are you starting to think oh yeah we might need to replace that bit
we might need to roll around our own there for sure so i think some of this varies like to talk
about some stuff that has fall under that umbrella in say the past year or two years um and none of
this i think is particularly surprising but like the api url patterning for for django and like
the request lifecycle, I think third-party packages like DRF and now more recently stuff
like Django Ninja or FastAPI, like that is just handled a little bit more better or more
ergonomically for a use case like mine, which is, you know, button down really has two front
ends to a certain extent.
It's got the subscriber facing front end that's like going to subscribe to someone's newsletter
or viewing their archives.
And all of that is kind of classic Django.
Like that is Django templating being served by CBVs, like very, very happy path.
And then the author facing application, which is you're an author, you want to log in, write
some emails, manage your subscribers.
All of that is a custom front end that's more like a conventional SPA and all of that's
powered by API views that we then serve as an external facing API.
So people can like, you know, call button down to like programmatically send newsletters
or chain subscribers and things like that.
And a lot of this stuff that you get out of the box
from whether it's DRF or Django Ninja
in terms of API generation and things like that,
that is where I've started to like pull really far
outside of what Django offers.
Because again, I think Django's charm and value
in many ways is they give you the 80%
or the 95% that you need for free.
And then it's really easy to opt out of the stuff
that you outgrow of like,
You don't have to go through a lot of hoops to be like, well, I'm not going to use Django CBVs.
I'm going to do my own thing.
Like you can always drop down to the primitives and skip what's out of the box without having to like really, really pay for it, if that makes sense.
That does make perfect sense.
And now I'm massively curious about what dirty API stuff you're rolling for yourself in there.
But I don't know if we'll go all the way there.
Yeah, no.
Well, Carlton and I want to just like tech talk the whole time, but I think it is also helpful to talk about the person behind it.
So I'm just curious for you, like I know you studied at William & Mary Computer Science.
I was in Yates too, by the way, back in 10 years before you, I think.
I had no idea you were also a William & Mary grad.
That is a small world indeed.
Yeah, they just took down the building, I think, right?
They just destroyed it.
They're redoing.
It was pretty grungy when I was there.
Like we had dehumidifiers going the whole time because I was in the basement and it
was, yeah, it needed a refresh.
But I, you know, so I'm probably, I think, 10 years older than you.
Like back then, nobody was doing really computer stuff.
I remember there was one guy who built his own email client and Microsoft was interested
and it was like this crazy, oh my God, like the West Coast.
Whereas fast forward and I guess the growth of tech in DC and just in general, it was
less crazy that someone would go work at a web company, right?
As opposed to a contractor in Northern Virginia or something.
So that, anyways, side note.
So I'm babbling, but I'm curious, when did you start getting into computers?
Was it in college or did you have a taste for it before?
Of course.
And so as context, like William & Mary, pretty small liberal arts college.
You know, even in the 10 years since you graduated, when I graduated from CS, I think there was
maybe 20 folks in the department who graduated with me.
So still a very small department.
I came into undergrad not thinking I was going to go into programming.
I wanted to be an English major and then like I had heard enough stereotypes about graduating with just an English major that I was like, all right, I'll supplement it with a marketing degree.
Maybe I can do copywriting or something along those lines.
You know, sophomore year after college, I interned at an ad firm in Richmond and I quickly discovered that the ad industry was not for me.
And in fact, my favorite part of the entire gig was like managing a couple of our clients like WordPress installation.
because i had to do like some basic html and css stuff and i was like this is actually like pretty
fun maybe i should think about this a little bit more seriously and so junior year onwards i kind
of took a couple of the basic 101 and 201 cs classes realized i loved it and then kind of did
a hard pivot into into cs um and so i had to make up a lot of ground in my final two years but
even even in 2013 the the scene as it was for cs at william and mary was pretty similar to what
you're describing will of like the vast majority of folks who were uh getting jobs after graduation
they were going up to northern virginia or dc they were doing public sector work maybe they
were contracting there were one or two people in every class that would kind of like uh go out to
the west coast and my sense was like i wanted to be one of them really aggressively because
i had no interest in going up to dc like it felt like the zeitgeist of what was happening in tech
and working at like big exciting novel companies was mostly on the west coast or mostly in new york
as opposed to virginia and dc so i worked really hard to try and like get myself either in the bay
area or seattle after graduation um just so i could learn from a larger culture of tech that
wasn't purely government-based yeah that's great well okay that makes sense because i was you know
reading through your, your personal site, you talk about writing poetry and reading poetry.
And I don't think I've ever seen that before. Yeah. Yeah. Which is great. I mean, you're sort
of like, you know, you, I wasted 10 years doing book publishing and getting an MBA, but, and then
also was like, I got to get off the East coast. I got to go West and like, get out of this old
world mindset. Okay. Wow. So that's, so was your first job out of, after graduation, was that at
Amazon. And it was, it was a really nice blend of kind of my, my former and then current passions.
I was working on Kindle, which, you know, Amazon, as I'm sure you two know, like there's a lot of
horror stories about the, the engineering culture there and how, how crazy it can be at times. But
it was, it was a perfect launching pad for me because I got to work on a topic and a vertical
that I was really, really passionate about, really, really knowledgeable about, but also got
to learn from folks who have been in industry for for decades at a time and then you went after a
number of years you moved over to stripe is that correct okay um that's that must be there must be
a war story or two in there like stripes both those both those companies are quite a little
high profile really no no oh yeah it was the stripe was an incredible experience i was very
fortunate in that i was one of the first few folks who kind of spun up the stripe seattle office of
um the the reason i originally joined is i was i was looking for a change of pace but i loved
living in seattle and had no desire to sort of move down to sf for the bay area and they were
starting to hire their first couple engineers to build out a seattle space and one of the things i
wasn't really expecting was how much of that role for the first say six to nine months was almost
more like um recruiting than anything of you you don't think about it until you're in it but
part of the the ambit and part of the mission of these rapidly growing tech companies is hey this
this engineering office has a dozen engineers we need that to be like a hundred by the end of this
year how do you do that without like sacrificing the quality bar and not just like letting anyone
in how do you do that while still shipping product and like maintaining a culture and all of those
things uh so much of what i look back fondly about that time was just uh going from we're in
a sublet of a sublet in like a random downtown a high rise like we've got four floors and like
uh i've chatted with you know at least half or two-thirds of like the hundreds of people working
here so really really fun uh high velocity time for for better and for worse did you get the big
corner office like on those oh absolutely not yes i was i mean there it was very um open plan
style right uh like we we had rows and rows of desks and you had a good amount of space but
there was a big emphasis on like collaboration and the only sort of closed off doors you're
going to have is for like meeting rooms or things of those lines so i okay i do have to ask how do
you hire quality engineers quickly because that's the thing that is both the company line and i do
honestly think is true is like there's no real magic bullet um you just have to like spend a lot
of time and spend a lot of effort and if you try and like uh sacrifice on one of those things it's
going to bite you throughout the process i think one of the things that stripe does in particular
really well that I am surprised more companies don't do is rather than having say like a bit
of a choose your own adventure where if you apply to most of the larger tech companies uh whatever
like interviewer you get they probably have a pet question that they ask all of their candidates and
like that's what you're gonna try and get Stripe has a very rigorous sort of interview question
creation system of like all of Stripe and you know thousands and thousands of engineers at this point
They had a corpus of maybe a dozen or two dozen very specifically calibrated questions.
That way you can enforce consistency of like, well, we know that a really good candidate
handles these specific edge cases and knows how to handle like this part of this problem
and so on and so forth.
And I'm surprised more companies in the industry don't kind of go with that standardization
approach because it just makes it easy to avoid implicit bias and have like a very strict,
very standardized bar for who is performing well and who isn't yeah no that's a good point because
i think people just make it up as they go along largely 100 did um so i did an interview in the
kindle office as an mba student in 2010 and at the time they had i did the whole full day thing
where you meet with like seven people and have lunch and they had like was it the level razor
basically the person who's a jerk to you the bar razor the bar razor did they do that in the tech
side as well? They did. I think it was, and again, it's, it's one of these things where
hiring is such a weird sociological problem because you have really perverse incentives.
Like if you're a hiring manager, regardless of what org you're in, like the standards that you
have for someone who's joining your team might be slightly different than someone who is completely
removed. Like, I think one of the things that Amazon did was whoever their, their bar raiser
would be it would
have to be a
completely different
org so they have
like no emotional
attachment to yeah
oh well this person
isn't great but we
do need to like ship
this product which
means we need to
like hire someone
quickly and get them
onboarded within three
months I think that
level of editorial
remove is always
smart um
But again, it's I feel like we're going to look back on how we do engineering, hiring and onboarding as an industry.
A hundred years from now is like this was the dark ages, like everyone was just kind of like throwing darts, trying to see what worked.
It feels still so early days and so unscientific.
OK, I'm going to ask one more question on that kind of thread.
They're like software engineering. There's this title gets thrown around, you know, but you compare it to civic engineering.
there's kind of a lot less engineering goes on do you think we're still a very young industry
from that perspective of having better systems better more more rigorous engineering practices
in place and i guess that's hiring practices as well absolutely i think you can look at this from
from a number of angles like uh i'm i'm the number one person to kind of bemoan and besmirch any kind
of uh software engineering like productivity metric or things along those lines but like
if you want to compare different disciplines of engineering like we should be able to do as an
industry a good job of saying like hey how productive is this corpus of engineers or this
given work stream and we're still not really there yet i think to go back to stripe like stripe as a
company and as an organization takes a lot of that discipline really seriously because you know it's
one thing i think it's different depending on what the role of the given piece of software is
strike from day one took really seriously that like hey if we have a bug in our software that
can mean billions of dollars of money movement even if it's just downtime like that downtime
means if you're offline for a couple seconds that's billions of dollars of volume that isn't
being processed. And they built out those rails from a very early stage of like, how do we make
sure that there's a focus on all of these kind of uptime and reliability and security angles
without sacrificing productivity. But, and I'm curious to get y'all's thoughts, but it feels
very much to me that one of the hallmarks of us being very immature as an industry about this
stuff is every organization has to figure it out from scratch to a certain extent. There's no like
omnibus best practice of like this is how we as a guild of software engineers handle these things
there are really good best practices but there's no formal like repository of knowledge around this
yeah i mean like i think that's bang on is that an engineer in almost every every field gets a
certificate because they've got a certain you know they've got a degree or they've got a certification
or they've got a you know postgraduate thing that says you know you are qualified here you've you
know the safety practices you know that and not that kind of bulletproofing isn't appropriate for
every project if you've just got an image carousel it doesn't you know if it's not super tested but
it's not the end of the world but again payment processing that needs more or the space shuttle
is the good example right and he's exactly well i know that um we'll move on from stripe but i
just recently i had some colleagues uh from a startup i worked at who moved to stripe pretty
much all of them moved to stripe actually and uh i know i just was emailing one of them i saw a bug
in the docs and i was like oh you you moved to open api and he's like yeah well you just just
do bugs at stripe and patrick's cc uh the ceo is cc'd on the those emails and you know of course
he's not responding but when the the boss is on this email list sure enough i got a response in
10 minutes you know because i was like hey there's a 404 in your checkout stuff like that does speak
to the importance coming from the top on on those things right because if the head person doesn't
care. Everyone else will slowly let those things slide. Absolutely. And I think one of the things
that I internalized most from my time at Stripe was just how rigorous and how thoughtful all of
the C-suite, all of the senior leadership really was in terms of like keeping a pulse on not just
like how are we doing at a top level as a company, but like individual, like how does it feel to
be an engineer like be a junior engineer and shipping code against this code base how does
it feel to be a new user running through stripe for the first time one of the things that patrick
the the co-founder and ceo did that i thought was mind-blowing and i again don't understand why
every company doesn't do this is he had what he called an engineer occasion every every quarter
which was he would parrot drop into a random eng team basically say give me a ticket i want to like
solve this ticket push code get it live to get a sense of like how things are working from an
engineering productivity standpoint like what are the rough edges because I think as companies grow
and grow and grow it can be so easy to get removed from like the day-to-day feet on the ground like
action of being part of that company or being a user that uses that company and I think there's
no magic bullet. You just, you have to be really disciplined and really strong willed about not
losing that visibility. And I think Stripe does that super, super well. Okay. Well, so all of
this, I think ties into, you know, your, your current job running an organization. Cause I
know you've talked about you, you, um, moved on to being an engineering manager at Stripe and
you've written about how you went from being proactive as an IC individual contributor to
reactive. What, what was that transition like? And then I'm sure that that's playing today,
you know, when you have to, again, do everything, but it's not, it's not easy to do. It's not easy
to do that. No, it's definitely not. I think I, I learned so much from my, my first transition
from being an IC to, to being an EM, um, large, and a lot of that has been incredibly, incredibly
useful. Cause even though I don't consider like what I do now as a, a literal engineering manager,
Like I do manage engineers and like being a founder requires so much of the context switching and so much of the reactivity that being a line manager and managing, you know, a small team or a couple of teams of engineers requires.
I think when I was developing as an engineer, so much of what I considered like getting better at my craft was around like figuring out how to get objective information and become more productive and like really manage both increase the amount of time I could spend in flow and make sure that that time was spent as productively and as usefully as possible.
which meant like spending a lot of time chatting with users to like get a lot of business information
and business value and like focus a lot on my tooling and a lot of what i loved about engineering
from my first days like modifying janky html and css on a wordpress installation to today was
the richness and speed of a feedback loop right of you you have a bug report you you write a test
you fix the test you instantly get the green check mark it's boom it's done and what i had
to unlearn shifting into management and shifting into like, uh, less IC oriented thinking was like
all of that stuff, like no longer really applies. And often the most rewarding parts about management,
both from a, uh, managing other people or managing businesses sense is the aperture is months or
years or weeks. It's not days or minutes or seconds. Like you might have a really good
conversation with a candidate that you're trying to recruit or someone on your team,
And you don't get to realize the value of that until like half a year later where they're like, oh, I got really better, much better at this because of this specific feedback you gave me or like, oh, I wasn't thinking about joining Stripe, but like or think about joining Button Down.
But the conversation we had over coffee, you know, back in September really changed my mind.
I think it can be hard, or at least it was very hard for me to context switch between those two modes, especially when, you know, most folks who first go into engineering management, unless you're at a really big company that's really strictly structured, you're going to be doing both.
Like you're going to be managing a couple engineers and you'll probably be a senior end or a tech lead on that team.
if not explicitly, then implicitly.
And getting comfortable with being in both areas at once
was really tricky, but also really rewarding
because I think that's what life is about.
Like it's really hard to maximize your impact in the world
by being a purely engineering focused,
like give me the tickets, I implement the tickets,
I move on to the next ticket.
Like that can be great.
And those are usually my most satisfying days
to a certain extent,
but they're rarely the most valuable ones.
There's lots of dopamine hits that you get.
Oh yeah, I fixed that one, I fixed that one, I fixed that one.
Do you have then in the engineering manager role,
do you have indicators that you track that they might be laggy
and that they don't come back for months later,
but months later you can say, oh, do you know what?
Retention's gone up, employee turnover's down.
Or do you have something like that that you can sort of say,
oh yeah, I did do well.
I think there, I wouldn't even consider them metrics,
but there are specific things you can look at to your exact point
around like my my goals as an engineering manager were and are always to like accomplish the
business goals of the team and this is a thing that varies from org to org but at stripe for
instance the engineering manager is responsible for the not just like the happiness and health
of the engineering labor within the team but also just the business goals of the team writ large
which is different from some companies might have ems be solely responsible for the end side but
there's like a PM assigned to the team that actually has to drive the business solutions.
And at Stripe, it was very much a balance of making sure the engineers are happy and healthy
and productive while also making sure we accomplish what we need to do from a business perspective.
But I think beyond the very concrete things around turnover and retention and up-leveling
or growth I think a lot of it was just learning to let go and listen to the folks who report it
up to me of like I can try and do all the spreadsheeting I want to like make my brain
feel happier about me doing a better job but like all of that kind of like washes out in the rain
compared to just the engineers saying hey yes we are shipping this like I am being challenged but
a good and healthy amount i'm growing i'm learning a lot i feel psychologically safe and healthy
within this environment like i really had to learn to lean on the qualitative feedback as opposed to
like again i have an engineer brain i want the quantitative feedback but unless you're looking
at a really really macro lens often that can just be noisy yeah and the qualitative word is the key
one there right it's like there are things that aren't they're not metrics they're not neat there's
qualitative data that's much more important and much more meaningful and yeah exactly good
oh isn't this about stripe i thought
what are what are some recent features you've pushed that you're proud of because i know
from the outside it's like oh you launched it um what 2016 2018 and one could think it's just the
same but of course you've been working away so what are some recent features you're proud of that
um you've launched in the last i know year or two yeah i think one of the the operating cadences
that i've really loved is like you you kind of have a big big expansion year and then a big
digestion year like 2023 for button down was we shipped a lot of new stuff and we grew a huge
amount and then this year is let's re-architect some of the internal systems let's make sure
performance and scaling and all those other things are really really good so that this this coming
year 2025 we can go back to another expansion year and really figure out what are the next
things to push the product forward the the biggest thing we launched last year uh which is one of the
uh really tricky things in this industry is naming so we call it automations which
are the equivalent of like drip sequences or life cycle emails or any of the things that uh
have kind of one name per company that's implemented them but the ability to do
instead of just one-off broadcast,
you're sending it to everyone.
You can send specific emails to a subset of folks
based on like, okay, they signed up on a Monday.
We'll send them an email on the Tuesday
and then a Friday.
And then depending on if they have a given tag
or they have like this bit of metadata associated with them,
we can customize the third email, that sort of thing.
And that was like a really fun systems problem
because there's a lot of UX concerns.
And then there's also a lot of just implementation level concerns
of like okay do we want this to be governed by a state machine like how do we want retrying to work
how do we want all the various moving parts to cohere with each other in a way that makes sense
especially because one of the things that i'm very very mindful of is i want button down as a system
to be like pretty dense and pretty stable so that it's really really important whenever we build out
a new piece of functionality it's not like oh well this is going to make the code base 20 harder to
maintain for eternity like whenever we introduce something new we want it to be as stable and as
coherent with the rest of the functionality as possible not just from a user standpoint but from
an engineer working on the code base standpoint and i can imagine that kind of workflow logic
state machine type stuff that that's got the potential to get quite ugly quite quickly if
you don't oh yeah think it through yeah one of the one of the i think breakthroughs that that led to
it shipping in in the way that it did and we're really really happy with the abstractions was we
took a step back and looked at the other pieces of button down that already kind of looked workflow
shaped like you said and it was like oh well if you if you think about it like web hooks are
basically like this of a thing happens somewhere in the code base and then we need to run some
logic based off of that rss to email is kind of like this where we have this external piece of
state that changes we need to detect that and then like spin up an email and send it out based off of
that and we were able to pull out some common threads and logic throughout the existing code
base build some abstractions around that and so before we even shipped the functionality we had
built a lot of the back end for it that was then powering existing features and then it was much
more easy and elegant to add a ui and add new functionality on top of those abstractions because
they already had traffic rolling through them. We knew it scaled from a performance and from a
maintainability standpoint, as opposed to just, well, we're going to graft on another big piece
of the code base that has a totally different way of looking at the world. And it almost sounds as
if it's like the one, two, three refactor type approach in that you've got a couple of built
cases, then you can extract the common patterns. That's much safer than, you know, writing something
fresh and hoping it works. Exactly. I'm curious at a high level, like who do you talk to about
these things is it just you like do you have a mastermind group like right how do you get a gut
check on or do you just block off some time and think it through and then and then do it right
that's always the hard part when you're running your own show that has definitely been i think
the hardest part about shifting from working at a big company to working at uh whether it's a a
solo sort of startup or a much smaller company is there there are fewer people who i can go over
and like kind of poke in the back and be like hey can we whiteboard this for for a couple minutes
i'm thankful to have like a couple friends and and former co-workers who i can at a high level
sort of talk about like hey let me just you know rant at you for 15 minutes and please let me know
if any of this is totally incoherent like you do get that kind of gut check from someone who
hasn't like sat and looked at the code base to the same extent you have and like there are a
couple engineers who work on button down who i can chat with about this kind of stuff but
a huge amount of it is especially in the early days just kind of thinking really hard for a
couple hours like i'm a big fan of sort of writing things down like writing down a prd even if it's
never gonna get read by anyone just to sort of like help cohere my thoughts it's the english
major in me right like uh i i can think best when i'm writing and so i've found a huge amount of
value in doing that but it's I think harder than it would be to say like all
right I'm gonna present this architecture diagram to my team I'll get
sign-off and criticism and feedback from them and reify that I think part of what
is difficult about starting something for the first time is you have to be
comfortable with the level of
like ambiguity or like lack of supreme confidence and just be like, well, I've done a sufficient
amount of de-risking for this. And if that's insufficient, then I'll get to a point where I
can bring in beta testers or bring in folks who can like help me benchmark things or things along
those lines. This episode is sponsored by MailTrap, an email delivery platform that developers love.
an email sending solution with industry-best analytics, SMTP, and email API SDKs for major
programming languages and 24-7 human support. Try for free at mailtrap.io.
So I imagine you have a lot of async going on in your application just because email is sort of
like the poster child for async. Carlton here has worked a lot on Django's async. So I'm curious,
what do you like and not like about how Django is doing things these days? Because I'm sure
you're kind of pushing the boundaries of async within Django. One of the things that I have
enjoyed doing is just like sort of piecemeal migrations in the early days. And like one of
the things that actually made the shift to Django being so async friendly, like a little almost
anticlimactic in a good way was I from day one was dumping anything that looked async shaped into
RQ which if you're unfamiliar or listeners are unfamiliar RQ is like a task queuing library
similar to Celery and and all of those and so a lot of the workflow shaped stuff where it's
we have to hit this external service like there's some state associated with it all of that was off
the main thread where I really got a lot of value from a lot of the acing stuff was things that you
would want kind of on the main thread but can be streaming or can be a little bit uh like more
async shaped stuff like pulling in initial batches of data or doing like really small remote checks
i think when javascript first brought in sort of async await stuff back in i don't know when that
was maybe a decade ago at this point um there was a lot of hysteria and a lot of like confusion
around what the migration path looked like and when javascript went through this this migration
a decade ago, it was pretty, I think, fraught, both from a imaginary standpoint and like the
actual process of bringing in async await and figuring out how to do polyfills and all that
stuff. Honestly, the best feedback I can give on how Django has been doing it is there hasn't been
like a lot of pain. Like I've been able to isolate specific views and pull them in. And it has been
a piecemeal project because it hasn't been a like, well, let's just adopt this wholesale across the
application and hope for the best but every time i'm like all right i think this view or like this
specific usage pattern would benefit from adopting it it's it's been like very non-dramatic there
hasn't been a okay i need to dig into the weeds and figure out why this behavior is happening the
way it is but that's the exact approach to introducing async into a django project that's
the way we want you to do it that's the best way to do it is yeah you know for this case you sprinkle
little bit of async yeah and then there's a difference between as you said throwing something
off to a queue where like that can happen anytime and then these sort of more async i'm going to
fetch a couple of apis and merge them together and exactly carlton you ask a question i've been
bombarding poor justin well okay but i i want to ask about the business side of email because
like there's it's quite a crowded marketplace right so it's it's quite like brave to go into
that marketplace and say right i'm going to do a new startup and you know to do you have a sort of
market insight that led you to say right i'm actually i'm going to do this one of the things
that is a double-edged sword about entering a really big really crowded market is yes from day
one you have a lot of competitors like you're going to have hundreds upon hundreds of competitors
and they're not little on the other side say that again they're not little competitors they're big
they've got resources yeah you know and like with every passing month like a new venture-backed
startup will launch that that's doing something with emails like some really big fortune 500
company will spin up like an email related sub vertical like there's always new people coming
onto the scene but the flip side of that is there's just a huge huge number of customers
that already have demonstrated like a willingness to pay and one of the things that i really liked
about email and i think i underappreciated when i was first building button down because i should
uh preface all of this with like i am not some sort of business genius who's like i've identified
this this little niche in the market that i'm going to go after like button down all came from
me being like well i want this tool that works for me and like let me back solve my way into
finding a market for it but with emails in particular one of the things that makes an
attractive industry for new entrants is the average user, like they might have some stuff
tied to a given provider. Like if you're using MailChimp, you probably have some automations
and settings that are very MailChimp specific, but 99% of what is actually valuable to you
are two things, which is your back catalog of emails you've sent and your list of email
addresses. And because email is decentralized and portable, you can bring those things with you
to whatever provider is most attractive to you.
Like it is not an industry
that has a lot of moats associated.
Yeah, right.
And that made it particularly easy
to try and find existing customers
who are using a tool that they didn't love
because you can credibly and legitimately say,
yes, you're already using MailChimp or Drip or whatever,
but it'll take you 10 minutes
to bring your stuff onto here.
Like you can drag and drop a CSV or a zip
and we'll pull everything for you.
It's not like you have to start over from zero.
that's not true of all industries but at least within email and i think it's it's true of many
industries like being able to reduce that friction of switching costs as low as you can is is really
really valuable the other thing too is button down i don't think is ever going to become like
a billion dollar business but the email industry itself is and being able to really approach
problems and approach differentiation in the space from a perspective of like well we're not
going to take over the industry, but if we can be the best product for 0.1% of everyone who needs
like email products, like that's a really good business right there. And having that level of
specificity and focus on a very specific niche, I think has been really useful.
Right. And so the, the, the sort of, Hey, you, you can write your emails in Markdown and they
just sort of go, that's, that's a nice specific niche. I've talked a lot about Markdown being
like kind of a weasel and i guess weasel word isn't the right phrase but like a really good
signifier because there are a lot of potential users who look at button down splash page see
a reference to like markdown and html and they they run fleeing for the hills and like that's
kind of fine because those people are probably not great customers for me anyway but the other
side of that is if you go to button down email and you see references to like markdown and you're
like, Oh, that's what I want. Like I'm sick of using a WYSIWYG. I want to be able to just write
markdown. Like it's such a good qualifier for potential users. Okay. That's good. Then the
other sort of side of it as well, I wanted to ask you about was the kind of pricing and how you're
pricing, how you sort of think about pricing, because we had Michael Kennedy on from talk
Python a couple of weeks ago, and he, we are, he's moved to self-hosting email because of the
costs that he had. And email does seem to be quite expensive, you know, AN automated marketing
package 100 quid a month just to start that seems quite a lot for small companies but obviously
that's where the big money is and so how do you think about pricing and what's your kind of
take there because button down is very reasonable to begin like that's another point i like i like
the footnote there yeah no but it is it's like start for free and you know small amount and then
slightly bigger and so how what's your kind of take there because we did we were talking with
michael about this so it'd be nice to get your view from the inside of course i think one of the
interesting things about the email industry as a whole is the vast majority of vendors myself
included we're not actually standing up and running the smtp rails ourselves like we're we're hitting
a even further downstream service like postmark or mailgun or one of those and that's true of
almost every major like newsletter email provider except for a couple few i think like mailchimp and
potentially cloveo now they've started to host and use their own rails in the past couple years
and what that means is there's really like a price floor and there's only so much experimentation
that you can do and it's also why i think uh self-hosted services like sendy are such a great
idea because you can pass that on to the user you can say well you can run this yourself if you feel
technically inclined and comfortable like standing up a docker container and all that stuff um when
i was first working on the pricing strategy for button down again going back to me not being a
marketing genius i think my logic was basically well here's a big google sheet that i've created
of like the eight other companies that i think people are using that i would like them to use
me instead and so what rough triangulation can i hit so that no one like i'm not uh undercutting
everyone but I'm somewhat like in the neighborhood and a lot of my logic in the early days was
based around like I didn't want people to choose or not choose button down solely based on price
like I wanted to make sure my unit economics were solid but I didn't want to like just advertise on
hey we're cheaper than whoever or like hey we're going to be more premium than whoever I wanted to
be roughly commoditized and that approach in general has has worked well though you see some
shifts over time like one of the things i did a couple years ago was i realized a huge amount of
my costs were coming from purely free users so i had to reshift the free plan a little bit push
people to pay like a couple bucks a month just to send more than like a thousand emails a day
things along those lines um i think this is a bit of a cliche but it's a true one like one of the
hardest things to do and also most valuable things to do is like experiment and change prices a lot
You know, in a way that is like not annoying or turning off users, but just like every couple of years sort of see like, hey, does this business model make sense?
Are there certain things that we can do to like better align with users?
I've actually been kind of bad at that to the extent that I've modified prices, I think, twice total since launching six years ago, largely because just the unit economics of having a tiered pricing like $9 a month, $49 a month, $79 a month fits so squarely onto how a lot of people look at these businesses.
But again, it's slightly different if you're not in a super crowded industry where every single customer is kind of expecting some level of pricing package.
And if you were to deviate wildly from that, you're kind of distinguishing yourself in a way that is not particularly good.
Okay, interesting.
So just to pick up one thing you said, a lot of it is about the reason why it perhaps looks expensive for email services is because the upstream cost of whoever's actually sending them, that comes back down.
Exactly, yeah.
The fun fact is button-down single biggest line item cost on a month-by-month basis is just straight up how much it costs for us to send the emails.
You pay the equivalent of a fraction of a fraction of a penny per email sent.
But that's a lot of emails.
Exactly.
When you're sending millions of emails a day, that little fraction of a cent adds up quickly.
Okay.
Interesting.
Good.
So I'm based in Boston, and maybe I'm saying it wrong.
Klaviyo just IPO-ed, and they're also Django-based, I think at like $8 billion or something.
But I'm curious to you, that's email-based commerce, I think, right?
Like I see now every e-commerce firm.
What are the buckets of email, right?
There is what you're doing, like newsletters, there's e-commerce.
Are there others, or are those transactional, I guess?
Like what are those layers abstracted above just sending straight emails?
Yeah, I think the three buckets that people usually talk about are transactional, which I always think of like password reset being the canonical example.
You as the user clicked a button, you get an email that like corresponds directly with that button.
And transactional emails are usually broken out by a lot of ESPs is like this is going to be very high volume, very high like open rates.
It's always going to be in the inbox. But if you like try and abuse these rails, we will offboard you from the from the platform.
There's broadcast, which is if you think about like J.Crew sending out coupons to like millions of people or you as just like a newsletter author sending out an email saying like, hey, I published a new blog article or something along those lines.
Just it's one to many, but you assume that everyone has opted in.
I think five, six years ago, double opt-in was like a bit more of a gray area.
And now, thankfully, we've ratified to the point where if you as a sender are consistently sending emails to people who didn't agree to get them or engage with them, like you're going to be so heavily penalized by the email overlords that it's really unsustainable, which is a great development.
And then the more e-commerce oriented, I think the current term du jour for this is omni-channel.
Meaning like we have a subscriber who has an email address, has a phone number, has like a WhatsApp or Telegram ID that we can hit.
Like we have a lot of data points around them and you can reach out to them through whatever channel you think is the most useful for whatever intent you have.
And that's really reserved for Cliveo. I never know how to pronounce them correctly or MailChimp or folks in that vein where it's like really, really heavy duty, really powerful tooling that's largely around purchase intent.
And going back to the pricing discussion a little bit, a lot of the larger players that have moved so upstream in terms of price is because they've started to anchor less on like SMBs or authors or people using it kind of in a more independent way and more like, well, you're a Fortune 500 company, you're a massive retailer, like you're spending, you know, $50 million a year on marketing ops in general.
And if we charge you 50K a month to like send your emails and do some automations, like that's a drop in the bucket to you because you've got like a bunch of people working full time on it.
And at that point, if you're a small developer or a small company with running a Django app, you've got no business using them anyway, right?
Exactly.
Yeah.
Well, I think your approach is smart, though. It's a little bit like boot camp, I would say, in that they've explicitly said they don't want a couple big enterprise customers because so many services, it does weight. I mean, what was it? Slack. When Slack IPO'd, you could see that like 60% of its money came from like a handful of companies. But then you're beholden to them. Whereas if you're more like, I'm indie and like, this is what it is, take it or leave it, you're kind of more stable in the long run, I would think.
Exactly.
Maybe make less money, maybe, but you're also, you know, even out a lot of churn that I'm sure if I'm a Fortune 500 CEO and I'm talking to one of these companies, I'm trying to squeeze them on cost for sure.
Right. And that's where the balance between pricing and product or pricing and positioning is really interesting, because on one hand, I can really sell button down to a lot of smaller, more SMB or more, you know, creator economy type folks is like, we don't include all of this stuff that the really big players do of like A, B testing across multiple campaigns and all of this stuff.
But you don't want that anyway.
So we get to pass on that savings to you because we're not charging you implicitly for the
cost of maintaining and developing those things that you don't want.
Like I'm sure everyone has some application that they use on a day-to-day basis that is
really, really important to their workflow.
But like 95% of what that application does is like completely not what they want.
Like I balance my book.
every month like using QuickBooks I have a CPA we have like a shared QuickBooks
thing and whenever I log in there's just so much stuff where it's like I'm not
trying to do any of this and I understand why you built it out but like
all I'm really trying to do is run payroll and like file receipts and like
the the bare-bones kind of like very basic stuff but there's all this product
baggage that is being passed on to me because it also has to serve a wide
swath of larger uh more uh heavy customers i imagine though that for you you you must have
some some whales and they're start asking for some of these features that some of these others
provide and then you have to internally balance that out right because you that must be a good
gut check when you know at what point do you let you know sort of like i know you're hosting on
heroku like at some point it's like i should make the leap um there must is there an equivalent for
you or how do you think about that because i would imagine that being the case philosophically
most of my largest customers use button down for a lot of the infrastructural and api pieces there
which means that like i have a really good opt out for lack of a better term like i can say
hey if you're trying to add this piece of functionality let's talk about like how you
might structure something that talks to our api one of the big parts of button down's philosophy
is anything that you can theoretically do in the app you can do programmatically if you were to
open up the the network tab for button down and just like look at all the requests we're hitting
the external facing api like the the button down front end the spa is like implemented as a third
party that hits the api and for the vast majority of sort of like whale style requests of like oh
well i really want to be able to do x uh i try and make sure they have the building blocks within the
api but also it's it's one of those things going back to your point of the pressure that larger
customers can bring i i make it very clear that there's never going to be any sort of like one-off
feature implementation if we ever build something within button down it the timeline might shift
because like one or two really big users want it but like it's not going to be something that
wouldn't have been built in the fullness of time anyway i think it's a really hard line to say like
no i don't want to add this amount of like top line revenue to to my balance sheet for 2024 but
like i have to um but i think if you take a really really long lens like not the scale of years but
like the scale of a decade the cost of like building and maintaining some ad hoc janky feature
that this one customer really wanted like that adds up really really quickly and it lasts forever
you too know how difficult it is to unship code like getting rid of code paths because as soon
as you launch it like there's going to be a couple other people who are relying on it too
and and there's so much detritus that builds around it and so it's difficult but like i think
you do have to exercise a little bit of discipline and say i understand that you want this like
here's some ways you could build it yourself but we're not going to adopt it within the product
because that's just going to be a long-term drag on our balance, not a long-term positive.
Yeah, I love that philosophy. I think that's very wise.
Well, I have one more, and then I'll turn it over to Carlton. I guess this is, again,
philosophical. How do you maintain your interest? Because you've written about this, and I would
agree, especially for a founder-led indie thing, in some ways, that's the biggest risk, right?
You prove traction. And I know you have Third South Capital and some other things, but what is
it for you that keeps you interested day to day? I think one of the... I would not have expected
this to be my answer, say, two years ago. But one of the things that is really, really fun and
really rewarding about having a company that's at product market fit and is growing is figuring out
all of like the meta work and like the systems work that you need to go from all right well this
thing has a bunch of customers like it's bringing in money it can pay a salary like it's doing well
to like how do i make sure that this thing can run on autopilot for like a month if i just want to
like throw all of my electronics in into the river and like go go to france or something and a lot of
that is really interesting architectural work of like okay how do we build out a knowledge base for
the internal support staff how do i write down all of my tacit knowledge about like how these
specific systems work that can't really be encapsulated within the code base all of that
like those are really fun interesting challenges that are they actually hit the same like dopamine
part of my brain that like solving a unit test does of like being able to offload some of that
into like a documentation base or into other people and like really building out the company
as opposed to just building out the code base.
I think that's been a huge part
of what keeps and captivates my interest.
The other part too is like,
despite all of that,
I'm still like a person who loves
like shipping and building software
and that's where I'm the happiest.
And part of kind of setting out on your own
and like doing your own thing
as opposed to working in the auspices
of a larger company
is optimizing for your own life.
And a lot of the time I will say,
screw the roadmap screw my responsibilities screw what is like quote-unquote best for the company
within this given week here's a feature that i just think would be fun for like my use case or
that i want to hack on like let me carve out some time and do that and the the like funny coda to a
lot of those work streams is that when i started button down it was it was purely for me and even
when i do these things where i'm like i can't really justify working on this but i want to
like i'm going to ship it and just see what happens often that's the stuff that resonates
most with users or is most successful because it's not necessarily obvious but being able to say like
i'm going to drop everything on a friday and like work on increasing load times by 200 milliseconds
like those sorts of things that are hard to justify in a larger framework but are still
satisfying is like why i love kind of being independent and getting to do what i do every
day it's like your 20 time for yourself exactly i think that's a good frame for it but those are
the things that have the flavor, right? What's the, what does it take? Well, it doesn't, I don't
know. It takes a button down. That's, it's, that's what gives it its character. That's all.
I love that.
So, okay. So change track quickly. You've talked about the, the API and then the SBA that eats the
API. I think that's a very sound policy and that's, you know, nice to see. I wanted to ask
you then, you're using React, I take it, and perhaps describe what your stack is, but how do
you feel about the the changes in front end that we're seeing at the moment and you know the likes
of the htmx is and where do you think it's going and you know it's been some complaints about react
and you know what's your view on that kind of that that ecosystem and world space for sure and i'm
using view technically not react but okay fine okay they're both they're both of a piece like
they have different philosophies in many arenas but i think the pros and cons of adopting either
are very very similar i think the biggest failure mode i see for a lot of folks who like go into the
front-end ecosystem for the first time is they they read something online that says like you
need to use react to like build your application don't really question it or interrogate it and
they're like well i guess i'm supposed to like spin up a next app or whatever and like that's
how I'm building this. I think React and Vue and Alpine and HTMX, they're all great tools depending
on what job you're trying to accomplish. I think for the median person starting a SaaS in 2024,
you probably don't need to start with like React or Vue or something that's super heavyweight.
You can start with no JavaScript at all or using HTMX or using like one of the very sort of like
lightweight, here's a bit of interactivity that's powered by JS. You can drop into your
applications. And I think when you adopt any piece of technology, not just like a front-end stack,
like you need to have a really good reason to do so because going from just one piece of tech to
an incrementally different piece of tech is such a big, heavy, heavy weight, whether it's bringing
in Vue, whether it's like bringing in Redis to manage like Celery or RQ or Rabbit or something
like that. I think that's the lens that people need to adopt more of as opposed to like, well,
this is the state of the art in 2024. You either have to go this way or you have to go this way.
I think you sort of asked about like the front end, like churn and the amount of like chaos on
a year to year basis. And like, I definitely feel that like, personally speaking, I think a huge
part of my philosophy has been, let me adopt things once they feel relatively stable and
relatively consistent and my my rough heuristic or metric for that is like when i google something
am i getting like stack overflow results because people have run into this before or am i am i
getting like blog posts this is now in beta from like the the team that built it out uh like i
think rscs or react server components and things like that where you know three years from now
that might be the state of the art that might be kind of permeated into the entire world of like
how complex SPAs deal with stuff.
But right now, it's just,
it feels like there's so much flux
and the amount of value
I would get into investing
in a new technology like that
is just outweighed by the level of friction
it takes to figure out,
okay, how do I do this now
as opposed to what it was three months ago?
And how do I like figure out
where to future-proof myself?
One of the things I guess in closing
that I feel really strongly about
is limiting your surface area with tech,
whether that's number of third-party packages, number of distinct technologies.
One of the engineers who was early at Etsy had this great blog post that was very influential on me
around spending innovation tokens of you as an org or you as a company.
You can only do so many things and hold up so many things particularly well,
so you need to be really, really tactical about where you choose those investments.
Yeah, okay. You can come on again, Justin.
That was the right answer. That was the right shift.
Well, it's what we think.
It doesn't mean it's the right answer.
Well, one final question is what we always end with, which is if you have a magic wand
and you can change something in Django, what leaps to mind?
Like no restrictions, just what would you do?
It's a great question.
And I cheated a little bit because I know y'all talked, I think maybe it was last week
about the roadmap stuff that came out of the January working session.
And so I think most of my answers are in that.
um i think the biggest one the biggest single one would probably be off of uh and this is kind
of like a blessing and a curse there there's a number of third-party packages that i basically
consider for my purposes core django uh one of them is all off because like the the all-off
abstraction and i talked about how much i love django's built-in auth but with the rise of things
like 2fa with the rise of social login like i feel like any maybe not any but the majority of
serious django use cases need that stuff at some point and being able to fold that into standard
django just makes sense or increasing the rails or increasing the ergonomics of adopting um frameworks
like that um i think the other one and this is really selfish and i also know it was covered in
red map admin is an incredible tool i when i was spitting up support staff for button down
the amount of work i had to do in terms of building out tooling was basically zero because
it's you get all these model views and all this permissioning and all this stuff for free which
is great um one of my pain points with admin i guess the two pain points one is like the styling
of it i just feel like it could be faster and more modern and like have omni search then the other
would be the escape hatches that admin affords you is very limited. You could get 98% of what
you want for free. But then if you need to build out a custom view that has state or is touching
multiple models at once, you kind of have to start from square one. And so some investments
in that ecosystem, I would say, would be really, really nice. Yeah. Yeah. So I'm all with you on
the auth. I think it's time for that battery to be modernized. And I think we'll get there. There's
lots of threads going there's about pass keys and you know web authentic and those things so i think
things are going to happen there as well jangle wall auth has been um given a grant to pursue
working on things in this space as well so that's an amazing thing um on the admin i'd love to be
able to just sort of embed a view more easily a custom view it's a custom view but just embed it
in the admin that would be lovely yeah i mean it's possible but even like even being able to
because there's a lot of built-in support for like here's a detail view you can drop in an
arbitrary inline or drop in an arbitrary widget being able to have and maybe there are some some
rails for this that i just haven't found but being able to do that in arbitrary like list views or
arbitrary filtered views like that would be tremendously useful because the alternative is
well okay now i have to build out all this scaffolding again from scratch and like the
including story on admin is like kind of hard to navigate and so just some easier escape hatches
there would be great yeah i mean it's possible but it's not documented and it's not officially
supported and you're into you know weird and wonderful things that you find on the internet
to give you ideas and no that's not that's not the jangle way so no totally that's not
that would be a good magic one wave well is there anything that we haven't asked you or anything you
want to call out as we close up i think we we touched it all i would say like the i get a lot
of questions from folks outside the the django ecosystem because i think at this point especially
in like the the sasser startup world a huge amount of the zeitgeist is really around like rails or
around like full stack javascript stuff and like every now and then when i'm when i'm chatting with
another founder chatting with just anyone they're like why did you go with django and part of the
reason was i was just comfortable and familiar with django i've been using it for for years and
years on end but the the other part of it now in hindsight is like button down would not have
progressed nearly as quickly as it did if it weren't for all the things that the django offers
you both in the the early days the stuff like uh here are all these views and here's the off model
and here's all this stuff for free uh that you just get to hold on to and you don't have to build
out and you don't have to like spend a lot of cycles not not delivering value but just doing
table stake stuff but even now like there's no way we would be able to iterate on features and build
a application as quickly and as reliably as we do if it weren't for the django orm like the django
request request lifecycle the django admin like all these things are so tremendously useful tools
that i think people you can almost take for granted when you're sitting within django for
for so long until you look at other ecosystems and look at other landscapes out there and you're like
they have to do that from scratch we just get it it's just part of the django thing so i'm
tremendously grateful uh for for everything that uh the maintainers and the journal sponsors and
everyone involved in the django ecosystem has contributed over however many years it's been
at this point. It is something that I owe my business's success to. Okay, super. You can
definitely come on again. Well, Justin, thank you so much for taking the time.
It's a wonderful service. It's so great to hear someone using Django from scratch. And
yeah, these are the podcasts I like best. Someone who can talk through that journey. And you haven't
left the Django nest yet, and maybe you never will. So that's always nice to hear.
I would be shocked if we were ever unshipping Django.
And again, the fact that you can opt out of certain parts of it
without having to leave the entire Django nest
is, I think, a feature in and of itself.
But thank you two so much for having me.
It was a great time.
Thanks for coming on. Really good fun.
All right. Well, thank you, everyone, for listening.
We're at djangochat.com, and we'll see you next time.
Bye-bye.
This episode is sponsored by MailTrap,
an email delivery platform that developers love.
Try for free at mailtrap.io.