How are you doing? Are you doing well?

October's been very fun, as evinced by the length of things I am remiss in writing about: EntryThingy 2.0, Long Live The Post Horn, Spy Game, Poor Things, DuckDB, The War Room, The Straight Story, TypeID, Florida, Hex, Stainless, and more. The days are long; the nights are peaceful; Lucy is obsessed with brioche; Telly got a partial ACL tear and remembers to hobble around on three legs instead of four if my parents are over since they're liable to fall for it; my Schwinn got a tune-up; I wore my Albert slippers for the first time.

Life accelerates; this year is a bullet train. I am free to wander from car to car but nothing changes our speed of one hundred and eighty miles per hour. This month lasted approximately three days; I would not trade those three days for anything in the world.

Post Date Genre
Long Story Short October 3 Television
Fixing CSS variables in Superhuman October 9 Technology
Adding imports to the Django shell October 10 Technology
Sneakers October 12 Film
Cheetah October 13 Technology
Someone built it; someone has to build it October 16 Technology
Business as authorship October 23 Business
Vercel's abstractions October 25 Technology
Fracture October 28 Film
Cheetah II October 29 Technology
Picnic October 30 Technology


This time last year, I wrote glowingly of Slow Horse’s fourth season:

It is rare and difficult for a long-running series to reverse a downward slide. There are simply too many sources of gravity: writers run out of obvious plot lines and have to start re-hashing, Flanderizing, and escaping the confines of the show's existing logic; actors change, and audiences grow tired of what was once novel; it is simply hard to capture lightning and put it back into the bottle, and the commercial demands of the television industry incentivize showrunners to turn their works into shambling ghouls (another year of steady work for the crew, another year of solid residuals, another year of fun with coworkers with whom you've grown fond) rather than a surgical and cohesive narrative arc.

This fifth season does not quite cover itself in glory as much as its immediate predecessor. Lazily, I instead reach to my short review of Season 2:

Not as great as the first season; still tremendously entertaining television, with more than a few twists that I couldn't predict and an underlying thread of competence in set design, pacing, and acting that is hard to deny.

This season felt like reading one too many Creighton or Le Carré novels in short succession: its not so much a lack of quality so much as a lack of novelty, a sense that I’ve seen this all before. Comfort food rather than haute cuisine: which is a tellingly unfair metaphor, because Slow Horses does not at any point pretend that it is haute cuisine.

There’s a bit of an incoherence to everything that feels more sit-commy than I prefer my spy thrillers, especially ones that demand you take their body counts seriously. The centerpiece of the entire thing is Lamb’s Stasi monologue, which depending on your perspective is either paid off or undermined in the final scene; the Libyans make for shallow and uninteresting antagonists, especially compared to last season. Still amped for season six.


Lucy, watching with a curiosity bordering on frenzy as I slowly fry her a single egg in the French style (which is to say drowning in butter); her wary gaze at the yolk lasting a full minute before slamming her face into it, emerging with a giggle, a mouth full of egg, and a nose whose yellow stain transfers quickly to the entire rest of her person —

Lucy, barely awake at 5am, overtired and ravenous, housing an entire peanut butter and jelly sandwich with brioche and Nick's serviceberry jam, and upon doing so she stumbles over to the couch and faceplants into a pillow and goes back to sleep for another hour —

Lucy, having her truly onomatopoeiac slurp of spaghetti at Mario the Baker’s — Mario the Baker’s, the same place, ten feet away from where my grandmother fed me my first garlic roll and my grandfather taught me how to make “special tea” by pouring sugar packets and lemon into iced tea — and then upon my brother’s encouragement first turns the noodle into a lasso and then a sort of banjo string, alternating with each noodle between feast and plaything —

Lucy, perched happily on my shoulders (Ratatouille-ing my hair in lieu of a more convenient handlebar) for the entire walk to En Su Boca, the not-great-but-good-enough Mexican joint where she’ll have two bites of her quesadilla but happily pick away the steak from my burrito and, so tired from the trip she rests her chin on my head and slowly lets her eyes grow narrower and narrower —

What is parenthood? It is many things, but today I am trying to tell you that parenthood is breakfast never being boring again. Every meal becomes a eucharist; every egg you fry is a blessing, even the ones that end up cold and untouched (and finally, mercifully, eaten by Telly) in favor of a handful of blueberries.


I, like so many other people in the Tyler Cowen / Stripe Press extended universe, have deeply enjoyed Dan Wang's annual letters over the past years. And I was delighted to see that he returned to writing in the form of a long-form book, largely about the same subject. In writing my thoughts on this book, I returned to some of his earliest letters, which I found had aged like wine: I cannot recommend enough carving out an afternoon to read them.

Dan has this very specific and lovely blend of impressionism punctuated by hyper-specificity that I find really delightful: it is almost a kind of autofiction, the way he takes you by the hand and guides you through what he’s seen and how he thinks about it. You come away from his writing with the sense of having caught up with a very well-traveled friend from years ago.


Breakneck is a book about the United States and China, with a very specific thesis about the difference between the two countries that is repeated ad nauseam on the off chance that you've forgotten every ten pages or so. The thesis is thus:

China is an engineering state, building big at breakneck speed, in contrast to the United States’ lawyerly society, blocking everything it can, good and bad.

If a book has a thesis, its goal is to convince you of that thesis’s validity; therefore, you must spend some time engaging with its thesis, weighing it in your hands as you might a supermarket orange.

My immediate reaction (during the prologue of the book, so jumping the gun a bit!) was to summon two counterpoints and patiently wait for Dan to address them:

  1. Peak levels of American industrialization and state-sponsored coordination occurred during World War II, during which the makeup of the cabinet and legislative bodies were just as dominated by lawyers as they are today.
  2. Japan’s levels of post-war industrialization, normalized per-capita, roughly match the U.S. during WWII or China over its recent boom, and Japan’s society (and culture) is bureaucratic to an extent that rivals if not surpasses America.

