One of the first things I did when setting up Whisperglass was to create a justfile.

I have grown older. I've either gotten worse at context switching or better at gauging my ability to context switch, and I have become a little bit obsessed with minimizing friction between jumping from project to project or repository to repository wherever possible. One of the really easy ways to do this that requires almost zero setup cost is by making sure every single project I interact with has a just file with a standard set of commands. These commands are install, bootstrap, dev, build, test, and lint. A just file can, of course, have more commands than this and can be fractal, but those are the core six that every project must have.

And as a result, it's really easy for me to hop from one repository to the next without having to get briefly stunned in my tracks trying to remember how to just spin up an Eleventy server or whatever. just files feel a little bit like Go format to me. And as a result, it's really easy for me, one repository to the next, without having to briefly stunned in my tracks. So I'm trying to remember how to get up an Eleventy server or whatever.

Here’s a sample Justfile for a Django repository:

# Install dependencies
install:
    uv sync

# Run migrations and collect static files
bootstrap:
    uv run python manage.py migrate
    uv run python manage.py collectstatic

# Run the development server
dev:
    uv run python manage.py runserver

# Build the production static files
build:
    uv run python manage.py collectstatic

# Run tests
test:
    uv run pytest

# Run linting
lint:
    uv run ruff check .
    uv run ruff format .

Standardizing on just has a number of other ancillary benefits:

Nested justfiles

If you're in a monorepo, you can have a justfile in a subrepo and invoke it very elegantly like this:

just backend/test

It also makes composition into top-level commands very easy. For instance, take this snippet from Buttondown's justfile:

install:
    ./scripts/install-brewfile.sh
    pre-commit install
    just check-docker
    just sniper-link/install
    just image-generator/install
    just latex-renderer/install
    just docs/install
    just marketing/install
    just analytics/install
    just app/install
    just internal-docs/install

CI

Making the justfile a source of truth makes it a lot easier to run CI on it. Instead of having another invocation of your test runner in CI that you always forget to update, you can just push the logic into the justfile as a single source of truth.

Documentation

