Matthieu asks:

Since you do a lot of things (investor, dad, owner of a "small" business, blog writer) I was wondering what you don't do to keep up with this level of commitment. In the same line, it often said that behind one person success, there's a wife/husband that helps to manage those others things.

First, as a broad, abstract answer I point people to Two Big Things, which I’ve found to be broadly Correct:

Some people try to “have it all.” Men and women both. But it’s never true. At most two can function well; the rest do not. More often, there’s just one that receives the majority of the energy, and the rest suffers.

The personal answer I give is going to be out-of-date: the truth is, I’ve experienced fatherhood for around five months and I’ve experienced “fatherhood while trying to also ‘do work’” for less than half that time, and I don’t think any in medias res description is going to be accurate, let alone useful. (If I were to try to put it into words right now, it’d probably be something like: I’m up for eighteen hours a day, six of those are spent on Lucy duty, eight of those are spent on Work, two of those are spent on keeping the house and family in order, one of them is spent lifting, and one is spent on Telemachus.)


The pre-Lucy answer is probably more useful, even if its now firmly entrenched in the past. When Haley and I talked about what my life as an independent technologist would look like, we settled on some ground rules, unimpeachable clauses in my contract not just as a husband and “person who wasn’t an absolute shit to live with”: to have dinner together every night, to take good care of myself (sleep well, eat healthy, work out every day, stay hydrated and sun-touched), to not lose sight of my own luck and providence. Those things were — and are — my topsoil. Everything else is labor — labor by choice, but hard work nonetheless.

A lot goes by the wayside! I am a terrible friend and correspondent these days; I love television and film but saw maybe a dozen movies total this year and only watch what Haley and I can consume during dinner (which in 2024 was all seventeen series of Taskmaster); I travel and experiment and hobby less than I otherwise would.

And exchange, agency: an infinitely flexible schedule (though we define flexibility here to mean “can take off a random day for no reason and go for a lovely walk through Maymont” more than “can throw phone into the ocean for a week and know that the rest of the team will fill in the gaps”); work that even on its most menial days I take full pride and equity.


I would be mortified if you read this (or, indeed, any of my writing) as a paean to Grindset.

I'm proud of what I've built, and the sacrifices it took to build it; I'm grateful for the life it's let me stumble into living, and would happily make the same choices again — knowing now with certainty where they would lead me.

But doing This Kind Of Thing means being in worse shape than I'd like to be, and spending less time with my friends than they deserve. These are reasonable (and temporary) choices, but they are choices nonetheless, and anyone who intimates that sufficiently divine levels of energy and discipline will exculpate you from making them is either a fool or a liar with something to sell.


You don't want to write. You want to find an excuse not to, and I'll just be one more thing to blame if you don't.

Beneath the decidedly seventies surface of Between the Lines — shag hair! a young Jeff Goldblum! sepia pastels! — is a timeless concept: a group of young kids, freshly out of college, have fashioned their identity out of a workplace that is exclusive and a little bit past their prime, and are trying to negotiate their understanding that the aspirational world they envisioned a few years ago is rapidly disappearing.


Perhaps it is my continued retreat into the burnishing embrace of Capital, but earnest interpretation of these characters' love of their work, and of the Back Bay Mainline does not exactly ring true to me. Matthew Monagle wrote in 2019:

The film has countless moments of insight into the struggle of the American journalist, from the staff’s shabby living conditions — the film offers perhaps the most realistic look at big city apartments ever committed to film — to how well-meaning writers navigate the competing interests of truth and financial trendlines

I think it requires a level of charity bordering on incredulity to treat Goldblum's character as someone meaningfully pushing back against the world around him — the film ends, very tellingly, with him parlaying his beat (and a few white lies) into getting a free beer. With the exception of a very young Bruno Kirby (playing a cub reporter) and a Jon Korkes (who runs the paper), nobody in this film is meaningfully interested in journalism; what they're interested in is being A Journalist, and to that effect this film feels warm and resonant, equal parts sympathetic and cynical. [1]

And this, I think, is a more meaningful thesis than to dwell too much on the demise of the alt-weekly. Cultural institutions are virtuous, whether they're formed under the auspices of a company or not — one way to rot such institutions is to cherish their outputs and ignore their inputs.


  1. Feeling not unlike the work of Whit Stillman, who loves nothing more than to fill his films with clever-but-unwise people on the brink of the end of the Current Thing. ↩︎


In the world of advertising, there's no such thing as a lie. There's only expedient exaggeration.

I wrote last week about Family Plot saying that Hitchcock's films feel like they simultaneously invent and master a given genre, and I had North by Northwest (which I watched shortly after watching Family Plot) in mind. What is there not to love about this film? So many of its scenes have been spoofed hundreds of times, and yet it carries with it none of the weight of inauguration: the set pieces are simple and elegant, Grant is at his Cary Grant-iest, and even though you are surprised by none of the twists and turns you are delighted and comforted by them.