Neither of my quibbles are addressed; Dan indeed does not spend much time interrogating or defending his thesis, and more uses it as a neat bow for every story. (This is lampshaded: Dan says that he aims to be “inventive and even playful with these terms,” which feels like a lame way to avoid serious critique.)

Jonathon Sine, in a kind but excoriating review, makes broader points to dismantle Dan’s argument:

There was never a period in American government when lawyers did not dominate. If anything, lawyers may be less prevalent today in terms of background. Data on the composition of Congress, for example, is one hint. The Congressional share of lawyers has actually plunged to 34% over the last several decades (though it still has very few engineers: the Senate, the more lawyerly body, has 47 lawyers and 1 engineer). Meanwhile, the professionalization of the federal bureaucracy (which is not to say expansion—it has not expanded at all numerically since the 1960s) means executive agencies are probably staffed by a greater share of engineers, technocrats, and non-lawyer professional managerial personnel (though this is speculation).

I compiled the educational backgrounds of China’s Politburo members from 2002 to the present. In 2002, a stunning 70% of Politburo members had undergraduate engineering degrees. But by 2017 the share had fallen to just 20%, before rising again to 33% in 2022. The book does not observe or point out this rise and fall. Instead, it skips any mention of this quite drastic fall and jumps immediately to pointing out the rise of an ostensible aerospace engineering clique at the 20th Central Committee.

And perhaps it is because I am examining his writing through the lens of a Book (big, serious, important) rather than that of a Blog Post (whimsical, esoteric, precious) that I am finding pores and flaws I would have otherwise glossed over, but it feels almost impossible not to notice the lengths to which he tries to skew reality into his argument. Two notable instances:

  1. Describing Joe Biden’s Senate career as being forever wedded to Delaware and Delaware’s interests as contrasted with the Chinese model of rotating officials throughout regions, and neglecting to even quietly mention in an aside the fact that the Senate mechanism for cross-pollination is in the form of subcommittees.
  2. Breakneck’s third chapter — on technology — and yet the details outside of what you might see in general knowledge blogs or New York Times articles are surprisingly shallow. Dan outlines a three-point thesis for Chinese technology, tools, plans, and process power, and argues that process power has been the most important to Shenzhen's success, and then attempts to underscore that point not by talking about China, but about a Japanese onsen continuously repaired every 20 years.

Breakneck is, ultimately, not a good book, a conclusion I come to from a place of love and disappointment. Its goal, in a Straussian sense, is to be an artifact by which Dan can run a circuit on the Ezra Klein Shows of the world, from its clippable thesis to its glossy anecdata.

I agree with Dan that America should be more interested in China. I certainly want to learn more, not just about the big picture Wikipedia-tier stuff, but about the minutiae, the coordination and deployment of capital, the cultural cachet of bureaucracy, and so on.

Dan's writing is incredibly qualitative and anecdotal rather than quantitative. I don't have any inherent problem with this; his writing is at his best when he's talking in the first person, a vibes-based cultural critique akin to mid-period Didion.

But the vast majority of the stories he tells are, bluntly, things that I've already read on Twitter. I have already seen the tweets contrasting China's high-speed rail and SF opening a single mile of track; I have seen the tweets about the size and scale of Shenzhen’s megacampus. Don’t tell me that these things exist: explain, in thorough and fascinating detail, how they came to be!

It is tricky to shift from blogging into long-form writing; good books require weight. I hope Dan keeps writing; I hope he spends more time in the mode of travelogue than of airport nonfiction.


Picnic is an app that can be described in one sentence:

Every day, you see all of the photos you took on that day in previous years, and you decide which ones you want to keep and which ones you want to permanently delete in order to save up space.

The interface is nice, though nothing brilliant — it is simply a good idea executed well. They monetize (cleverly, but not too cleverly) by only letting you sift through 100 photos per day, and if you want to do any more than that, you need to pay something like $5 a month or a heavily discounted annual charge. I can't imagine the kind of person who intentionally uses Picnic for more than a year, but who cares? It has provided me value, both at the practical and sentimental level. It feels very much like a 2014 iOS app in the best possible way: humble intentions, obvious value, and a tiny little bit of whimsy.


I wrote about Cheetah two weeks ago and appreciated the multiple people who quietly whispered in my ear after publication that it was, in fact, a Cursor model.

They have released it and given it the branding of Composer, which, to be clear, is a much worse name:

Our motivation comes from our experience developing Cursor Tab, our custom completion model. We found that often developers want the smartest model that can support interactive use, keeping them in the flow of coding. In our development process, we experimented with a prototype agent model, codenamed Cheetah, to better understand the impact of faster agent models. Composer is a smarter version of this model that keeps coding delightful by being fast enough for an interactive experience.

Branding aside, I'm excited to see this. I've been historically fairly bearish on Cursor's prospects as a company with a long-term moat, even as I count myself an MAU. This is perhaps a devastating blow to that argument because they've built something that, for my use case of LLMs, is overwhelmingly some version of fuzzy copy-paste. I think trade-offs between speed and accuracy are hard to reason about. I suspect that it might be idiosyncratic of me to profess happily trading a little bit of precision for a whole lot of speed.

The reason for that is fairly simple: my use case of LLMs is overwhelmingly some version of a copy-paste. It's rare that I ask an LLM to do something that is not already implemented in a similar fashion somewhere in my codebase, such as:

  1. implementing a bulk action for changing the color of a tag (we already have bulk actions and we already have the ability to change tag colors in the API, just not in bulk)
  2. or recreate the test suite that we have for all Mailgun events except for SendGrid (we have the exact suite, just need updated constants and fixtures)