Justfiles are self-documenting in a way that very few other scripts are. (I wish it was literally more self-documenting: I'd love a HTML-based output of the justfile that was just a bunch of markdown files that I could just open in my browser, but just --list is a good start.)

You get the point

Even if none of these things are world-shattering, they come at zero cost, or at least what rounds down to zero. (I am hospitable to Convinced this is essentially the same thing as make or as having a bin directory. But at least for me, both of those approaches carry a bit more implicit baggage because you have to spend some time evaluating: is this a real Makefile or is this just a task runner? A just file is very explicit—you know exactly what it is and what it is used for.)


I spent a couple hours this weekend resuming work on Whisperglass, born from some of the internal functionality within Buttondown. Resuming is perhaps a misleading choice of words: the work hitherto performed on the app was: thinking of the idea, registering a domain, and putting a Google Docs-based landing page in front of it. This weekend, I actually created a repository and started adding some code. This is going to be a hodgepodge of various notes from the early onset before I forget them all.

Scope

This is, in many ways, an app that I should have done before Buttondown, in that the scope is so tight and the TAM is so small that it's a bit of a training wheels SaaS compared to most other things I've worked on. There's nothing wrong with that, obviously. I've always admired products like DMARC Digests and the since-departed Briefmetrics as smart ways to try and just get a little bit of incremental value out of a common pain point.

Goals

There's really no expectation of this being a meaningful financial success. I think it will be fun to do this and get my hands dirty programming from scratch in a way that I haven't done in a long time, and I think it can be a good little source of inbound traffic for Buttondown — but it feels like the 95% case for this is, ultimately, a trivial revenue number compared to anything on the Buttondown side or anything on the Third South side.

However! One of the things that I have really wanted to exist for my own tinkering is an open-source SaaS in Django that I can point people to and use as a legitimate example for some patterns and tactics. This is a nice way of being able to do that, and it will also mean that I can credibly and reasonably riposte complaints that the prices for Whisperglass are too high — "just host it yourself" is a fun card to be able to play.

Name

I don't love the name, I'll be honest. I wanted something that wasn't explicitly GPT-related in both senses of the term. I wanted something that had an easy dot-com to remember and pronounce. Whisperglass was the best I could come up with, and I guess it theoretically leaves the door open to surface area expansion down the line.

Stack

Django, Tailwind, PostgreSQL — pretty much the same as Buttondown. A couple notes around the edges:

  1. Going to explore the use of django-cotton and resist the siren song of a JS framework. (Nothing wrong with them, but this is not a sufficiently demanding frontend to warrant the big guns.)
  2. Going to explore using Postgres only for queuing and crons, rather than using Redis.
  3. Wherever this gets deployed, it's not going to be on Heroku (mostly as a training exercise for a large Heroku exfiltration down the line.)

Speed

I mentioned that I started this app in earnest this weekend per timing. I spent three hours total with my laptop open. During that time, I was able to get the core schema, registration, auth, core data sync mechanism, a pretty solid design system, a landing page, linting, tests, the 0.0.1 iterations on notifications, and a generalized activity feed. I framed this as with my laptop open specifically because the majority of my input came from using Aqua to talk to Claude, and the minority of the input largely came from copy-pasting existing functionality, dependencies, and utilities from. I think those things are almost equal in weight, obviously flawed, as a tremendously powerful lever for sloppy code. But I think it's really, really hard still to get meaningfully well-architected code out of it without having a lot of backstops and a lot of prior art.

Like and Subscribe

  • If you want to follow along: just subscribe to this blog. I'll be posting updates here as I go.
  • If you want to test Whisperglass as an actual user: email me.


Thomas Crown: [smirking] I trust myself implicitly.
The Psychiatrist: But can other people trust you?
Thomas Crown: Oh, you mean society at large?
The Psychiatrist: I mean women, Mr. Crown.
Thomas Crown: Yes, a woman could trust me.
The Psychiatrist: Good. Under what extraordinary circumstances would you allow that to happen?
Thomas Crown: A woman could trust me as long as her interests didn't run too contrary to my own.
The Psychiatrist: And society? If ITS interests should run counter to your own?

Not unlike its titular billionare, there's something so charming and disarming about the Thomas Crown Affair's incredibly modest, breezy, I-can't-believe-this-isnt-a-TV-movie sensibilities. There is nothing you'll be surprised by in this film: Pierce Brosnan plays a rakish billionaire, and Rene Russo plays a fiery art sleuth trying to track him down, and from that description alone you already know everything there is to know.

It's neither a complicated nor substantial film, and your acceptance of its wispiness is largely predicated on whether you're watching this because you have 90 minutes to kill or if you're watching this because you want to see something good.

There are a couple fun choices in the film: one is the framing device of Faye Dunaway as the psychiatrist, which seems completely immaterial to the plot and doesn't even give us any information about Brosnan's character, but is a nice little wink to the original film. Another is a very deliberate focus on eschewing technology in favor of more timeless methods of heisting, and I think that does this film a favor in much the opposite direction that most of Brosnan's Bond films feel dated purely because the folks behind the camera lacked the self-control to mess with gadgets.

But if the movie is defined by its suave vacuity, there are just so many better options that I struggle to recommend it to anyone who's already drowning in things they've been meaning to watch. It is an unfair bar to compare this to Ocean's Eleven (also a remake!); this is a quieter, stiller movie, and one that's more interested in the romance than the heist. (But there is more beauty and truth in one little exchange in Ocen's Eleven — "does he make you laugh?"; "he doesn't make me cry." — than in all of Russo and Brosnan's smoldering banter.)


pytest is, in many ways, the Age of Adz of the broader Python ecosystem: a rewarding idiosyncratic departure from convention whose quirks and foibles are quickly and easily outweighed by the fact that it’s just really, really good.

Magic name-based dependency injection? Totally new scoping paradigm? Autodiscovery? Sure. All of that is forgivable because the tests themselves become so pleasant to read and write.

And/but/nevertheless, much like Age of Adz’ impenetrability being in no small part due to track length (Impossible Soul, the closing track, sums to twenty five minutes across five parts; the title track alone is eight minutes) — conftest.py, the vaguely bizarre ur-file which contains all of your fixtures and other various pytest goodies, can quickly get bloated and confusing. [1]

What I wanted was the same thing I had for tests — colocation. If I had, say, a survey model, I wanted to be able to define the fixtures for that model next to the model itself but still have it be globally available. Same thing with external services: if I’m mocking out my calls to Stripe, it just makes more sense to organize those mocks closer to the actual implementation code.

I struggled to figure out a way to do this until poking around the docs and realizing that “plugins” are more of a duck type than an actual thing — from pytest’s perspective, a plugin is just a module filled with stuff, and therefore I could technically treat a file filled purely with fixtures as a “plugin” imported by my root conftest.py.

This means I can do something like this:

# /emails/models/survey/model.py
class Survey(BaseModel):
    identifier = models.CharField(max_length=100)
    question = models.CharField(max_length=500)
    answers = ArrayField(base_field=models.CharField(max_length=500))
    newsletter = models.ForeignKey(
        Newsletter, on_delete=models.CASCADE, related_name="surveys"
    )
    
# /emails/models/survey/model--mock.py
@pytest.fixture
def survey(newsletter: Newsletter) -> Survey:
    return Survey.objects.create(
        newsletter=newsletter,
        identifier="pokemon",
        question="What's your favorite starter?",
        answers=["Bulbasaur", "Charmander", "Squirtle"],
        notes="",
    )

# /conftest.py
pytest_plugins = [
    "emails.models.newsletter.model--mock",
    "emails.models.survey.model--mock",
]

There’s no real magic here — well, besides all the magic employed by pytest. But it’s a nice tactic that cut our root conftest from ~2KLOC down to a very manageable 200, and made fixtures much more discoverable in the process.


  1. Maybe this is not true for all codebases, but for Buttondown there’s a huge swath of objects and services (anything to do with rendering or auth) that can’t really be nested into a specific folder and must be present at root to be globally accessible. ↩︎


Scattered throughout the Buttondown docs site, you'll see the fruits of the latest experiment I'm running: getting rid of outdated screenshots and videos by replacing them with iframes. The iframe itself points to our demo instance, which helps alleviate some security issues, and some very light parsing of query parameters allows us to apply a mask and highlight a specific element. This seems really cool, and after hacking out a proof of concept, I'm kind of surprised I haven't seen this tactic applied in more places.

One of many fundamental problems that rapidly evolving tech companies have to face is the drift between docs and the things that they're documenting, and a huge part of this pain comes from the fact that it's really, really hard to keep media artifacts up to date. This seems like a nice way to sidestep that problem entirely while also making a better user experience, since the user could just go from this specific frame, click on it, and then open that exact page in their browser.

There are two obvious reasons that I can think of for not doing this:

  1. Security. We solve this by using a completely separate demo instance of Buttondown that's permanently logged into its own account. [1]
  2. Performance. iframes are slow! We're not doing it here yet, but it seems pretty trivial to just take a Puppeteer screenshot of every single iframe as a facade and then lazily load on hover or based on some other heuristic.

Early feedback from this approach has been really positive, and it feels not unlike stumbling upon gofmt for the first time — a joy and confidence in the knowledge that this onerous chore has become 80% easier. I'm sure there's a lot of other nuances and edge cases and weirdnesses that I haven't really stumbled into — but it's surprisingly versatile.

I think it's rare that we get to make our docs better and easier to maintain at the same time, and I'm excited to see where this approach ends up. If you've run into any companies attempting or succeeding with a similar approach, please let me know.


  1. As a sidebar, this is another thing that I'm surprised more people don't do, because it's just really, really useful to be able to point someone towards a hyperlink that shows off exactly what they're asking about without having to muck around with auth or any admin tooling or deal with any mock data. ↩︎


There's a (likely apocryphal) quote from Soderbergh about Ocean's Eleven, one of the greatest movies about America:

I love seeing a movie does what it does and does it well and makes no argument about it. To me, Ocean's Eleven was my opportunity to try and make a movie that has no desire except to give you pleasure from beginning to end — a movie that you just surrender to without embarrassment and without regret.

I don't think many people would ever cite Soderbergh as their favorite director, but: he's got an incredible action economy, is unafraid of failure, challenges the industry more than his contemporaries, and has shipped two stone-cold classics (the aforementioned Ocean's Eleven and Logan Lucky.)

And if the Ocean's trilogy is a riotously entertaining meta-commentary on American cinema, Logan Lucky is a riotously entertaining meta-commentary on the Ocean's trilogy, then Black Bag is, well, not riotous—it's a quiet and subdued film filled with mostly quiet and subdued megastars, but a demonstrably and thrillingly entertaining meta-commentary on le Carre, Agatha Christie, and the trappings of British genre fiction. (Fassbender's character is a really fun riff on Smiley in some respects, though the core of Smiley's character is perhaps his fallibility, his paunch, and unrequited love.)

And, conversely, one of the sweetest and loveliest through-lines of Black Bag is the powerful and honestly inspirational marriage between his characters and Cate Blanchett's. There's a lot of MacGuffin-izing in here and a lot of things that don't quite hold up to scrutiny in much the same way any constituent part of Ocean's Eleven doesn't quite hold up to scrutiny. But the goal of this film, like so many of Soderbergh's, is not scrutiny — it is pleasure, and the luxury in Black Bag's 90-minute runtime cannot be understated, a film that would feel hedonistic if it was not so masterful and self-assured. Every character is given a grace note or two, and this feels a little deeper than the one-note archetype that they embody.

Black Bag is not going into my personal canon. There is, not unlike Knives Out, a certain echoing hollowness deep within it—a sense that it is more interested in response than call. I can't fault it for that, but I can't consider it one of my top 10 or however many films of all time. That aside, this film is flawless. What are you doing? You should clear your schedule, find a friend or a spouse, and watch this movie right now. You'll not have a better use of your time.


Hello! I have so much to catch up with you about. The time has flown.

Reading (and watching)

As you might have surmised from the radio silence, less to share than usual on this, but I am finishing up what is almost certainly going to be my favorite book of the year, Ducks, Newburyport. It's an experimental novel in the same vein as Infinite Jest or Ulysses, but don't let that descriptor scare you off if you are the kind of person who is scared by the emotional baggage of either of those books. This is a harder read in some respects and a much more thrilling read in others, and it is one of the books where you instantly understand exactly what a writer is trying to do.

Beyond that, I really loved: Diner, Working, They Came Together (more for nostalgic reasons than anything), North by Northwest, Pantheon (Season 1), The Studio, and the second season of The Rehearsal. (Still need to watch Andor S2 once Haley and I can carve out a few evenings together, and I've heard great things about Black Doves.)

Writing

Traditionally, when I do this I share all the stuff I've written in the past month. Well, it's been four months, so in lieu of that I'll share my two favorites: What Gives and Fatherhood.

Buttondown

You know, whenever I sit down to write one of these monthly roundup posts, the first thing I do is open a tab with every single blog post that I've published since the last monthly roundup, and it's funny to see HQ1 be one of the first tabs. Moving into this office feels like a lifetime ago, and in fairness, it has been three months—which, as we will get to later, is the new unit of lifetime. It's been a really busy quarter—mostly good busy, some bad busy. I think this is the thinnest I've ever felt between interesting product decisions, tough existential questions about strategy and growth, scaling up the team, and building out new processes because we've outgrown the old ones—or lack thereof—trying to keep more and more of a rapidly expanding organism in my head. It can be stressful on stressful days, but my median state is that of gratitude that I get to spend eight hours every day working really hard on interesting problems for people who I care about, and then I get to go home.

Some stuff in particular that I'm proud of shipping: the Playground, the CLI, the Firewall. but I don't need to ask for your forgiveness for the solipsism since I think you're used to it by now I'm proud of being able to work on the organization and the process more than the product itself. One of the things that was always tricky for me being In Management was the disconnect that I felt between my empathy and concern for my employees and my general anhedonia to the supersystem in which we all resided. Agency feels good; it is much easier and exciting to care about meta-work when I know we're the ones reaping the rewards.

Lucy

Lucy just turned eight months old. She's not quite crawling but doing everything short of it; she's not quite talking but has no difficulty in making her feelings known on any matter in which we beseech her opinion. We're in a pretty good schedule right now, though "pretty good schedule" is always relative when it comes to a kid. We roughly know how much she wants to sleep during the day, when she's going to go to bed, and when she's going to wake up. We also know who her favorite dog is (Telly), which is her favorite toy (Hobbes), and what her favorite brand of Greek yogurt is (Ellenos). The rest is a glorious act of continuous discovery — she is in many ways a Morrowind character, going to bed every night and then waking up the next morning with increased stats and two new skills.

The overwhelming joy of getting to spend time with her is so visceral that it makes writing about it feel anodyne and therefore impossible. Here is what I mean: my favorite part of every day is bringing her with me to the garden to water the crops and herbs. Each morning is a bit of a gacha: she will either find delight in the arc of the water from the watering can, or the novelty of a particularly long sprig of parsley, or the shadow-dappling of the soil next to the tomato plants in the Richmond sun. I am writing this paragraph, and trust me that it is not a bit when I say the mere act of writing this paragraph is forcing me to immediately leave the office early to go find her and have her honk/laugh at me.

Telly

Meanwhile, Telly's role as older brother continues to evolve. He is not exactly thrilled with the situation. He understands, and he is fiercely protective of his sister. But he's also still a little bit of a shit when he feels like it. My current negotiating tactic with him is what Haley has deemed "Boy's Club time": every evening at 7 p.m. when she takes Lucy up to get ready for bed, he and I live like kings and bachelors: which is to say, we go for a walk, play fetch for 10 minutes, and then he immediately passes out while I drink half of a Pabst and fall asleep watching the playoffs.

Haley

The first year of parenthood is filled with many surprises and revelations; one of the best of these is discovering hitherto unearthed virtues — ways in which your partner is even greater, kinder, warmer, and stronger than you had imagined. There have been a lot of these.

The first meal we ever had together in our house — that house, a lovely and terrible ramshackle craftsman in Green Lake — was an 18-inch pizza, freezer Manhattans and a bag Caesar salad, The Caine Mutiny and a sense of utmost arrival and contentment. Some of that has changed: movie nights are rarer for us now (evenings are a bit of a math problem); she's graduated from Manhattans to Gimlets [1]. But we still get the same pizza we got five years ago (Belmont in lieu of Zeek's), and new rituals lattice themselves onto old ones rather than replace them outright. (To give a concrete example: Lucy really loves pizza crust.)

Here's what living with Haley is like, though: a few weeks ago, I was biking back from the office, carrying with me the baggage of a long day filled with too many calls and not enough coffee. I pulled into the backyard (laden with turf rather than what we generously referred to as "sod" in the Seattle house) and discovered Haley and the kids out there waiting for me, playing fetch (Telly) and spatula (Lucy). And in that brief instant, I could not quite remember where I was except home, nor how old I was except married — and the near-painful desire to live in that feeling of arrival forever was matched only by the joy in knowing that I can.

Miscellany

  • My friend Myles has joined the team at Third South! Myles is great; you should reach out to him (he'll be delighted.)
  • If you're reading this and I owe you an email: I'm getting to it, I promise.
  • Almost done with my first side project in what feels like many years.
  • Purchased a TrimUI Brick. This genre of device has gotten really good over the past half-decade, even if this is really an aspirational purchase at this point.

I hope you are well. If you don't hear from me for a while, it is because I am taking my family on a lovely walk because it is a nice day out.


  1. Key limes and muddle a bag's worth of mint in the simple, to be specific ↩︎


It's useful and fitting that yesterday I wrote, in reference to [[Secret Mall Apartment]]:

Which, to be clear, is fine — and charming in its own way. Were these eight people engaging in an explicit art project? Almost certainly not. They were kids fucking around. Does it make you think? Does it change the world in some interesting, albeit slight, way? I think so, and the distance between those two truths does not matter that much, and I think I (we) used to feel better about that, that a random art project could be a random art project and not a referendum.

No other show seems to straddle this bizarre, blurry, liminal space between comedy, metafiction, and art quite like The Rehearsal.

How do you describe the show? What do you make of it? The quick-hit "jokes" are great, such as the graphic of Paramount Germany slowly taking over Europe, but everything larger (entertaining as it is) feels recursive in a way that delights the brain and eludes the tongue. "Nathan's making a joke about this thing which was a joke about this thing which was a joke about this thing." It is impossible not to sound like a Redditor when talking about how much you enjoy the show.

There's almost a Jackass element, too, to what Fielder has done this season, capstoned with (spoilers!) the genuinely impressive accomplishment of getting a pilot's license just to reenact flying a 737 on a plane filled with actors. A lot of what Nathan does elicits the kind of dry scoff-laughter that comes from shock and disbelief, followed by the dawning realization of just how far he's gone; this season traded some of the ambition and insanity of last season (which I liked!) for a leaner, more focused set of bits, all of which paid off and none of which outstayed their welcome.

I don't know how to situate "The Rehearsal" alongside really anything else, but what I know is that I look forward to it and it enchants me. (And I have no idea how stressed HBO must have been during this filming.)


I can't quite remember how I got into it, but in high school I was a big webcomics guy, mostly pixel stuff. But the one I loved the most at the time, and felt permeate deep into my identity in a way that 8-Bit Theater and the rest never could, was Questionable Content—a still-running series about a self-insert-shaped character working at a coffee shop in New England and palling around with his coworkers, most of whom were women, all of whom had high levels of snark and indie rock erudition.

I fell out of readership in much the same way I fell out of a lot of bits of my high school identity—you go to undergrad, you have your first Natty Light, you buy a couple pastel polos, and suddenly it is four years later, and you wake up checking your fantasy football scores rather than the collage of daily comic strips.

Five years later, feeling a little more comfortable in my having an identity that was not primarily formed in reaction to my friends and whatever book I was reading (or pretending to read) at the time, I revisited QC. It felt something like a time capsule—not just into what passed as laudatory alternative humor and culture, but also a time capsule into myself.

It was fun to remember being the kind of person who fantasized about working at a coffee shop — who fantasized about having an increasingly idiosyncratic coterie of band T-shirts. It spoke to a culture that I wasn't even really sure existed, but desperately wanted all the same, and I remembered at once how adulthood felt like a distant, beautiful island filled with serendipity and meaning.


I bring this up in the context of Secret Mall Apartment not just because I think the characters of QC would befriend the protagonists of the documentary, but because it's hard not to have the same kind of feeling—both a nostalgia for remembering all the discussions and jokes about these lovely artist/squatters, and a not unpainful feeling of distance between who I was and how I thought about these people then versus now, and how my understanding of meaning and grandeur has shifted over time.

SMA is about the physical world: it is a treatise on who owns a space and what it means to modify a space, and all of those things. But it also feels like a bit of a time capsule into what the internet or what communities used to be—the idea of privacy and being part of a secret club, and the thrill and joy of discovery before we had fully swung into an indexed world where the difficulty was in curation rather than discovery.

Okay, so, the film. I'm not really sure this works well as a documentary. There's a thinness to it that sits in an uncanny valley between cinema, reality, and an explicit top-down narrative. Workman, the director, does a lovely job with the aesthetics, but the fact that padding the narrative with quick asides about relationship drama and 9/11 just to meet a 90-minute runtime feels indicative that there is not some big story to tell here. It's a small story! It's the kind of thing that briefly went viral before "went viral" was a phrase, and I think I was more bemused than enlightened by the attempts of the crew and original collective to try and conflate the mall with a broader statement about Society And The Way Things Are Today.

Which, to be clear, is fine — and charming in its own way. Were these eight people engaging in an explicit art project? Almost certainly not. They were kids fucking around. Does it make you think? Does it change the world in some interesting, albeit slight, way? I think so, and the distance between those two truths does not matter that much, and I think I (we) used to feel better about that, that a random art project could be a random art project and not a referendum.

All of this is to say: it's a fun way to spend ninety minutes. Don't overthink it. (Or maybe do.)


While I've been impressed with the advancements in software engineering LLMs over the past six months, it's hard for me to say that anything has been really paradigm shifting. What I mean by that is I feel increasingly comfortable offloading larger and more nuanced tasks to cloud or whatever the hottest LLM of the given week is, but it's not really changing how I approach building software or how I approach what my day looks like. It simply makes me faster and more productive. This has been a bit of a through line for me really since Copilot came out, which is that a lot of the iteration in this space feels like very strong and impressive incremental improvements, but with obvious jank, especially once you escape the lovely sandbox of small, un-nuanced apps without the accretion of technical debt or erstwhile design decisions or things that don't necessarily fit into a corpus trained on Stack Overflow and other such sites.

Outside of the realm of software engineering, I have found a tool that has changed the way I work on a day-to-day basis. I've used it for a grand sum of one month, so this is not exactly a gargantuan sample size — but the tool has held up and done remarkably well in such a way that my day viscerally feels different than it used to. This tool is called Aqua Voice.

Aqua Voice is a speech-to-text transcriber. It's an LLM thing, technically. I say technically because you don't really feel like you're interacting with an LLM. There's no chat paradigm. There's not a lot of losslessness there. It feels like the way LLM-powered search feels, which is here's this thing that has always been possible with varying degrees of fidelity, speed, and other trade-offs. Now it's just much better in ways that are hard to quantify but easy to internalize.

I spend a lot of my days writing things. I write blog posts (including this one!), long-winded pull request comments, and many, many emails to prospects, active customers, potential team members, and existing team members. This is frankly kind of tiring. I'm old now: my wrists and fingers aren't as bereft of carpal tunnel as they used to be, and I often feel myself intentionally limiting my communication because the effort in having to write out something that is nuanced or complicated and perhaps long-winded is just difficult to do. It's hard to really pour everything you have into writing a five-paragraph email when you know once you hit send there are 47 left.

And that brings me to Aqua Voice, which I am (as you might have guessed) using to write this very blog post, though I likely won't use it for others (my prose is verbose enough as-is, and this just makes it worse!). Aqua is just a really, really good transcriber. There's nothing else to say about it from a product or UX perspective, though maybe that'll change. Really, it's just an example of something being so, so good that you start to find places to use it where you wouldn't have even fathomed. And that's a marked difference from my previous experiences of using speech-to-text, where things were fine and solid, but you couldn't really trust it to be character perfect. You had to do a lot of massaging and editing after the fact, which, from a volume perspective, often made me conclude that it really wasn't worth it compared to just writing out stuff myself or sending a voice memo in very specific cases.

I want to give two examples of things that I am just straight up doing differently now compared to a week ago because I have this tool:

  1. Writing issue descriptions in Linear or whatever tool you want to use. I'm really bad at this in no small part because it's hard for me to jump a rat's nest of context and state and known knowns and known unknowns and all of the flotsam that is required to write up a good ticket. What ends up happening is 95% of the time, I will just write a ticket that has the title and no description, and if I end up taking it a couple of months down the line, hopefully, I remember what it's about. If someone else takes it, they have to kind of figure out what it means and maybe we just cancel it because I cannot remember. Now I'm just writing a bunch of ticket descriptions.
  2. The blank screen problem. It's regardless of what the artifact is, whether it's a changelog entry, a blog post, or a position paper. I often find there's this huge mental tax in just getting the first couple bullet points out the door. This tax feels heavier when I'm more tired or have a lot on my mind, or it's been a tricky day in some respect. And yet with Aqua, I can just start talking. Often the talking is kind of rambly, and I might want to go back and delete a paragraph or two — which is, of course, fine, because the hard work has already been completed (going from zero to non-zero words.)

I think so much of the AI discourse, such as it is, is prescriptivist: you kind of implicitly take a position before evaluating the thing, whether the thing is, you know, image generation or automatic code review or whatever (a failure mode of which I have certainly been guilty, on both sides!)

But to me, what feels like both the more ideologically pure and more pragmatic thing to do is pretend the AI does not exist. Pretend the LLM is an implementation detail to which you as a user are not privy, and evaluate the tool, whatever it is, on its own merits. This is where Aqua is really interesting to me — it could secretly be backed by nothing LLM-ish at all, and it's just really, really great from a performance perspective. I don't care. It's a super useful tool that makes my day easier, and I am grateful that it exists.


I wrote this essay around three weeks ago and let it sit for no other reason than laziness and a very long to-do list. In those past three weeks, I've continued to use Aqua.

Whether it's hedonic adaptation or some other cause, the experience has kind of gotten worse in the way that AI experiences sadly tend to. Aqua was rewriting my words if I was in a certain composer like Gmail. Suddenly, the sub-500 milliseconds wake time would drop the first sentence or two. How much of this is due to AI? How much of this is due to my own shifting demands for how snappy this should be? How much is just due to code being code or network connection being network connections? It is impossible to tell, which is one of the tricky things about this bit of software. I'm still happy enough with the experience to continue using it over any of its competitors, but the tools that I use for years on end are the ones that benefit from a confidence and muscle memory in their usage. And as I read back this essay, I am reminded that it is very hard for LLM tools to develop any sort of patina at all.


Do you ever get the feeling that there's something going on that we don't know about?

Fascinating film with a lot to chew on and a lot to admire. The first thing that comes to mind is that most of the actors are folks who I kind of think of as memes now. When I think of Mickey Rourke, I think of 30 Rock. I think of Kevin Bacon. I think of, well, Kevin Bacon. I think of Steve Guttenberg. I think of Party Down. Seeing them in this production a little north of 40 years ago, I am just absolutely blown away. It is perhaps obvious to commend a film called Diner for its diner scenes, but the ease and grace with which these five friends plot and chide and yap and shit talk and love each other is legitimately one of the most earnest and beautiful depictions of male friendship that I've ever seen in any medium. Watching these guys talk about sandwiches is cinema, and on those notes alone, I'm grateful.

The other thing that comes to mind is that for this being a hangout movie along the lines of Everybody Wants Some or Dazed and Confused, there's a melancholy and a gravity to this that feels honest and interesting and not at all heavy-handed. Everybody Wants Some is probably my favorite film, or at least was my favorite film in this genre, and that had a seriousness too, but it was a sun-drenched seriousness. There was a nostalgia for a simpler time in Linklater's life. Diner feels like, in many ways, the opposite argument, even if it is so vividly informed by Levinson's own memories and childhood. He is not trying to use the past to talk about the present; he is trying to use the past to remind us about what doesn't change. These people are happy and some of them are having a good time, but they don't all necessarily end the film in a better place than they start. Nor do they get the freeze frame happy ending that you'd expect out of this sort of 80s ensemble dramedy. The point in this film that I come back to and know will live in my head forever is, of course, the strip club scene. This is a cliché that shouldn't work. The idea that we've seen this sort of thing dozens and dozens of times before, before and after dinner, to varying degrees of success, I have always found it maudlin and fantastical. This is not how the world works. This is pointless and a little bit demeaning to the viewer, and yet I loved this scene. This might have been one of my favorite scenes of all time, not because of the music, though that worked well too. Seeing Billy, this guy who is introduced as the graduate in more senses than one, having figured it all out, being on the precipice of the greater world in a way that the other four guys haven't quite reached. Getting punched in the face a few times and breaking and letting that break not turn him into a shell but into a virtuoso pianist, letting the light displace everything.

What worked for me about this scene was Guttenberg, whose performance topped the class in what was a really, really great series of performances. He's delightful throughout this entire thing, but that one scene where he goes from a certain kind of very real 25-year-old despair into a man so caught up with joy and music and the understanding that life will still have its moments. I don't know how you come away from that scene without feeling 10 pounds lighter.

What are we to make of the fact that we never see Elyse's face? I think it's easy to read this with a certain backwards-facing criticism: that this film is not just a product of its time but a product of a product of its time. And I think that's not giving Levinson enough credit for the nuance he's trying to hit. We know everything about Elise that we need to know from her voice, warm and timid and half amused as she rattles off answers to NFL trivia questions. But the movie is not about Elise, nor is it about Beth, Carol, or Jean. It is about what it means to be one of the boys. And what it means to have yourself change or not change in rhythm and syncopation with the people you consider your whole life.


All good books are different but all bad books are exactly the same. I know this to be a fact because in my line of work I read a lot of bad books - books so bad they aren't even published, which is quite a feat, when you consider what is published. And what they all have in common, these bad books, be they novels or memoirs, is this: they don't ring true. I'm not saying that a good book is true necessarily, just that it feels true for the time you're reading it.

My first indication that The Ghost was going to be closer to the airport-bookstore end of the spectrum than the Le Carré end probably should have been when I saw that Audible had chosen an Americanized title to coincide with the movie adaptation (starring Pierce Brosnan—an actor I find impossible to associate with serious or meaningful sociopolitical inquiry). The book itself struggles to be as cynical as it thinks it is, though perhaps that's more a reflection of the last two decades than of the book's own quality.

I can, albeit faintly, recall a world in which the illegal detainment and torture of four non-combatants would be considered a civil rights violation and a political firebomb large enough to engulf the career of a British prime minister. Now, it feels like the sort of thing that would be buried on the fourth page of an article nobody read but everyone quote-tweeted.

Even setting aside the realism of the politics, there just isn't much substance here. None of the characters are interesting enough to have a personality beyond the three sentences they were assigned at birth. The narrator is exactly as smart or reckless as the scene requires, the charismatic but soulless politico is a cipher, and the wife is—spoiler alert—so obviously telegraphed as a master manipulator that the third-act twists land with a thud. There's a cutesiness in the faux-metafiction of the book's closing that feels dated, if mildly fun, and that's about it.

The book's best asset is its pace and propulsive readability. I finished it in three days, and the leanness of its prose at least leaves nothing lingering in your mouth—better than a bad taste, I suppose. But the best thrillers engage you both viscerally and intellectually; The Ghost is light on both counts, and what little viscera it has hasn't aged well.


I'm emerging from what already feels like, in retrospect, the hardest two months of my career and the hardest I've worked since I was an over-caffeinated undergrad whose diet consisted of PBR and Qdoba (Chipotle if I was in the mood to splurge). This isn't an oblique metaphor or a veiled reference to any one specific thing: it's simply been a very demanding stretch, filled with long nights, longer to-do lists, and stressful incidents. A certain malaise attacks me when I have so much to do and neither time or energy to do even a fraction of it: a recursive stress, a gray goo of Bad Vibes that seeps unchecked without exogenous intervention.

About that exogenous intervention.

Whenever I heard my friends talk about being a parent, the happiness always seemed abstract in much the same way that someone talks about summiting Everest: an accomplishment and pride more than a day-to-day feeling. That’s not what it is: the happiness is visceral, even if trying to speak to it diminishes its power. What I am trying to say is this: every morning, I am the first person Lucy sees, and whether her eyes are hooded by fatigue or her cheeks reddened and dampened with tears, she invariably forgets whatever first-order things are happening and locks her eyes with mine and smiles. This is an event that buoys an entire day (or week, or month.)


Last weekend, we got back from a lovely vacation with my lovely family. We were gone for a week and change, and my in-laws graciously offered to watch Telly.

When they dropped him back off the following day, the thing that finally pierced me and turned me back into myself was not his joy at seeing us, nor mine at seeing him, but Lucy’s joy at seeing him: a joy so bright and perfect that it spawned the loudest and squeakiest shriek of delight I have heard from her and perhaps from anyone. That single noise washed away the past six weeks and untied a few knots in my back.

All of this is to say I have been gone for a while; I missed this, and I'm happy to be back. Thank you for your patience, whether you've been waiting for an email or a text or a RSS notification. I promise I'm speeding towards you as fast as I can, holding a child who through some miracle of physics makes me lighter for carrying her.


One of the most useful and janky internal tools we have in Buttondown’s codebase is a codegen pipeline called “autogen”. There is nothing “auto” about autogen: it is a series of scripts that munges a bunch of data into a bunch of different formats, to generate things like our API clients and code snippets and storybooks. Some of this data is stateful, and therefore requires a database, and therefore requires migrations — you see how this kind of thing can grow somewhat labrynthine.

Each individual script is pretty simple, but as we’ve found more and more things to glom onto autogen. This, to be clear, is a good thing. It’s really nice to have automatic, consistent data and types everywhere, so that we literally cannot change the API without also pushing a concomitant change to the API docs. With each glom, though, the wall-clock time of running autogen increases — and so I found myself staring down the barrel at a 50second script running whenever we wanted to make any sort of non-trivial change to our schema.

Fifty seconds was too many seconds. I set a budget of ten seconds — still a long time, but significantly less onerous — and began digging in at low-hanging fruit. There was a lot. A few that come to mind:

  1. We split up our vite config so we could only run the portion that we needed (cross-piling and minifying our CSS bundles;
  2. We disabled all Sentry and perf-tracing stuff that was getting enabled as part of the standard build;
  3. We no-oped all of the Python-land data generation if it was already there, since that stateful data didn’t change very often.

This was all great, but we were still left with 15 seconds of wall clock time. Profiling each individual cog in the script revealed that the problem was essentially “it’s Python”: four items in the script ran Django commands, and just spinning up the Django process and running autodiscovery took around two seconds. Ouch!

The impulse was to cut down that runtime. A great post by Adam led us to discover the biggest culprit was our Stripe imports, and we timeboxed a bit of time to try and get rid of them, either by deferring the imports or excising the library; neither seemed particularly feasible.

Then, suddenly, the answer seemed obvious. If we have four scripts where the fixed cost of invoking Django is the long pole, why not simply combine the scripts?

And that’s exactly what we did:

    if len(sys.argv) > 1 and "," in sys.argv[1]:
        commands = sys.argv[1].split(",")
        original_argv = sys.argv.copy()

        for command in commands:
            sys.argv[1] = command
            execute_from_command_line(sys.argv)

        sys.argv = original_argv
    else:
        execute_from_command_line(sys.argv)


A fun romp that I’m surprised I hadn’t heard of sooner (thanks owed to The Big Picture’s 1982 Movie Draft pod) and it checks all of my boxes: a simultaneous love letter and pastiche to the murder mystery. It is obvious in retrospect that Knives Out owes a lot to Deathtrap, as does (much less successfully) Skin.

Deathtrap is a play, and it feels perhaps unfair to criticize the performances for being too theatrical: Dyan Cannon and Irene Worth are game and funny but do not feel real in any sense of the word, which works well in the comedic scenes and less so when Deathtrap wants you to take it earnestly as a thriller. (SImilarly, Caine is great in the first third of the movie as someone Going Through Things, and then every aspect of his role recedes into the obvious.) But Reeve — who I don’t think I’ve ever seen as someone other than Superman — is the star of the show, with a performance that wins and convinces every step of the way.

(Also, a great ending, even more than a good ending.)


I’m coming at White Lotus a little bit after the zeitgeist; as I write this, the third season is currently airing, and I understand the metatext (each season a new location, with some overlapping characters) in a way the original viewers of the first season probably did not. And it’s hard not to enjoy the framing device! It’s a great canvas that Mike White has engineered for himself: six hours is a good amount of time to stay with a series of folks, long but not too long, and its easy to get interesting actors who might not otherwise be interested in committing to an HBO series for fear of overcommitting themselves.

This being a miniseries (or at least miniseries-series) also helps in that, frankly, I can’t imagine spending that much more time with many of these characters who all feel either insufferably one-note or insufferably two-note. (That is the point, you might argue: it is a satire, meant to reveal the human condition as through the prism of the upper class. I would argue back: okay, I get it.)

Still, it’s a good watch. Mike White has a flair for both dialogue and casting; to the extent that this show gets brought up in the same vein as Succession (which I think is trying to deal with bigger questions and ideas), these scripts (perhaps even more so. than Succession) are modern, surgical, and deeply clever, and the actors clearly love them.

Coolidge gets (got?) a lot of the attention for reviving her career in a delightfully lampshaded performance, but to me the hallmark of the show was Connie Britton as Supermom. There’s a sincerity in her performance (which, like Coolidge, feels somewhat in conversation with her previous role in Friday Night Lights) and her ability to switch from unflappable and warm to, in alternating (and incredible) scenes sharply bitter and deeply, shatteringly, unloved.


Everything you’ve been doing is bullshit. Underlying every one of my stories was the traditional belief that you’re in a democracy and the power in a democracy comes from being elected. Yet here was a man, Robert Moses, who had never been elected to anything, and he had enough power to turn around a whole state government in one day. And he’s had this power for more than forty years, and you, Bob Caro, who are supposed to be writing about political power and explaining it, you have no idea where he got this power. And, thinking about it later, I realized: and neither does anybody else.


You’re never going to achieve what you want to, Mr. Caro, if you don’t stop thinking with your fingers.


The women who lived that life, a life before electricity — millions and millions of them — of course are almost all dead, and they can’t tell their story to their descendants If in even small measure I told it for them, these women of the American frontier, and in order to accomplish that, ‘The Path to Power’ took a couple of years longer to write, well — so what?


everyone else, minds rotted from overconsumption of narrative media: conviction! passion! belief! / me, only reading nonfiction and poetry (a kind of nonfiction): administrative capacity

Alex Williams


I've said many times now that Robert Caro has ruined me for the vast majority of non-fiction [1]; I think it is only recently that I've really internalized the fact Robert Caro more than any other writer, thinker, or public intellectual has changed my understanding of the world and my place therein. Caro is a crusader but not a zealot: he believes in the possibility of institutions to make great things, and he thinks it is important to understand how those institutions operate and the process by which individuals can capture, change, and subvert those institutions. He understands — and teaches the reader — that things do not Happen, but are part of a fractal and infinite web of cause and effect, and that the footnotes of history — the footnotes of life — are littered with fascinating and terrible and honorable people, all of whom had loved and lived and grieved and died — sometimes on the periphery, sometimes in the far far distance.

It was hard for me to get around to reading Working, despite all this. This book, from a distance, felt like the kind of — I don't want to be unkind and call it a cash grab, but maybe a collection of b-sides from an artist spending a long time in the studio, something that doesn't detract from the ouevre necessarily but still feels somewhat cheap in the holding. (I am thinking specifically of Murakami when I say this, who I still love dearly but the guy has never seen a quick-hit book deal he doesn't like.)

And, to be clear, Working is very much that kind of book. I think it's fair to only say half of it is truly new material from Caro; a third of it is a collage of (good, but repetitive) interviews and press clippings from the past few decades, and a sixth of it is passages from his earlier (and perfect) work.

The new material, though! It is reductive (Caro's first job; how Caro moved to the Hill Country; why Caro takes so long between books; Caro's writing routine) and somewhat anodyne, and I don't really care. I think everything Caro publishes is valuable; I think reading this book felt akin to reading a blog of his, and in that light I was happy to do so.


  1. Take, for instance, Nixonland, a perfectly fine book that I'm currently reading whose author seems to revel in the pace at which he lightly and swiftly hops from cursory subject to cursory subject, seemingly more interested in connecting the dots between various Wikipedia articles than pursuing any sort of inner understanding. ↩︎


Ain't no way to keep a band together. Bands come and go. You got to keep on playin', no matter with who.


I'm Guy Patterson, I'm from Erie, Pennsylvania, I'm in a band called The Wonders and we just cut a record, we're out here on the coast and I play the drums and I have all your records well not all of them but a lot of them but ah at least I did until some of them got swiped when I was stationed in Germany and you were playing in Germany at the time that I was stationed there, but you know what I couldn't see you because you were playing in Hamburg and I was stationed in Munich but I listen to your records and I think you're great.


There is a sheer competence to That Thing You Do!, a fim that is slightly overlong [1] but capable from start to finish. No beat is surprising; no scene is revelatory; everything moves with a grace and light-chuckle ease like a particularly well-maintained carnival ride. The surrounding cast are all doing a great job (especially Liv Tyler, who does her best with a script that requires her to sit around and do nothing but project and collect unrequited love); Tom Everett Scott gives an absolute lights-out performance that makes me surprised that this was not his ticket to a broader stardom.

Does this movie share any insights about fame, passion, or the human condition? Not really. There's a child-like sensibility to the entire thing, a refusal to budge from the American Storybook narrative arc that I at this point readily associate with Tom Hanks on either side of the camaera. But it is well-done, and provides relief, and purports to do little else than that. (And the title track is a banger!)


  1. I learned, in the process of writing this, that I watched the extended cut — a full forty minutes longer than the original release, so perhaps the egg is on my face. The forty minutes includes a bunch of content between Charlize Theron and her Herculean dentist beau (a plotline which provides nothing of importance), Howie Long as Tom Hanks' lover (which was, if inconsequential, at least charming), and a bunch of other fluff. ↩︎


3/14/2025: Updated the snippet to include imports and remove some unused stuff. Thanks, Andy!

Here is a confession: I am a very strong proponent of a robust test suite being perhaps the single most important asset of a codebase, but when it comes to auxiliary services like admin sites or CLIs when it comes to testing I tend to ask for forgiveness more than I ask for permission. Django's admin site is no different: and, because Django's admin DSL is very magic-string-y, there's a lot of stuff that never gets caught by CI or mypy until a lovely CS agent informs me that something is blowing up in their face.

Take this example, which bites me more often than I care to admit:

from django.contrib import admin

from stripe.models import StripeCustomer


class StripeCustomer(models.Model):
    id = models.CharField(max_length=100, unique=True)
    username = models.CharField(max_length=100, unique=True)
    email_address = models.EmailField()
    creation_date = models.DateTimeField(auto_now=True)



@admin.register(StripeCustomer)
class StripeCustomerAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "username",
        "email",
        "creation_date",
    )
    search_fields = (
        "username",
        "email",
    )

One thing that has made my life slightly easier in this respect is a parametric test that just makes sure we can render the empty state for every single admin view. Code snippet first, explanation after:

from django.test import Client
from django.urls import get_resolver, reverse
from django.urls.resolvers import URLResolver


def extract_routes(resolver: URLResolver) -> iter[str]:
    keys = [key for key in resolver.reverse_dict.keys() if isinstance(key, str)]
    for key in keys:
        yield key
    for key, (prefix, subresolver) in resolver.namespace_dict.items():
        for route in extract_routes(subresolver):
            yield f"{key}:{route.name}"


def is_django_admin_route(route_name: str):
    # Matches, e.g., `admin:emails_event_changelist`.
    return route_name.split(":").endswith("changelist")

# This should be either your ROOT_URLCONF or whatever urlconf file your admin is set to.
# Hint: it's whatever file pulls in `admin.site.urls`.
ADMIN_URL_ROUTE = "buttondown.urls.admin"

DJANGO_ADMIN_CHANGELIST_ROUTES = [
    route.name for route in extract_routes(get_resolver(ADMIN_URL_ROUTE))
    if is_django_admin_route(route.name)
]

# The fixture is overkill for this example, but I'm copying this from the actual codebase.
@pytest.fixture
def superuser_client(superuser: User, client: Client) -> Client:
    client.force_login(superuser)
    return client


@pytest.mark.parametrize(
    "url",
    DJANGO_ADMIN_CHANGELIST_ROUTES
)
def test_can_render_route(superuser_client: Any, url: str) -> None:
    url = reverse(url, args=[])
    response = superuser_client.get(url)
    assert response.status_code == 200

Okay, a bit of a mouthful, but the final test itself is very clean and tidy and catches a lot of stuff.

  • That extract_routes implementation looks scary and magical, and it is — I use a more robust implementation in django-typescript-routes, which itself we gratefully purloined from django-js-reverse. Lots of scary indexing, but its held up well for a while.
  • The fixture and parametrize assumes usage of pytest (you should use pytest!) but it's trivially rewritable to use subTest instead.


A strategy should hurt. / Leadership is disappointing people at a rate they can absorb.

First, let my biases be explicit: while I didn’t work closely with Claire during my time at Stripe I certainly enjoyed my time in her orbit. My working understanding of her was largely in concordance of her presentation in the introduction: extraordinarily competent, with an ability to context switch from granular to big-picture, deeply empathetic, entertaining and charming. She was a great executive, and I was saddened to see her step back from her role as COO.

That being said: who is this book for? Hughes Johnson attempts to give a very explicit answer early on, joking that “yes, you should do weekly chats with your direct reports, but if you need to know that then this is not the book for you”. And yet, this book is presented as a very practical guide:

There’s a Pablo Picasso quote we like to repeat at Stripe: “When art critics get together, they talk about Form and Structure and Meaning. When painters get together, they talk about where you can buy cheap turpentine.” Sometimes you want to read a book about Picasso’s life, and sometimes you just want to know where to buy the cheapest turpentine. Consider this the latter: an insider’s guide to management turpentine.

If I were to be slightly catty, I would say this is less of an insider’s guide to turpentine and more an explanation on: here is why turpentine is important, here are some ways other artists have used turpentine, here are some challenges that other people have faced when dealing with a lot of turpentine. The entire book feels cursory, and I use that word deliberately: Hughes Johnson never knows quite what level of specificity she wants to dwell, and instead flits around from topic to topic — nothing she says is wrong or even, I think, controversial, but each of the major points (goals/planning, team structure, hiring, and perf) are neither thorough enough to be a primer nor idiosyncratic enough to be novel.

The book is buttressed by a series of sidebars that are largely “here’s how it worked at Stripe.” A lot of these were fun trips down memory lane; some of them were, to a person who lived through them [1], slightly undermining Claire’s theses:

  1. She cites Stripe Home as an example of Stripe’s outsized investment in internal tooling, even though Home was a hackathon project and its running joke during my tenrue was that its staffing was HDD — hackathon-driven development, because Stripe could never actually devote resources to it;
  2. She cites Stripe’s (now-deprecated, I assume) “TPP” as a way of rolling up many disparate and discrete goals into a legible shortlist of 3—5 true priorities for an organization; when I left Stripe, TPP had ballooned to twenty, and a long-standing joke was whether or not those twenty priorities were stack-ranked or not.

I bring up these nits self-servingly, to a certain extent. My already-foggy memory of my time at Stripe was that its late-period success was less about the systems and processes it developed and more about the fact that its culture and talent base was so overwhelmingly strong (in terms of empathy, in terms of agency, in terms of ability) that folks overcame the myriad systems and processes. [2] I don't think Stripe's perf or resource planning is that much different than, say, Amazon's — and even if I don't like Amazon's system, Working Backwards is a much better and specific resource for implementing that kind of thing, and I didn't like that book either.

Maybe this kind of book is simply Not For Me. I think organizational design and growth is a really tricky, really nebulous subject that resists easy text (High Output Management being a singular exception, and of course cited heavily in Scaling People.) Many things are either so obvious that if you need a book to tell you how to do them you're probably not in the right role or so nuanced and specific that any broader discussion is worthlessly anodyne.

All of this to say: skip this book, perhaps skip all of these books and listen to some of her interviews instead. They’ll be more informative, and more real.


  1. And here is where my reading experience does not reflect the median! ↩︎

  2. The clever riposte to my entire argument is, of course, "well these are the processes and systems that brought those folks in." Are they? ↩︎


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.