It's hard to write much about North by Northwest under delusions of novelty. I think this film — like much of Hitchcock's work, excepting Rear Window — is less interested in truth than it is in enchantment, and it's funny to look retrospectively at considerations of the film as a "paranoid thriller" (which it certainly is!). Compare this with, say, The Parallax View — Grant is rankled but never ruffled, the movie ends with a hug and a tryst in a sleeping car, and the world keeps spinning away with a mystery solved and sinner saved. Hitchcock at his best cannot summon the heights of cynicism and world-weariness that dominated seventies cinema: and as good as the acme of that decade is, North by Northwest ages so well because it knows that, at the end of the day, it's meant to be a romp.


What a start to the year! January was a bit more flat-packed than I think Haley and I would have otherwise liked, but all with great things. (Highlights include: first weekend trip with Lucy, signing a lease on an office, and Third South's annual offsite.)

A roundup of writing from the past month:

Not as much fun writing in January than I had in the past few months; I promise my backlog of topics is longer than ever before.


I had held off on watching Being John Malkovich for a while, mostly because I think I had a pretty good idea of what it was and, while I wanted to watch it at some point, it never felt particularly urgent. (The vision in my head was a sort of Bosch painting filled with John Malkovich, which of course is true of exactly one scene [and perhaps the most indelible and famous of the film.])

Having finally gotten around to watching it, the biggest surprise was just how large the gulf was between my preconception of this thing — a silly art experiment of a movie — and the reality of it, a script and set filled with humor and wit and a thousand different ideas. [1]

John Cusack plays a Nice Guy (not to be confused with a nice guy); Catherine Keener plays what I think we'd recognize today as an evil twin version of a MPDG; Cameron Diaz's (out of type!) performance was, for me, the show-stopper. It is really hard to seriously play a non-serious person: she does it with aplomb, and her arc is the soul and sugar of the movie that rescues it from collapsing into self-indulgence.

The worst thing a piece of comedy can do is, in the process of not taking itself seriously, it forgets to take its characters seriously. This film is deeply funny, and deeply weird, but Kaufman remembers every step of the way that these people are real, that they want things and feel things. (And I'm sure there are a lot of interesting things it's saying at a metatextual level, but I figure I should finish watching Adaptation before I mull on those too heavily.)


  1. It is hard not to be grateful that this show came out in 1999 and not 2025, when it would have been forced to be a miniseries or even a full show, with each little angle and side street stretched out into its own episode. ↩︎


I told you about danger, didn't I? First it makes you sick, then when you get through it, it makes you very, very loving.

Every review (contemporary or otherwise) of Family Plot refers to it as a "lesser work" of Hitchcock's, and my reaction both immediately after watching it and now, a few weeks later, is largely the same: it is no North by Northwest or Rear Window, both of which felt so obviously like they had not only invented a genre but mastered it in the making.

Family Plot, if it can be said to have invented anything, feels like a spiritual predecessor to the Coen brothers' early ouevre: tragicomic, centered around a crime and a misunderstanding, pitting the foolish and naive yet goodhearted against the evil yet fallible. Karen Black and Bruce Dern could have been the protagonists of Fargo; their performance, both individuals and as a team, is lovely (as is William Devane, who I'd never seen in this phase of his career.)

It's a fun film, but once the puzzle box of "how are all of these people going to run into each other?" is solved, it feels a little bit like the back third of a Sudoku puzzle: satisfying in its own right, sure, but not something you'll look back on with amity and awe.

If you want to get schmaltzy [1], though, I think there's a certain symbolic richness in Hitchcock's final directorial scene being as cute as this film's ending, a literal wink to the audience. You know, he says, that I hid this diamond myself: but I kept you guessing, and I kept your faith alive for as long as I saw fit.


  1. And I do! ↩︎


Of course Primal Fear's legacy is (justifiably) dominated by Edward Norton's insanely talented debut performance [1], but what I came away most surprised by [2] was the richness and texture of Gere and Lilley's performances. I have nothing against either of them as actors but — there's a certain We Have George Clooney At Home quality to most of Gere's work for instance, a sense of them being more of a well-executed archetype than a singular presence.

And that, I think, is the lens through which it's most fun to experience Primal Fear: a sort of gradual Dante-esque perversion of what feels like a standard SVU episode into hell: hell of the heart, hell of the soul. The hotshot amoral defender is revealed to be, in fact, a paladin succored and ruined by forces more wicked and clever than he thought extant; the wisecracking prosecutor discovers that she sacrificed everything and earns nothing. The two performances could not have been portrayed by "bigger" actors; the strength of their arc relies on the fact that you think you know who these people are from the very first time they step onto the screen.


  1. This is an uncomplicated and unnuanced reaction, but: I cannot think of a single better debut performance in film? ↩︎

  2. Including the "twist ending", which felt cheap and telegraphed by today's standards but not ridiculous, which cannot be said of other legal thrillers in the era. ↩︎


