Latest Posts (20 found)
Justin Duke 3 weeks ago

October, 2025

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.

1 views
Justin Duke 1 months ago

Business as authorship

When Buttondown was a smaller company, the goal was to, quote unquote, stick around. That mostly meant making: 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. 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?” 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. enough money; providing enough value; and crucially, remaining interesting enough

1 views
Justin Duke 1 months ago

Adding imports to the Django shell

I was excited to finally remove from my file when 5.2 dropped because they added support for automatic model import. However, I found myself missing one other little escape hatch that 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 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:

0 views
Justin Duke 1 months ago

September, 2025

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 have to go through again for a very long time.

1 views
Justin Duke 2 months ago

Hidden coupons

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 ButtonDown 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: 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.

0 views
Justin Duke 2 months ago

Weeknotes 2.0

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

0 views
Justin Duke 2 months ago

Pulumi

I'm spending a lot more time lately using Pulumi. This is for a handful of reasons. The two biggest ones are as follows. 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. Second, external infrastructure is often a dark forest

0 views
Justin Duke 2 months ago

Another reason our pytest suite is slow

I wrote two days ago about how our pytest suite was slow, and how we could speed it up by blessing a suite-wide fixture that was scoped to . This was true. But, like a one-year-old with a hammer, I found myself so gratified by the act of swinging that I found myself also trying to pinpoint another performance issue: why does it take so long to run a single smoke test

0 views
Justin Duke 2 months ago

Why our pytest suite is slow

The speed of Buttondown's pytest suite (which I've written about here , here , and here ) is a bit of a scissor for my friends and colleagues: depending on who you ask, it is (at around three minutes when parallelized on Blacksmith) either quite fast given its robustness or unfathomably slow

0 views
Justin Duke 2 months ago

63 postcards

We have wrapped up the formal portion of DjangoCon. DjangoCon is not Buttondown's first conference that we've sponsored, but it is the first one that we've actually manned a booth at — and we did so in a fashion that I would describe as idiosyncratic, ramshackle, and informed by a charming bootstrapper ethos — which is to say, deeply on brand

0 views
Justin Duke 2 months ago

Django forever

Tomorrow, I am taking a very early morning flight to Chicago to attend DjangoCon US. Buttondown is sponsoring, less as an exercise in lead generation and more as an act of circuitous open source sponsorship, and perhaps "sponsorship" is not quite the right word compared to gratuity in the most literal sense

0 views
Justin Duke 2 months ago

Onboarding survey, one week in

One extremely compelling form of blogging, both for the reader and the writer, is the admission of defeat. Seriously: whenever you find yourself faced with an empty iA Writer window and a dearth of ideas, ask yourself "what have I been wrong about this week. " and let the digital ink flow

0 views
Justin Duke 2 months ago

Goodwill

One of the amazing things about Morrowind is that it's a combat-rich game in which you can feasibly go through much of the game without ever fighting; indeed, gaming up your Disposition with every NPC you meet is a key to a much easier and interesting experience. A major vendor that I rely on has had three major incidents this week

0 views
Justin Duke 2 months ago

August, 2025

The summer heat in Richmond clung to everything this August like a second skin, broken only by afternoon thunderstorms that sent Telemachus scurrying to his fortress of solitude (the upstairs bathroom), and Antibes — Lucy's first European stamps in her passport, her delight at the Mediterranean blue

0 views
Justin Duke 2 months ago

What follows GitHub?

It seems fairly clear that, as far as product lifecycle goes, GitHub is in its “Azure metered billing” stage. I don’t mean this as a negative value judgment in of itself — who am I to argue that GHE is not, from a certain utilitarian point of you, more valuable to the world than all of the things I’m about to kvetch about

0 views
Justin Duke 3 months ago

Ashland, 2025

Trundle is not quite the right word. When I hear trundle , I think of layers, of wool and dampness, of hitting the road before the sun does, wrapped in a blanket and uncaffeinated haze

0 views
Justin Duke 3 months ago

Three apps that will not change your life

After what has felt like a long winter of habitual reliance on my existing tools, I’m finally playing around with some new ones. This is a healthy habit—so long as you don’t convince yourself that you’re just one more App Store download away from a previously unimaginable level of personal satisfaction and joy

0 views
Justin Duke 3 months ago

July, 2025

Telemachus turned five, two weeks ago. He did not have a great July; Richmond's been roiled by storms (ten nights in the past two weeks have ended with him hiding in the bathroom before bravely emerging at two in the morning, having wisely assessed that the threat has passed); add to that the firewo

0 views
Justin Duke 4 months ago

Have you at least tried asking?

My wife got sick this past weekend, and as a result we had to cancel or at least postpone a trip to Seattle that we had been looking forward to. She's feeling much better now, and I am left with the task of recouping what I can from our reservations — a task much more satisfying and much less stressful than force-feeding her electrolytes and naan

0 views
Justin Duke 4 months ago

Bodies Bodies Bodies

More than anything else, Bodies Bodies Bodies is a perfectly reasonable and delightful way to spend 90 minutes. It is beautiful, well-acted, and consistently funny, with a banger soundtrack and a propulsive pace

0 views