My mental model of work like this is something like the following: if you were to rate every single LLM on a competence scale of 1 to 100, where 1 is "fired from the job" and 100 is my own competence, all of the work required by this genre of task is usually somewhere between 25 and 75. All of the truly pernicious bugs one can introduce, the really gnarly edge cases, are somewhere between 95 and, like, 125.

Therefore, an LLM that performs at a level of 90 as opposed to 80 actually provides me no value: the work I'm giving it does not benefit from its extra ten points. But if that LLM instead outperforms on speed, well, that is a tangible difference: twenty seconds and five seconds are oceans apart from one another in terms of ability to stay in flow.


Even within the genre of trashy, hyper-masculine crime fiction, there's room for being interesting.

Indeed, one of the saving graces of bad art is that it often has the courage to take wild swings. I think of, for instance, Wild Things and the sheer joy with which it engaged in its many, many bacchanalian excesses, or of Red Sparrow, which fell prey to almost every cliché about cold war espionage writing, but still managed to fit in a couple interesting artistic flourishes here and there.

Bad art that is not even interesting has a spiritual emptiness to it. Not just because it fails at achieving what it sets out to do, but because you often feel like it didn't set out to do anything at all.

And this, of course, is how I feel about Fracture, a film that is not incompetent as much as it is spiritually empty. It was built (a verb I use deliberately) in 2007, but if it had come out today, this is the kind of production that would be accused of having been crafted at every step with an LLM. There is no single part of this film that will surprise you, and no part that won't disappoint you:

  • The direction is schlocky and obvious without being painful.
  • The script is serviceable without being interesting.
  • The plot is exactly as silly and well-paved as you expect it will be 15 minutes into the film, if not sooner.
  • Three weak performances by actors who I quite like but act as if they are in a simulacra of a more interesting film, sleep-walking through their roles with the requisite blank stares and artifice.

What gets to me more than anything else, though, is the ending, in which the writer and director do again exactly what you would expect: a vanilla resolution to events, lacking even the courage of cynicism or menace. (Primal Fear, for instance, while a better film in many ways besides, also was brave enough to feature an ending with finality and dread. They let the bad guy unambiguously win, because that is sometimes how life works.)

And you, as the viewer, are left with the sense of having spent two hours and not gained anything from it at all.


use workflow is cool. I admire Vercel for many things, but in particular for what I will phrase charitably as a steadfast refusal to shackle themselves to the past. One gets the sense of their core philosophy being as simple as:

  1. What’s a problem facing developers?
  2. What’s the best possible experience we can build in solving that problem?
  3. How do we ship that as quickly as possible?

At the same time, I get an overwhelming sense of “the best possible experience” being defined in terms that do not rhyme with my own. Buttondown’s Next sites are simple — almost entirely static — with low code churn and little regard for performance hyperoptimization. The value I get from a lot of the things they work on are academic rather than practical; certainly the improvements I have reaped from, say, App Router does not outweigh the cost in having migrated to it in the first place.

Abstractions feel magical until you are on attempt #22 of trying to fix a bug that appears in production but not on your laptop. Vercel’s (very cool!) A/B pre-compute abstraction which involves building static variants of every possible combination of flags makes for a great demo; then you discover it doesn’t really play nice with Vercel’s (very cool!) og:image generator.

The feeling I get using Vercel’s fancier stuff is, more than anything, that of playing Minesweeper: at this point, I know where most of the bombs are on the grid but I’d prefer they bump down the difficulty level. (I also know I am not the target audience for most of what they spend their time working on, and perhaps my future is with a framework more interested in websites rather than applications like Astro.)


When Buttondown was a smaller company, the goal was to, quote unquote, stick around. That mostly meant making:

  1. enough money;
  2. providing enough value;
  3. and crucially, remaining interesting enough

for me to continue wanting to work on it.

Now that all three of those things have proven themselves infinitely satisfiable, I'm sort of left with the existential crisis that comes from building a company without the explicit goal of world domination.

The thing that I settled on as a North Star to justify continuing to work every day really hard on growing not just the product but the business itself is that I really want to show people this kind of alternate path for creating a software business: A business that is slightly more humane, much more sustainable, and provides substantial value and satisfaction to all involved without having to also bring Faust into the mix.

I think any sort of ambition I have comes more from relative scale than absolute scale, if that makes sense. Leverage is a concept I think about a lot lately. It*'s way more interesting to me to work towards Buttondown becoming a 100-person company (in terms of scope, stability, repute, and polish) that happens to be staffed by 10 people than to have it become a 1,000-person company staffed by a thousand people.

All of this is downstream of my own whims. It is not bluster for me to say that I constantly place my own ideals and idiosyncrasies ahead of Buttondown's objective financial success. Since Buttondown’s first year of existence, I have been awash in offers for capital, offers for acquisition, offers to do a completely unrelated job that happens to pay much, much more — all of which I turn down not even for moral reasons (there are lots of great uses for venture capital! I worked at two companies that would not exist without it!) nor for strategic reasons (it would be nice to throw five million dollars at solving MTAs!) but because, on many days, even the swampland ones where I'm spending a bunch of time digging through random SMTP logs while on hold with a random IP blocklist administrator based in Oslo, building a company feels like a form of authorship.

I have spent the majority of the past five years trying to take how I feel about communication and technology and the social compact and put it into a little app that lets you email other people — this has been so successful that now, I find myself working with lovely people all around the world who agree with what I’m trying to say.


There are three passages I’ve read that I think about almost every day: in order of my having read them, they are from East of Eden, Lincoln in the Bardo, and Working by Steinbeck, Saunders, and Caro respectively.

Steinbeck:

Lee laughed. “I guess it’s funny,” he said. “I know I wouldn’t dare tell it to many people. Can you imagine four old gentlemen, the youngest is over ninety now, taking on the study of Hebrew? They engaged a learned rabbi. They took to the study as though they were children. Exercise books, grammar, vocabulary, simple sentences. You should see Hebrew written in Chinese ink with a brush! The right to left didn’t bother them as much as it would you, since we write up to down. Oh, they were perfectionists! They went to the root of the matter.”

“And you?” said Samuel.

“I went along with them, marveling at the beauty of their proud clean brains. I began to love my race, and for the first time I wanted to be Chinese. Every two weeks I went to a meeting with them, and in my room here I covered pages with writing. I bought every known Hebrew dictionary. But the old gentlemen were always ahead of me. It wasn’t long before they were ahead of our rabbi; he brought a colleague in. Mr. Hamilton, you should have sat through some of those nights of argument and discussion. The questions, the inspection, oh, the lovely thinking—the beautiful thinking.

“After two years we felt that we could approach your sixteen verses of the fourth chapter of Genesis. My old gentlemen felt that these words were very important too—‘Thou shalt’ and ‘Do thou.’ And this was the gold from our mining: ‘Thou mayest.’ ‘Thou mayest rule over sin.’ The old gentlemen smiled and nodded and felt the years were well spent. It brought them out of their Chinese shells too, and right now they are studying Greek.”

Samuel said, “It’s a fantastic story. And I’ve tried to follow and maybe I’ve missed somewhere. Why is this word so important?”

Lee’s hand shook as he filled the delicate cups. He drank his down in one gulp. “Don’t you see?” he cried. “The American Standard translation orders men to triumph over sin, and you can call sin ignorance. The King James translation makes a promise in ‘Thou shalt,’ meaning that men will surely triumph over sin. But the Hebrew word, the word timshel—‘Thou mayest’— that gives a choice. It might be the most important word in the world. That says the way is open. That throws it right back on a man. For if ‘Thou mayest’—it is also true that ‘Thou mayest not.’ Don’t you see?”

Saunders:

Please do not misunderstand. We had been mothers, fathers. Had been husbands of many years, men of import, who had come here, that first day, accompanied by crowds so vast and sorrowful that, surging forward to hear the oration, they had damaged fences beyond repair. Had been young wives, diverted here during childbirth, our gentle qualities stripped from us by the naked pain of that circumstance, who left behind husbands so enamored of us, so tormented by the horror of those last moments (the notion that we had gone down that awful black hole pain-sundered from ourselves) that they had never loved again. Had been bulky men, quietly content, who, in our first youth, had come to grasp our own unremarkableness and had, cheerfully (as if bemusedly accepting a heavy burden), shifted our life’s focus; if we would not be great, we would be useful; would be rich, and kind, and thereby able to effect good: smiling, hands in pockets, watching the world we had subtly improved walking past (this empty dowry filled; that education secretly funded). Had been affable, joking servants, of whom our masters had grown fond for the cheering words we managed as they launched forth on days full of import. Had been grandmothers, tolerant and frank, recipients of certain dark secrets,who, by the quality of their unjudging listening, granted tacit forgiveness, and thus let in the sun. What I mean to say is, we had been considerable. Had been loved. Not lonely, not lost, not freakish, but wise, each in his or her own way. Our departures caused pain. Those who had loved us sat upon their beds, heads in hand; lowered their faces to tabletops, making animal noises. We had been loved, I say, and remembering us, even many years later, people would smile, briefly gladdened at the memory.

Caro (with apologies for the length):

Because there was no electricity, there were no electric pumps, and water had to be hauled up—in most cases by the women on the farms and the ranches, because not only the men but the children, as soon as they were old enough to work, had to be out in the fields. The wells in the Hill Country were very deep because of the water table—in many places they had to be about seventy-five feet deep. And every bucket of water had to be hauled up from those deep wells. The Department of Agriculture tells us that the average farm family uses two hundred gallons of water a day. That’s seventy-three thousand gallons, or three hundred tons, a year. And it all had to be lifted by these women, one bucket at a time.

I didn’t know what this meant. They had to show me. Those women would say to me, “You’re a city boy. You don't know how heavy a bucket of water is, do you?” So they would get out their old buckets, and they'd go out to the no-longer-used wells and wrestle off the heavy covers that were always on them to keep out the rats and squirrels, and they’d lower a bucket and fill it with water. Then they’d say, “Now feel how heavy it is.” I would haul it up, and it was heavy. And they’d say, “It was too heavy for me. After a few buckets I couldn't lift the rest with my arms anymore.” They'd show me how they had lifted each bucket of water. They would lean into the rope and throw the whole weight of their bodies into it every time, leaning so far that they were almost horizontal to the ground. And then they’d say, “Do you know how I carried the water?” They would bring out the yokes, which were like cattle yokes, so that they could carry one of the heavy buckets on each side.

Sometimes these women told me something that was so sad I never forgot it. I heard it many times, but I’ll never forget the first woman who said it to me. She was a very old woman who lived on a very remote and isolated ranch—I had to drive hours just to get out there—up in the Hill Country near Burnet. She said, “Do you see how round-shouldered I am?” Well, indeed, I had noticed, without really seeing the significance, that many of these women, who were in their sixties or seventies, were much more stooped and bent than women, even elderly women, in New York. And she said: “I’m round-shouldered from hauling the water. I was round-shouldered like this well before my time, when I was still a young woman. My back got bent from hauling the water, and it got bent while I was still young.” Another woman said to me, “You know, I swore I would never be bent like my mother, and then I got married, and the first time I had to do the wash I knew I was going to look exactly like her by the time I was middle-aged.”