Guillermo posted this recently:

What you name your product matters more than people give it credit. It's your first and most universal UI to the world. Designing a good name requires multi-dimensional thinking and is full of edge cases, much like designing software.

I first will give credit where credit is due: I spent the first few years thinking "vercel" was phonetically interchangable with "volcel" and therefore fairly irredeemable as a name, but I've since come around to the name a bit as being (and I do not mean this snarkily or negatively!) generically futuristic, like the name of an amoral corporation in a Philip K. Dick novel.

A few folks ask every year where the name for Buttondown came from. The answer is unexciting:

  1. Its killer feature was Markdown support, so I was trying to find a useful way to play off of that.
  2. "Buttondown" evokes, at least for me, the scent and touch of a well-worn OCBD, and that kind of timeless bourgeois aesthetic was what I was going for with the general branding.

It was, in retrospect, a good-but-not-great name with two flaws:

  1. It's a common term. Setting Google Alerts (et al) for "buttondown" meant a lot of menswear stuff and not a lot of email stuff.
  2. Because it's a common term, the .com was an expensive purchase (see Notes on buttondown.com for more on that).

We will probably never change the name. It's hard for me to imagine the ROI on a total rebrand like that ever justifying its own cost, and I have a soft spot for it even after all of these years. But all of this is to say: I don't know of any projects that have failed or succeeded because of a name. I would just try to avoid any obvious issues, and follow Seth's advice from 2003.


Dear Dad — you always told me that an honest man has nothing to fear, so I'm trying my best not to be afraid.

I floated the idea of a TBS canon when writing about Planes, Trains, and Automobiles — a sort of normcore cohort of good-but-not-fine movies whose pop cultural imprint has somehow never quite convinced me of their viewership, and right after doing so a friend wrote in suggesting Catch Me If You Can as a worthy entrant. And, indeed, I know the movie poster extremely well despite having never seen it.

It's a stretch to draw too many parallels between the two films (both now-rote plots largely carried by the sheer charisma of the leads and their winning chemistry, et cetera), but whereas Planes, Trains, and Automobiles had to win me over from my default position of "road trip movies are kind of boring" — here I was in from minute one, completely sold into this universe. Spielberg is at the peak of his powers: Christopher Walken delivers an absolute knockout performance with every second of his limited screen time, and DiCaprio — always an actor who felt like he was in conversation with a version of himself whom I had never seen — well, I get it now, this is the guy, this is the urtext which Killers of the Flower Moon destroys.

The movie does such a good job of selling you in its first two thirds with a sense of verve and playfulness (the John Williams score!) that the few moments of somberness hit you with affectation. The two truly dark scenes: DiCaprio's character meeting his father at a bar and understanding that the house of cards around which he's built his life has fallen, and then him peering in at his mother's house to understand there is no going back — do not feel cheap, do not feel schmaltzy. There is an emotional texture to this film that beggars comparison to Wolf of Wall Street: once you stop moving, once you catch your breath and the world settles around you, you realize you are alone, and so you better keep running.

(The kicker, the perfect kicker: the person about whom this story is ostensibly written made it all up. A perfectly meta-textual long con!)


Before reaching cruising altitude the plane sliced through a thick layer of cloud and for a few seconds there was nothing but white outside the window and I couldn’t help feeling, as we cut through the ephemeral landscape slowly thinning and dispersing and branching out in a thousand unmappable directions, that this moment had been prepared especially for me, some kind of aerial requiem held in honor of the city I was leaving behind, and in the end, I remember thinking a few minutes later as the Lufthansa stewardess rattled down the aisle with her drinks cart, there was little difference between clouds and shadows and other phenomena given shape by the human imagination.

It is sometimes obvious when a newer author organizes an entire book around a single paragraph or image, as if they've decided on the thesis they wish to present and spend the intervening pages gathering supporting evidence to bolster its strength. This little bon mot — clouds are like shadows! history is pareidolia! — quoted above as the final paragraph of Book of Clouds lampposts the entire novel, as if Aridjis' discursions on lights and fogs were insufficiently subtle.

There are good moments in this book, in much the same way that chatting with a clever but self-absorbed friend can still leave you with a smile on your face. Aridjis has a prose that manages to be both humane and detached, and her flirtations with the world of magical realism are not exactly Marquez-tier, but they're still interesting.

But — as is often the case with these sort of pseudo-autofictional debuts that have become increasingly common over the past two decades — wit and skill makes for a great garnish but a poor main course. This book is a pleasant way to spend a few hours, but it lacks substance and insight: it is, in fact, quite akin to spending two years in Berlin in your twenties and flying back home to consider yourself a changed person. You have nicer shoes; you can chat with your friends about your favorite spots on the Hermannstraße; your eyes are thinner and sharper. But you're still you; you haven't changed enough, you haven't changed at all.


(Shout out to Red Queen Podcast for introducing me to this book.)

Becoming Trader Joe is, more than any other business book (certainly any other business memoir), a turpentine book. There is interesting philosophy and retrospective here — and Coloumbe, whether through earnestness or affectation, is a more literate and flippant narrator than your standard post-exit founder — but the meat and the merit of this is the absolute smorgasboard of anecdata and fun facts. Some notes:

  1. Trader Joe's counterpositioned themselves early on by making deals with suppliers that their larger competitors couldn't due to supply constraints: they bought, for instance, XL eggs at sub-market prices because the Krogers of the world were unable to purchase them as they wouldn't be able to distribute them to the entire corpus of stores in an areas. This let Trader Joe's both get favorable unit economics and counterposition ("we have this unique product that nobody else has!")
  2. Trader Joe's spent a lot of time figuring out how to compete and innovate in an ostensibly static market due to fair trade and other regulations: for instance, being unable to market California wines at a discount (due to price controls) but instead offering complementary wine bank access to accomplish the same thing.
  3. Lots and lots of pivoting. (Bullets used to be one of their best SKUs: standardized, value-dense, easily shippable.)
  4. Trader Joe's made the explicit decision to shift from "customer focus" to "buyer focus" in order to aggressively maximize deal flow.

More than the sheer pleasure of reading — Coloumbe is a fun personality, and garnishes all of his stories with equal parts honesty and flippancy — this book strikes me as real. This is not a hagiography: it does not purport that all of Trader Joe's was a grand plan, but more of a series of strong base hits (with some misses as well) and a couple really great strategic shifts.


The passage of time and the monotonic accretion of accolades makes it difficult to remember with total clarity and honesty the sins and virtues of The Wire, both artistically and politically. It all gets eroded in a certain hagiographic tide: without committing myself to an (overdue, but unlikely) rewatch, I remember the character notes more than the glorious latticework (replete with frayed threads) storytelling.

Whether you want to call it a spiritual successor or not, We Own This City is a work in obvious conversation with The Wire. Pelecanos and Simon are interested in talking about the same things: the impossibility of an individual reformer to heal a corrupt system, the way those systems self-perpetuate even when filled with good intentions, and the bi-directional relationship between the streets (metaphorical and otherwise) of a city and its City Hall.

We Own This City is a decidedly more new show than The Wire. It is a miniseries, rather than a multi-season affair; it is postmodern and non-linear, following multiple threads and timelines to piece together every part of the GTTF story and all of the cohorts impacted by its rise and fall.

Much of this feinting towards the nouveau is neither necessary nor successful. A solid tranche of screen time is devoted towards the DOJ's attempts to build a civil rights case against Baltimore, and this time (largely the same three characters, didactically explaining that Crime Is Bad) provides neither pathos nor revelation given how already heavy-handed the core narrative is. [1]

But the heart of the show is still raw and pumping. Jon Bernthal's performance is as masterful as everyone says it is, even though his character lacks the folk hero complexity of Omar and Stringer; the (true!) story is gripping and masterfully told, and Simon et al manage the same core empathy that made The Wire such a uniquely American piece of art, summoning the jeremiad levels of fury and rage while always grounding things in the humanity and plight of the people victimized by the system, portrayed with depth and nuance uncommon in this decade's television.


  1. This single bit of pay-off from this thread is watching the OCR's initial attempts to solicit the alliance of the then-mayor of Baltimore, whose career ended due to her own fraud and conspiracy charges. ↩︎


One reason I love An Everlasting Meal is that even more than its ostensible didactic value, Tamar Adler's writing and humanity compels and enchants you to cook so that you might have a life as lovely as hers. Her writing conjures a world of warmth and bonhomie and charm: you finish the book less with a renewed understanding of why and how to keep a practical kitchen, and more with a sense of the joy of cooking and the joy of sharing it with others.

This is not an easy feat. By blurring the line between textbook and memoir, authors run the risk of doing neither well; such is the case with Bringing up Bebe, a book that exists less as a serious study about cultural and socio-economic differences in child-rearing (here is a fun drinking game: take a shot every time Druckerman refers to the Parisian crèche where she sends her children as "completely free") nor as a meaningful self-examination of her own transformation as her mother during her time in Paris (even the stilted narrative strains credulity: she opens a chapter about how no other mothers would talk with her at the park due to "typical French indifference", and then the very next chapter opens with an anecdote of a French mother chatting her up at the park).

This is unduly harsh; if I had approached Bringing up Bebe less as a serious tract and more as, say, a This American Life segment, I would probably be more charitable. Certainly, I found the core theses of the book interesting and worthwhile. I'd summarize them as follows:

  1. French households try to integrate their children into the existing family unit, rather than reorienting the family unit to revolve around the child.
  2. French parents espouse a "cadre", or "frame", where very strict and non-negotiable limits are set on certain things, but within those limits children have a great deal of freedom and autonomy.