To show me—the city boy—what washdays were like without electricity, these women would get out their old big “Number 3” zinc washtubs and line them up—three of them—on the lawn, as they had once every Monday. Next to them they’d build a fire, and they would put a huge vat of boiling water over it.

A woman would put her clothes into the first washtub and wash them by bending over the washboard. Back in those days they couldn’t afford store-bought soap, so they would use soap made of lye. “Do you know what it's like to use lye soap all day?” they'd ask me. “Well, that soap would strip the skin off your hands like it was a glove.” Then they’d shift the clothes to the vat of boiling water and try to get out the rest of the dirt by “punching” the clothes with a broom handle—standing there and swirling them around like the agitator in a washing machine. Then they’d shift the clothes to the second zinc washtub—the rinsing tub—and finally to the bluing tub.

The clothes would be shifted from tub to tub by lifting them out on the end of a broomstick. These old women would say to me, "You’re from the city—I bet you don't know how heavy a load of wet clothes on the end of a broomstick is. Here, feel it.” And I did—and in that moment I understood more about what electricity had meant to the Hill Country and why the people loved the man who brought it. A dripping load of soggy clothes on the end of a broomstick is heavy. Each load had to be moved on that broomstick from one washtub to the other. For the average Hill Country farm family, a week’s wash consisted of eight loads. For each load, of course, the woman had to go back to the well and haul more water on her yoke. And all this effort was in addition to bending all day over the scrubboards. Lyndon's cousin Ava, who still lives in Johnson City, told me one day, “By the time you got done washing, your back was broke. I’ll tell you—of the things in my life that I will never forget, I will never forget how my back hurt on washdays.” Hauling the water, scrubbing, punching the clothes, rinsing: a Hill Country wife did this for hours on end; a city wife did it by pressing the button on her electric washing machine.

Tuesday was ironing day. Well, I don’t intend to take you through the entire week here, but I'll never forget the shock it was for me to learn how hard it was to iron in a kitchen over a woodstove, where you have to keep throwing the wood in to keep the temperature hot all day. The irons—heavy slabs of metal—weighed seven or eight pounds, and a Hill Country housewife would have four or five of them heating all day. In the Hill Country it’s nothing for the temperature to be 100 or even 105 degrees, and those kitchens would be like an oven. The women of the Hill Country called their irons the “sad irons.” I came to understand why.

I came to realize that the man I was writing about had grown up in an area that was a century and more behind the rest of America, an area where life was mostly a brutal drudgery. When Lyndon Johnson became congressman he promised the people of the Hill Country that he would bring them electricity. They elected him congressman, but nobody really believed that he could do it. For one thing, there was no source of hydroelectric power within hundreds of miles. A dam had been begun on the lower Colorado River some years earlier, but the company that was building it had gone bankrupt in the Depression and its future was very uncertain. New federal financing was needed, and only the President could push that dam to completion. When Johnson got to Washington he became friends with Thomas Corcoran—“Tommy the Cork”—who was close to Roosevelt. Every time Johnson saw Corcoran he would say, “The next time you see the President, remind him about my dam.” And Corcoran reminded Roosevelt so often that finally one day Roosevelt said in exasperation, “Oh, give the kid the dam.”

Once the dam was built, there was a source of electric power, but there still seemed no feasible way of getting this power out to the people. The Rural Electrification Administration had minimum density standards—about five persons per square mile, I think it was—and they said, “We're not going to lay thousands and thousands of miles of wire to connect one family here and another family over there.” The story of how Lyndon Johnson persuaded the REA to do this—how he circumvented through his ingenuity not only the REA but dozens of government agencies and regulations and brought the people electricity—is one of the most dramatic and noble examples of the use of government that I have ever heard. Actually it took more than ten years—it was 1948 before some of the people got electricity. But they did get it, and the men I talked to who had worked on the line-laying crews would tell me how they never had to bring lunch because the farm families were so grateful. When they saw the crews coming, stretching that precious wire toward them across the hills, they would set tables outside, with their best linen and dishes, to welcome the men.

And all over the Hill Country, people began to name their children after Lyndon Johnson. This one man had changed the lives of more than one hundred thousand people—had brought them, practically by himself, into the twentieth century, and when Tommy Corcoran said to me, shortly before he died, “Lyndon Johnson was the best congressman for a district that ever was,” I knew exactly what he meant.


Building anything of value requires tenacity that borders on mania; every good part of the built world in which we live is either natural providence or the life’s work of someone you’ll never get to meet.

If you find yourself in the fortunate position to build one of these things — to improve the world and in so doing tell people things that you can’t phrase in words — I implore you to do it. It will not be easy; it will be worth it.


This afternoon I stumbled upon this ticket from Tom Forbes about a faster bulk update mechanism in Django.

Django's ORM workings can be complex, but the concept behind the ticket is fairly simple. If you were to use bulk_update, like so:

subscribers = Subscribers.all()
for s in subscribers:
  s.subscriber_type = random.choice(['good','bad'])

Subscriber.objects.bulk_update(subscribers, ['subscriber_type'])

This compiles into a query like this:

UPDATE emails_subscriber
SET subscriber_type = (
  case when id = 1 then 'a'
  case when id = 2 then 'b'
  case when id = 3 then 'b'
  case when id = 4 then 'a'
)

This genre of query, beyond being an eyesore, is obviously "bad" especially if you imagine the common use case for a bulk update (not four rows, but hundreds or thousands.) The more proper way to compile such a query is something like this:

UPDATE emails_subscriber
SET subscriber_type = v.subscriber_type
FROM (VALUES (1, 'a'), (2, 'b'), (3, 'b'), (4, 'a')) AS v(id, subscriber_type)
WHERE emails_subscriber.id = v.id;