You wanna hurt me? Go right ahead if it makes you feel any better. I'm an easy target. Yeah, you're right, I talk too much. I also listen too much. I could be a cold-hearted cynic like you... but I don't like to hurt people's feelings. Well, you think what you want about me; I'm not changing. I like... I like me. My wife likes me. My customers like me. 'Cause I'm the real article. What you see is what you get.

There are a few movies that I consider part of a "TBS canon", in that I've seen commercials for them for an aggregate of years and have a vague sense of what they're about but have never actually seen. This is one of them, and while nothing in Planes, Trains and Automobiles is revelatory or novel, it hits the John Hughes notes perfectly.

I am simply not a buddy comedy guy, nor much of a road trip movie guy, and much of the actual plotting felt so lukewarm that I couldn't even endear myself to the faux suspense of it all. But Martin and Candy's performances are pitch-perfect; even without the telegraphed reveal or the saccharine reunion, the graduation evolution of the two characters from charming pastiche into rounded, wounded realism is timeless.


Consider a fan-out-ish model that you want to aggregate a bunch of: likes on a post, for instance.

class Post(models.Model):
    created_at = models.DateTimeField()

class Event(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created_at = models.DateTimeField()

Let's say we want to aggregate the number of likes on a post relative to the post's creation time (for instance, to visualize the growth of a post's popularity over time), yielding a list of tuples of the form [(minutes_since_post_creation, number_of_likes)].

def test_calculate_popularity_over_time(self):
    post = Post.objects.create(created_at=datetime.datetime(2020, 1, 1))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 1, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 1, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 1, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 2, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 3, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 5, 0))
    results = calculate_popularity_over_time(post)
    assert results == [
        [1, 3],
        [2, 1],
        [3, 1],
        [4, 0],
        [5, 0],
    ]

We might naively try to do this in-memory, by pulling everything out of the database and doing the math in Python, but that's going to be slow:

import defaultdict

def calculate_popularity_over_time(post):
    events = Event.objects.filter(post=post)
    minute_to_count = defaultdict(int)

    for event in events:
        minute_to_count[event.created_at.minute] += 1
    return minute_to_count.items()

This is an aggregation: databases are good at aggregations!

Your first instinct might be to try to do this using ExtractMinute:

from django.db.models.functions import ExtractMinute
from django.db.models import F

def calculate_popularity_over_time(post):
    events = Event.objects.filter(post=post).annotate(
        delta=F("created_at") - F("post__created_at")
        delta_in_minutes=ExtractMinute("delta")
    )
    .order_by("delta_in_minutes")
    .values_list("delta_in_minutes")
    .annotate(count=Count("id"))

But this has a bug. Can you spot it? Here's a hint:

def test_calculate_popularity_over_time_different_hours(self):
    post = Post.objects.create(created_at=datetime.datetime(2020, 1, 1))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 0, 1, 0))
    Event.objects.create(post=post, created_at=datetime.datetime(2020, 1, 1, 1, 1, 0))
    results = calculate_popularity_over_time(post)
    assert results == [
        [1, 1],
        [61, 1],
    ]

The problem is that ExtractMinute, well, extracts the minute, rather than truncates it. Extracting the minute from a duration of 1 hour, 30 minutes, and 5 seconds yields 30, not 90.

Whatever are we to do? Well, we can take advantage of EPOCH to truncate the duration of a duration to its number of seconds, and then convert that to minutes:

from django.db.models.functions import Extract
from django.db.models import ExpressionWrapper, F

class ExtractEpoch(Extract):
    lookup_name = "epoch"


def calculate_popularity_over_time(post):
    events = Event.objects.filter(post=post).annotate(
        delta=F("created_at") - F("post__created_at")
        delta_in_minutes=ExpressionWrapper(
            ExtractEpoch(F("delta")) / 60, output_field=models.IntegerField()
        ),
    )
    .order_by("delta_in_minutes")
    .values_list("delta_in_minutes")
    .annotate(count=Count("id"))

I suspect there may be even more elegant and efficient ways to do this, but this satisfies a couple constraints:

  • It delegates the heavy lifting to the database
  • It doesn't require dropping down to raw SQL or registering intermediate tables
  • It's fairly reusable and "Django-ish"


Hello, 2025! (As always, Death Cab remains the soundtrack by which you should read this.)

Headlining this month was my annual review; everything else is flotsam.

But, speaking of flotsam:

I have much to write; the backlog is longer than ever before, both literally and figuratively. Our water is out; our daughter is happy; we are keeping sane, and warm, and busy, and we are sleeping lightly but well.


It might be premature to write this review: I'm sure I'll play this game for another ten hours over the next month, and maybe by then (as is often the case with ascension-based roguelites) my understanding of the core game and mechanics will transform, and all of my forthcoming thoughts will be revealed as the meanderings of a novice.