I bring this up for three reasons:

  1. A reminder to myself that some of our most expensive queries are bulk updates of this genre, and we should probably optimize them;
  2. We've known for seven years that a core Django API is sub-optimal, as if we needed more proof that there's tremendous value in investing in optimizing frameworks, even mature ones;
  3. It can be tempting to treat framework internals as haunted forests whose decisions and mechanisms are so abstract as to be unknowable and so obscure as to be untouchable. In reality, they are just like anything else: an accumulation of decisions made by smart people, over time, in a particular context, under particular constraints. Someone built it; it can probably be improved, but someone has to build that too.


My usage of LLM tooling has plateaued — a word I use deliberately.

I feel like I've developed a pretty solid sense over the past three months of what these models can do and are good for and, inversely, what they can't, and I've largely curtailed my usage of them accordingly:

  1. "codemod"-shaped work;
  2. MVPs that can afford to be poorly written;
  3. First cuts that I know I'm going to go back and refactor heavily.

I'm not trying to undersell the value here: if LLM progress halted tomorrow, I'd still consider the technology invaluable and a significant driver of my incremental productivity.

Being an LLM centrist is boring, I know. But I think both sides of the quality debate around LLM tooling is largely overstating the case. The code is not garbage, nor is it perfect. It is generally around average, and there are many applications in which average is a perfectly fine benchmark. (Buttondown is not one of those, and I say that out of realism rather than pride: we are resource-constrained and therefore need to draw a lot of leverage from the strength of our code base.)


A new tool has entered the chat, though, which is Cheetah. Cheetah is a stealth model, a concept I frankly hate. Theories of who "owns" Cheetah range from the obvious subjects to the more arcane ones, and feel immaterial relative to the question of "is the model's quality durable enough to withstand general availability?"

My experience of using Cheetah is that it is more or less at par with the code quality of its contemporaries: like GPT-5 and Sonnet 4.5, it is a machine for generating average quality code.

Where Cheetah wins, though, is speed. Cheetah is an order of magnitude faster than those aforementioned peers: small tasks that would take Sonnet three minutes take Cheetah five seconds. This matters a lot! My frustration with LLM-based tooling draws in no small part from the slowness of the REPL and the pain of context switching back into whatever I asked a model to do; with Cheetah, you are never switching context because it is fast enough (not unline the inline-editing or autocompletion affordances popularized by Copilot) to keep you in flow.

The net result of this is that I'm asking Cheetah to do much more than I have asked other models to do, in a way that feels pragmatic rather than aspirational.


https://share.cleanshot.com/gKFQRTKf

Cosmo: What's wrong with this country, Marty? Money. You taught me that. Evil defense contractors had it, noble causes did not. Politicians are bought and sold like so much chattel. Our problems multiply. Pollution, crime, drugs, poverty, disease, hunger, despair; we throw gobs of money at them! The problems always get worse. Why is that? Because money's most powerful ability is to allow bad people to continue doing bad things at the expense of those who don't have it.

Martin Bishop: I agree. Now who did you say you were working for?

Sneakers is not a great movie. It's also not a particularly bad movie, and it's filled with lots of things to like, if not love. While Redford is perhaps the least convincing red teamer in cinematic history, he's still Robert Redford, and his commanding performance that managed to blend earnestness, guile, and charm is deeply winning, as well as the coterie of scene-chewing performances from the crew that surrounds him. There are a couple of indelible scenes, not the least of which are "Too Many Secrets" and the opening heist that immediately sets you into an understanding of what this movie wants to be. And then there's also a lot of things that probably felt like clichés 30 years ago, and even more so now. But I don't think this movie was trying to be revolutionary, and it succeeded in being a good hang with a lovely and interesting score. I get why people love this. I can imagine that there is an alternate history in which I watched this at six years old and it became a major part of my identity.

And indeed, the movie has a six-year-old's sense of narrative cohesion. how would you describe the final act? robert redford's character lies, tries to pull one over on the mafia, who 30 minutes ago were sufficiently threatening that he could never show his face in public again. but this time they're just going to let him win. then he pulls the same with the us government, who in the first act of the film were sufficiently threatening. and finally, in the postscript, the thing that his character spends the film railing against, the ability for one man to have all of that agency and all of that power. it turns out he uses it anyway to take some money from the RNC. Maybe it's weird to try and ascribe any sense of moral valence to this movie; certainly, it seems like a poor use of mental energy, but one of the things that I often struggle with revisiting films from the 90s and the early aughts is this exact level of tonal whiplash, where in one scene a member of the Russian consulate is shot dead in cold blood, and in the next scene we, the audience, are supposed to laugh at a man behind the man who pulled the trigger.


I was excited to finally remove django-extensions from my pyproject.toml file when 5.2 dropped because they added support for automatic model import. However, I found myself missing one other little escape hatch that django-extensions exposed, which was the ability to import other arbitrary modules into the namespace. Django explains how to do bring in modules without a namespace, but I wanted to be able to inoculate my shell, since most of my modules follow a similar structure (exposing a single call function).

It took the bare minimum of sleuthing to figure out how to hack this in for myself, and now here I am to share that sleuthing with you. Behold, a code snippet that is hopefully self-explanatory:

from django.core.management.commands import shell


class Command(shell.Command):
    def get_namespace(self, **options):
        from emails.models.newsletter import actions as newsletter_actions
        from emails.models.subscriber_import import actions as subscriber_import_actions

        namespace = super().get_namespace(**options)
        namespace["newsletter_actions"] = newsletter_actions
        namespace["subscriber_import_actions"] = subscriber_import_actions

        return namespace


Part of running a business like Buttondown is spending more time than you'd like installing esoteric email clients and trying to debug odd rendering behavior. Superhuman is one such client, but they do us the favor of being an Electron app with a concomitant Chrome extension. So rather than having to guess at what the black box is telling you, you can just pop open Chrome Inspector and see exactly what's happening in the DOM.

Specifically, we had someone write in and say that their spacing on their emails was a little wonky for reasons passing understanding. I installed and poked around Superhuman and discovered the root cause, which is that Superhuman wraps the emails that they're rendering in a shadow DOM node, a perfectly reasonable thing to do. However, we declare some CSS variables in our emails. And in fact, that CSS variable is what was getting stripped out.

Take the following example:

:root {
  --my-color: red;
}

p {
  color: var(--my-color);
}

Simple enough, right? Now imagine that embedded in a page with a shadow DOM:

<template>
  <style>
    :root {
      --my-color: red;
    }
  </style>
  <p>This text should be red.</p>
</template>

And yet:

The solution to this is simple and probably why you are here if you're on this article because you googled Superhuman CSS rendering. Instead of declaring the variable on a root, you need to also declare it on :host, which allows the scoping to attack DOM nodes or shadow root DOM nodes as well:

:root,
:host {
  --my-color: red;
}

p {
  color: var(--my-color);
}


Long Story Short, feels like in many ways a synthesis of everything Raphael and Lisa have been trying to do and say, packaged in a slightly more mature and restrained way than the excesses of Bojack Horseman and their respective written fiction (everyone should read Someone Who Will Love You in All Your Damaged Glory).

There's still a lot of experimentation here — a post-modernism that takes advantage of the animated medium without losing the plot, just very little playing around with what a television show can be just for the sake of it. It's still of a kind with Bojack: every character is given warmth and humanity even as they're taken to trial for their sins; the voice cast is excellent, and every scene has whiplash dialogue that manages to sound both realistic and completely absurdly hilarious.

This is not an audacious leap forward by an auteur ready to take the next step; it's just a really, really good season of television informed by all of the work that they've done in the past. Is anything in here quite as powerful as the best parts of BoJack? I don't think so, but I think that might be an unfairly high bar. It's still tremendously good television, and I'm already looking forward to the second season.

(About that second season — I'm not sure any show that is more aggressively tailored to my interests has, at least in my little corner of the zeitgeist, been subject to so little fanfare. It is not obvious that this show has even been released. This is probably equal parts a condemnation of my own level of pop cultural awareness right now and just how fractious the television landscape has become.)


The last of summer's grip finally loosened its hold this September, and Richmond began its annual transformation into something gentler and more contemplative. This morning's walk with Telly required a dusting-off of the closet-buried Patagonia puffer jacket; it's perfect for walks with Lucy, who has graduated into the Big Kid stroller making it easier than ever for her to point at every dog ("dah!"), every bird (also "dah!"), every passing leaf that dared to flutter in her line of sight.

As you will read below, the big corporate milestone for me this month was sponsoring Djangocon and having our first offsite over the course of a single week. Sadly, our Seattle trip was once again canceled. Haley and Lucy both got a little sick, and we had to abandon course. It's weird to think this will be the first year since 2011 that we have not stepped foot in the Pacific Northwest.

More than anything though, I learned this month for the first time how impossibly difficult it is to be away from your daughter for six days. It is something I hope I don't have to go through again for a very long time.

Post Date Genre
What follows GitHub? September 2 Technology
From Up On Poppy Hill September 3 Film
Goodwill September 5 Business
Onboarding survey, one week in September 6 Business
Django forever September 7 Technology
63 postcards September 11 Personal
Pulumi September 17 Technology
Weeknotes 2.0 September 21 Personal
SABLE, fABLE September 22 Music
Hidden coupons September 29 Business


Much of our work at Buttondown revolves around resolving amorphous bits of state and cleaning it up to our ends, particularly state from exogenous sources. This manifests itself in a lot of ways: SMTP error codes, importing archives, et cetera. But one particularly pernicious way is straight. An author can come to Buttonown having already set up a Stripe account, whether for some ad hoc use case or because they were using a separate paid subscriptions platform such as Substack or Ghost that also interfaces with Stripe. And one of the first things we do is slurp up all that data so we understand exactly what their prior history is, how many paid subscribers they have, et cetera. As you might imagine, this is very, very effective because the biggest perceived barrier for users is friction and how difficult it is for them to move from one place to another. And every time we can make it incrementally easier for them, it's worth our while. However, as you can also imagine, we deal with a lot of edge cases and idiosyncratic bits of behavior from Stripe. (And if anyone from Stripe is reading this essay, please don't interpret it as that large of a complaint because Connect is a pretty impressive bit of engineering, janky as it is.)

One thing we have to do is pull in all coupon and discount data. So this is for a variety of reasons that are all uninteresting. The point of this essay is to talk about a divergence and where the abstract breaks down.

You might think, as we once did, that the way to do this is pretty simple. You compile a list of all the available coupons, and then you iterate through every single subscription looking for said coupons. This is also the approach outlined in the docs and surfaced in the dashboard, so your naivete is excusable.

However, this neglects to highlight an entirely different genre of discount, which is ad hoc discounts that are created and applied during the checkout session process, as well as probably a couple other places in which I'm unaware. To iterate through these, you must iterate through the subscriptions themselves:

tangible_coupon_ids = [c.id for c in stripe.Coupon.list().auto_paging_iter()]
intangible_coupons = []
for subscription in stripe.Subscription.list():
  if not subscription.discount:
    continue
  if subscription.discount.coupon.id not in tangible_coupon_ids:
    intangible_coupons.append(subscription.discount.coupon.id)

I'm sure there are a lot of interesting and nuanced reasons why these intangible coupons are not actually available through the core endpoint — I also don't care! It is a bad abstraction that I can get two different answers for "what are the coupons for this account?"; it is particularly bad because the "real" answer is by looking in the non-obvious place.