This is a thing that I worry about more with negative reviews than positive ones, though: and I really liked Luck Be a Landlord, even if I found — find! — it a tiny bit wanting. It is in many ways a deckbuilder stripped down to the essence — build a deck, draw 25 cards in order — and your sole act of agency is to choose (or not choose) what cards/items to add to your deck.

Please do not mistake my elision here for disparagement: LbaL crushes this core gameplay loop. The combination of dopamine and analysis is second to none; it absolutely devoured me, even through the runs where I felt like I didn't lose so much as I didn't get great options in the first six hands. [1]

Where I find it lacking is depth once you understand the mechanics and synergies at play: the ascensions (at least the first ten, which took me around twenty runs to climb) are less about transforming the gameplay and more just increasing the incline; the universe of cards is pretty sharply divided into realms of Obviously Good and Obviously Bad, and the anti-capitalist intrigue is fun but doesn't actually contribute much to the gestalt of the game.

Seriously, though: if you like Slay the Spire, download and play this immediately. It won't be your favorite game, but you will have a great time with it, and there are many games that fail to hit that mark.


  1. Again, this might be a thing that I look back on with shame rather than consternation! ↩︎


(You may be interested in 2023 as well, which was last year's annual review.)

Family

Haley and I welcomed our first child, a daughter named Lucy, on September 24th. She is perfect in ways both obvious and mystical. Our whole life is hers, now: this is even true of Telemachus, who proudly and rapidly assumed the title of big brother with characteristic gusto. [1]

I have more writing — which is to say more thinking, which is to say more doing — about what it means to be a parent, and how to be a good parent. We read the Oster books, we road-tested strollers; we were lucky enough to have a safe and relatively uncomplicated time at the hospital [2]; we slept for sixty minutes at a time, then two hours, then four, and now six. Everything is a lovely maelstrom; we have never been so lucky, to have found each other and to have the sibling and parents and extended family of friends and neighbors that we do.


Health

Ha-ha. I mean. I am going to grade myself both harshly and kindly here, which is to say that I'm in my worst shape since... 2018, maybe? I do not feel bad about this; I still try to eat fairly healthy and walk four miles a day [3] but there is not much else to counterbalance the "terrible sleep, much more delivery/takeaway, tremendous amounts of caffeine, no dedicated exercise time" melange in which I (just like every new parent) am adrift.

In the start of the new year, I'll be picking back up nSuns (which is quite literally exactly what I said last year before pivoting to a 5/3/1 program because nSuns was too taxing) and starting to do some jogging with hopes of improving my 5K time. We'll see! No plans (or hopes) to get into some hitherto-unseen level of fitness, just to shift back into a default state of discipline and posture now that the first wave of chaos has mostly passed and we have a bit more time and space to breathe.


Buttondown

Ending last year, I wrote:

The question that the industry trains us to ask is: what's next? I think that's obvious from a product perspective but a little less so from an organizational or business one: but my high-level goal for next year is to make a full-time hire, and all of the financial/existential commitments entailed therein.

It took me some time, but I'm ending 2024 with an answer to that question (see Why should a company?) and a full-time hire to boot.

Most of this year was spent in operations and development: I was a practitioner more than a manager, largely because I was interested in pushing Buttondown forward as much as I could before Lucy came. That was successful! Successful here meaning: Buttondown once again basically doubled in all of the metrics that matter, and it did so in a way that I felt honored my own ideals as an engineer, writer, and human.


Third South

Our goal with the first full year of Third South Capital was a diptych of existential questions:

  1. Do we enjoy spending time and energy on this thesis, relative to other options?
  2. Is this a financially viable thesis, relative to other options?

(And, yes, in that order.)

The answer to both questions proved to be a smashing yes, and in the waning weeks of this year we started to once again fire up our acquisitive flywheel. (Please reach out if you're ever interested in chatting about your company!)


jmduke.com

This was, legitimately, the first "real" year of writing in a long time for me. I think it was largely prompted by the increasing fracture of social networks and continued collapse of Twitter as a respectable, hospitable platform; I wanted to broadcast and no other better option remained than my own blog.

This year's biggest hits, by volume:

(That being said, my favorite thing I wrote — in a crowded airport, on my way to MicroConf — was Two years as an independent technologist.)

For the first time in a long time, I've had people talk to me about my blog. The two most common remarks I receive are:

  1. I love your blog specifically because it is so weird and idiosyncratic.
  2. Why and how do you write so much? What are your goals?

I can say with some degree of smugness and honesty that the answer to the latter is the former.


Media

I don't exactly have a rich corpus of art to review from this year: the first nine months were spent being as heads-down as possible, and the last three were spent in a mode, as aforementioned, that offered little opportunity for consumption that wasn't audiobook-based.

That being said, the best things I experienced this year, in no order, were:

  1. Austerlitz;
  2. Possession (which I am not quite done with as I write this but is already locked in as one of my ten favorite books of all time);
  3. Cromartie High School;
  4. Le Samourai;
  5. Legend of the Galactic Heroes
  6. Mr. and Mrs. Smith;
  7. Pokerogue;
  8. Ripley;
  9. Becoming Trader Joe (need to write this up, still!);
  10. The Parallax View.

Coda

In retrospect, every cliche about parenthood is true; the one I found myself most surprised by was just how quickly and thoroughly a child seeps her way into every pore of your life, suffusing it with renewed texture and meaning and urgency. There is nothing I do now without Lucy by my side, either literally or figuratively.

In last year's coda, I wrote:

The median day of 2023 looked something like this: eight hours of sleep, a good workout, ten hours of exhausting intellectual work growing a business, some puttering around the house and tending the garden, two dog walks, an evening spent unwinding with my wife, an episode of anime with my brother. There are a lot of things I wish I could fit into that day: more time writing, more time exploring new technologies, more time playing video games, more time exploring Richmond. At the same time: I think I chose wisely.

And now, of course, I look back on that time of my life with not just a sense of detachment — again, to risk cliche every memory before your child is so aggressively The Before Times — but also a sense of irony that I could have ever felt like I didn't have enough time then. All I had was time!

And now, instead of time, I have a daughter for whom I would do anything. It is hard to fret about the things that fall away on the margins — a sourcing call that could have been interesting but certainly couldn't have been vital, a partnership talk that wouldn't work out anyway if the relevant details couldn't be hashed out over email, a great new restaurant with a wait measured in hours, a great new RPG that really hits its stride once you get past the first ten hours or so — when the alternative is this tiny little scientist of yours, bright and beckoning, whose every breath and burp and coo and cough is your charge and triumph.

What I am saying is this: it is hard to care quite as much about craft when fidelity has your eyebrows and your wife's nose — it is hard to care about scale when you have divinity asleep in your arms, sighing softly after three and a half ounces of milk.

(And I do care — and I do fret — and whenever I do too much of either, I peer into Lucy's bassinet and remember just how good we have it.)


Thank you

To my wife Haley, light of my life; to Lucy and Telly, precious and perfect; to everyone who sent us a note or meal or gift or hug for the first few weeks coming back from the hospital; to my grandparents, who I think about every time I see Lucy smile; to everyone who's patiently waiting on a response from me in Q4; to every customer who made it possible for me to step away from my job for two months and still afford Pampers; to you, dear reader, for getting this far.


  1. We were, if we're being honest, a little bit worried about this dynamic. In reality, what has happened is that any time Lucy cries Telly softly pads over and licks her face and if she keeps crying (rare) he patiently sits down next to her and waits. ↩︎

  2. Haley had minor pre-eclampsia and was induced two weeks early; she's been great ever since, and bounced back (again, with characteristic gusto) much more quickly than even she had hoped. ↩︎

  3. Which is to say nothing of all the stair work that I do now. Being a parent is about many things, but mostly it is about bringing things up and down stairs. ↩︎


(Order in the CSS rule sense, not the metaphysical sense.)

The time has come to begin exfiltrating some higher-traffic, higher-leverage parts of Buttondown's admin UI away from the autogenerated Django admin and into some more bespoke components.

Take, for instance, this rather grisly (but useful) inline admin table:

This contains useful information but is annoying to parse. It gets replaced with the following HTML, all still governed by Django and a wallop of Tailwind [1]:

  1. draft

  2. about_to_send

  3. in_flight

  4. sent

It's a trivial thing, but lets me pull out a new toy that I learned from Mary a few weeks back: order, which lets you re-arrange the rendering order of elements in a flex container irrespective of their original order.

For instance, consider the following:

<div class="flex gap-1">
  <div class="order-2">world</div>
  <div class="order-1">hello</div>
</div>

This, as you might expect, renders as:

world
hello

Where this gets really useful is composition with groups. Consider the following:

<div class="flex gap-1 w-[200px]">
  <div class="group flex-1 flex items-center">
    <div class="z-10 flex items-center justify-center size-6 bg-red-500"></div>
    <div class="w-full bg-gray-200 h-0.5"></div>
  </div>
  <div class="group flex-1 flex items-center">
    <div class="z-10 flex items-center justify-center size-6 bg-red-500"></div>
    <div class="w-full bg-gray-200 h-0.5"></div>
  </div>
  <div class="group flex-1 flex items-center">
    <div class="z-10 flex items-center justify-center size-6 bg-red-500"></div>
    <div class="w-full bg-gray-200 h-0.5"></div>
  </div>
</div>

This renders, unexcitingly, as:

But! Add a tiny sprinkle of group-last:

<div class="flex gap-1 w-[200px]">
  <div class="group flex-1 flex items-center">
    <div
      class="z-10 flex items-center justify-center size-6 bg-red-500 group-last:bg-blue-500"
    ></div>
    <div class="w-full bg-gray-200 h-0.5 group-last:order-first"></div>
  </div>
  <div class="group flex-1 flex items-center">
    <div
      class="z-10 flex items-center justify-center size-6 bg-red-500 group-last:bg-blue-500"
    ></div>
    <div class="w-full bg-gray-200 h-0.5 group-last:order-first"></div>
  </div>
  <div class="group flex-1 flex items-center">
    <div
      class="z-10 flex items-center justify-center size-6 bg-red-500 group-last:bg-blue-500"
    ></div>
    <div class="w-full bg-gray-200 h-0.5 group-last:order-first"></div>
  </div>
</div>

And you get:

Obviously, that is a lot of HTML to write for a very simple outcome. There are a bunch of ways you could reduce this. Why so much repetition? Why specify group-last for every node when you know it's going to be the last one?

Because in reality, the above HTML is actually, in Django, a pure and concise for loop:

<div class="flex gap-1 w-[200px]">
  {\% for item in items \%}
  <div class="group flex-1 flex items-center">
    <div
      class="z-10 flex items-center justify-center size-6 bg-red-500 group-last:bg-blue-500"
    ></div>
    <div class="w-full bg-gray-200 h-0.5 group-last:order-first"></div>
  </div>
  {\% endfor \%}
</div>

Which suddenly looks much more pleasant and maintainable than its conditionally-rendered alternative:

<div class="flex gap-1 w-[200px]">
  {\% for item in items \%}
  <div class="group flex-1 flex items-center">
    <div
      class="z-10 flex items-center justify-center size-6 {\% if forloop.last \%} bg-blue-500 {\% else \%} bg-red-500 {\% endif \%}"
    ></div>
    <div
      class="w-full bg-gray-200 h-0.5 {\% if forloop.last \%} order-first {\% endif \%}"
    ></div>
  </div>
  {\% endfor \%}
</div>

  1. Not mobile friendly, I'm afraid! Not exactly a pressing concern for the admin site at the moment. ↩︎


I invited nickd to join our Linear instance yesterday, which reminded me that I had a slew of notes I wanted to publish on our own experience of migrating from GitHub Issues to Linear, and some reflections on it as a product now that we've been using it for a few months.

  • One useful lens for understanding a product's positioning and strategy is to look at what its primitives are — the experiences and states that stand alone (and hopefully offer value) without any exogenous or endogenous connections. [1] For Linear, the core primitives are issue and projects; you cannot, for instance, tie issues to initiatives, nor can you create a document that doesn't tie back to a project or issue. It does not exactly take oracular powers to assume that this is not going to be the case for much longer; it is easy and seductive to imagine a world where documents and writing of a more artificial, less project-based nature live in Linear, simply because that's the most pleasant place to write, read, and collate them.
  • Regardless of Linear's success as a brand, it's very very clear that Linear's success as a product is simple: it is really, really good, in a way that is almost uninteresting. Linear offers very few novel features [2] and instead invested a lot of time, energy, and polish in... just getting everything correct, and making it work extremely extremely fast. (This is, to be clear, whatever the opposite of a backhanded compliment is.)
  • [REDACTED BUTTONDOWN ENGINEER] commented that using Linear "felt so much better than using GitHub Issues that it made [them] want to actually spend time making sure their issues were up to date", and I echo that sentiment tenfold. There aren't a lot of bold new workflows or insights that using Linear has unlocked, but it has changed "backlog management" from one of my least favorite chores due to the lag of GitHub Issues into something that I genuinely look forward to doing because it feels suddenly tactile and cybernetic.
  • Relatedly, what all of these nascent "Linear for X" tools seem to get wrong is that the specific design language and branding is downstream (or even orthogonal) to what makes Linear feel so good, which is its obsession with ergonomics. The hyper-designed table views and Things-style progress-indicator chart icons are nice, but they belie the obsession with performance. [3]

In case anyone's reading from the Linear team, my (meager!) wishlist is as follows:

  1. Let me assign individual issues to initiatives
  2. Docs as a first-party primitive
  3. Let me mark certain views/issues as publicly visible (I know this one's niche!)

  1. And, similarly, much of the nuance in "land-and-expand"-style product development, where you wriggle your way into a company with a single wedge and then hope that the company jams more of its state and headcount and process into your product, is offer facility and stair-step value in doing so. ↩︎

  2. The label taxonomy thing, maybe? And "pivot tables in a sidebar"? ↩︎

  3. And performance is much harder to ape. ↩︎


Next page

Lightning bolt
About the author

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

Lightning bolt
Greatest hits

Lightning bolt
Elsewhere

Lightning bolt
Don't miss the next essay

Get a monthly roundup of everything I've written: no ads, no nonsense.