At the same time, I am sympathetic. "I should not have to create a dedicated Coupon object just to apply a single discount to a single subscription" is a very reasonable papercut that I understand Stripe's desire to solve; in so doing, they created a different (and perhaps more esoteric) problem. This is why API design is a fun and interesting problem.


I have been going through a certain kind of reckoning with my previous self and the things that I loved back when I was an undergrad with fewer things on my mind and more time to listen to music — and even more importantly, more time to spend being the person who has listened to music. I blame the new Blind Pilot album — the idea that my favorite band could record an album that I didn't even find disagreeable, but just supremely forgettable, has me in a constant state of mild panic that the couture indie band that I had made my cause célèbre for some random spring semester turned out, in fact, not to be an important part of my personal tapestry, but yet another 7.4 on Pitchfork to be lost like so many tears in the rain.

And I say all this as preface for the zag, which is Bon Iver was and is not one of those artists. I did not like a lot of his post self-titled output because I felt then, as I felt now, that trying to achieve some sort of post-modernism via funny Unicode song titles felt like a cheap and disingenuine way out of whatever he was trying to negotiate with himself. But those first two albums are absolutely above reproach! For Emma, Forever Ago, far from being dated, feels more timeless now than it did when I first listened to it. And it has the double pleasure of taking me not just to the same cabin Justin Vernon sat in all those winters ago, but the cabins, metaphorical and otherwise, that I was in as I listened to it as that bright-eyed and bushy-tailed undergrad, hoping more than anything that I would be able to get a PBR without getting caught.

(You could probably spin all of that into a single narrative, which is Justin Vernon recognizing himself as being the For Emma guy and spending a decade trying to escape it, as if escaping the pigeonhole he created for himself would also help him escape the conditions that brought him his fame: an angel's voice and a shattered heart.)

It is perhaps overthinking it to call this album an extended reckoning, but it's also — despite the annoyingly ironic capitalization in the title — a very earnest record, bordering, if not infringing, on 80s dad rock at times, in a way that doesn't feel like cosplay but feels like the turn Vampire Weekend made with Father of the Bride — a new kind of music that represents neither stagnation nor escape, but a logical progression. And so many of its songs — If Only I Could Wait, There's a Rhythm — are great in the same way Holocene was great: an instant recognition that it would stick with you for a decade, and maybe longer still.


Once upon a time, I wrote weeknotes for Buttondown. I’ve started them up again—the first edition is linked below. I’ll spare you the navel-gazing about whether they belong there or on the blog (I cover that in the other post). In short: this won’t really affect the blog. Most of what will go into weeknotes are things I’ve been too much of a coward to blog about until now. So, consider this just more content for your enjoyment.

Two quick programming notes:

  1. The subscriber lists for the blog and weeknotes will remain separate. I’ll make sure to occasionally nudge folks from one list to the other, and might even use this as a chance to dogfood some cross-promotional features—like, how do you send a CTA only to people not already subscribed to a given list? Still, it’s important (for my brain and heart) that these stay truly independent publications, as grandiose as that sounds. I want to keep firing off takes about ’70s cinema without worrying about The Brand, and vice versa.

  2. As for this site: I’d like to cross-publish weeknotes here, but right now that’s basically impossible. So, I’ll probably use this as an excuse to rejigger the design into something a bit more microbloggy. I’m especially inspired by Gina's newly launched “note to self,” which nails the vibe I’m after: a mix of short, link-blogging-style posts and longer standalone pieces.

Read the weeknotes

I'm spending a lot more time lately using Pulumi. This is for a handful of reasons. The two biggest ones are as follows.

  1. First, we're ramping up our investment in quote-unquote infrastructure. We're sending a lot from our own machines and want to be able to scale that up in a way that is more observable, predictable, and legible.

  2. Second, external infrastructure is often a dark forest. It's very, very easy to change state, i.e., swap over a dyno in Heroku or futz with some settings in S3 and never propagate those Changes back to internal docs. This creates a vicious cycle in which someone looks at the docs, notices a difference between the docs and reality, and then decides that the docs aren't worth the time to read, let alone to write.

I approach tools like Pulumi as a bit of an outsider. I’ve never really had to deal with this class of DevOps tooling before—either I was at a small company where orchestration wasn’t worth the trouble, or at a big company where the whole problem was abstracted away. So, if you’re reading this with more experience, you might see some of what follows as naive, or even a little clueless. (Tell me what I'm missing!)

That said: Pulumi is genuinely cool, but I still find myself baffled every time I use it. I get the high-level idea: you declare your infrastructure as code, store the state somewhere, diff the code and the state (and the state and reality), and then apply changes. But the process just feels unnecessarily painful, which makes me wonder if I’m missing something obvious.

Why isn’t there a one-click way to declare all my state in Cloudflare? Why do I have to write a bunch of ad hoc scripts just to slurp up zone records? Why does every provider have its own slightly weird authentication scheme? There are a lot of stubbed toes along the way.

And yet, once you get past all that, it’s still extremely cool. I love being able to write five lines of Python and add MX records to 20 servers at once. I love that those same lines of Python can double as living documentation. Pulumi is a genuinely useful abstraction—one that sometimes feels like it’s succeeding in spite of itself.

A lot of the best advances in developer tooling over the last decade have been about taking practices that were once exclusive to resource-rich, cutting-edge companies and making them accessible to everyone else. There’s a similar opportunity here, especially now that LLMs make it so much easier to reason about your system architecture when it’s all laid out in a tidy YAML file.

Honestly, I think a hyper-opinionated, polished successor to Pulumi—one that nails the first-run experience—would absolutely crush. And if you know of something like that already, please let me know.


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.