<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/feed.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Applied Cartography</title>
    <link>https://jmduke.com</link>
    <description>Essays and media reviews by Justin Duke</description>
    <language>en-us</language>
    <lastBuildDate>Thu, 24 Sep 2026 23:08:07 GMT</lastBuildDate>
    <atom:link href="https://jmduke.com/feed.xml" rel="self" type="application/rss+xml"/>
    <image>
      <url>https://jmduke.com/favicon.svg</url>
      <title>Applied Cartography</title>
      <link>https://jmduke.com</link>
    </image>
        <item>
      <title>The new look</title>
      <link>https://jmduke.com/posts/the-new-look.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-new-look.html</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>As you may have noticed, the site has a new look. I don&amp;#39;t think of it as a new version of the site, in no small part because the structure has not changed at all.</description>
      <content:encoded><![CDATA[<p>As you may have noticed, the site has a new look. I don&#39;t think of it as a new <em>version</em> of the site, in no small part because the structure has not changed at all.</p>
<p>This is mostly a very messy conglomeration of two template files and a bunch of JavaScript and CSS applied to the same underlying build script and content taxonomy that I&#39;ve been very happy with for quite a while. There was a very oblique reason for this change, which was my friend Ryan asking for a blogroll of folks whose writing I enjoyed. I couldn&#39;t figure out a nice way to surface this, even though I did have it in my site&#39;s repository already.</p>
<p>So one thing led to another, and here we are. This is certainly not the greatest implementation of this kind of idea that has ever existed, but the thing that I like about mine compared to many of the others that I&#39;ve seen is that I get to take advantage of what is approaching a decades-long corpus of writing and thinking — much of it sloppy, but all of it mine.</p>
<p>I hope you enjoy it too, and please let me know what feels janky or outright buggy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Vue</title>
      <link>https://jmduke.com/posts/vue.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/vue.html</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>The most common follow-up question I got about the post I wrote on Django last month had nothing to do with Django at all. It was about a comment I tossed off about React and Vue, and my regret in choosing Vue all those years ago.1Which is a far cry from 2017, when I called Vue pragmatic and meant it as the highest compliment.</description>
      <content:encoded><![CDATA[<p>The most common follow-up question I got about <a href="https://buttondown.com/blog/what-i-love-about-django">the post I wrote on Django</a> last month had nothing to do with Django at all. It was about a comment I tossed off about React and Vue, and my regret in choosing Vue all those years ago.<label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Which is a far cry from <a href="/posts/what-vue-needs-next.html">2017</a>, when I called Vue <em>pragmatic</em> and meant it as the highest compliment.</span></p>
<p>I don&#39;t want this to be a particularly harsh or negative essay, so let me start with how I made the decision — which was, in retrospect and given how Buttondown has grown, laughably naive. I chose <a href="https://www.djangoproject.com/">Django</a> and <a href="https://vuejs.org/">Vue</a> because I had just started a job in which I would be writing Django and Vue, and I didn&#39;t want to have to context switch. I was a pretty mature Django developer at that point but an immature Vue developer, so I thought of this as a great opportunity to learn the framework.<label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">In a fit of cosmic irony, said company has since gone under. Buttondown persists.</span></p>
<p>To be clear: on the scale of poor technical choices I&#39;ve made with Buttondown, Vue is certainly not in the top three. It might not even be in the top ten.</p>
<hr>
<p>What I do find myself ruing about Vue falls into two buckets: minor aesthetic differences, and what I would describe as a <em>permanently lagging</em> ecosystem.</p>
<p>In the realm of minor aesthetic differences, I&#39;ve found the core <a href="https://vuejs.org/guide/scaling-up/sfc.html">SFC</a> abstraction painfully limiting. It introduces weight — a tax, really — on component refactors and small bits of shared code.</p>
<p>Vue&#39;s clumsy <a href="https://v3-migration.vuejs.org/">migration from 2 to 3</a>, and its inability to rip the Band-Aid off and get everyone onto the <a href="https://vuejs.org/api/sfc-script-setup.html"><code>&lt;script setup&gt;</code></a> style, has also fragmented the documentation and the general zeitgeist. I think this compounds what was already a problem even back then: the sheer enormity of <a href="https://react.dev/">React</a>&#39;s user base makes its ecosystem that much better.<label class="sidenote-toggle" for="sn-3">3</label><input type="checkbox" id="sn-3" class="sidenote-toggle-checkbox"><span class="sidenote">I don&#39;t think it&#39;s a coincidence that Evan&#39;s most successful projects — <a href="https://vite.dev/">Vite</a> and, more recently, <a href="https://voidzero.dev/">VoidZero</a> — have been the ones that target the entire JavaScript ecosystem rather than just Vue.</span></p>
<p>We&#39;ve had to reinvent things that would be trivial dependencies to pull in over in React land, like sprites and <a href="https://storybook.js.org/">Storybook</a>. We&#39;ve had to completely shift our use of libraries that originally targeted both React and Vue, because they eventually abandoned Vue (<a href="https://headlessui.com/">Headless UI</a> being the most painful example).</p>
<hr>
<p>None of this is dramatic or exponentially painful. Buttondown as a business would probably be somewhere between 5—15% larger if we were using React instead of Vue — which is non-trivial, but not worth rewriting the entire author-facing application over.</p>
]]></content:encoded>
    </item>
    <item>
      <title>State and Main</title>
      <link>https://jmduke.com/posts/state-and-main.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/state-and-main.html</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>Go, you Huskies!</description>
      <content:encoded><![CDATA[<blockquote>
<p>Go, you Huskies!</p>
</blockquote>
<blockquote>
<p>It&#39;s not a lie... it&#39;s a gift for fiction.</p>
</blockquote>
<p>For all of his foibles, Mamet can write dialogue like no one else, and the chance to hear his words in the trappings of a sort of proto-<em>Hail, Caesar!</em> — a film about filmmaking — is too good an opportunity to pass up.</p>
<p>This movie is cynical and odd. It contains a bunch of great writing, delivered by horrible people, portrayed by actors you are excited to see; the net effect is a film that you feel slightly more rotten for having seen.</p>
<hr>
<p>And yet: the best deconstructions are also love letters. Mamet names the mayor of this town — which could essentially be <a href="/posts/it-s-a-wonderful-life.html">Bedford Falls</a> — <em>George Bailey</em>. He also quickly dispenses with the traditional narrative (a large capitalist entity rolling over and squashing small-town people with big hearts) by laboring to show us how strange and urbane and awful the townspeople are, too.</p>
<hr>
<p>Almost everyone is <em>terrific</em> in this, in all senses of the word, and in ways that feel just self-referential enough to suggest recursion. Alec Baldwin&#39;s main plot arc is his inability to not sleep with underage girls; the girl in question (Julia Stiles) is written as a pursuer rather than a victim. Rebecca Pidgeon steals the show as a sort of saintly manic pixie dream girl who also incites much of the plot by leaving her fiancé on a whim.</p>
<p>It is also — lest any of this obscure the point — an intensely frenetic and funny movie.</p>
]]></content:encoded>
    </item>
    <item>
      <title>To Live and Die in L.A.</title>
      <link>https://jmduke.com/posts/to-live-and-die-in-l-a.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/to-live-and-die-in-l-a.html</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <description>To Live and Die in L.A. is a movie I find remarkable in its ability to drown you with positive and negative qualities — so many of each, and so evenly matched, that the two perfectly balance out and leave you with a hangover.</description>
      <content:encoded><![CDATA[<p><em>To Live and Die in L.A.</em> is a movie I find remarkable in its ability to drown you with positive <em>and</em> negative qualities — so many of each, and so evenly matched, that the two perfectly balance out and leave you with a hangover.</p>
<p>Consider the ledger:</p>
<ul>
<li>The character work is borderline incomprehensible — though I love Rick Masters altogether, and I love that his arc is left largely unresolved.</li>
<li>The direction is beautiful (Friedkin! Müller!) and hamstrung by an atonal, often sitcom-esque pacing.</li>
<li>The chase scene&#39;s heights are cancelled out by some truly awful reaction shots from John Pankow.</li>
</ul>
<p>And then there&#39;s the sense that the whole thing somehow exists as a fever dream, untouchable by the artifice of any character besides our central few.</p>
<hr>
<p>The ending wants you to interpret it either very somberly or very trivially, which is not unlike the rest of the film. Perhaps I needed to grow up a decade earlier to appreciate it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Pale King</title>
      <link>https://jmduke.com/posts/the-pale-king.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-pale-king.html</guid>
      <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
      <description>I came to The Pale King with the same skepticism I brought to Infinite Jest — for different reasons. With Infinite Jest, it was that book&amp;#39;s thick popular place in the zeitgeist as a quote-unquote bro book. With this one, it was that it is posthumous, and famously unfinished. And not unfinished in the Eyes Wide Shut sense, where the only tasks left were polish and assemblage (as Pietsch makes explicitly clear in the introduction).</description>
      <content:encoded><![CDATA[<p>I came to <em>The Pale King</em> with the same skepticism I brought to <a href="/posts/infinite-jest.html">Infinite Jest</a> — for different reasons. With <em>Infinite Jest</em>, it was that book&#39;s thick popular place in the zeitgeist as a quote-unquote bro book. With this one, it was that it is posthumous, and famously unfinished. And not unfinished in the <a href="/posts/eyes-wide-shut.html">Eyes Wide Shut</a> sense, where the only tasks left were polish and assemblage (as Pietsch makes explicitly clear in the introduction).</p>
<p>So one version of this review is an impossible hypothetical: <strong>if it had been finished, I think it probably would have been a greater work than <em>Infinite Jest</em></strong>. Which — again, I stress — is one of my favorite books of all time.</p>
<p>But it wasn&#39;t and it&#39;s not. So what is it? It&#39;s impossible to really talk about the themes or the choices made in this book unless you want to do so as theorycrafting. Many of its deeper meanings are left mostly submerged: available for examination, but not for excavation.</p>
<p>Instead, I think a reader should consider <em>The Pale King</em> as if it were a collection of short stories, all set in the same place, and see how it sits with them then. In that light. it&#39;s bizarre and atonal and sloppy and really, really terrific.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Engineering produces wisdom</title>
      <link>https://jmduke.com/posts/engineering-produces-wisdom.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/engineering-produces-wisdom.html</guid>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <description>A software organization can generate competitive advantage in many ways: network effects, branding/counter-positioning, switching costs, etc.</description>
      <content:encoded><![CDATA[<p>A software organization can generate competitive advantage in many ways: network effects, branding/counter-positioning, switching costs, etc.</p>
<p>One historical way to build power has been creating leverage through engineering: an engineering organization that can generate value quickly or cheaply is better than one that can&#39;t.</p>
<p>Gauging the efficacy of an engineering organization is, sadly, an unsolved problem, but three useful aspects are:</p>
<ol>
<li>speed</li>
<li>stability</li>
<li>cost</li>
</ol>
<p>These must be considered as vectors, not points; any codebase&#39;s snapshot of any of these is much less important than the organization&#39;s ability to change it in line with overall goals.</p>
<hr>
<p>I find myself constantly amazed at the efficacy of LLMs while also being surprised at how and why they fail a given task in uninteresting and inscrutable ways.</p>
<p>Models from frontier labs are currently very cheap (but could soon not be); they are very fast (but tend to lower their own velocity over time); they are good at improving some but not all aspects of stability.</p>
<p>Just as Warhol said that a Coke is a Coke and you&#39;re drinking the same bottle as the president, there is little variance across model performance for consumers. The marginal advantage of various point-level improvements quickly accretes to the commons thanks to open-source.</p>
<p>To the extent that you cede responsibility for your codebase to an LLM, you diminish your ability to generate leverage from your codebase over a sufficiently long-term horizon; phrased differently, ceding responsibility to the LLM means sacrificing wisdom. Is that a big deal? Well:</p>
<ol>
<li>My experience with LLMs is such that, at least today, I can be wiser about a codebase than an LLM. (Reasonable people can disagree!)</li>
<li>My experience with running a business is such that, at least today, wisdom is a useful lever to build a codebase which provides competitive advantage over incumbents. (Reasonable people can disagree!)</li>
</ol>
<p>Discussions about our current <em>rituals</em> (hand-writing code, reviewing pull requests, etc.) are really discussions about the value of engineering as a process vs. the value of engineering as something which produces an artifact.</p>
<p>It is a reasonable position for someone to think that the value of engineering as a process is going to zero. But if you believe that, you better have a coherent answer of where your competitive advantage is coming from once every other organization you compete with is using the same tools as you.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Slack workflows as duct tape</title>
      <link>https://jmduke.com/posts/slack-workflows-as-duct-tape.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/slack-workflows-as-duct-tape.html</guid>
      <pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate>
      <description>A workflow we&amp;#39;ve wanted for a long time at Buttondown: throw a random paper cut or complaint into a Slack channel, and get a nicely formatted Linear issue out the other end.</description>
      <content:encoded><![CDATA[<p>A workflow we&#39;ve wanted for a long time at Buttondown: throw a random paper cut or complaint into a Slack channel, and get a nicely formatted Linear issue out the other end.</p>
<p>This is not a novel desire. Linear offers it out of the box via <a href="https://linear.app/docs/linear-asks">Linear Asks</a> — on the enterprise plan. I am a cheapskate, and I could not justify a couple hundred extra dollars a month for this one thing. So I set out to jerry-rig it myself.</p>
<p>The answer is honestly kind of funny, and kind of sad. Behold:</p>
<figure><img src="/img/slack-workflow-sadness-detector.png" alt="The Slack workflow: when a message posted in #sadness contains &quot;sadness&quot;, reply in thread asking @Linear to check for an existing issue, and otherwise file it and assign the sender." data-zoomable><figcaption>The Slack workflow: when a message posted in #sadness contains &quot;sadness&quot;, reply in thread asking @Linear to check for an existing issue, and otherwise file it and assign the sender.</figcaption></figure>
<p>And it works!</p>
<p>Ideally this is the sort of thing Slack&#39;s workflow builder does natively, and my bar was low: I needed neither polish nor perfection but simple mechanical routing. The blocker is in identity mapping, as far as I can tell: the Slack–Linear integration has no canonical way to map a given Slack user to a given Linear user, and I want every reported issue assigned to the person who reported it.</p>
<p>(That requirement is probably a liability at a larger company. If you have forty engineers and a real code-ownership graph, &quot;assign it to whoever complained&quot; is exactly the wrong default; you want triage, routing, et cetera. We are thankfully, blissfully unaware of such problems thus far. The person who notices the paper cut is, nine times out of ten, the person who should fix it.)</p>
<p>So: duct tape.</p>
<figure><img src="/img/slack-workflow-linear-reply.png" alt="The workflow in action: a sadness message gets a threaded reply from the Sadness detector, and Linear responds with a created and assigned issue, B-5335." data-zoomable><figcaption>The workflow in action: a sadness message gets a threaded reply from the Sadness detector, and Linear responds with a created and assigned issue, B-5335.</figcaption></figure>
]]></content:encoded>
    </item>
    <item>
      <title>10:04</title>
      <link>https://jmduke.com/posts/10-04.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/10-04.html</guid>
      <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
      <description>Art has to offer something other than stylized despair.</description>
      <content:encoded><![CDATA[<blockquote>
<p>Art has to offer something other than stylized despair.</p>
</blockquote>
<p>Something I hadn&#39;t really considered before reading <em>10:04</em>: my experience with autofiction has been almost entirely dominated by women writers (<a href="/posts/second-place.html">Cusk</a>, <a href="/posts/dept-of-speculation.html">Offill</a>, <a href="/posts/no-one-is-talking-about-this.html">Lockwood</a>, <a href="/posts/bluets.html">Nelson</a>). There is probably something interesting to examine here — a continuation of <em>A Room of One&#39;s Own</em>, Woolf extended onto the present, a sort of rebellion by the feminine to allow (and demand) their inclusion in what is allowed to be fictionalized, which is to say what is allowed to be <em>fiction</em>.</p>
<p>There&#39;s also probably something to be said about the inherent power dynamics of autofiction, and <em>10:04</em> spends time discussing this at length in a way characteristic of the rest of the book: circuitously, coyly, and in a manner I would otherwise find annoying if the author were not such a strong stylist and clever thinker:</p>
<blockquote>
<p>that part of what I loved about poetry was how the distinction between fiction and nonfiction didn&#39;t obtain, how the correspondence between text and world was less important than the intensities of the poem itself, what possibilities of feeling were opened up in the present tense of reading</p>
</blockquote>
<blockquote>
<p>She said she hoped she would see me again, and the next thing I knew I was running through light snow back to my dorm, laughing aloud from an excess of joy like the schoolboy that I was. I had overwhelming sense of the world&#39;s possibility and plentitude; the massive, luminous spheres burned above me without irony; the streetlights were haloed and I could make out the bright, crustal highlands of the moon, the far-sprinkled systems; I was going to read everything and invent a new prosody and successfully court the radiant progeny of the vanguard doyens if it killed me; my mind and body were as a fading coal awakened to transitory brightness by her breath when she&#39;d brushed her lips against me; the earth was beautiful beyond all change.</p>
</blockquote>
<blockquote>
<p>Nothing in the world, I thought to myself, is as old as what was futuristic in the past.</p>
</blockquote>
<p>And this is ultimately where my analysis of <em>10:04</em> starts and ends. Ben Lerner is, at least in this estimation, a smart and clever prose stylist whose powers of observation and reflection are <em>interesting</em> but not <em>meaningful</em>.</p>
<p>I enjoyed this book, and I could get ensorcelled — however briefly — in the trappings of its recursions. But whatever heights it reaches, the book is trapped by the fences of its context. I don&#39;t mean this as a slight against anyone but myself; I simply don&#39;t think I have that much to learn about the world from learning about Ben Lerner.</p>
<p>And despite all the lampshading, this is a book by Ben Lerner about Ben Lerner. Reading it has made me more interested in seeing his other work — and less interested in ever recommending this one to someone else.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Flirting with Disaster</title>
      <link>https://jmduke.com/posts/flirting-with-disaster.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/flirting-with-disaster.html</guid>
      <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
      <description>An odd little bird of a movie — one that, in retrospect, kicked off a fairly solid career for David O. Russell, and one littered with great performances from beloved actors. And yet it seems to have barely any cultural footprint at all. Perhaps that&amp;#39;s because its star shines less obviously bright here than in the other Ben Stiller vehicles that made him famous; perhaps it&amp;#39;s because it mostly stars people you laugh at but do not like.</description>
      <content:encoded><![CDATA[<p>An odd little bird of a movie — one that, in retrospect, kicked off a fairly solid career for David O. Russell, and one littered with great performances from beloved actors. And yet it seems to have barely any cultural footprint at all. Perhaps that&#39;s because its star shines less obviously bright here than in the other Ben Stiller vehicles that made him famous; perhaps it&#39;s because it mostly stars people you laugh at but do not like.</p>
<hr>
<p><em>Flirting with Disaster</em> works very, very well when you examine it through its screwball sensibility. Russell strikes a fascinating balance with this script: almost every single line read is delivered in a mostly naturalistic way. Nobody is playing a cartoon character. These are real, genuine — albeit silly and ridiculous — adults.</p>
<p>But the off-screen action, the camera movement, and the editing almost serve to undermine them. Take Richard Jenkins, absolutely playing his pants off, getting passed between two cars in a long-running bit about him being the fifth wheel.</p>
<p>Which is not to say that the naturalism makes the film unfunny. I laughed more than I was expecting to — but the laughs often came from a place of realism, like Mel&#39;s parents going back and forth about the car, or just about any scene with Mary Tyler Moore.</p>
<p>Part of the real joy of watching it was not knowing whether a line would be played straight or for laughs, even though both ended up serving the same end. The movie never has much in the way of serious tension or suspense, but the final act — Mel&#39;s parents showing up to save (or sabotage) the day, the smash cut, and the immediate turnaround — single-handedly raised my estimation of not just the script but the film as a whole.</p>
<p>So: a great script, a wonderful plot, and a then-modern take on screwball comedy, a genre for which I have a very soft spot. And it&#39;s filled with extremely great performances from actors I love — I haven&#39;t even mentioned Alan Alda and Lily Tomlin, playing husband and wife. As if things could get any better!</p>
<hr>
<p>So why haven&#39;t I decided that I actually <em>like</em> it?</p>
<p>I think it ultimately comes down to the fact that Ben Stiller&#39;s character fucking sucks. I know this is not an interesting or trenchant critique. One interesting dynamic of older films is that we tend to <em>otherize</em> their characters, viewing them through a different lens than we would a contemporary protagonist — even decades later.</p>
<p>But Mel is the father of a literal four-month-old whom he spends maybe five seconds of the film holding or addressing, and he is mostly disinterested in his wife compared to the wiles of Téa Leoni.</p>
<p>For every note that lampshades the fact that yes, we know this guy is a scumbag, there&#39;s another that attempts to slightly humanize or redeem him. And so where I had difficulty — right up until the final act — was not being sure how seriously I should take this film and its foibles.</p>
<p>Screwball comedies tend to involve at least one relatively well-meaning character. By the end of this one, the closest thing we have to heroes are Mel&#39;s parents: played initially for one-dimensional laughs, they end up saving the day, acting only in service of protecting and rescuing their son.</p>
<p>(This all got a little more serious than intended.)</p>
<hr>
<p>This is a good, funny film. There are moments of broad screwball comedy, and there&#39;s also some great, dry wit. You get to see two actors I tend to think of in a much older mode — Josh Brolin and Patricia Arquette — playing young, attractive, exciting people.</p>
<p>You won&#39;t have a bad time with this movie. Just don&#39;t spend any time at all caring about these people, because it might distract you from the jokes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Talk Easy</title>
      <link>https://jmduke.com/posts/talk-easy.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/talk-easy.html</guid>
      <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
      <description>A running joke between me and a few friends is the inevitability of all podcasts — or really, all interview mediums — to curdle into anodyne pablum as they grow in scale and success.</description>
      <content:encoded><![CDATA[<p>A running joke between me and a few friends is the inevitability of all podcasts — or really, all interview mediums — to curdle into anodyne pablum as they grow in scale and success.</p>
<p>The logic for this inevitability is simple. Interviews derive the vast majority of their value from their audience, and the single biggest influence on that audience is the subject of the interview. Interviewers are therefore incentivized to land subjects who are as popular as possible, and one way of doing so is to make the value proposition for those subjects as positive as possible — which generally means letting the subject completely drive the interview and use it to their own ends. Both parties get to leverage the audience and reach of their counterparty; it&#39;s a win-win relationship for everyone except the listener. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">I&#39;ve been grumbling about this for a while: my <a href="/posts/podcasts.html">The best podcasts</a> list from 2017 is a receipt.</span></p>
<hr>
<p>There is one small exception to this rule that I&#39;ve noticed: a single podcast called <em>Talk Easy</em>, hosted by Sam Fragoso. Sam tends to interview people in the entertainment spheres — movies, television, and writing in particular.</p>
<p>His interviews are remarkable in three ways:</p>
<ol>
<li>Bless his heart, he has the voice of a caricature of an NPR interviewer.</li>
<li>His depth of research for every interview is startling. He&#39;ll dig up — and quote at length — excerpts from a writer&#39;s first gig at their college paper, or from a blog they wrote under a pseudonym.</li>
<li>He asks legitimately meaningful questions, and successfully elicits responses from his subjects that are unique and candid — a feat I have not seen replicated by any other interviewer who regularly talks to people of the same repute.</li>
</ol>
<p>How does he do it?</p>
<p>Perhaps this is naive of me, but I think it&#39;s because he so clearly approaches every conversation with genuine candor and empathy. He builds a surprisingly intimate rapport with his subjects in a very short amount of time, which lends him the credence to ask them harder questions. Those harder questions are often telegraphed, but never inorganic or mean-spirited. He gets his subjects to discuss painful things — or their own hypocrisies — in a way that I find genuinely rewarding, unlike most other podcasts in this format.</p>
<p>Unlike <em>every</em> other podcast in this format, actually. The antidote to pablum, it turns out, is not hostility; it&#39;s homework and a little bit of tenderness.</p>
]]></content:encoded>
    </item>
    <item>
      <title>It&apos;s just a model</title>
      <link>https://jmduke.com/posts/its-just-a-model.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/its-just-a-model.html</guid>
      <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
      <description>I, like many people, have witnessed and felt the whiplash between the seemingly-orgastic highs of the Astra launch and the experience of using the model.</description>
      <content:encoded><![CDATA[<p>I, like many people, have witnessed and felt the whiplash between the seemingly-orgastic highs of the Astra launch and the experience of using the model.</p>
<p>Whether intentional or otherwise, a lot of airtime was given in the brief pre-release hypecycle to Astra&#39;s ability to generate things that <em>looked cool</em>. Lots of games, renders, and <code>canvas</code> examples cluttered my various timelines.</p>
<p>This makes sense: 3D stuff is cool; most people don&#39;t really have a sense of the toolchain involved in things like this, and how much of the effort is on the part of the LLM versus the structures it builds upon is somewhat obfuscated; platforms like xtheeverythingapp.com tend to reward videos and animations.</p>
<p>I try (unsuccessfully) to remain sober about all of this. But the release of the model, coupled with things like the deeper information around the Hugging Face incident and Collusion.wiki, did ignite a bit of a spark in the back of my head — thinking, as always, however briefly, about the chance that things are really different this time. Did we solve software?</p>
<hr>
<p>Then I started using the model.</p>
<p>And much like my quasi-review of <a href="/posts/fable-5-1.html">Fable 5.1</a>, I found that the model is good! It&#39;s hard for me to really compare and contrast it against Fable 5.1 because I didn&#39;t do formal comparisons or anything like that; I just tried throwing a couple of problems I was working on against it, and it handled them all well and the things it couldn&#39;t handle were generally  due to lack of context and agency, not lack of horsepower. </p>
<p>It&#39;s very smart and capable, but limited by the tools and harnesses and contexts it has access to (words I deploy in the broader sense, not the industry-specific ones.). All of this mirrors almost exactly my sense of wonder followed by disillusion when I started really kicking around Fable for the first time. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Though I do maintain that Fable pre-DOD was a slightly different beast, and felt more akin to a real change in how I programmed.</span></p>
<p>Astra is very good at a lot of things; for me, though, it is increasingly extremely competent at tasks that have already been solved by faster, cheaper models. And at least personally, as someone who runs a non-trivial business where the risk of false positives vastly outweighs the attractiveness of sheer velocity, I struggle to find the right balance here between exploring the boundaries of what is possible and remembering that right now my job is no longer that of a technologist but of an industrial designer.</p>
<hr>
<p>I run a small business where we have absolute license to use models at will, so long as we do so judiciously and securely. I talk about them for no economic or personal reason <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">Disclaimer: I am, as of this writing, an investor in Anthropic through an acquisition they made.</span>; I want to understand (and thereby master) them out of a conviction that they&#39;ll improve my business. </p>
<p>I bring that up because I found myself vigorously nodding along to this essay from <a href="https://x.com/mitsuhiko/status/2097746938804216135">Armin Ronacher</a>, who writes (amongst other things, which I agree with):</p>
<blockquote>
<p>I&#39;m more and more convinced that all of AI engineering is Neijuan (内卷, meaning curl inwards). In China it describes a system that demands ever more effort and competition without improving output. The way in which it sometimes shows up in the West is the 996 nonsense. The English term for Neijuan is &quot;Involution&quot; from the book Agricultural Involution. Agricultural involution describes the intensification of farming that raises productivity per square meter while leaving productivity per head unchanged.</p>
</blockquote>
<p>One way of thinking about LLMs (or any technology) is dichotomous:</p>
<ol>
<li>There is the raw power a given model can generate,</li>
<li>and then there&#39;s the design and manufacturing of interfaces that can use that model in useful ways.</li>
</ol>
<p>The biggest step function in software engineering over the past few years was not a specific model but Claude Code. Astra and Fable have improved my life less than full support for subagents and worktrees did.</p>
<p>I get that it&#39;s unfair of me to pretend those two things are discrete! I don&#39;t have enough intelligence to understand how raw power acts as a proxy for various other implications outside my industry. But I do — at least for now — have enough experience to understand that right now it&#39;s a poor proxy for operational leverage in mine.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hiring and firing a DBA</title>
      <link>https://jmduke.com/posts/hiring-and-firing-a-dba.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/hiring-and-firing-a-dba.html</guid>
      <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
      <description>For the past sixty days, Buttondown 1I take liberties here and throughout the essay: this was all Matias&amp;#39; doing. He also wrote a great piece on our migration to Planetscale, and also cites Planetscale&amp;#39;s recommendation for this experiment. ran a scheduled LLM invocation once a day. Every morning it would look at the previous few days of database load in PlanetScale, and — if, and only if, it was sufficiently confident — it would open a pull request containing exactly one performance impro...</description>
      <content:encoded><![CDATA[<h2>Hiring our DBA</h2>
<p>For the past sixty days, Buttondown <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">I take liberties here and throughout the essay: this was all Matias&#39; doing. He <a href="https://buttondown.com/blog/how-we-migrated-our-database-to-planetscale">also wrote a great piece on our migration to Planetscale</a>, and also cites Planetscale&#39;s recommendation for this experiment.</span> ran a scheduled LLM invocation once a day. Every morning it would look at the previous few days of database load in <a href="https://planetscale.com">PlanetScale</a>, and — if, and only if, it was sufficiently confident — it would open a pull request containing exactly one performance improvement to the seam between our app and our database.</p>
<p>I think of this as a longitudinal study, and a fairly cheap one: LLMs are extremely well suited to performance optimizations, precisely because such optimizations can be evaluated and then trivially discarded. <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">We used GPT 5.3 Codex High for this, but I suspect our outcomes would have been broadly similar with whatever model we reached for.</span></p>
<p>Two months down, and here&#39;s where we&#39;re at:</p>
<ol>
<li>We decreased our overall database reads by 25% for no cost or effort beyond that of reviewing the PRs.</li>
<li>We are stopping the experiment.</li>
</ol>
<p>Let me frame the rest of the post with the most important takeaway for a prospective reader: this was an undoubtedly positive-value experiment, and I recommend everyone try it if they&#39;re able. Even setting the epistemology aside, the performance benefits we banked were unambiguously worth the small amount of time I&#39;d spend reviewing PRs every morning. The only reason I&#39;m not dwelling on the upside is that I think the flaws are more instructive than the wins.</p>
<p>So, with that out of the way — </p>
<h2>Firing our DBA</h2>
<p>25% improvement! That&#39;s great! Why stop the party?</p>
<p><strong>The single biggest reason is that the LLM ran out of easy targets.</strong> In the first thirty days, I approved 75% of incoming PRs. In the latter thirty, that number dropped to 30%.</p>
<p>The theoretical underpinning of the whole enterprise is that there&#39;s a sweet spot: the risk of a given PR has to round down to zero, while the value of the performance benefit has to stay high enough to outweigh the attention and energy required to review it. <label class="sidenote-toggle" for="sn-3">3</label><input type="checkbox" id="sn-3" class="sidenote-toggle-checkbox"><span class="sidenote">This will be covered in a post to come, but a note I&#39;d have here for the &quot;get rid of code review&quot; maximalists is that at three of the PRs I rejected would have caused an incident if merged.</span> Without looking too hard at the Insights dashboard, it&#39;s clear the LLM ran out of obvious wins and it started getting desperate. Most of the PRs it submitted toward the end were bad code that made choices I didn&#39;t like — adding branching logic to defer work under some very esoteric circumstance, say, which would have a real positive performance impact and an equally real, and larger, negative technical-debt one.</p>
<p><strong>The second reason is that the LLM consistently overclaimed</strong> — both the scale of the improvement it was making and its confidence in being able to make any change whatsoever.</p>
<p>I led with the exciting headline: it cut 25% of our reads. Which is great! But that impressive feat is itself roughly 25% of what it <em>claimed</em> it was going to do. Yes, the math there is not a typo. Largely, I think, this is because we did not — for obvious reasons — give it access to the actual production dataset, only the metadata about it. So it was calibrating a lot of its estimates against synthetic datasets it would conjure up itself, and synthetic data is a flattering mirror.</p>
<p>The combination of the two meant this experiment had crossed from positive value into negative-value territory.</p>
<h2>What about upskilling?</h2>
<p>I&#39;m entirely amenable to the counterargument that I should treat this as a harness-engineering problem instead: give the model better instructions, or tooling to approximate the prod dataset, or coaching on which sacrifices to refuse. And those responses are correct, in a certain sense: they probably would have resulted in a better signal-to-noise ratio. But they still amount to me spending unjustifiable time on this experiment. It was valuable to me <em>because</em> it was free real estate, so to speak — not because I have a deep and systemic database problem. (Once again: thank you to PlanetScale for making that no longer the case.)</p>
<p>Zoom out further and you arrive at the worry that haunts everything shaped like this: there really is only so much low-hanging fruit. Every time a frontier lab ships a new model your proverbial ladder gets a little taller, but at some point you have to move on from your current copse of trees. Which is not to say ladders aren&#39;t useful, only that they&#39;re not jetpacks.</p>
<hr>
<p>(Edited and added on 2026/09/11.)</p>
<p><a href="https://x.com/enginoid/status/2097281325963125120">Fred writes</a>:</p>
<blockquote>
<p>I think your approach would be great to automate SLO bootstrapping. You could track acceptance rate and stabilize the SLO once acceptance drops, and then only invoke the agent on breaches. Should scale across monitoring a large number of things for non-regression.</p>
</blockquote>
<p>(For the unfamiliar, Google&#39;s SRE workbook has <a href="https://sre.google/workbook/implementing-slos/">a good primer on implementing SLOs</a>.)</p>
<p>I like this for two reasons:</p>
<ol>
<li><p><strong>It gets rid of the daily trigger.</strong> Invoking something like this as a daily cron is a kludge — an admission that plucking all of the low-hanging fruit at once would be onerous to the point of disqualification. Choosing a daily cadence is the equivalent of running a migration that backfills on read rather than rewriting the entire table in lockstep: technically janky and slow, but a totally valid approach. Once you finish the backfill, though, sticking to that cadence makes no sense. Far better to have the agent fire when CPU is consistently over a given percentage, or read volume is consistently over a number we define — which is to say, only when there&#39;s something worth fixing. (That drop in acceptance rate from 75% to 30% <em>was</em> the backfill finishing; I just didn&#39;t have a better trigger to switch to.)</p>
</li>
<li><p><strong>It&#39;s more portable into other domains.</strong> The most obvious — one I&#39;ve <a href="/posts/llm-devprod.html">already done manually</a>, and so can imagine working well — is speeding up specific CI steps. But running it in a true SLO fashion, with the system watching P99s and availability rather than a bespoke waste metric, is one I hadn&#39;t considered — and one I&#39;m now considering quite a lot.</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>/shuffle</title>
      <link>https://jmduke.com/posts/shuffle.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/shuffle.html</guid>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <description>I&amp;#39;m here to tell you about a hidden feature of sorts that I built for Buttondown. Go to buttondown.com/shuffle and you will be served a completely random archived email, pulled from the population of all newsletters who expose their archives and consent to being indexed by search engine brokers.</description>
      <content:encoded><![CDATA[<p>I&#39;m here to tell you about a hidden feature of sorts that I built for <a href="https://buttondown.com">Buttondown</a>. Go to <a href="https://buttondown.com/shuffle">buttondown.com/shuffle</a> and you will be served a completely random archived email, pulled from the population of all newsletters who expose their archives and consent to being indexed by search engine brokers.</p>
<p>This tool began as a bit of a joke internally. The phrase &quot;StumbleUpon for newsletters&quot; was at one point deployed. It has since become a bit of a tether for me, a splash of water that reminds me of what actual users are up to -- and, just as importantly, reminds me that all the test data and sniffing around for edge cases is nothing compared to the sheer breadth of the UGC firehose. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">(Is that two water metaphors in a single paragraph? Whatever.)</span></p>
<p>Much hay has been made of the ability of LLMs to sniff out latent bugs lurking within your codebase. But even judging solely on wall clock time, Fable and Astra have absolutely nothing on the efficiency and signal-to-noise ratio of me spamming refresh on /shuffle, scrolling through the page, and jotting down whatever feels odd, broken, or — crucially — just sort of <em>wonky</em>.</p>
<p><a href="https://vickiboykis.com/2025/09/09/walking-around-the-app/">Vicki Boykis</a> writes about walking around your app:</p>
<blockquote>
<p>More importantly: if you are building an app, you need to also constantly be testing and touching different parts of it to see if the app flow makes sense. Look at the UI dropdowns, try the search bar. Toggle the toggles. How long does it take to load a result? What do the results look like? What colors are the buttons? How do they work on different devices? At different internet speeds? What about your payment gateway? How does onboarding look for a brand new user in North America? In New Zealand? Could you onboard from a fresh device in under three minutes? Do images load from your CDN?</p>
</blockquote>
<p>UGC makes this practice both more difficult and more important in that your app is actually two things: the lovingly and painstakingly manicured constructions of the author-facing app, and then the unstructured dreamspace that your users build with whatever tools you&#39;re brave enough to give them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Coffee and Cigarettes</title>
      <link>https://jmduke.com/posts/coffee-and-cigarettes.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/coffee-and-cigarettes.html</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>The relative scarcity of anthology films contributes to an unease with their lack of narrative cohesion in much the same way someone reading a collection of short stories for the first time might get to the end and, in desperation and frustration, rapidly flip back through the pages as if to spot the technicolor threads binding each story together. The joy is in spinning the threads yourself, not spotting them!</description>
      <content:encoded><![CDATA[<p>The relative scarcity of anthology films contributes to an unease with their lack of narrative cohesion in much the same way someone reading a collection of short stories for the first time might get to the end and, in desperation and frustration, rapidly flip back through the pages as if to spot the technicolor threads binding each story together. The joy is in spinning the threads yourself, not spotting them!</p>
<p>(That&#39;s not to suggest the through-lines in Coffee and Cigarettes are particularly subtle. Many are textual: as if the titular motifs and the various displays of vaguely anonymous cafés weren&#39;t enough, characters echo other characters&#39; prior lines verbatim, perhaps most obviously and symbolically in the Nikola Tesla line — <em>that the earth is a conductor of acoustical resonance</em>.)</p>
<p>Regardless of narrative structure, though, I found the film straightforwardly entertaining by the second or third segment, once I felt like I had really gotten used to its vibe. (The first segment in particular caught me off guard and suggested a much more surreal film than the ten which followed it.) And from then on out, I started to understand this film to be an exploration — both earnest and comedic — of the ways people try to connect with one another, and the ways people try to seek refuge in consumption, and the overlap of those two things.</p>
<p>I am surprised to discover that people think of this as a boring film, but perhaps that is my biases showing. Most scenes are, to re-use a parallel, like a well-crafted short story: exactly the right length to land the punches they wish to before departing. And I will remember this film more by its trees than its forest:</p>
<ol>
<li>the sheepish way Iggy Pop, after awkwardly dismissing Tom Waits despite their kindred spirit, reaches for a second cigarette, hoping no one catches him doing so;</li>
<li>the shadows falling on Alfred Molina&#39;s face as he is finally and explicitly rejected by Steve Coogan, both of whom playing fictionalized versions of themselves to great effect;</li>
<li>the angelic notes of Janet Baker summoned as if to suggest a bright and beckoning afterlife awaiting the protagonists of the final segment, who, pretending for sport that their coffee is champagne, takes one last celebratory sip.</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Conjury</title>
      <link>https://jmduke.com/posts/conjury.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/conjury.html</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>A difficulty I have when reviewing Slay the Spire-likes is a certain anchoring bias. It can feel unfair to judge an otherwise good game, even partially, by dint of it being so aggressively inspired by a game that I consider, on a mechanical level, literally the best ever made.</description>
      <content:encoded><![CDATA[<p>A difficulty I have when reviewing <a href="/posts/slay-the-spire.html">Slay the Spire</a>-likes is a certain anchoring bias. It can feel unfair to judge an otherwise good game, even partially, by dint of it being so aggressively inspired by a game that I consider, on a mechanical level, literally the best ever made.</p>
<p>Conjury exists almost as a perfect distillation of this trickiness, because it is fundamentally a very good iOS game with much to love that — after a while of playing it — I cannot help but find wanting in comparison to its forebear. Structurally, and aesthetically, it is almost like a demake of Slay the Spire.</p>
<p>Each run consists of a handful of acts, shorter and with fewer branches than Slay the Spire. Combat is a simplification of the same engine: using energy to play and draw cards, balancing attack and defense, leaning on emergent interactions between cards. And it is particularly well optimized for its format. It looks gorgeous on an iPhone; the pixel art is done just right, as are the audio and the scaffolding around it.</p>
<p>Where the game struggles, on the gameplay side, is in the monotony — both at a micro and a macro level. In a micro sense, encounters do very little to differentiate themselves from each other; even bosses feel fairly samey, and whatever variety a given fight offers comes much more from the order in which your cards are dealt than from any need to tailor your tactics or decision-making to the enemy you happen to be facing.</p>
<p>At a macro level, the various characters you can play in Conjury do feel fresh and distinct from one another, but repeated runs of a <em>given</em> character do not. This would be much less of a problem if it weren&#39;t for the fact that, in order to unlock new characters, you have to grind through a lot of runs. Where Slay the Spire is very generous with handing you new mechanics and play styles and characters as soon as you&#39;re ready to appreciate them, Conjury makes the exercise feel daunting and chore-like. In a way — and to its credit — that is not entirely dissimilar from games of the era whose aesthetic it so successfully emulates.</p>
<hr>
<p>So it&#39;s not as good as Slay the Spire. Is that so brutal a condemnation? No.</p>
<p>And, to end on an earnest and positive note: the more honest comparison would be with other iOS games, where all of my quibbles are rendered moot. I don&#39;t think it&#39;s unreasonable to say that the average iOS game ranges somewhere from offensive to actively malicious. Obviously, there are many counterexamples. But if you&#39;re evaluating this game from the perspective of <em>is this a better choice than anything else on the App Store, given that I&#39;ve already played Slay the Spire to exhaustion?</em>, the answer is an emphatic yes. Hmm.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Soulstone Survivors</title>
      <link>https://jmduke.com/posts/soulstone-survivors.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/soulstone-survivors.html</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>M&amp;amp;Ms tend to trigger in me a kind of existential crisis if I have more than a few. A small handful is no problem, but any more than that and I abruptly come face to face with the mechanics of what I&amp;#39;m doing — the sheer artifice of the thing I&amp;#39;m putting into my body. I find myself overcome with a violent repulsion, so strong that I&amp;#39;ll end up literally spitting out whatever is in my mouth and, in doing so, briefly swearing off the mere concept of processed food.</description>
      <content:encoded><![CDATA[<p>M&amp;Ms tend to trigger in me a kind of existential crisis if I have more than a few. A small handful is no problem, but any more than that and I abruptly come face to face with the <em>mechanics</em> of what I&#39;m doing — the sheer artifice of the thing I&#39;m putting into my body. I find myself overcome with a violent repulsion, so strong that I&#39;ll end up literally spitting out whatever is in my mouth and, in doing so, briefly swearing off the mere concept of processed food.</p>
<p>Playing — and ultimately washing my hands of — Soulstone Survivors felt very much like this. Not because of anything so simple as in-game quality: the game is a competent, polished entry in the survivors-like genre that <a href="/posts/vampire-survivors.html">Vampire Survivors</a> spawned into existence, one of many that focus on polish and technicolor spectacle.</p>
<p>But one of the things I think is underrated about Vampire Survivors&#39; success is that it&#39;s a <em>weird</em> and charming game, filled with secrets and surprises meant to confuse and delight the player — not merely to accelerate the rate at which dopamine enters the body.</p>
<p>Soulstone Survivors is very good at the dopamine. It is also, in a certain sense, very boring. The game offers breadth — skill sets, customization, playable characters galore — and these choices do have meaningful differences. But they all serve exactly one purpose: to explode things and clear fairly simple arenas in a manner that does not vary from run to run.</p>
<hr>
<p>It would feel disingenuous to give Soulstone Survivors a particularly negative review, because it is a fun game for a time, and it accomplishes exactly what it sets out to do. And yet I can&#39;t recommend it — because I don&#39;t think it is <em>good</em> for you.</p>
<p>I am, at heart, a romantic who believes that video games are, at their best, a transformative piece of art. Even the ones focused purely on pleasure can do so nobly, in a way that puts them on the same tier as something like Ocean&#39;s Eleven or <em>Jaws</em>: works of entertainment that carry merits outside that simple rubric. Soulstone Survivors is not one of those. It is an M&amp;M.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fable 5.1</title>
      <link>https://jmduke.com/posts/fable-5-1.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/fable-5-1.html</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>Anthropic released Fable 5.1 this week. My initial reaction to the release was this comment I made in the Third South Slack:</description>
      <content:encoded><![CDATA[<p>Anthropic released Fable 5.1 this week. My initial reaction to the release was this comment I made in the Third South Slack:</p>
<blockquote>
<p>More seriously: I&#39;m excited to see the reduced cost, but have a very hazy time of describing the shape of work that Fable 5 was unable to complete, which is not to say that it didn&#39;t exist, but that it&#39;s hard to even conceptualize a step function improvement because the line between &quot;LLM can do this&quot; and &quot;LLM cannot&quot; feels so amorphous. I suspect their lack of concrete examples here is proof that this is a broader issue.</p>
</blockquote>
<p>Later that afternoon, I fired up 5.1 in much the same way I had fired up Fable 5 for the past few weeks, both on Conductor and, an hour or so later, on the Claude Code webface.</p>
<p>When I fired up the webface, it prompted me -- in a full-screen modal dialog -- to try out Fable 5.1, even though Anthropic had all the information it needed to know I had already tried it out.</p>
<p>Then, later that evening, I wanted to look at one of the long-running tasks I had kicked off before leaving work. So I opened up Claude on my phone, at which point it announced -- in a full-screen modal dialog -- the release of Fable 5.1.</p>
<p>The two options to dismiss this dialog were &quot;try it now&quot; and &quot;maybe later.&quot;</p>
<p>This little papercut is not novel in any sense: it&#39;s happened for every model release from Anthropic in recent memory, and is a common genre of problem across all sorts of applications.</p>
<p>Anyway: Fable 5.1 seems good. It is faster and cheaper for the work I&#39;ve used it for than Fable 5. And I am quite confident that someone could probably feed it the contents of this blog post and it would fix the issue I am whining about. But every time I hear a frontier lab employee mention that software engineering is a solved problem I pretend they say that cooking is a solved problem.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Everybody Wants Some!!</title>
      <link>https://jmduke.com/posts/everybody-wants-some.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/everybody-wants-some.html</guid>
      <pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate>
      <description>The single most pleasurable movie of all time is Soderbergh&amp;#39;s Ocean&amp;#39;s Eleven, and it achieves that status in order to try to convey what makes filmmaking uniquely magical: a sense of shared enchantment between the audience and the director, and the ecstasy of the latter pulling a heist on the former -- not (just) trickery, but the successful creation of an ornate and difficult craft. (See also The Prestige.)</description>
      <content:encoded><![CDATA[<p>The single most pleasurable movie of all time is Soderbergh&#39;s Ocean&#39;s Eleven, and it achieves that status in order to try to convey what makes filmmaking uniquely magical: a sense of shared enchantment between the audience and the director, and the ecstasy of the latter pulling a heist on the former -- not (just) trickery, but the successful creation of an ornate and difficult craft. (See also <em>The Prestige</em>.)</p>
<p><em>Everybody Wants Some!!</em>, conversely, generates pleasure as sheer by-product of its subject matter: what it&#39;s like on your first few days on campus as a freshman in college. Because those days are glorious and orgastic, so too is the feeling of watching the film; everything that the film is interested in conveying emotionally is downstream of its loyalty to conveying earnestly, as is often the case with Linklater.</p>
<p>The extent to which you find it legitimately a great piece of filmmaking (as everyone agrees that it&#39;s a fun time) is based solely on if you find its script earnest rather than hedonic.  The highest praise I can give it is that my sensation upon watching it — first ten years ago, and then again today — was a resounding &quot;yep, that&#39;s exactly how it felt.&quot; I went to college in 2009; I did not play for the baseball team; but I can still remember that exact sense of heightened reality that suffused my first few weeks of college, and it felt the exact same as watching this movie feels.</p>
<p>In this respect, it shares for me an unlikely honor with Donna Tartt&#39;s <a href="/posts/the-secret-history.html">The Secret History</a>, another piece of art which was almost entirely an act of memory-keeping by its creator about their undergraduate experience, and which I found spiritually resonant in a manner unlike any book about &quot;being in college&quot; before or since.</p>
<hr>
<p>Linklater touches on a lot of aspects here, but the one that hits home for me the most is lampshaded by an exchange between our protagonist and Glenn Powell, in what ends up being his breakout role as Finnegan:</p>
<div class="teleplay">
  <p class="character">Jake</p>
  <p class="dialogue">Look at us, man. The last three nights, we've danced at a disco, total mindless disco music, danced the Cotton-Eyed Joe in kicker attire, and here we are, punks for a night. It sort of begs the question about who we really are.</p>
  <p class="character">Finnegan</p>
  <p class="dialogue">Are you insecure about the duck feet?</p>
</div>

<p>In Linklater&#39;s memory of college, the identity of the individual is thin and negligible and therefore mutable. What matters and what persists is the identity of the collective. Everyone can put on cowboy hats, but they&#39;ll still present themselves in exactly the same way.</p>
<p>(To the extent that I have any critique of the film, it&#39;s that Linklater is almost heavy-handed with a lot of this. I guess he feels the need to balance out the joy of the film with a bit of didacticism — no more evident than in the climactic final-night party of the day, a literal costume partty.)</p>
<hr>
<p>Almost all of the performances in this film are great and lovely in their own way, because they match the specific version of the character they&#39;re trying to portray.</p>
<p>But there are two people in this film who deservedly became stars: Glenn Powell and Zoey Deutch, both of whom are not only unfathomably charming in the same way everyone from college is, but also sell their magnetism in a way that reminds me of the most charming people I knew in college: people whose air I was desperate and grateful to share.</p>
<hr>
<p>This film ends with a scene and message as cloying and obvious as it is lovely: a professor writing on the chalkboard, the first day of history class: &quot;Frontiers are where you find them.&quot;</p>
<p>To me — someone who spent most of his time in college in some brew of both proactive and reactive self-discovery and self-reinvention — this gets to the heart of the specific kind of experience being a freshman and an undergrad provides: a fractal sense of wonder in all the uncharted territory.</p>
<p>And now, more than a decade after having left campus, it is clearer to me than ever that success in my four years there can be measured — or perhaps divined — by the extent to which I felt comfortable surrendering myself to the act of discovery. Is this, perhaps, what Linklater is trying to say? More than anything else, experiences are shared, but discovery is private, and the joy in college is that it forces you to understand that you can&#39;t have one without the other.</p>
]]></content:encoded>
    </item>
    <item>
      <title>BB, Grok Bot</title>
      <link>https://jmduke.com/posts/bb-grok-bot.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/bb-grok-bot.html</guid>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
      <description>Another month, another field report from testing some vaguely interesting tools: this time, BB and Grok Bot.</description>
      <content:encoded><![CDATA[<p>Another month, another field report from testing some vaguely interesting tools: this time, BB and Grok Bot.</p>
<hr>
<p><a href="https://getbb.app/">BB</a> is a tool from the folks who built <a href="/posts/failed-experiments.html">Terragon</a>. The illegibility of its value proposition over Conductor — which is still my day-to-day development environment of choice — was overcome by my goodwill for those folks, and for how much I enjoyed Terragon in its too-brief existence.</p>
<p>BB&#39;s core conceit is that the customizability of the tool itself is given priority: rather than shoehorning yourself into the same UI, chrome, and workflows as everyone else, you can ask an LLM to essentially build it on your behalf. One might argue that such a thing is already possible, given how extensible VS Code is — just with more steps. But that does BB a disservice. There is something meaningful about a product choosing <em>that</em>, specifically, as its North Star and prioritizing it as such. There is something akin to emergent gameplay in giving developers permission to really iterate on their mise en place in a way that other tools do not.</p>
<p>I was impressed with BB, but I did not use it for more than a few days, even once I got into the swing of it. Because — and this is no fault of the app or its intentions — it makes the opportunity to <a href="/posts/snacks-are-everywhere.html">snack</a> so tempting. I realize, in hindsight, that I spent more time futzing with the chrome and seeing just what I could do with the tool than I did actually using it to deliver and build things of value. And what&#39;s more: the feedback loop, and the feeling (as my friend Myles says) of <em>viscera</em> that you should have with your product, is instead replaced by that same feeling toward the tool you use to deliver the product.</p>
<p>I don&#39;t have a good sense of what BB&#39;s future holds. I think it&#39;s cool, and I&#39;m glad it&#39;s open source. And, like many things, I hope I revisit it in six months to discover that its progress and mine combine to yield something of legitimate value.</p>
<hr>
<p><a href="https://x.ai/bot">Grok Bot</a> has done the impossible: it has forced me to acknowledge the <em>Grok</em> brand — a branding decision so viscerally bad, so painful, that it makes the shift from Cheetah to Composer look mild by comparison.</p>
<p>On paper, Grok Bot does many things I don&#39;t like. It encourages anthropomorphization. It provides value through crons and periodic work that are kicked off unattended and hard to observe or monitor without deliberate effort. It obfuscates the distance between how you interact with it and what is really happening. But none of this really matters, because — as many people have said — it gets a lot of ineffable things right. And, thankfully, the value it represents has nothing to do with what I find particularly odious about it. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">I am very, very confident that every single other frontier lab will launch something similar by the end of September.</span></p>
<p>The iteration that Grok Bot represents over the current suite of LLM tools is summarized neatly by a single fact: when onboarding or using Grok Bot, you are never prompted or asked to choose which model or reasoning level you want to use.</p>
<p>In stark contrast to BB, I have spent exactly zero time futzing with Grok Bot. I have not had to help set up its remote execution environment, or deal with permissioning, or any of those things. It simply gets out of my way and does some of the annoying things for me, like resolving trivial merge conflicts.</p>
]]></content:encoded>
    </item>
    <item>
      <title>EPUB is not that scary</title>
      <link>https://jmduke.com/posts/epub.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/epub.html</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <description>In a prior life, I worked on Kindle — specifically on content pipelines and data processing. This either excuses the fact that I had no real idea what EPUB was from a data standpoint, or makes it all the more embarrassing, since Amazon has, quite notoriously, long waged a war against EPUB and the other open e-reader formats.</description>
      <content:encoded><![CDATA[<p>In a prior life, I worked on Kindle — specifically on content pipelines and data processing. This either excuses the fact that I had no real idea what EPUB was from a data standpoint, or makes it all the more embarrassing, since Amazon has, quite notoriously, long waged a war against EPUB and the other open e-reader formats.</p>
<p>I will submit as my defense a certain kind of subconscious aversion to anything under that curfew. In much the same way that I have largely exited the world of fintech after Stripe — with the notable exception of fervently checking for updates about the growth and progress of FedNow.</p>
<p>All of this is a lead-up to say: I had reason at my day job, thanks to Steph, to try generating an EPUB file from Markdown source. An idea to which I said, &quot;Yes, how hard can it be?&quot;</p>
<p>Usually, when I say that, it is a prelude to disaster. But in this case, EPUB turns out to be pretty nice and simple. So I am going to drastically sand off the edges of some of the complexity, because I think the core bit is what&#39;s important:</p>
<p><strong>EPUB is a zip file that contains some metadata files and a bunch of XHTML. That is all.</strong></p>
<p>This was delightful as a discovery and disastrous as a derailment, since now I&#39;m going to use that as license to spend some time — just like I did when I did my deep dive into ICS a while back <a href="/posts/ics.html">Are calendars underrated?</a> — to daydream about some features that might be frivolous and unjustifiable, but nonetheless fun to take advantage of.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Man Who Knew Too Much</title>
      <link>https://jmduke.com/posts/the-man-who-knew-too-much.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-man-who-knew-too-much.html</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <description>The Man Who Knew Too Much is a film of peaks and valleys. There is little argument that it is a good film; whether you place it amongst the highest of Hitchcock&amp;#39;s work depends on just how much you value the stratospheric heights it reaches, and whether they overcompensate for the lulls.</description>
      <content:encoded><![CDATA[<p><em>The Man Who Knew Too Much</em> is a film of peaks and valleys. There is little argument that it is a good film; whether you place it amongst the highest of Hitchcock&#39;s work depends on just how much you value the stratospheric heights it reaches, and whether they overcompensate for the lulls.</p>
<p>The film is never weak, but it is weak <em>for Hitchcock</em> in parts. Watching it for the first time, and knowing that it is a Hitchcock film, you feel as though you don&#39;t quite need all the foreshadowing and lampshading. As it progresses, you can&#39;t help but feel a sense of déjà vu with his other work — remarkable for this film as compared to the parts of his filmography not considered his absolute best.</p>
<p>As a remake of his own 1934 work, and something relatively mid-career for him, it is very much him in his bag, doing what he does and what he is well known for. Compare this with, say, <a href="/posts/family-plot.html">Family Plot</a>, where your mileage largely depends on how willing you are to go along with him doing something much shaggier than usual. Put another way: this is the first Hitchcock film where I found myself not once, but <em>twice</em>, checking how much time was left in the movie and being surprised that there was so much still to go.</p>
<hr>
<p>But those dizzying heights. There is, crucially, the ability Hitchcock has to wring noteworthy performances from the Jimmy Stewarts of the world — to see something new and interesting in a face you have already seen so many times. I say this without consulting any of my prior notes, but my gut reaction was that this was my favorite Jimmy Stewart performance I have ever seen. He plays a man who fits perfectly the definition of <em>fumbling</em>.</p>
<p>Hitchcock uses his frame for great gags, especially in the first act. But there are two scenes in particular where you see Jimmy Stewart as something an actor of his caliber is almost never shown as: a completely broken man. First, the close-up of him holding the corpse of a dying man, trying to process on many levels the mistakes and errors he has made over the past few days. And then a scene that is grotesque in many ways, but not unrealistic, when he coerces Doris Day — his wife, who must be said is consistently much smarter than him throughout the film — to take a fistful of tranquilizers before he delivers the news that their son has been kidnapped.</p>
<p>For all the love I have for Cary Grant, he tends to have a certain problem in Hitchcock films of being too starkly charming in the scenes where terrible things have happened to him. Jimmy Stewart crumbles, and stays crumbled, until the very end.</p>
<hr>
<p>And then, of course, there is the VistaVision and the scene work. I am not smart or well versed enough to talk about the technology and how Hitchcock used it, but the aesthetics are perfect and gorgeous. He relies a lot on static shots, especially when we are first introduced to Marrakesh, that — like a discordant note held for slightly too long — usefully upset the viewer.</p>
<p>But where I must end this review is, I imagine, with the set piece that most people think about when they think about this film: Albert Hall. Five minutes of opera and those aforementioned static shots, not a single line of dialogue, but stress building and building and building — for me, it is indelible, and so powerful that even after I forget the silly international spy bits, I know I will remember it for years to come.</p>
<hr>
<p>I think this is correctly placed in the mid-tier of Hitchcock&#39;s canon. His best films are tauter and have more things to say, tauter and carry more opinions than this one does. But a middle-tier Hitchcock film is still a very good film. And if I got to watch something this good every evening for years to come, I would consider myself a very lucky filmgoer. 8 out of 10.</p>
<p>One last thing: Doris Day was great. The script did not really give her much to display any sort of range, despite the character herself being very competent and capable and, again, much smarter than Jimmy Stewart&#39;s — but there&#39;s just not a lot for her to do. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Honestly, the same could be said of Jimmy Stewart&#39;s character, and to a certain extent that&#39;s why parts of the film drag as much as they do: you get the sense that our protagonists are, up until that Albert Hall scene, passive observers more than they are agents of the action. Not a sin in and of itself, but it exacerbates the drag in the middle of the film, because everyone is just going through the motions. But Day&#39;s performance in that tranquilizer scene is unimpeachable — and, as with Jimmy Stewart, not something you&#39;re used to seeing from an actress of her stature.</span></p>
]]></content:encoded>
    </item>
    <item>
      <title>Wet Hot American Summer</title>
      <link>https://jmduke.com/posts/wet-hot-american-summer.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/wet-hot-american-summer.html</guid>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
      <description>It feels like a long-standing embarrassment that I had never seen Wet Hot American Summer. And the longer I put it off, the harder it became to watch — like an undergrad paper already past its deadline. It wasn&amp;#39;t even a worry that I wouldn&amp;#39;t like it, but a sense that everything the movie had to offer I had already consumed in some other form or fashion, in the various spiritual sequels and films its stars went off to make.</description>
      <content:encoded><![CDATA[<p> It feels like a long-standing embarrassment that I had never seen <em>Wet Hot American Summer</em>. And the longer I put it off, the harder it became to watch — like an undergrad paper already past its deadline. It wasn&#39;t even a worry that I wouldn&#39;t like it, but a sense that everything the movie had to offer I had already consumed in some other form or fashion, in the various spiritual sequels and films its stars went off to make.</p>
<p>I was wrong, obviously, and I loved it. I loved it in much the same way I loved <a href="/posts/they-came-together.html">They Came Together</a>, which is essentially the same film with a slightly different cast. Where <em>They Came Together</em> skewered rom-coms, this one makes fun of teen movies. These films are not well-reviewed in the same way a particularly good episode of <em>Saturday Night Live</em> in its heyday would not be well-reviewed: part of the appeal is vibes and volume. It is easy, perhaps, to focus too much on the jokes that don&#39;t land, as opposed to the ones that do.</p>
<p>For my part, what the movie feels like is a warm hug. And in a strange way, it gives me the sense of having already watched it many times — this first viewing being the latest in an ongoing series. Not because the jokes are stale (though, having spent enough time internalizing the UCB extended universe, you could certainly make that accusation) but because it feels <em>comfortable</em>.</p>
<hr>
<p>Obviously it is fun to note, as many people do when discussing the film in retrospect, how many incredible stars — or if not stars, then <em>guys</em> — are jammed in here. But I&#39;ll avoid saying too much about them, because I don&#39;t have much to add that hasn&#39;t already been covered at length. I do want to give specific accolades to the children, who managed, in scene after scene, to just absolutely nail the assignment. This is not easy work, honestly. A version of this film in which the child actors drag down the whole thing is not far-fetched.</p>
<p>Is this the greatest comedy movie ever? No, obviously not. But it might be the one, in some small way, that I&#39;m most grateful for — both as a kind of beachhead for a bunch of very talented people to go on and do other things, and as a sort of rallying flag around which people can organize.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Notes on Cloudflare Access</title>
      <link>https://jmduke.com/posts/cloudflare-access.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/cloudflare-access.html</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
      <description>Cloudflare is now in the AWS zone: it has a long tail of useful but under-examined little services that haven&amp;#39;t quite entered the zeitgeist the way the flagships have. One that we&amp;#39;ve recently started using — and quite admire — is Cloudflare Access.</description>
      <content:encoded><![CDATA[<p>Cloudflare is now in the AWS zone: it has a long tail of useful but under-examined little services that haven&#39;t quite entered the zeitgeist the way the flagships have. One that we&#39;ve recently started using — and quite admire — is Cloudflare Access.</p>
<p>The UX is very simple. If you have a domain backed by Cloudflare DNS, and that domain runs through a DNS proxy, you can put a one-click authentication wall in front of it. Delightful.<label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Free up to fifty users, at which point it&#39;s seven dollars per user per month — worth knowing before you wall off something with a big team behind it.</span></p>
<p>Obviously, this is not useful for everything, or even for most things. But we found two good use cases. The first is our admin site, which obviously needs to be protected — but doesn&#39;t need a broader authentication mechanism, or any real knowledge of a user model. The second is our internal tooling. We have an internal file-sharing tool, for instance; putting it behind the same access policy isn&#39;t a game-changer, but it&#39;s genuinely nice, and it&#39;s genuinely neat.</p>
<p>What I admire most is that it feels like an obvious case of vertical integration used for good. I think that&#39;s very cool. It gives me a glimpse of a world — perhaps not too distant — where Cloudflare is a much more serious contender in infrastructure. Which is not to say they aren&#39;t already one.</p>
<p>If you squint a little, there&#39;s a lot of tooling and adjacency that becomes much easier to build and sell once you already sit on a user&#39;s DNS. Historically, the answers have been kind of boring: email, web hosting, and so on. But with sufficient skill and ingenuity, that&#39;s just the tip of the iceberg.</p>
<p>The biggest downside, obviously, is lock-in — to which I have no salient or interesting answer, besides that the switching costs of using such a service are outweighed by the utility it provides. That could certainly become untrue in the future. But it isn&#39;t today.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Master Builder</title>
      <link>https://jmduke.com/posts/a-master-builder.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/a-master-builder.html</guid>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
      <description>Vanya on 42nd Street is, to date, my favorite film of the year. The more I revisit it, the more I suspect it might be one of my favorites of all time. So discovering that Wallace Shawn had attempted something of a spiritual successor — this time with Ibsen instead of Chekhov — was cause for celebration.</description>
      <content:encoded><![CDATA[<p><a href="/posts/vanya-on-42nd-street.html">Vanya on 42nd Street</a> is, to date, my favorite film of the year. The more I revisit it, the more I suspect it might be one of my favorites of all time. So discovering that Wallace Shawn had attempted something of a spiritual successor — this time with Ibsen instead of Chekhov — was cause for celebration.</p>
<p>I&#39;ll admit that I&#39;m more of a Chekhov man than an Ibsen one, but so much of what I loved about <em>Vanya</em> was not the script or the play itself; it was the interplay between the idea of theater and the idea of film. <em>Vanya</em> suggests a synthesis of the two forms through a shared goal of enchantment; the performances are great and the material is great, but all the fourth-wall stuff is meaningful on a level beyond devotion to the play itself.</p>
<hr>
<p><em>A Master Builder</em> comes two decades later, directed this time by Jonathan Demme (of <a href="/posts/stop-making-sense.html">Stop Making Sense</a> and a slew of others.)</p>
<p>Demme appears to be going for something quite different -- or at least achieves (though that implies a certain intentionality) a much different effect. <em>A Master Builder</em> feels less like a sequel to <em>Vanya</em> and more like a spiritual rebellion against it: naturalistic performances are replaced with exaggerated ones; calm, steady, invisible direction is replaced with jarring cuts and off-putting close-ups; the warm, decrepit charm of the crumbling playhouse on 42nd Street is replaced with sterility and cold tones. Put simply: <em>Vanya</em> wants you as close as possible, and <em>A Master Builder</em> is insistent on pushing you away.</p>
<p>And consider myself pushed! There were more than a few moments during this film where I felt uncomfortable — not because I was grappling with something difficult, or reckoning with what the film was trying to tell me, but because everything simply felt so jarring in a way that seemed poorly architected rather than intentional.</p>
<p>(Hagerty was great, though.)</p>
<hr>
<p><em>Update.</em> My friend Jennifer emailed me to suggest that I listen to the <a href="https://podcasts.apple.com/us/podcast/a-master-builder-with-john-hodgman/id981330533?i=1000467763827">Blank Check podcast episode</a> about this, and as someone who only has room for one middlebrow film podcast in their life, I had been putting this off for quite some time — but I&#39;m glad for her suggestion, as I finally took the plunge.</p>
<p>Not only because it was a very funny episode in which I had all of my priors confirmed, albeit in a more manic and eloquent manner than above, but because — of all people — their guest was John Hodgman, who delivered this point about both the play and the production altogether:</p>
<blockquote>
<p>But only do I feel like Julie Haggerty really figures out what this is about when she says the thing. Yeah, my twin children died after this fire. My house burned down that I grew up in. But that&#39;s not what bothers me. What bothers me is the loss of all of the dresses that my mothers and grandmothers made, all this silent secret work that women do that never gets celebrated by putting a wreath on a phallic symbol or whatever in the middle of town. And two, these dolls that I had, these nine dolls that I even still as an adult played with these dolls when you were a grown up. She had a secret in her life that got burned up by her husband&#39;s ambition. It was just – that was the moment where I felt like, oh, this could be a – you could redo this play and it would be revolutionary to see today. </p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Tech debt is weird</title>
      <link>https://jmduke.com/posts/tech-debt-is-weird.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/tech-debt-is-weird.html</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>Jesse wrote this interesting article on technical debt, which resonated with me spiritually but not directionally -- which is a very weird way to say that I agree with some parts and disagree with others (so you should read this not as a critique of the post but an exploration from my point of view). The title of this essay is &amp;quot;negative-interest tech debt&amp;quot;, which gives you a sense of where Jesse is going, but read the post in its entirety for two reasons:</description>
      <content:encoded><![CDATA[<p>Jesse wrote <a href="https://jesseduffield.com/Negative-interest-tech-debt/">this interesting article on technical debt</a>, which resonated with me spiritually but not directionally -- which is a very weird way to say that I agree with some parts and disagree with others (so you should read this not as a critique of the post but an exploration from my point of view). The title of this essay is &quot;negative-interest tech debt&quot;, which gives you a sense of where Jesse is going, but read the post in its entirety for two reasons:</p>
<ol>
<li>it is short,</li>
<li>it is nuanced; he is clearly neither arguing that technical debt is a thing of the past and we should treat it as such, nor that it&#39;s the exact same as it&#39;s always been.</li>
</ol>
<p>With that in mind, I have four commingled takes. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Thank you to Sonny who reminded me that I cannot count.</span></p>
<h2>Technical debt is materialized as drag against the ability to deliver customer value.</h2>
<p>This sounds like a pedantic recharacterization of Jesse&#39;s words, but I want to be very deliberate about this because I think the distinction is meaningful. In particular, it is important to remember that there are times where the technical debt brings pain even though we&#39;re not trying to make a code change or deliver value through a code change. If there&#39;s an incident that takes 2x as long as it should because nobody knows how the relevant subsystem operates, that is still technical debt. </p>
<p>If you would like to argue that that gets materialized purely as bad documentation or some other failure, okay, fine, whatever. But then the question becomes: how do we more adequately build LLM-generated codebases which humans can operate and internalize the mechanics of just as well as their own? I don&#39;t think we have arrived at that answer, </p>
<h2>LLMs are default net-producers of technical debt</h2>
<p>I am a person who <em>abhors</em> technical debt, often to the detriment of my ability to build more directly useful things for customers. I feel fairly proud of my ability to leverage LLMs to drive down technical debt. There is no question that Buttondown&#39;s codebase is filled with less technical debt than it used to be, even though it is more generated by LLM than it used to be. However, that&#39;s not happening a priori. If I were to ask the Council of Frontier Models what specific things I could do to lower technical debt, their answers would be incorrect and would probably end up increasing technical debt. (This harkens back to one of my favorite aphorisms, which is that technical debt is the delta between a codebase and the reality which it attempts to map.)</p>
<p>I have seen enough codebases from organizations and individuals who do not care about technical debt to know that, absent very strenuous guardrails and intervention, the situation gets dire very, very quickly. This is a problem exacerbated by the fact that observability tooling for LLMs is still at a very nascent period, such that we feel the pain of technical debt without being able to quantify it. When you are spending all day struggling with some bad abstraction or kludge, you notice and internalize that much more than when an LLM is.</p>
<h2>LLMs are not free</h2>
<p>In a world where technical debt is completely solvable by LLMs, all that means is that the technical debt now assumes the form of traditional financial debt. LLMs are not free. I know it&#39;s really boring to say that, and I don&#39;t mean it in any sort of doomerish way. The thing that frustrates me about the school of thought that with enough tokens you can solve any problem is that, like, yeah, man — the tokens cost a lot of money. I think this is important to remember because suddenly we will want to reason about this work financially and not just from a productivity perspective. Certainly, I have been evaluating my own tool usage with the end goal of driving down cost, driving down token spend — which is technical debt in its purest form, if you can approximate token spend as a rough proxy for knowledge-work-based labor.</p>
<h2>LLMs devalue features at the same rate they pay down debt</h2>
<p>Jesse ended the post with a supposition:</p>
<blockquote>
<p>[If you think LLM improvements continue to compound relative to consumer price], you should probably spend less time worrying about tech debt, and spend more time shipping new features.</p>
</blockquote>
<p>I think this is true if and only if you are in a position where there&#39;s <em>genuine</em> first mover advantage and you happen to be that first mover. Otherwise (again, given this supposition) you must assume that your competitors are reasonable people who will be using these tools too, and therefore <em>also</em> pay down all of their tech debt and ship all of the features. The Red Queen problem comes for us all!</p>
<p>Personally speaking, though, I have learned to grow suspicious of prognostication that lets me lean into the kind of work that is easy and fun. </p>
<p>As I wrote in <a href="/posts/snacks-are-everywhere.html">Snacks are cheaper and tastier than ever</a>, I think you have to spend some time thinking really hard about what is the most important, highest-leverage use of your time — whoever you are — and changing your habits and approach to engineering accordingly. Regardless of the future of LLM capability or cost, I think the relative margin in having a given feature goes down for the simple reason that marginal cost of implementing that feature has gone down. </p>
<p>So this essay ends the same way all of mine lately: you need to find durable and meaningful ways to create value for your users. Same as it&#39;s ever been, but more so.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Secondhand Time</title>
      <link>https://jmduke.com/posts/secondhand-time.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/secondhand-time.html</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>It is rare that I review a book before I finish it. Sometimes I do this with bad books that I have not completed — but that is what the Goodreads user base calls DNFing it, explicitly saying that I am not going to finish, and therefore am capital-D done with it. I do it every so often with video games, too, where even if my interest in completing the thing end-to-end is waning, I still want to record my thoughts.</description>
      <content:encoded><![CDATA[<p>It is rare that I review a book before I finish it. Sometimes I do this with bad books that I have not completed — but that is what the Goodreads user base calls DNFing it, explicitly saying that I am not going to finish, and therefore am capital-D <em>done</em> with it. I do it every so often with video games, too, where even if my interest in completing the thing end-to-end is waning, I still want to record my thoughts.</p>
<p>And I feel comfortable with that because gaming is a different experience and mechanism than consuming literature. Books, generally speaking, are about the gestalt, and it is hard to opine on the full quality of one without knowing how it ends, and the feeling that comes over you when you close it and sit with your thoughts. A game, conversely, can be called a success if it entertains you meaningfully and deeply for some portion of time, even if you put it down while there is still content left to experience.</p>
<p>So I am breaking with tradition here. I am talking about <em>Secondhand Time</em>, my favorite book of the year — a book that has taken me six months to get through and will probably take me another two or three to complete. And I am comfortable talking about it because, not unlike a video game, it has already offered me so, so much, that to delay doing so would be an exercise in unnecessary formality.</p>
<p><em>Secondhand Time</em> is an oral history of the regions comprising the former USSR, compiled almost entirely from firsthand narrative: actual people recounting their past. It is sprawling and nonlinear. There are obvious messages the author is trying to communicate — but unless I am in for a rude awakening, there is going to be no denouement that deeply recontextualizes or reshapes everything that came before.</p>
<p>You hear countless stories, repetitive and rhapsodic, from every possible walk of life, though almost all of these walks involve the scars and bruises left by war and revolution. The only unifying thread is sadness and bitterness — not nostalgia, though certainly some of these stories contain nostalgia, so much as the sense of a country weeping for all the pain it has gone through.</p>
<p>It is a brutal and beautiful book. It has taken me a long time to read because, frankly, sometimes the brutality — the extremes of the human condition to which I have been so privileged to be largely ignorant — is too much to bear, and I need to wade back out into the shallows until I am ready to resume.</p>
<hr>
<p>This is an oral history. And at the time of this writing, <em>The Odyssey</em> is the single biggest movie event of the year — <em>The Odyssey</em> being a book that is the writing-down of a story told from person to person over many, many years. And that story, too, is about a man who primarily tells stories: to kings and gods and everyone he encounters, sometimes for good effect and sometimes for ill.</p>
<p>I am drawn to the comparison despite these two books sharing little to nothing with one another. Let me give you one example.</p>
<p>One of the early stories in the book is about Sashka, a man who burned himself alive in the vegetable patch he owned outside a barracks — a suicide, to escape the pain of his daily drudgery. The story is told to us through by the author, recording faithfully the words of Sashka&#39;s friend and neighbor in the barracks. </p>
<p>That neighbor spends her time on the page filling it with wild digressions that the author clearly found fascinating enough to include, and she was right to. One of these digressions is about the neighbor&#39;s mother, and the time the Germans occupied their remote farm town. In the span of a single afternoon, they shot every single Jew in the whole town. Except — the speaker tells us — two frightened and clever little boys, eight and ten years old, hiding out in a neighbor&#39;s barn.</p>
<p>Her mother, one of the few in on the secret, was tasked with bringing these precious children a little milk in the dead of night whenever she could. But because in such stories there is always a turn, after a week or two she awoke to the screech of three German motorcycles pulling up to the barn. Someone else, it appears, had told a story — had informed on the barn&#39;s owner, fabulizing in the process, saying it was not just two boys but an entire dozen of Jews hiding. The two boys were shot immediately. And the neighbor, for all their bravery and trouble, was tied to one of the motorcycles and forced to run alongside it until their heart burst.</p>
<hr>
<p>I think, right now, for one reason or another, I am drawn to things that try (in vain, with honor) to evoke the sheer depth and breadth of the human experience. Ducks, Newburyport was the last book that took my breath away in quite this sense — a feeling that can only be described as <em>transportative</em>, a sense not of enchantment but of teleportation.</p>
<p>It is a blessing to get to read something like this. It also requires not just fortitude but reflection; I have put down this book for an afternoon and felt myself so compelled by what I was reading that I knew I had to start writing about it.</p>
<p>This is not an obscure book. The author won the Nobel Prize. And yet I have never heard anyone discuss it. Perhaps this is due to its peculiarity — its sitting outside the easy confines of genre, neither a traditional history nor traditional fiction by any means. Perhaps partially due to it being a Russian work, though it must be said that the English translation is masterful. Perhaps due to the book simply being uncomfortable and unapproachable.</p>
<p>The stories of triumph and victory, rare and fleeting as they are, always arrive as either a prologue or an epilogue — which is perhaps the most honest way to think about the human condition. Narratives ought to impose a clean chronology on events: a rising action, a falling action, a denouement. But this is never how the world works. And to the extent that we can feel comfortable with the illusion — whether in our media or in our day-to-day lives — that comfort is equal parts blessing and willful ignorance, handed to us by many people, almost all of whom died and suffered in life, whether on the battlefield or in the factory line.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MacGruber</title>
      <link>https://jmduke.com/posts/macgruber.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/macgruber.html</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>Letterboxd has an ingenious concept baked into its rating system. You can rate a film on a scale of zero to four stars, and you can also adorn a film with a heart. These two things are completely separate systems. The films you love and the films you thought were great are by default a decoupled set.</description>
      <content:encoded><![CDATA[<p>Letterboxd has an ingenious concept baked into its rating system. You can rate a film on a scale of zero to four stars, and you can also adorn a film with a heart. These two things are completely separate systems. The films you love and the films you thought were great are by default a decoupled set.</p>
<p>This is one of many decisions that makes Letterboxd a fascinating and well-designed piece of software, because I have no idea how to rate <em>MacGruber</em>, which strains the conceit of a single numerical score. And I don&#39;t mean this only in the same way it can be said of all comedic films. Obviously it is harder to discuss the positive and negative qualities of comedy as opposed to drama, because subjective tastes become even more subjective.</p>
<p>But very specifically, my reaction upon watching <em>MacGruber</em> — a film during which I laughed out loud more than any other film this year — was some combination of &quot;that was a piece of shit&quot; and &quot;I wonder if these five people have seen this, because I bet they&#39;ll love it.&quot;</p>
<hr>
<p><em>MacGruber</em> does not satisfactorily answer the most important question an SNL film must answer, which is: why does this need to exist at all? You could, again, say this of any work of art, but SNL films are all of a kind — sequels to sketches whose idea was already hyper-optimized for a medium much, much shorter than ninety minutes.</p>
<p>One answer might be this: the writers <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">The credited writers are Forte and two SNL writers, which I would surmise is metonymy for &quot;the SNL writer&#39;s room.&quot;</span> had a handful of ideas stuck in their heads that would otherwise not come out. In the process of building a low-quality movie, they spilled those ideas, and it turns out some of them are extremely funny. Another answer might be that you give the late, great Val Kilmer and, of all people, Ryan Phillippe a chance to play opposite a character who — in a film or in a skit — is so loud that others do not have the budget or the time to do anything except react in a quick reaction shot. (Both, of course, are true yet insufficient.)</p>
<p>And the film feels, quite vividly, like a college dorm room filled with jokes and half-jokes being hurled like careless javelins. <label class="sidenote-toggle" for="sn-3">3</label><input type="checkbox" id="sn-3" class="sidenote-toggle-checkbox"><span class="sidenote">This is a connection I draw with no bias, even though it was released in 2010 while I was an undergrad.</span>  There are lots of jokes about dicks and balls. The repetition of these jokes itself becomes a joke, and it lets you briefly — for a fraction of a second — pretend that it is elevated material. If you don&#39;t like a joke, don&#39;t worry: another one of varying quality is coming five seconds later.</p>
<p>What else is there to say? This is not, to be clear, elevated material. But I can&#39;t imagine a better version of <em>MacGruber</em> than what we got. And the one we got made me laugh a bunch. Not just for obscenity&#39;s sake — because in the midst of the detritus, there was some really good material. Truth be told, I am not that much of a Will Forte fan. I would consider myself more of a Jason Sudeikis guy. But his comedy — and, as <a href="https://letterboxd.com/djhughes/film/macgruber/">getfiscal</a> puts it, &quot;pure energy&quot; — evokes in everyone he plays opposite who isn&#39;t from SNL <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Wiig really doesn&#39;t do it for me here, with a brief exception of her disgruntled face at the prospect of having to pretend to play the titular character.</span> a certain blessed mania.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Patch notes</title>
      <link>https://jmduke.com/posts/patch-notes.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/patch-notes.html</guid>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
      <description>Earlier this year I mentioned that Slay the Spire 2 had reached the status of needing to be deleted from my computer, on the grounds that it was proving too big of a distraction. More recently, a second game has reached that same ignoble height — except it&amp;#39;s not even a full game. It&amp;#39;s a demo. It is Guildrun.</description>
      <content:encoded><![CDATA[<p>Earlier this year I mentioned that Slay the Spire 2 had reached the status of needing to be deleted from my computer, on the grounds that it was proving too big of a distraction. More recently, a second game has reached that same ignoble height — except it&#39;s not even a full game. It&#39;s a demo. It is <a href="https://www.reddit.com/r/Guildrun/comments/1vfmu44/demo_update_053_patch_notes/">Guildrun</a>.</p>
<p>Guildrun is a single-player auto-battler in the spirit of Teamfight Tactics. If you&#39;re unfamiliar with the genre: it revolves around setting up a roster of heroes, equipping them with skills and items, and then having them fight against increasingly difficult enemies while you watch. I have never been a huge fan of the genre, and yet Guildrun has completely ensorcelled me — in no small part because I think they have nailed the balance between <em>mastery</em> and <em>chaos</em>. There&#39;s enough randomness in a given run that each one feels different, but I as a player have enough agency and optionality to feel that my choices not only meaningfully impact the run but that I&#39;m getting better at making the right choices over time.</p>
<p>This post isn&#39;t really about Guildrun, though. It&#39;s about their patch notes.</p>
<p>Remember: this is a demo. The game is not yet out, and it is a single-player game — there is no ladder, no economy, no opponent whose feelings about a nerf you have to manage. And yet the notes are uncommonly detailed and well-reasoned. It is very hip to talk about the lessons application designers can learn from game design, largely around progressive disclosure and activation/habit-building. But the thing that caught my eye here was how the balance dev talks about <em>archetypes</em> of players, and how they weigh priorities when making changes.</p>
<blockquote>
<p>Since it just isn’t possible for every player to be happy with every decision I make, I try to think about each decision in terms of the “net fun” it will add to the game for each kind of player. I read through my list of changes from the perspective of each major player group, then add up the total amount of positive and negative “fun units” I expect these players to derive from each change. This way, even though certain changes add to the net fun of one group while subtracting from another, I can always aim for each player group to end up with a positive net fun score, which hopefully translates to a positive view on the patch. However, if even one player group ends up in the net fun negative then I haven&#39;t done my job well enough.</p>
</blockquote>
<blockquote>
<p>For Guildrun, the 3 major groups of players are the Climbers, the Endless Mode players, and the Red Rift players. The Climbers are players who are in the process of climbing through the difficulties to unlock and complete all of Guildrun&#39;s content, and are currently our largest group of players by a decent margin. Everyone starts out as a Climber, and for many of these players the quest to discover everything the game has to offer is the game. The experience that players have during their climb through the difficulties is incredibly important to us, and the feedback from Climbers helps make the game better for all Climbers, present and future. Since the primary goal for most Climbers is to progress up the game&#39;s difficulties, it&#39;s easy to understand why nerfs can feel like an obstacle standing between them and their goals, and why buffs feel like a helping hand.</p>
</blockquote>
<p>It does not require a lot of rhetorical justification to understand how this might apply to traditional software. Software tends to grow more complex and featureful over time, which rewards edge case users who have already onboarded at the expense of new users; conversely, redesigns or radical simplifications of an interface might be a net positive for new users without any muscle memory whatsoever, but are often experienced as a net negative to experienced users who log in to find that all of their cheese has been moved.</p>
<p>Even more than that, I find, as a player who now aspirationally describes themselves as in absentia from any sort of impact of these notes, I can&#39;t help but admire the thought that went into these changes, minute as they are. And the explanations themselves, even if I might disagree with them, generates goodwill towards the organization, because at least now I can understand that there was a thought process and not just whimsy</p>
]]></content:encoded>
    </item>
    <item>
      <title>Adaptation</title>
      <link>https://jmduke.com/posts/adaptation.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/adaptation.html</guid>
      <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
      <description>Eighteen months ago, I wrote in review of Being John Malkovich:</description>
      <content:encoded><![CDATA[<p>Eighteen months ago, I wrote in review of <a href="/posts/being-john-malkovich.html">Being John Malkovich</a>:</p>
<blockquote>
<p>The worst thing a piece of comedy can do is, in the process of not taking itself seriously, forget to take its characters seriously. This film is deeply funny, and deeply weird, but Kaufman remembers every step of the way that these people are real, that they want things and feel things. (And I&#39;m sure there are a lot of interesting things it&#39;s saying at a metatextual level, but I figure I should finish watching <em>Adaptation</em> before I mull on those too heavily.)</p>
</blockquote>
<p>And now, having finally watched <em>Adaptation</em>, I feel as though I can adequately comment.</p>
<p>This is the first Kaufman film that has left me with a <em>lesser</em> level of respect for him than before. It has moments of greatness, many of them not owing themselves to the script. Streep&#39;s performance, both comedically and somberly, is brilliant — a couple of shots of her transfixed in thought, in particular the scene where she watches Laroche make a sundial (or the moment a few minutes later, when Charlie runs into her in the elevator and does nothing), are singularly devastating in a relatable way. For who amongst us has not had a tiny little non-incident in passing force us to zoom out and realize that we are standing in a swamp?</p>
<p>Some of the production gimmicks, especially in the film&#39;s first act, are fun too. And while it&#39;s not exactly high cinema, I think Nic Cage acted well enough to earn the gimmick of being billed twice.</p>
<p>But outside of the performances and a couple of particularly good shots, the film is juvenile, both in a straightforward way (lots of objectification, lots of the word &quot;fatty&quot;) and an existential way. </p>
<p>Take a film that more people have strong takes about: <a href="/posts/everything-everywhere-all-at-once.html">Everything Everywhere All At Once</a>. Detractors of the film will argue that it sacrifices substance for style; nobody would argue that it&#39;s not <em>trying</em> to deploy its style for the purpose of its emotional arc, just that it is unsuccessful in doing so.</p>
<p><em>Adaptation</em>, conversely, is clearly about passion and the creative process — but its underlying structure undermines its ability to concretely say anything about these topics beyond the fact that Charlie Kaufman spent some time thinking about them. (Perhaps we can credit Kaufman with the invention of irony poisoning!)</p>
<p>Bringing up EEAAO also reminds me that much of my 2026 viewing of this film is tempered by how far we&#39;ve come creatively in the two decades hence. Lampshading (a la Brian Cox&#39;s screenwriting teacher) is now old hat; recursion is seen in all media, because we have a stronger understanding of how all media is recursive. But this is not the Velvet Underground: Adaptation might be early to some of these things relative to mainstream cinema, but it ultimately relies on novelty and audaciousness (and a hope that you&#39;ll find it sufficiently clever) to be worth seriously recommending.</p>
<p>Let me end on a positive note, which is Streep&#39;s final line reading and the best I&#39;ve heard all year:</p>
<blockquote>
<p>It&#39;s over. Everything&#39;s over. I did everything wrong. I want my life back. I want it back before everything got fucked up. I want to be a baby again. I want to be new. I WANT TO BE NEW.</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Near to the Wild Heart</title>
      <link>https://jmduke.com/posts/near-to-the-wild-heart.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/near-to-the-wild-heart.html</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Two friends, upon learning that I wanted to get into Clarice Lispector, advised me not to start with Near to the Wild Heart. Having now finished the book, I think I understand why.</description>
      <content:encoded><![CDATA[<p>Two friends, upon learning that I wanted to get into Clarice Lispector, advised me not to start with <em>Near to the Wild Heart</em>. Having now finished the book, I think I understand why.</p>
<p>The two parallels that come to mind — less in terms of style and message than in terms of how one situates the prose — are Murakami and Woolf.</p>
<p>Murakami is, to be clear, the much less stylistically successful of the two. But like Murakami, Lispector&#39;s work has been treated with a sense of <em>otherness</em> — not as a method of denigrating it, but to suggest that it sits outside its country&#39;s literary tradition. And while you can make a compelling argument that Murakami taps into a distinctly Japanese sense of alienation and ennui in the modern era — and, moreover, that much of his earlier writing is explicitly political — Lispector here is ethereal, barely attempting to give any hint or indication of where and how her protagonists live.</p>
<p>Part of this otherness — the sense of the story being completely untethered to any semblance of setting — serves contemporary reading well, in this age of autofiction and, for lack of a better term, idealistic narcissism. There is hardly a hint of whiplash going from Ben Lerner to Lispector.</p>
<hr>
<p>Woolf I evoke for a handful of reasons. First: like Lispector, Virginia Woolf is often praised backhandedly, under the umbrella of feminist literature, or feminist modernism. But Woolf&#39;s goals — say, in To the Lighthouse — are directly oppositional to Lispector&#39;s. <em>The Lighthouse</em> is an argument toward the permeability of consciousness and shared existence, conveyed with empathy and perspective. Woolf uses the frame of modernism to talk about <em>shared experience</em>, and this pattern forms a lineage in which I can find much of my favorite writing. (See also A.S. Byatt&#39;s <em>Possession</em>.)</p>
<p>Lispector, conversely — at least in this book — is a solipsist. Her self-insert protagonist is the raison d&#39;être of the entire prose, the sun about which every other character orbits. Any character not named Joana is given time and energy only insofar as they shed light on Joana. And the philosophy of the book — beyond its explicit cribbing of Spinoza — is an argument, if not quite <em>in favor</em> of this, then against the status quo that spawns it.</p>
<hr>
<p>All that aside: this book makes me more intrigued to read the Lispector of her later years, while considerably less excited at the prospect of having found an author I can spend the next decade absorbing. Her biggest asset on display is the prose. Even through translation, her writing is beautiful and serrated, while never being Rococo. And considering her age upon writing this — and this is where the Woolf comparisons begin to feel unfair — one gets the sense of a young master in full control of what she wants to say and how she wants to say it, but who unfortunately does not yet have much at all to say.</p>
<p>One last note: the final chapter, a series of monologues from Joana, is indeed placeable among the highest echelons of modernism — beautiful and cryptic and self-indulgent all at once.</p>
]]></content:encoded>
    </item>
    <item>
      <title>op, mprocs</title>
      <link>https://jmduke.com/posts/two-tooling-changes.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/two-tooling-changes.html</guid>
      <pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate>
      <description>Two small tooling changes that have been really nice for us at Buttondown:</description>
      <content:encoded><![CDATA[<p>Two small tooling changes that have been really nice for us at Buttondown:</p>
<h2>1Password CLI</h2>
<p>A long-standing annoyance has been dealing with secrets and coordinating their rollout across CI, plus a bunch of Heroku instances, plus a bunch of Vercel instances, plus maybe a local box if you need them for critical debugging.</p>
<p>Historically, we did this by using whatever was in the production Heroku app as the source of truth and syncing and linking as much as we could. But with our pending migration to AWS, this approach, which was already crufty, now had two more problems. It had an expiration date, since I believe we are getting rid of the production Heroku app.</p>
<p>And suddenly the number of services to which we need to sync secrets has doubled. Our solution was to do the thing that I always wanted to do but could never quite summon the effort, which was standardize on using 1Password and their CLI. This worked pretty painlessly. We&#39;ve got a single entry in 1Password that represents all of the environment variables that we need for a given environment and we read from that before deploying. Rolling a key now requires one subsequent change (adding it to 1Password).</p>
<h2>mprocs</h2>
<p>We&#39;ve long used Overmind to orchestrate our local dev servers. It is -- was! -- fine, but it carries a steady drip of paper cuts — chiefly the inability to focus a single process&#39;s log output and the inability to restart a process from inside the running session. Individually trivial; collectively, hit many times a day, worth fixing.</p>
<p><a href="https://github.com/pvolok/dekit">mprocs</a> is a TUI process manager that solves exactly those. It pages between processes, scopes scrollback to the selected one, and starts/stops/restarts any process in place — no tmux, no external socket dance. After a week of piloting it, we switched over. It&#39;s been great.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Best of Enemies</title>
      <link>https://jmduke.com/posts/best-of-enemies.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/best-of-enemies.html</guid>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
      <description>Last year, I watched The War Room, the documentary following Bill Clinton&amp;#39;s first campaign — a film I am remiss for having never written about, because it was captivating, satisfying, and illuminating. And whether for good reasons or bad, it punctured most of my belief that the political moment we currently find ourselves in is novel in any grand sense. (See also Days of Rage, which covered the seventies; if you&amp;#39;re ever worried about civil unrest, it&amp;#39;s the one to reach for.)</description>
      <content:encoded><![CDATA[<p>Last year, I watched The War Room, the documentary following Bill Clinton&#39;s first campaign — a film I am remiss for having never written about, because it was captivating, satisfying, and illuminating. And whether for good reasons or bad, it punctured most of my belief that the political moment we currently find ourselves in is novel in any grand sense. (See also <a href="/posts/days-of-rage.html">Days of Rage</a>, which covered the seventies; if you&#39;re ever worried about civil unrest, it&#39;s the one to reach for.)</p>
<p><em>Best of Enemies</em>, compared to <em>The War Room</em>, has less immediacy and access but much more of a clear agenda and through line. It&#39;s about the William F. Buckley–Gore Vidal debates during the 1968 conventions, built out of lots of archival footage with very little fat. We, the viewer, spend more time <em>at</em> the debates than <em>examining</em> them; as someone who confesses to knowing of the <em>National Review</em>, and to owning a half-read copy of <em>Burr</em>, but not really knowing who either of these two individuals were in any meaningful sense — I appreciated how the film is equal parts explanation and analysis. </p>
<p>I hesitate to succumb to instinct and laud both them <em>and</em> the middle-brow public that appreciated and rewarded the idea of intellectualism. The histrionic fondness with which we might remember their patrician accents could very well be said, thirty or forty years from now, of people discovering blogs and pining for the days when public intellectuals would so candidly and openly write on Wordpress or whatever. Additionally, I don&#39;t buy at face value the film&#39;s thesis that these debates were the birth of American punditry. In no small part because I think <em>television itself</em> was the birth of American punditry — an organism that simply required some time to incubate.</p>
<p>But these two guys are fascinating, and the debates are riveting, and this documentary gets to carry that respective sunlight.  The film takes an unflinching look at who these people were and what drove them. How clearly you can see that these two men led twinned lives, to a certain extent: both ultimately failed ambitions, both incredibly intelligent, and — in what seems so deeply interesting, perhaps more so than the denoument of their careers after the debates — both horribly, horribly despondent toward the end of their lives.</p>
<hr>
<p>As for the debates themselves: it&#39;s fascinating to me that it&#39;s taken at face value that Vidal <em>won</em> by the TKO of successfully baiting Buckley into an outburst. Vidal succeeded in his goal and Buckley did not, but Buckley knew — as the film references multiple times — that the goal wasn&#39;t to be awarded the highest score by the judge, so to speak, but to be known at all.</p>
<p>What is beyond debate (ha) is that the experience destroyed at least some part of both men, or at least revealed to millions a part of them which was rotten.</p>
<p>The final scene in the film is a clip of Jon Stewart appearing on Crossfire, declaring that the format of the show is theatrical rather than analytical: Stewart&#39;s appearance was so caustic that the network cancelled the show and the two hosts (Carlson and Begala) considered irrevocably stained by the association: after a decade in the hinterlands (PBS and MSNBC), Carlson was a few years into a Fox &amp; Friends gig as a sort of Barbour-clad ronin; Begala left the television sphere entirely and returned to consultancy.</p>
<p>That was in 2015; in the decade since this film&#39;s release, whatever spectre haunting Carlson appears to have vanished, having risen to lead the most popular show on television before his ouster and now in the process of doing the same in the realm of podcasts. Just like sixty years ago, it appears that no transgression can outweigh the power of a sufficiently fervent audience.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Snacks are cheaper and tastier than ever</title>
      <link>https://jmduke.com/posts/snacks-are-everywhere.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/snacks-are-everywhere.html</guid>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <description>Perhaps the single most consequential essay I&amp;#39;ve read is Will Larson&amp;#39;s Work on what matters. This is ostensibly advice targeted towards staff engineers, but the content generalizes across disciplines. One of the failure modes he talks about is snacking:</description>
      <content:encoded><![CDATA[<p>Perhaps the single most consequential essay I&#39;ve read is Will Larson&#39;s <a href="https://lethain.com/work-on-what-matters/">Work on what matters</a>. This is ostensibly advice targeted towards staff engineers, but the content generalizes across disciplines. One of the failure modes he talks about is snacking:</p>
<blockquote>
<p>If you&#39;re in a well-run organization, at some point you&#39;re going to run out of things that are both high-impact and easy. This leaves you with a choice between shifting right to hard and high-impact or shifting down to easy and low-impact. The latter choice–easy and low-impact–is what Walk refers to as <em>snacking</em>.</p>
<p>When you&#39;re busy, these snacks give a sense of accomplishment that makes them psychologically rewarding but you&#39;re unlikely to learn much from doing them, others are likely equally capable of completing them (<em>and</em> for some of them it might be a good development opportunity), and there&#39;s a tremendous opportunity cost versus doing something higher impact.</p>
</blockquote>
<p>As my role as a founder has shifted to be more explicitly managerial over the past few years, I find myself returning to it whenever I am feeling particularly guilty of the behavior it espouses.</p>
<p>One of the things that has made this much more difficult over the past year has, of course, been the rise of LLMs. One of the things they have done is made it incredibly easy to avoid what <a href="https://en.wikipedia.org/wiki/Wicked_problem">Horst Rittel and Melvin M. Webber</a> refer to as wicked problems: problems with no clear success criteria, no right to be wrong, and no prior art (amongst other things.)</p>
<p>A few years ago, I could procrastinate on thinking deeply about go-to-market for a new segment by maybe hammering out a single bug fix or spending an hour in the support queue. Now, suddenly, my alternative to doing deep work contains many new Cyrenaic properties:</p>
<ol>
<li><p>I can pretend that it is in fact managerial work. Asking Cursor to build a visualization of metrics feels like it is something that is akin to strategy work, even though no decisions were made differently as a result of it.</p>
</li>
<li><p>I can build and ship features trivially. And these are features that I earnestly believe are things that, given an infinite time scale, I would want the product to have — even if the reason we haven&#39;t built them yet is because it&#39;s not obvious how it actually generates leveraged value for the business, nor is it obvious how to prove it.</p>
</li>
<li><p>I can spec out and create high-fidelity prototypes for interesting new product directions. Even if those prototypes end up gathering dust, and by the time I&#39;m ready to seriously consider them, the context which necessitated or informed their construction is obsolete.</p>
</li>
</ol>
<p>So what to do?</p>
<hr>
<p>One answer is simply that I don&#39;t know, and it feels very important -- like, &quot;I have written and discarded six other versions of this essay over the past eight weeks&quot; important -- to try and figure it out, because if you have good eyesight you can probably see a Red Queen problem lurking on the horizon where all of the software factories in the world nullify any marginal advantage that the others might have. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">We are far away from this. The median software company, despite what you read online, is still figuring out how to get its CRM hooked up to Claude, but we&#39;re not going to be far away forever. </span></p>
<p>Another answer is &quot;exercise more personal and organizational discipline&quot;. This is true but facile.</p>
<p>Here&#39;s the answer that feels best right now: the definition of something being done must shift from the code being shipped to customer realizing that. That sounds both abstract and obvious, I know, and I&#39;m sure you can compellingly argue that every good company should already be operating from that position. But this is a personal blog, and in my personal experience, I can say that I&#39;ve gotten surprisingly far with Budden and other projects, pretending I am Kevin Costner and knowing that if I build it, they will come. </p>
<p>LLMs optimize the transformation of input into output; in my experience, all the context in the world does not aid them in creating customer value from first principles. Now more than ever, the job is to build both wisdom of what users find valuable and knowledge of how to decompose that into legible work.  </p>
]]></content:encoded>
    </item>
    <item>
      <title>Cursed knowledge</title>
      <link>https://jmduke.com/posts/cursed-knowledge.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/cursed-knowledge.html</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <description>Nick pointed me towards Marcin who pointed me towards immich&amp;#39;s list of cursed knowledge the other day, and it has already become a running joke in the Slack.</description>
      <content:encoded><![CDATA[<p>Nick pointed me towards Marcin who pointed me towards <a href="https://immich.app/cursed-knowledge/">immich&#39;s list of <em>cursed knowledge</em></a> the other day, and it has already become a running joke in the Slack.</p>
<p>Here is a baker&#39;s dozen of Buttondown&#39;s own cursed knowledge: <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Yes, that&#39;s the joke.</span></p>
<hr>
<ol>
<li><p>The Python <code>ua-parser</code> library assigns the device family <code>&quot;Other&quot;</code> to <em>every</em> non-Mac desktop browser</p>
</li>
<li><p>The HTML <code>accept</code> attribute only filters what the file-picker dialog <em>shows</em> you; drag-and-drop and clipboard paste bypass it entirely.</p>
</li>
<li><p>Safari and Chrome re-serialize quoted CSS custom-property strings differently when you read them back via <code>getComputedStyle</code>: Chrome keeps the single quotes, WebKit rewrites them to double quotes. </p>
</li>
<li><p>Django emits a <code>CacheKeyWarning</code> — which fails our CI — for any cache key over 250 bytes or containing a space or control character.</p>
</li>
<li><p>Python&#39;s <code>requests</code> has no default timeout and will, given the opportunity, wait forever.</p>
</li>
<li><p>SPF <code>include:</code> directives recursively chain DNS lookups against a hard cap of ten — exceed it and you get a <code>permerror</code>, which can fail authentication for <em>all</em> of your mail.</p>
</li>
<li><p>Outlook and Hotmail enforce mandatory TLS but serve a certificate chain rooting at DigiCert Global Root CA (G1) — a root that Ubuntu has since removed from its trust store.</p>
</li>
<li><p>Django&#39;s <code>JSONField</code> <code>data__key__isnull=True</code> tests whether the <em>key exists</em>, not whether its value is JSON <code>null</code>.</p>
</li>
<li><p><code>UPDATE ... WHERE id IN (...)</code> does <em>not</em> lock rows in the order you listed them — Postgres locks them in executor scan order, which is a wonderful way to deadlock two queries that both thought they were being careful.</p>
</li>
<li><p>A postgres <code>tsvector</code> cannot exceed ~1MB.</p>
</li>
<li><p>Stripe will send subscription update events for paused subscriptions.</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Enough Said</title>
      <link>https://jmduke.com/posts/enough-said.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/enough-said.html</guid>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
      <description>More by luck than by fate, most of the great protagonists of the last forty years of television have escaped forever being associated with the character they played. Jon Hamm&amp;#39;s love of comedy means that, in a bizarre way, I think of him more as a guest on Comedy Bang Bang than as Don Draper — despite Mad Men being my favorite show of all time. Similarly, Bryan Cranston has such a well-enmeshed prior career in comedy and sitcoms that one can hardly fault him for being anything but one note.</description>
      <content:encoded><![CDATA[<p>More by luck than by fate, most of the great protagonists of the last forty years of television have escaped forever being associated with the character they played. Jon Hamm&#39;s love of comedy means that, in a bizarre way, I think of him more as a guest on <em>Comedy Bang Bang</em> than as Don Draper — despite Mad Men being my favorite show of all time. Similarly, Bryan Cranston has such a well-enmeshed prior career in comedy and sitcoms that one can hardly fault him for being anything but one note.</p>
<p>But whether it&#39;s due to his relatively short career — made even shorter by his untimely passing — or to the singular power of the performance itself, I could not ever imagine James Gandolfini as anyone other than Tony Soprano.</p>
<p>Having only seen him in one other work — <a href="/posts/the-death-of-stalin.html">The Death of Stalin</a>, in which everyone&#39;s playing a lot of dress-up and having a fun time but not trying particularly hard to be a <em>good actor</em> — I pulled up his filmography and found <em>Enough Said</em>, a film I vaguely remembered, largely for the circumstances of its release. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Gandolfini passed after the movie had wrapped, but before it had finished editing.</span> So I sat myself down and had a watch, and came away with the obvious conclusion that, armed only with these two performances: Tony Soprano and Albert, a reasonable person would assume that Gandolfini is the greatest actor of all time.</p>
<p>Often, when actors want to play against type, they do so by insisting upon themselves in one way or another — playing a part that seems somehow audacious, or <em>other</em>. Gandolfini here is none of those things. He is a kind guy, but not angelic. He is a bit of a slob, but not disgusting. He plays a human being with depth and nuance and warmth and sensitivity in a way that I don&#39;t think I&#39;ve ever seen quite captured like this.</p>
<p>And that sense could be extrapolated to the film as a whole, which — if you can look past the central conceit and Julia Louis-Dreyfus&#39;s tendency to over-emote in the first two acts — is a bittersweet, funny, but deeply realistic meditation on what marriage does to people. Holofcener, who wrote the script, takes no prisoners, but she doesn&#39;t cast anyone as demons either. This is a story about two people who are flawed but not damaged. And her writing, mercurial as it is, <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">Production notes indicate there was a lot of improvisational work done, which helped contribute to the naturalistic feel — and, in particular, to that final scene.</span> was so good here that I immediately pulled up the rest of her credits to add to my backlog.</p>
<hr>
<p>The film has its contrivances, and at times forces the point a little too heavily, as if each scene were rewritten to drive Louis-Dreyfus&#39;s character one step further into Flanderization. But it is an honest and entertaining portrayal of adults being adults — and when you layer on top of that one of the single greatest acting performances I&#39;ve seen in my entire life, it&#39;s hard not to recommend it. Even if it feels, ultimately, a little slight.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nirvanna the Band the Show the Movie</title>
      <link>https://jmduke.com/posts/nirvanna-the-band-the-show-the-movie.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/nirvanna-the-band-the-show-the-movie.html</guid>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
      <description>No matter what, you&amp;#39;re going to have a great time watching this movie. It is funny and audacious and handcrafted, which is a quality that feels increasingly absent from the modern cinematic landscape. It is hard to get an honest-to-God comedy released these days. It is even harder to get one of this kind that is as bizarre and metatextual and devoid of any real box office draw, except its own aggregate goodwill and perhaps the increasing cachet of Matt Johnson.</description>
      <content:encoded><![CDATA[<p>No matter what, you&#39;re going to have a great time watching this movie. It is funny and audacious and handcrafted, which is a quality that feels increasingly absent from the modern cinematic landscape. It is hard to get an honest-to-God comedy released these days. It is even harder to get one of this kind that is as bizarre and metatextual and devoid of any real box office draw, except its own aggregate goodwill and perhaps the increasing cachet of Matt Johnson.</p>
<p>I really enjoyed watching this film, so take it with a grain of salt when I say that it also leaves me a little cold without the aegis of some of the truly remarkable and original shenanigans it pulls off (the details of which I&#39;m being intentionally vague on so as not to spoil anyone or anything). I think the best way to engage with this is less as a film and more as an incredible and hilarious experiment that happened to be released in theaters. An achievement of some kind, if not cinema.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Check the status page</title>
      <link>https://jmduke.com/posts/check-the-status-page.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/check-the-status-page.html</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <description>As I&amp;#39;ve covered somewhat extensively in prior writing (see A month of OpEx quick wins and Self-hosting our GitHub Action runners), this year has been marked by a careful and deliberate shrinking of our stack, button down, with the goals of, in order, one, reduce long-term maintenance burden. Two, reduce operational expenses. Almost without us really meaning to, this has materialized indirectly as adopting a lot of Cloudflare stuff, which makes sense given that Cloudflare&amp;#39;s primary positi...</description>
      <content:encoded><![CDATA[<p>As I&#39;ve covered somewhat extensively in prior writing (see <a href="/posts/opex-quick-wins.html">A month of OpEx quick wins</a> and <a href="/posts/how-i-saved-100.html">Self-hosting our GitHub Action runners</a>), this year has been marked by a careful and deliberate shrinking of our stack, button down, with the goals of, in order, one, reduce long-term maintenance burden. Two, reduce operational expenses. Almost without us really meaning to, this has materialized indirectly as adopting a lot of Cloudflare stuff, which makes sense given that Cloudflare&#39;s primary positioning for almost all of their non-DNS infrastructure is a more cost-effective alternative to entrenched legacy alternatives like AWS. These savings have been real, and minus some hiccups here or there, the migrations have been extremely painless. However, we do find ourselves with the new problem of having accidentally introduced what at times feels like an SPOF. When Cloudflare&#39;s DNS infrastructure goes down, it impacts basically the entire world, and therefore I don&#39;t mind that much that it impacts us. But now that we&#39;re using their more esoteric offerings, we are no longer shielded by the aegis of universality. All of this is prelude to the fact that we&#39;re discovering Cloudflare has more operational issues than I think their reputation suggests, or at least our exposure to those issues feels precarious: last week (recency bias, but also fresh wounds) hit us <em>thrice</em>: once because of general dashboard issues, once because of R2 (their S3 competitor), and once because <a href="https://www.cloudflarestatus.com/incidents/652w59bvnbsj">all POST requests were silently/myseriously failing</a>.</p>
<p>Complaints aside, even knowing what I now know, I think all of our decisions were the right one. Part of this is just getting used to a slightly different status quo. We were able to remediate the two customer-facing incidents of these three very well (thanks entirely to Matias and Steph!), and in doing so, it revealed that we&#39;re just missing a lot of obvious kill switches and documentation for failure modes that aren&#39;t the ones we&#39;ve already been scarred by. So a lot of August will be enumerating and addressing those.</p>
<p>But as obvious as it sounds in retrospect, next time we evaluate a new vendor or a new SKU on an existing vendor, the first item on my list is going to be running a script on their status page to see what the actual stability of that SKU is and not just what the reputation suggests.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How the media library works</title>
      <link>https://jmduke.com/posts/the-media-library.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-media-library.html</guid>
      <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
      <description>I&amp;#39;ve received a number of questions as to how the media library part of this blog works, and I figure it&amp;#39;s worth a bit of time to explain — even though there frankly is not that much to explain.</description>
      <content:encoded><![CDATA[<p>I&#39;ve received a number of questions as to how the media library part of this blog works, and I figure it&#39;s worth a bit of time to explain — even though there frankly is not that much to explain.</p>
<p>The soul of the thing is that each media item is a markdown file, just like the posts themselves. Here, for example, is a recent one, for <em>Jay Kelly</em>:</p>
<pre><code class="hljs language-md">---
title: Jay Kelly
type: Movie
date: 2026-06-30
rating: 5
year: 2025
director: Noah Baumbach
status: Finished
image: jay-kelly.jpg
tags:
<span class="hljs-bullet">  -</span> movie
<span class="hljs-section">colorSortKey: [0, 22, 0]
---</span>

<span class="hljs-quote">&gt; I was young. I wanted something very badly and I was afraid that if I took my eye off it, I wouldn&#x27;t have it. And I was right. There was no other way to do it. And it meant choosing it over you. But it was always meant to be temporary. Just until I got what I wanted... But then I had to keep it.</span>

I am reminded of the other recent George Clooney vehicle, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;/posts/wolfs.html&quot;</span>&gt;</span></span>Wolfs<span class="language-xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></span>: this is self-indulgent in one dimension, and its merits are almost entirely carried by the efforts of Sandler and Clooney, both of whom give very strong performances which rescue the film from being Bad but do not carry it to greatness.

I also found myself wondering what Baumbach is up to right now. The script and direction here seem entirely <span class="hljs-emphasis">*thoughtless*</span> — not so bad as to be offensive, but neither interesting nor characteristic of his earlier and better work. I can dismiss things like the scattershot tone or the half-hearted performances from Laura Dern et al. as being intentional -- it is an ethereal, dreamlike film.

But the movie fails to do what I think it needed to do, which is to make us feel bad -- or novel in <span class="hljs-emphasis">_some_</span> kind of way -- for either character, even if for an instant.

Clooney plays a very light pastiche of himself: if you interpret the film as a story about Clooney himself, you are forgiven for doing so because he so comfortably eases into that role of charm and conviviality. He is a man who made it big, and in so doing had two lovely daughters who care little for him due to his absence -- an absence that he chose, time and time again, until there was no other choice to make.

(And much of the same criticism -- if it can be called that -- can be levelled at Sandler&#x27;s character, who is a very realistic depiction of a guy worth millions of dollars whose biggest problem is that nobody will say &quot;I love you&quot; to him.)

I watched <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;/posts/Somewhere.html&quot;</span>&gt;</span></span>Somewhere<span class="language-xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></span> earlier this year, and I think many parallels (Hollywood people and their Hollywood problems!) can be drawn between the two films, but the success of <span class="hljs-emphasis">_Somewhere_</span> is in what I called &quot;the wattage and nuance of Dorff and Elle Fanning&#x27;s performances&quot;; both together and in isolation the two performances there stirred something beyond artifice in me in a way that Jay Kelly did not.

---

Lastly, the ending.

I really think the story of this film is that Baumbach — and Emily Mortimer, as co-writer — came up with the final scene and the final line, and then worked their way backwards from it into a movie. And to a small extent, that worked: the final scene, and the final line, cliche as it is, smashes me to bits. But it feels cut from a different movie -- a different life! -- than the one I spent two hours watching.
</code></pre><p>The front matter is, of course, the most interesting bit to talk about. Most of it is self-explanatory, with the exception of the <code>status</code>, which is what governs the answer to the question: should this be published?</p>
<p>A quick aside on the color sorting. The grid is arranged by the dominant color of each cover, which I extract at build time and cache back into the front matter — that&#39;s the <code>colorSortKey</code> field above. It&#39;s the one bit of genuine cleverness in here, and mostly it just makes the grid pretty.</p>
<p>Beyond this, every other bit of functionality can be abstracted away into things you can do once you have a JSON blob. The media grid at the bottom of the splash page is just vanilla JavaScript. Deep linking, or wiki linking, to other reviews is handled through a bespoke build-time mechanism — but nothing you wouldn&#39;t be able to figure out from first principles, since it&#39;s the exact same logic as for how it works for blog posts.</p>
<p>I&#39;ve iterated on a number of different approaches over what is now, literally, more than a decade of keeping this little library. And if there&#39;s one ground truth that I hold dear above anything else, it is the primacy of flat files. They are portable, fungible, and legible.</p>
<p>I lose out on a couple of small idiosyncrasies. For instance, I can&#39;t trivially add new things from my phone — which sounds like a pain point, but any solution to the pain point would indirectly induce much more pain than it solves.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wings of Desire</title>
      <link>https://jmduke.com/posts/wings-of-desire.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/wings-of-desire.html</guid>
      <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
      <description>When I try to describe this film, I keep fleeing from the word strange toward poetic — because there isn&amp;#39;t much strange about it. If you accept its conceit at face value, everything that follows is fairly naturalistic and straightforward, especially given what else I&amp;#39;ve seen from Wenders. And the conceit is simple enough: angels, in a spiritual but perhaps not biblical sense, are all around us, invisible to everyone except children, tasked with guarding and observing a given patch of the...</description>
      <content:encoded><![CDATA[<p>When I try to describe this film, I keep fleeing from the word <em>strange</em> toward <em>poetic</em> — because there isn&#39;t much strange about it. If you accept its conceit at face value, everything that follows is fairly naturalistic and straightforward, especially given what else I&#39;ve seen from Wenders. And the conceit is simple enough: angels, in a spiritual but perhaps not biblical sense, are all around us, invisible to everyone except children, tasked with guarding and observing a given patch of the world.</p>
<p>In some ways this is Wenders&#39; too-clumsy attempt at combining the two things he loves — the bizarre, met in an ironical register, and an earnest examination of the kinds of people that not just cinema but humanity tends to gloss over. It&#39;s a slower film than the rest of his oeuvre, but not by much; there&#39;s more propulsive action here than in, say, Perfect Days. Even so, I think it&#39;s at its strongest in its first two-thirds, when it is quiet and observational — when we are mostly left to breathe in the space between these two good-hearted angels and the Berliners they wish to help.</p>
<p>The transition into its final act is perfect, even if the final act itself doesn&#39;t quite land for me: the fallen angel talking about symbolism, becoming human, immediately getting bonked on the head, the black-and-white exploding into color.</p>
<p>And then there&#39;s Peter Falk. His role is so central, and his performance so arresting, that the movie threatens to become his movie — his odes to humanity mirroring Homer&#39;s ode to the epic of peace, his monologues as he sketches extras and tries on hats both fun and beautiful. And the dichotomy he provides by giving identical monologues to each angel — the first successful, the second falling on deaf ears — provides a useful juxtaposition.</p>
<p>Wenders&#39; films are content with textual ambiguity but never with spiritual ambiguity; if I wasn&#39;t trained by his other works, I&#39;d argue that Falk can be seen more of a Satanic tempter of angels. We leave the film believing that everyone is in their right place: some angelic, and some never happier to have a head wound.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Notorious</title>
      <link>https://jmduke.com/posts/notorious.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/notorious.html</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
      <description>I think this might be the first Hitchcock that just didn&amp;#39;t really work for me. The premise feels unlike so much of his output: dated and strained.</description>
      <content:encoded><![CDATA[<p>I think this might be the first Hitchcock that just didn&#39;t really work for me. The premise feels unlike so much of his output: dated and strained.</p>
<p>Asking Cary Grant and Ingrid Bergman to both play against type is, I think, laudatory, but their work is half-baked at best. I don&#39;t care about their love for each other because it appears as if out of nowhere — a thing the script insists upon rather than something the performances themselves earn. The same can be said of Bergman&#39;s backstory as a lush and a &quot;loose woman,&quot; neither of which she hints at with anything besides emphatic insistence that she&#39;s not that kind of girl anymore. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Obviously, it is safe to blame The Code for much of this, but Hitchcock does not exactly bend over backward to handle it gracefully.</span></p>
<p>Claude Rains and his mother — Leopoldine Konstantin in her sole American performance as the stern, vaguely comic Nazi — both acquit themselves as the stronger pair of performances (&quot;You are protected by the enormity of your stupidity!&quot;) but even then their ultimate fate earns neither satisfaction nor sadness, because I simply do not know or care about them enough to justify it.</p>
<p>Two shots of this film will sit with me for a long time, though: </p>
<ol>
<li>the introduction of Cary Grant&#39;s character, in which he is filmed bravely and eerily from behind, showing only a silhouette of the man and his dark haircut.</li>
<li>the scene in which Rains famously tells his mother that he has made a big mistake, and her long, slow procurement of a cigarette in response.</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Two hundred decisions</title>
      <link>https://jmduke.com/posts/decision-logs.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/decision-logs.html</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
      <description>This week, after a little under two years of having adopted the practice, Buttondown has minted its 200th decision log. This is a practice very similar to RFCs or ADRs, but I prefer the term decision because it&amp;#39;s both A, used for a variety of non-engineering purposes, and B, sounds a little less lame. The practice itself is extremely simple and there is no catch. It goes something like the following:</description>
      <content:encoded><![CDATA[<p>This week, after a little under two years of having adopted the practice, Buttondown has minted its 200th decision log. This is a practice very similar to RFCs or ADRs, but I prefer the term decision because it&#39;s both A, used for a variety of non-engineering purposes, and B, sounds a little less lame. The practice itself is extremely simple and there is no catch. It goes something like the following:</p>
<ol>
<li>Decisions are any non-trivial choice made for a specific reason.</li>
<li>The context behind a decision is very hard to retrieve after the fact and grows in difficulty over time.</li>
<li>The ability to revisit this context and update, invalidate, or buttress it is extremely useful in a variety of reasons.</li>
</ol>
<p>Our decisions range from the monumental-yet-concise:</p>
<pre class="decision"><code><span class="decision-meta">---
id: &quot;0002&quot;
title: What domain should we use now that we have buttondown.com?
date: 2024-05-14
status: implemented
---</span>

We should shift to buttondown.com, but the process of doing so is very unclear and we need to take it slowly + carefully.</code></pre>



<p>to the trivial-but-nuanced:</p>
<pre class="decision"><code><span class="decision-meta">---
id: &quot;0196&quot;
title: &quot;Unship django-simple-history&quot;
author: Justin Duke
date: 2026-06-24
status: implemented
---</span>

## Context

We carried `django-simple-history` for years to track changes to two objects: the
`Newsletter` and the `Email`. It installed mirror `Historical*` tables that copy
every field of the tracked model on every save.

It is the same kind of dependency we have spent the past year unshipping
(0148 django-safedelete, 0149
django-structlog, 0152 django-anymail): a general-purpose,
illegible, low-performance package doing work that our actual use case — narrow
and minor — does not justify. We already had a `*StatusTransition` model and
several other purpose-built ways to record the changes we cared about, so most of
what `django-simple-history` did was redundant. We held onto it mostly out of
deference to history, not because we were using it.

I have spent this month deep in the email lifecycle and now have both the
confidence that we should remove it and the loaded context to do so quickly
without coming back up to speed later. The removal is not urgent on its own — it
mainly cleans up the render and save/performance path — but the marginal cost of
doing it now, while the context is hot, is low.

## Decision

Remove `django-simple-history` and replace its two real use cases with
purpose-built models:

- Email body revisions → the home-grown `EmailHistory` model
  (`emails/models/email_history/`), one row per body change rather than a full
  per-field mirror on every save (#9795).
- Newsletter design changes → `NewsletterDesignHistory`.

We removed the package's models from Django's state but **deliberately retained
the underlying tables and their data** — `emails_historicalaccount`,
`emails_historicalemail`, and `emails_historicalnewsletter` — in case we ever
need to read the old revisions. (#9906 then dropped the orphaned `auth_user`
foreign keys those tables still carried, which were tripping a
`ForeignKeyViolation` on user deletion — BUG-387.)

## Consequences

- The save path no longer writes a full-object history row on every `Email`/
  `Newsletter` save; history is now scoped to exactly the fields we surface
  (email body, newsletter design).
- Three orphaned `Historical*` tables now live on production with no Django model
  in front of them. Like our other retired historical datasets (API requests,
  raw email events), the right end state is to archive them to ClickHouse and
  drop them from Postgres rather than leave them sitting in the primary database.
  That cleanup is tracked as a follow-up and is not blocking.</code></pre>



<p>It is objectively not a free lunch in that it does take time for you to sit down and explain concisely in prose why you are doing a thing and what the other options are. It was most of all the null hypothesis of simply not acting. But a cost which serves as a forcing function to write, I mostly think of as a reward at this point.</p>
<p>The world is complex: with every patch of fog that lifts, I find four more in the distance. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Only very recently have I started to understand knowledge as a perception of fog rather than a dispelling of it.</span> And so I am very careful not to prescribe these days, unless I am so overwhelmingly confident in the universality of a given prescription. This is one such thing: keep a decision log. </p>
<p>(See also <a href="https://rfd.shared.oxide.computer/">Oxide&#39;s public RFD system</a>.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>June, 2026</title>
      <link>https://jmduke.com/posts/june-2026-roundup.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/june-2026-roundup.html</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
      <description>June, like any month in which I neither write very much nor read very much, feels already cryptographic in retrospect.</description>
      <content:encoded><![CDATA[<p>June, like any month in which I neither write very much nor read very much, feels already cryptographic in retrospect.</p>
<p>Part of this was due to significantly downshifting my caffeine consumption (makes for a boring story, I know, but it was time to go from a baseline of four cups a day to two); the other reason is having spent most of my brain on things that are hard to write about and hard to spin back up on once I&#39;ve distracted myself: Firewall/KYC concerns, systemic onboarding, and so on. </p>
<p>It was a good and quiet month. We started harvesting the tomatoes, and this weekend I made salsa from three pounds of delicious Roma. I started waking up even earlier to lift, before the sun (or, bless her heart, Lucy) have a chance to intrude. Lucy, who by the way now speaks in two-syllable bursts, who now makes a game out of grabbing my shoes when I say it&#39;s time to go to the store, who knows not just how to dance, but what I mean when I say <em>dance</em>.</p>
<div style="display: grid;grid-template-columns: 1fr 1fr;gap: 2rem;align-items: start;width: 100vw;margin-left: calc(-50vw + 50%);padding: 0.5rem;">
<div style="width: 30vw;margin-left: 20vw;">
<table>
<thead><tr><th>Post</th></tr></thead>
<tbody>
<tr><td><strong><a href="https://jmduke.com/posts/self-hosting-ci-three-months-later/">Self-hosting our CI, three months later</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/back-to-overcast/">Back to Overcast</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/victory-is-a-lossy-compressor/">Victory is a lossy compressor</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/squash/">Indeterminate / Squash</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/denormalization-is-caching/">Denormalization 101</a></strong></td></tr>
</tbody>
</table>
</div>
<div class="media-grid" style="display: grid;grid-template-columns: repeat(3, 1fr);gap: 0.5rem;width: 30vw;padding: 0;margin-left: 0;">
<a href="/posts/jay-kelly/" class="media-grid-item"><img src="/img/jay-kelly.jpg" alt="Jay Kelly" loading="lazy"></a>
<a href="/posts/let-them-all-talk/" class="media-grid-item"><img src="/img/let-them-all-talk.jpg" alt="Let Them All Talk" loading="lazy"></a>
<a href="/posts/peggy-sue-got-married/" class="media-grid-item"><img src="/img/peggy-sue-got-married.jpg" alt="Peggy Sue Got Married" loading="lazy"></a>
<a href="/posts/the-man-from-earth/" class="media-grid-item"><img src="/img/the-man-from-earth.jpg" alt="The Man from Earth" loading="lazy"></a>
</div>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Jay Kelly</title>
      <link>https://jmduke.com/posts/jay-kelly.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/jay-kelly.html</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>I was young. I wanted something very badly and I was afraid that if I took my eye off it, I wouldn’t have it. And I was right. There was no other way to do it. And it meant choosing it over you. But it was always meant to be temporary.Just until I got what I wanted...But then I had to keep it.</description>
      <content:encoded><![CDATA[<blockquote>
<p>I was young. I wanted something very badly and I was afraid that if I took my eye off it, I wouldn’t have it. And I was right. There was no other way to do it. And it meant choosing it over you. But it was always meant to be temporary.Just until I got what I wanted...But then I had to keep it.</p>
</blockquote>
<p>I am reminded of the other recent George Clooney vehicle, <a href="/posts/wolfs.html">Wolfs</a>: this is self-indulgent in one dimension, and its merits are almost entirely carried by the efforts of Sandler and Clooney, both of whom give very strong performances which rescue the film from being Bad but do not carry it to greatness.</p>
<p>I also found myself wondering what Baumbach is up to right now. The script and direction here seem entirely <em>thoughtless</em> — not so bad as to be offensive, but neither interesting nor characteristic of his earlier and better work. I can dismiss things like the scattershot tone or the half-hearted performances from Laura Dern et al. as being intentional -- it is an ethereal, dreamlike film. </p>
<p>But the movie fails to do what I think it needed to do, which is to make us feel bad -- or novel in <em>some</em> kind of way -- for either character, even if for an instant. </p>
<p>Clooney plays a very light pastiche of himself: if you interpret the film as a story about Clooney himself, you are forgiven for doing so because he so comfortably eases into that role of charm and conviviality. He is a man who made it big, and in so doing had two lovely daughters who care little for him due to his absence -- an absence that he chose, time and time again, until there was no other choice to make.</p>
<p>(And much of the same criticism -- if it can be called that -- can be levelled at Sandler&#39;s character, who is a very realistic depiction of a guy worth millions of dollars whose biggest problem is that nobody will say &quot;I love you&quot; to him.)</p>
<p>I watched <a href="/posts/Somewhere.html">Somewhere</a> earlier this year, and I think many parallels (Hollywood people and their Hollywood problems!) can be drawn between the two films, but the success of <em>Somewhere</em> is in what I called &quot;the wattage and nuance of Dorff and Elle Fanning&#39;s performances&quot;; both together and in isolation the two performances there stirred something beyond artifice in me in a way that Jay Kelly did not.</p>
<hr>
<p>Lastly, the ending. </p>
<p>I really think the story of this film is that Baumbach — and Emily Mortimer, as co-writer — came up with the final scene and the final line, and then worked their way backwards from it into a movie. And to a small extent, that worked: the final scene, and the final line, cliche as it is, smashes me to bits. But it feels cut from a different movie -- a different life! -- than the one I spent two hours watching.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Denormalization 101</title>
      <link>https://jmduke.com/posts/denormalization-is-caching.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/denormalization-is-caching.html</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
      <description>I have had exactly two conversations this week about denormalization, which is a sign that it is time to write a blog post. If you already know what denormalization is, you will likely find this blog post uninteresting. That is okay! It is meant more to be an artifact that I can point to when people who haven&amp;#39;t been burnt by the fires of sad databases (or, perhaps, sad ETL pipelines) ask what I&amp;#39;m talking about.</description>
      <content:encoded><![CDATA[<p>I have had exactly two conversations this week about denormalization, which is a sign that it is time to write a blog post. If you already know what denormalization is, you will likely find this blog post uninteresting. That is okay! It is meant more to be an artifact that I can point to when people who haven&#39;t been burnt by the fires of sad databases (or, perhaps, sad ETL pipelines) ask what I&#39;m talking about.</p>
<h2>The well-behaved schema</h2>
<p>Imagine the data behind an art gallery. Galleries run <em>calls</em> — open invitations for submissions — and artists submit <em>entries</em>. The application that captures all this stores it the way Codd would want: tidy, normalized, every fact in exactly one place.</p>
<figure class="erd"><svg class="erd-lines" aria-hidden="true"></svg><div class="erd-grid"><table class="erd-entity"><thead><tr><th colspan="3">Gallery</th></tr></thead><tbody><tr class="erd-row erd-pk" data-field="Gallery.id"><td class="erd-keycell"><span class="erd-badge">PK</span></td><td class="erd-name">id</td><td class="erd-type">int</td></tr><tr class="erd-row" data-field="Gallery.name"><td class="erd-keycell"></td><td class="erd-name">name</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="Gallery.url"><td class="erd-keycell"></td><td class="erd-name">url</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="Gallery.state"><td class="erd-keycell"></td><td class="erd-name">state</td><td class="erd-type">string</td></tr></tbody></table><table class="erd-entity"><thead><tr><th colspan="3">Call</th></tr></thead><tbody><tr class="erd-row erd-pk" data-field="Call.id"><td class="erd-keycell"><span class="erd-badge">PK</span></td><td class="erd-name">id</td><td class="erd-type">int</td></tr><tr class="erd-row erd-fk" data-field="Call.gallery_id" data-ref="Gallery.id"><td class="erd-keycell"><span class="erd-badge">FK</span></td><td class="erd-name">gallery_id</td><td class="erd-type">int</td></tr><tr class="erd-row" data-field="Call.title"><td class="erd-keycell"></td><td class="erd-name">title</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="Call.deadline"><td class="erd-keycell"></td><td class="erd-name">deadline</td><td class="erd-type">date</td></tr></tbody></table><table class="erd-entity"><thead><tr><th colspan="3">Entry</th></tr></thead><tbody><tr class="erd-row erd-pk" data-field="Entry.id"><td class="erd-keycell"><span class="erd-badge">PK</span></td><td class="erd-name">id</td><td class="erd-type">int</td></tr><tr class="erd-row erd-fk" data-field="Entry.call_id" data-ref="Call.id"><td class="erd-keycell"><span class="erd-badge">FK</span></td><td class="erd-name">call_id</td><td class="erd-type">int</td></tr><tr class="erd-row erd-fk" data-field="Entry.artist_id" data-ref="Artist.id"><td class="erd-keycell"><span class="erd-badge">FK</span></td><td class="erd-name">artist_id</td><td class="erd-type">int</td></tr><tr class="erd-row" data-field="Entry.title"><td class="erd-keycell"></td><td class="erd-name">title</td><td class="erd-type">string</td></tr></tbody></table><table class="erd-entity"><thead><tr><th colspan="3">Artist</th></tr></thead><tbody><tr class="erd-row erd-pk" data-field="Artist.id"><td class="erd-keycell"><span class="erd-badge">PK</span></td><td class="erd-name">id</td><td class="erd-type">int</td></tr><tr class="erd-row" data-field="Artist.name"><td class="erd-keycell"></td><td class="erd-name">name</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="Artist.email"><td class="erd-keycell"></td><td class="erd-name">email</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="Artist.state"><td class="erd-keycell"></td><td class="erd-name">state</td><td class="erd-type">string</td></tr></tbody></table></div></figure>



<p>Here&#39;s what a handful of rows actually look like — the keys (<code>gallery_id</code>, <code>call_id</code>, <code>artist_id</code>) are the threads you pull to stitch it back together:</p>
<div class="tabs"><div class="tabs-list" role="tablist"><button class="tabs-tab" type="button" role="tab" aria-selected="true">Gallery</button><button class="tabs-tab" type="button" role="tab" aria-selected="false">Call</button><button class="tabs-tab" type="button" role="tab" aria-selected="false">Entry</button><button class="tabs-tab" type="button" role="tab" aria-selected="false">Artist</button></div><div class="tabs-panels"><div class="tabs-panel" role="tabpanel"><table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>url</th>
<th>state</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Pace</td>
<td>pacegallery.com</td>
<td>NY</td>
</tr>
<tr>
<td>2</td>
<td>Gagosian</td>
<td>gagosian.com</td>
<td>NY</td>
</tr>
<tr>
<td>3</td>
<td>White Cube</td>
<td>whitecube.com</td>
<td>CA</td>
</tr>
</tbody></table>
</div><div class="tabs-panel" role="tabpanel" hidden><table>
<thead>
<tr>
<th>id</th>
<th>gallery_id</th>
<th>title</th>
<th>deadline</th>
</tr>
</thead>
<tbody><tr>
<td>11</td>
<td>1</td>
<td>Spring Open</td>
<td>2026-03-15</td>
</tr>
<tr>
<td>12</td>
<td>2</td>
<td>Summer Group</td>
<td>2026-06-01</td>
</tr>
<tr>
<td>13</td>
<td>3</td>
<td>Emerging Voices</td>
<td>2026-09-20</td>
</tr>
</tbody></table>
</div><div class="tabs-panel" role="tabpanel" hidden><table>
<thead>
<tr>
<th>id</th>
<th>call_id</th>
<th>artist_id</th>
<th>title</th>
</tr>
</thead>
<tbody><tr>
<td>101</td>
<td>11</td>
<td>5</td>
<td>Field No. 4</td>
</tr>
<tr>
<td>102</td>
<td>11</td>
<td>6</td>
<td>Marfa Light</td>
</tr>
<tr>
<td>103</td>
<td>12</td>
<td>7</td>
<td>Balloon Dog</td>
</tr>
</tbody></table>
</div><div class="tabs-panel" role="tabpanel" hidden><table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
<th>state</th>
</tr>
</thead>
<tbody><tr>
<td>5</td>
<td>Agnes Martin</td>
<td>agnes@example.com</td>
<td>NM</td>
</tr>
<tr>
<td>6</td>
<td>Donald Judd</td>
<td>donald@example.com</td>
<td>TX</td>
</tr>
<tr>
<td>7</td>
<td>Jeff Koons</td>
<td>jeff@example.com</td>
<td>NY</td>
</tr>
</tbody></table>
</div></div></div>



<p>Every fact lives once. An artist&#39;s state is on the artist; a call&#39;s deadline is on the call. This is <em>normalization</em>, and for the system that has to keep the data <em>correct</em> — accept a submission, change an address, never contradict itself — it is exactly right.</p>
<p>I honestly struggle to talk about normalization, and I think even the concept of database design (or at least data modeling) has become a little less in vogue because best practice has just sort of been absorbed into the collective subconscious. Everyone knows how to model stuff a little bit better now than they did 20 years ago. Most databases look something like the above.</p>
<h2>Asking questions</h2>
<p>Sooner or later someone asks an actual question. Say whoever&#39;s running the gallery wants to know how much of their interest is <em>local</em> — concretely: <strong>how many entries come from an artist based in the same state as the gallery running the call?</strong></p>
<p>That&#39;s one sentence. Against the normalized schema, it&#39;s four tables and three joins, because the two facts you need to compare — the artist&#39;s state and the gallery&#39;s state — live at opposite ends of the graph:</p>
<pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> <span class="hljs-built_in">count</span>(<span class="hljs-operator">*</span>)
<span class="hljs-keyword">from</span> entry e
<span class="hljs-keyword">join</span> <span class="hljs-keyword">call</span>    c <span class="hljs-keyword">on</span> c.id <span class="hljs-operator">=</span> e.call_id
<span class="hljs-keyword">join</span> gallery g <span class="hljs-keyword">on</span> g.id <span class="hljs-operator">=</span> c.gallery_id
<span class="hljs-keyword">join</span> artist  a <span class="hljs-keyword">on</span> a.id <span class="hljs-operator">=</span> e.artist_id
<span class="hljs-keyword">where</span> a.state <span class="hljs-operator">=</span> g.state;
</code></pre><p>You have to hold the whole shape in your head — entry to call to gallery on one side, entry to artist on the other — just to line up two <code>state</code> columns. And this is the toy version — real questions pile on: break it down by gallery, restrict to this year&#39;s calls, weight it by how many entries each artist submitted.</p>
<p>This, at least in an abstract sense, has two problems:</p>
<ol>
<li>Meaningful insights come from combining disparate datasets, and normalization makes that <em>definitionally more cumbersome</em>.</li>
<li>Joins are slow.</li>
</ol>
<h2>Simply eat the other tables</h2>
<p>The answer is denormalization!</p>
<p>You build the thing that makes it easy:</p>
<figure class="erd"><svg class="erd-lines" aria-hidden="true"></svg><div class="erd-grid"><table class="erd-entity"><thead><tr><th colspan="3">EntryView</th></tr></thead><tbody><tr class="erd-row erd-pk" data-field="EntryView.id"><td class="erd-keycell"><span class="erd-badge">PK</span></td><td class="erd-name">id</td><td class="erd-type">int</td></tr><tr class="erd-row" data-field="EntryView.title"><td class="erd-keycell"></td><td class="erd-name">title</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.artist_name"><td class="erd-keycell"></td><td class="erd-name">artist_name</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.artist_email"><td class="erd-keycell"></td><td class="erd-name">artist_email</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.artist_state"><td class="erd-keycell"></td><td class="erd-name">artist_state</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.call_title"><td class="erd-keycell"></td><td class="erd-name">call_title</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.deadline"><td class="erd-keycell"></td><td class="erd-name">deadline</td><td class="erd-type">date</td></tr><tr class="erd-row" data-field="EntryView.gallery_name"><td class="erd-keycell"></td><td class="erd-name">gallery_name</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.gallery_url"><td class="erd-keycell"></td><td class="erd-name">gallery_url</td><td class="erd-type">string</td></tr><tr class="erd-row" data-field="EntryView.gallery_state"><td class="erd-keycell"></td><td class="erd-name">gallery_state</td><td class="erd-type">string</td></tr></tbody></table></div></figure>





<div class="tabs"><div class="tabs-list" role="tablist"><button class="tabs-tab" type="button" role="tab" aria-selected="true">EntryView</button></div><div class="tabs-panels"><div class="tabs-panel" role="tabpanel"><table>
<thead>
<tr>
<th>id</th>
<th>title</th>
<th>artist_name</th>
<th>artist_state</th>
<th>call_title</th>
<th>deadline</th>
<th>gallery_name</th>
<th>gallery_state</th>
</tr>
</thead>
<tbody><tr>
<td>101</td>
<td>Field No. 4</td>
<td>Agnes Martin</td>
<td>NM</td>
<td>Spring Open</td>
<td>2026-03-15</td>
<td>Pace</td>
<td>NY</td>
</tr>
<tr>
<td>102</td>
<td>Marfa Light</td>
<td>Donald Judd</td>
<td>TX</td>
<td>Spring Open</td>
<td>2026-03-15</td>
<td>Pace</td>
<td>NY</td>
</tr>
<tr>
<td>103</td>
<td>Balloon Dog</td>
<td>Jeff Koons</td>
<td>NY</td>
<td>Summer Group</td>
<td>2026-06-01</td>
<td>Gagosian</td>
<td>NY</td>
</tr>
</tbody></table>
</div></div></div>



<p>This is <em>denormalization</em>, and the warehouse crowd has a dozen names for the result — a wide table, a one-big-table model, the flat fact table at the center of a star schema, a <em>feature table</em> if you&#39;re about to train something on it. ETL, materialized views, whatever — the implementation is a detail; the point is that this pattern has a dozen names.</p>
<p>The artist&#39;s state and the gallery&#39;s state now sit in the same row. You&#39;ve reintroduced, deliberately, the redundancy normalization warned you about — <code>Spring Open</code> and <code>Pace</code> repeat once per entry — because the join you used to pay on every query, you now pay once.</p>
<p>And the query becomes the question, almost verbatim:</p>
<pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> <span class="hljs-built_in">count</span>(<span class="hljs-operator">*</span>)
<span class="hljs-keyword">from</span> entry_view
<span class="hljs-keyword">where</span> artist_state <span class="hljs-operator">=</span> gallery_state;
</code></pre><p>How lovely!</p>
<h2>[points at butterfly] is this a cache?</h2>
<p>So obviously there&#39;s a reason we don&#39;t do this for everything: we now have to figure out how to build the table. This is a rich subject for which I am much less qualified or interested to opine; if you&#39;re reading this blog for answers, the answer is something like &quot;run a daily cron which makes the big ol&#39; join manually and reconstitutes the table&quot;.</p>
<p>At this point, you have yourselves a cached table with twenty four hours of freshness. You have traded (presumably) a bit of operational toil for a bit of... <em>something</em>. What is that something?</p>
<ul>
<li>Sometimes you&#39;re caching <strong>knowledge</strong> — you just want one clear, blessed definition of what an <code>EntryView</code> <em>is</em>, a shape everyone can point at and treat as the source of truth. If so, just through it in a view! Don&#39;t worry about materialization.</li>
<li>Other times you&#39;re caching <strong>reads</strong> — the join itself is the problem, too slow or too expensive to pay for on every query. <em>That&#39;s</em> the one that earns a materialized table and an ETL pipeline to keep it fresh, operational toil and all.</li>
</ul>
<p>Both are valid reasons, but as someone in the business of <a href="/posts/no-more-redis">reducing his exposure to moving parts</a> I am morally obligated to make sure you know which camp you&#39;re in.</p>
<h2>Postscript: I once again recommend a data greenhouse</h2>
<p>I wrote <a href="/posts/insourcing-your-data-warehouse">about building a data greenhouse</a> four months ago, and it&#39;s largely in service of this problem. Being able to trivially answer stuff like &quot;how quickly do we solve bugs from US-based users vs. EU ones?&quot; is wildly actionable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Peggy Sue Got Married</title>
      <link>https://jmduke.com/posts/peggy-sue-got-married.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/peggy-sue-got-married.html</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>I envy you. You have your whole life ahead of you and you know exactly what you want to do. But forget the rat puke; write something beautiful.</description>
      <content:encoded><![CDATA[<figure><img src="/img/peggy-sue-got-married-still.jpg" alt="" data-zoomable></figure>
<blockquote>
<p>I envy you. You have your whole life ahead of you and you know exactly what you want to do. But forget the rat puke; write something beautiful.</p>
</blockquote>
<blockquote>
<p>You don&#39;t know zip! You think I&#39;m going to end up selling appliances like my father? Chasing women around the store. I&#39;ve got to give it a shot. Why are you trying to kill the two things that mean the most to me? Until yesterday you loved me and you loved us.</p>
</blockquote>
<p>I watched this absolutely bizarre film solely on the back of being fascinated that Coppola had to do so much commercial work to support all of his less-than-successful creative work. It is an 80s film about going back to the future — which is to say, it came out one year after <em>that</em> film, and apparently this recontextualizes much of it. But as someone who really doesn&#39;t care that much about <em>Back to the Future</em>, I can take it on its own merits.</p>
<p>Its own merits are just: deeply strange?</p>
<p>You have Kathleen Turner being entertaining but entirely overacting the entire film, traveling back to her high school years with Nicolas Cage (whose best friend — by the way — is Jim Carrey) cosplaying as a 50s lounge lizard with the worst nasally accent you have ever heard. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">It has apparently taken me this long to discover that Cage was Coppola&#39;s nephew, a fact made even funnier by his having also cast Sofia in a minor speaking role.</span></p>
<p>You almost certainly know exactly how this movie is going to turn out by the 15th minute or so, and the question then becomes whether the scenery along the way makes it worth your while. Bizarre choices abound in every line reading and abrupt scene transition: almost gratuitous sacrifices to requisite 80s comedy — the snarky high schooler who gets her comeuppance, and so on, punctuated by moments of melancholy and tenderness that make you forget just what it is you&#39;re watching. You have a faux beatnik deploying Yeats in a way that works both textually (it&#39;s a very lovely, sonorous poem) and metatextually (the authors understand that the pilgrim soul is Yeats&#39; way of being a dick).</p>
<p>Cage&#39;s character is in many ways the protagonist of the film, and Turner the viewpoint character; she remains static while our understanding of him changes radically. Charlie is vain, ridiculous, overbearing, hyperreactive; he also seems to genuinely love the protagonist. His dreams get dashed not due to cosmic justic nor awful luck but due to the ways of the world; he errs, and he attempts to atone for his errors. The clever trick of the film is that Turner does not end up leaving the past with a better understanding of herself so much as she leaves with a better understanding of her soon-to-be ex-husband: that he is a man who wanted big things that did not quite materialize; that he is a buffoon who will do anything for her.</p>
<p>For the first two-thirds, the film is dominated by the schizophrenia of jumping between the two movies it&#39;s trying to be: the reflective, somber, Proustian meditation and the formulaic nostalgia-driven cash-in. This incoherence finally reconciles in the movie&#39;s sweetest scene (in a movie already filled with them), in which Turner visits her grandparents, a scene which fulfills two purposes:</p>
<ol>
<li>Her grandmother is psychic and her grandfather belongs to a Masonic lodge that is actually a time cult</li>
<li>Her character is the person who more than anything else that could be granted by a trip to the past — fortune, fame, power — chooses an evening with her grandparents</li>
</ol>
<p>The film is both fatalistic and deeply, deeply humane; it is a lucid dream, in which you know (however hazily and briefly) that you will wake up in your own bed, but are willing to get taken along for the ride in hopes of remembering something interesting. </p>
]]></content:encoded>
    </item>
    <item>
      <title>Indeterminate / Squash</title>
      <link>https://jmduke.com/posts/squash.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/squash.html</guid>
      <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
      <description>The hardest part of gardening is not correctly timing the seedling transfer, or deciding when a plant is a goner versus when it just needs one more week. The hardest part of gardening, at least for me, is resisting the urge to make cheap and facile metaphors.</description>
      <content:encoded><![CDATA[<p>The hardest part of gardening is not correctly timing the seedling transfer, or deciding when a plant is a goner versus when it just needs one more week. The hardest part of gardening, at least for me, is resisting the urge to make cheap and facile metaphors.</p>
<p>One example comes to mind from this weekend, when I was trellising a handful of truly overgrown cherry tomato plants. Cherry tomatoes are indeterminate, which means there&#39;s no size at which they stop growing and start to ripen. They&#39;re like mint, secretly — they will happily grow and grow and grow forever. The only thing stopping them, barring human intervention, is the comic rapidity with which they&#39;ll die: from blight, from dehydration, from sheer overextension — almost as quickly as they prospered, if not more so.</p>
<p>There are a lot of ways to curtail this, and one of the things we do is trellis. We&#39;ve got this very fun, K&#39;nex-esque trellis system that acts as a kind of three-dimensional grid. The tricky bit is that you can&#39;t really set it up before you&#39;ve set up the tomato; you build the trellis <em>around</em> the plant, carefully, using it as an opportunity to find which branches are in danger of touching the ground. It&#39;s a satisfying exercise in its own right. Often, when Haley and I tear down the tomato crop for the year, we&#39;ll sit for a minute and just look at our lovely little cityscape of green rods and connectors before we tear those down too and throw them in the bucket. Because as cool as they look, there&#39;s no real reason to keep them around in an empty bed.</p>
<p>And of course structure is necessary but insufficient. So we did the things one does when tomatoes are overgrown. First, Lucy and I started with the two existential threats. Anything in danger of stooping down to touch the bare ground had to be either scaffolded immediately or mercifully pruned. Then came the work of trying to establish a sight line to the soil, which is a useful proxy for two things: airflow and sunlight. The plants had a couple of little yellow bits here and there, but no blight — nothing too serious.</p>
<p>From there we moved on to the more qualitative work, and in doing so started to discover just how bountiful these couple of plants had been. I tried not to wince at every little tug Lucy gave at the root. Slowly and surely, the plants started to look less grisly, less insanely overgrown, until the garden resembled a garden and not a jungle — something I could show my mother-in-law with pride and not fear.</p>
<p>And finally, at the end of this week-long journey — every morning Lucy waking up with me, having a few eggs, and going outside before the humidity made the prospect unbearable — we discovered the very back of the garden, hidden and prospering all this time: a terrific squash plant, happy and beaming, its first fruit ready not to be plucked or picked but cut with one ginger motion.</p>
<p>For the past three days, Lucy has refused to eat anything until she gets to go look at her squash. I do not like squash, and yet it appears it has now earned a permanent place in our harvest.</p>
<figure><img src="/img/lucys-squash.png" alt="Lucy holding her squash in the backyard" data-zoomable><figcaption>Lucy holding her squash in the backyard</figcaption></figure>
]]></content:encoded>
    </item>
    <item>
      <title>The Man from Earth</title>
      <link>https://jmduke.com/posts/the-man-from-earth.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-man-from-earth.html</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
      <description>One interesting thing about films, relative to — say — writing within video games, is the demarcation of amateurishness. (A description I don&amp;#39;t mean to carry any moral valence.) The indie revival in games owes much, much of itself to the fact that games are a medium where polish and craftsmanship and production value can actively work against the core gameplay loop. Books, on the other hand, have such a fundamentally small gap between what we&amp;#39;d call unpolished, messy prose and avant-gard...</description>
      <content:encoded><![CDATA[<p>One interesting thing about films, relative to — say — writing within video games, is the demarcation of amateurishness. (A description I don&#39;t mean to carry any moral valence.) The indie revival in games owes much, much of itself to the fact that games are a medium where polish and craftsmanship and production value can actively work <em>against</em> the core gameplay loop. Books, on the other hand, have such a fundamentally small gap between what we&#39;d call unpolished, messy prose and avant-garde experimentalism that it becomes hard to apply the lens of quality at all.</p>
<p>One of the joys of my recent cinema excursions has been getting to understand some of these mechanics — even when the films themselves aren&#39;t particularly successful. There&#39;s <a href="/posts/vanya-on-42nd-street.html">Vanya on 42nd Street</a>, a film whose lack of production is literally part of the text, and which uses that fact to brilliant effect. And there&#39;s <a href="/posts/mindwalk.html">Mindwalk</a>, a film forgotten to history, with interesting elements of its zeitgeist, that nonetheless conjures a dreamlike quality out of the graininess of its direction layered over the beauty of its landscapes.</p>
<p>Somewhere in the middle of these sits <em>The Man from Earth</em>, which is probably best introduced through the lens of its screenwriter, Jerome Bixby — a quasi-famous science-fiction writer who did a lot of work on <em>The Twilight Zone</em> (as one might guess from the title) and the then-successful B-movie side of Hollywood; the film&#39;s executive producer is his son, and it is hard not to think of this as more of an act of Asthi Visarjan than of genuine creative commitment. </p>
<p>This is very much a five-act play captured on camera rather than a work built for the medium.  The entire action takes place in a single remote house, and unlike the aforementioned <em>Vanya</em> it is filled with actors you&#39;ve never heard of performing, by and large, very poorly. The music is bad; the lighting is bad. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote"></span></p>
<p>And yet, for a certain type of person — i.e. myself, and perhaps you as well — this will be a movie you cannot tear yourself away from, even as it grows more and more absurd. The conceit of the exercise is very simple: the central character reveals himself to be a man who is (for the sake of this essay) immortal, then he invites his colleagues — a coterie of university professors in various disciplines — to interrogate him and to challenge the veracity of his claim. </p>
<p>That is the film, by and large: professors quizzing an immortal man on what he should or should not know and what he should or should not remember. If you think that is interesting, it may be worth watching; if you don&#39;t, turn away.</p>
<p>As poor as every other part of the product is, the writing (not unlike the best of Bixby&#39;s Twilight Zone episodes) is arresting not for its clarity or beauty but because it forces you, however briefly, to completely eject yourself from your frame of reference. It&#39;s a really, really fun premise, delivered earnestly and intelligently. </p>
<p>What is the difference between someone with a sufficiently encyclopedic memory and understanding of the world and someone who has actually <em>lived</em> it? You might think understand that this is suddenly a more relevant question than it has been.</p>
<hr>
<div class="spoiler-wrapper"><div class="spoiler"><p>Where it becomes more entertaining but harder to recommend is in its attempts to introduce dramatic stakes. One of the characters does not believe John, and so first tries to bring in a psychology professor to commit him — or, failing that, to disprove him. The professor, it&#39;s revealed, has recently lost his wife; he pulls a gun on John, points it, and then relents. It&#39;s all a little boggling.</p>
<p>And then a twin pair of revelations brings the whole thing to its most absurd. One: that John is Jesus Christ. Two: in the final scenes, that John is in fact the psychiatrist&#39;s father — having abandoned him long ago, owing to his policy of moving on every ten years to shift identities — a revelation after which John&#39;s son promptly dies of a heart attack. It&#39;s hard to describe such plotting as anything but insanity. And it&#39;s the point at which you begin to suspect that perhaps it isn&#39;t just a lack of budget that has made the film feel so shoddily crafted.</p>
<hr>
<p>And yet you can&#39;t look away. And I don&#39;t mean that in a train-wreck sense. There&#39;s a real nuance and depth and earnestness to the film&#39;s discussion of religion, of history, of all these things. It is not meant to shock. This is a film that has clearly been researched and considered deeply — made less as an act of entertainment than as an act of <em>inquiry</em>. And I have to admire those bets, and respect them.</p>
<p>I think it&#39;s a film that many, many more people could enjoy than have. Especially right now, when the value of intelligence and experience feels increasingly slippery.</p>
</div><div class="spoiler-label">Spoilers — click to reveal</div></div>]]></content:encoded>
    </item>
    <item>
      <title>Victory is a lossy compressor</title>
      <link>https://jmduke.com/posts/victory-is-a-lossy-compressor.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/victory-is-a-lossy-compressor.html</guid>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
      <description>Update, July 2026: Bill Mill kindly pointed out that the Cavs&amp;#39; head coach is Kenny Atkinson, not JB Bickerstaff — who coached Cleveland until 2024 but as of this writing coaches the Pistons. My bad and thanks, Bill.</description>
      <content:encoded><![CDATA[<p><em>Update, July 2026: <a href="https://bsky.app/profile/billmill.org">Bill Mill</a> kindly pointed out that the Cavs&#39; head coach is Kenny Atkinson, not JB Bickerstaff — who coached Cleveland until 2024 but as of this writing coaches the Pistons. My bad and thanks, Bill.</em></p>
<p>The NBA&#39;s conference finals wrapped up this past week, and as a Heat fan and a Seattle émigré I was pleased with both results. Happy that the Cavs lost, because I still resent them for being the destination to which LeBron fled in 2014; happy that the Thunder lost, because fuck Howard Schultz. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">For the uninitiated: Schultz, as owner, presided over the sale of the Seattle SuperSonics in 2006, which led directly to their relocation to Oklahoma City. The Thunder are, in a very real sense, the Sonics. I am not over it.</span></p>
<p>Both losses were noteworthy.</p>
<p>The Cavs were, after game three, safely assumed to be dead in the water — no NBA team has ever come back from a 3-0 deficit in the playoffs. Their head coach, JB Bickerstaff, infamously (yes, it can already be classified as infamous) claimed that <em>from an analytics standpoint</em> they were really up — that the underlying numbers had the series at a 2-2 coin flip they happened to be losing.</p>
<p>The Thunder, last season&#39;s champions, were being discussed around the halfway mark as candidates for the greatest team of all time: whether they could break the all-time regular-season wins record, or, more humbly, be the team that finally snapped the league&#39;s eight-season no-repeat-champion streak. Those discussions promptly ended in December, when — in what turned out to be foreshadowing — the Spurs beat them three times in ten days. Even gods can bleed. Now the conversation has gone the other direction entirely: whether they should blow up their core three and pursue a win-now trade for Giannis, or some similarly older-but-better superstar.</p>
<p>All of this is, in my opinion, kind of silly, by all parties involved.</p>
<p>Bickerstaff should not have tried to invoke the spirit of Pythagorean victories to motivate his team or deflect criticism about their dire straits. And yet — it&#39;s not like he was <em>completely</em> incorrect. In much the same way that, if you know with absolute certainty a coin is rigged to land heads 70% of the time, you shouldn&#39;t start betting tails just because tails came up the last three times. <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">Now, if it comes up tails ten times in a row, maybe that&#39;s a sign to reevaluate your threshold for &quot;absolute certainty.&quot;</span></p>
<p>And the discourse around the Thunder&#39;s prospects glosses over the fact that the second-best player on their team — and, during some stretches, arguably the fourth-best player on their team — were both out for the entire series. Which is a boring but plausible explanation for why they lost. (It should be noted that they lost in seven, and scored more total points than the Spurs across the span.) But the narrative of Wemby, the seven-foot-seven godkiller, has taken root.</p>
<p>Let me be clear: the Knicks and the Spurs <em>did</em> win, and no number of hypothetical simulations changes or devalues that fact. But as soon as we turn the page onto next season, the nuances that led up to the result will grow hazier and dimmer and more nebulous, until recovering them requires archaeology rather than recall.</p>
<p>The NBA is a league where we talk about rings, not net rating.</p>
<hr>
<p>Which is to say: victory, whether over the course of a single game or an entire season, is not a lagging metric assembled from the true granules of play-by-play data. It <em>is</em> the thing itself — the reified artifact. The banner, the line in the record book, the ring.</p>
<p>And there is nothing wrong with this, in the same way that it is no crime that both PNGs and JPEGs exist. Victory is a lossy compressor: it takes the full, lossless record of a season and squeezes it down into something small and portable, discarding almost all of the granular detail in order to do so. It is enormously useful to be able to optimize for file size — for what travels, for what gets remembered. But it is not the only use.</p>
<p>All of this is to say: I bring it up not just because I&#39;m waiting for Zach Lowe to publish his Tuesday episode previewing the Knicks-Spurs series, but because in America sports are metonymous with many things, and one of those things is business.</p>
<p>And I have found it far more revealing, in trying to understand a company that has — capital M, capital I — Made It, not to read their most recent batch of press releases, but to crank up the Wayback Machine and go look at the launches they shipped in 2018 that failed.</p>
<p>The press release is the JPEG. The failures are the bits that got thrown away. If you want to understand how something actually won, you don&#39;t get to recall it — you have to decompress it, and the only way to recover what victory discarded is to dig.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Back to Overcast</title>
      <link>https://jmduke.com/posts/back-to-overcast.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/back-to-overcast.html</guid>
      <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
      <description>In what is certainly the least consequential update in this blog&amp;#39;s history: I have boomeranged back from Apple Podcasts to Overcast.</description>
      <content:encoded><![CDATA[<p>In what is certainly the least consequential update in this blog&#39;s history: I have boomeranged back from Apple Podcasts to Overcast.</p>
<p>None of my gripes with Overcast have been fixed, or even assuaged. But paper cuts are less annoying than other forms of pain. If I really wanted to, I could sit down for thirty minutes and assemble a meaningful list of everything that bothers me about the first-party app — but instead I&#39;ll present only the two that are actually load-bearing.</p>
<p>The first, and the trivial one: there is no easy way to search for episodes within a given podcast feed. I&#39;m not talking about clever, fancy, transcription-based search — just searching by title. Apple Podcasts&#39; search functionality has many oddities, but this one is bizarre, and it is crucial for me whenever I&#39;m trying to dredge up an old episode. This probably reveals something idiosyncratic about my listening habits: there are very few podcasts I subscribe to — exactly one of them technical — that aren&#39;t evergreen.</p>
<p>The second point is less about features and more about existential positioning. Compare the home screen for Apple Podcasts to the home screen for Overcast. One of these apps is designed with the primary goal of letting me listen to the podcasts to which I&#39;ve subscribed. The other is designed with the primary goal of getting me to listen to a podcast to which I have not.</p>
<p>I could make grand sweeping gestures about how this reflects various pricing models and success criteria — and maybe I&#39;ll do that in some future essay — but I actually don&#39;t care about the bigger picture. My point is narrower: Apple Podcasts pursues goals that result in a worse experience for me.</p>
<p>And so I&#39;m not back on Overcast out of any solidarity for a fellow independent developer, nor because of some vague, abstract sense of it being capital-B Better. I&#39;m back on Overcast because I like it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>May, 2026</title>
      <link>https://jmduke.com/posts/may-2026-roundup.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/may-2026-roundup.html</guid>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <description>There are two mental models about work and fatigue which, like my brief dalliance with Roshe Runs, I have loved and outgrown:</description>
      <content:encoded><![CDATA[<p>There are two mental models about work and fatigue which, like my brief dalliance with Roshe Runs, I have loved and outgrown:</p>
<ol>
<li><p>The first is the fungibility of fatigue. Also known as the <a href="https://en.wikipedia.org/wiki/Spoon_theory">spoon theory</a>,<label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">To be clear, my point is with the colloquial extension of spoon theory to able-bodied people like myself, and not the chronic illness context in which it was coined.</span> it is roughly the notion that everything we do — from the mundane (brushing one&#39;s teeth, taking a shower) to the expensive (entering flow state for four hours of incident response) — carries some vaguely quantitative measure of toil, all of it drawn from a single reservoir over the course of the day. Like a wizard spending mana to cast spells at varying levels. This model, like all models, is useful insofar as it offers some bit of truth: for everyone there is an innate drain from everything we do, even the things we don&#39;t think of as draining, and both those numbers and the size of the central reservoir vary from person to person.</p>
</li>
<li><p>The second is the idea that productive work is inherently toilsome in a way that consumptive work is not — a concept often espoused by Cal Newport, for example, generally as a kind of groundwork lemma, to then advocate against consumption in favor of productive work as a form of leisure. This, too, contains some scintilla of truth: on net, work that we would describe as productive does have characteristics distinct from work that we would describe as consumptive. But the dichotomy is fake, and with enough rigor can be made contradictory. I take quite a bit of pride in my approach to consumption; when I am watching a movie or reading a book it is the only thing receiving my attention, and I am often thinking very, very hard as I do so. And conversely, many bits of ostensibly productive work are without a doubt the easiest and most energizing parts of my day — fixing a quick bug, or cooking Lucy an omelette.</p>
</li>
</ol>
<p>The synthesis of these two anti-revelations is probably obvious, and perhaps one that you arrived at years before I did: energy is not a trivial thing, whether in the growing or in the reaping.</p>
<p>May was filled with days in which I would happily and ably spend sixteen hours straight playing with Lucy and cleaning the house, then running a dozen errands, then reviewing a handful of PRs. And then suddenly it is 9pm, and for all the Café Bustelo in the world I cannot summon the energy to open Slack for the first time in twelve hours — not out of fear or dread of what may await me, but because in that moment a dozen hashtagged channels lit up and awaiting my attention feels akin to a text from my friend Colin asking whether I&#39;d like to go on a quick eighteen-mile jog to shake the rust off.</p>
<p>It took time to earn the comfort of hitting <code>CMD+Q</code> on Slack. Two years ago, <a href="/posts/the-maelstrom.html">as I have written</a>, a couple of days away from the business meant a week of lost growth, meant a week of angry customers. Now: I spent a week away and came back to one of my lovely support folks genially informing me that everything had gone great, and that I should take more time logged off. <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">This conversation concluded with her daring me to stay logged out of her customer support tool forever — a dare which I happily accepted. Thanks, Anita.</span></p>
<p>How do you relax when the things that once brought you energy now demand it? One way involves a very happy dog with a newly-repaired ACL and what is frankly the most disgusting tennis ball I have ever seen or felt, its entire surface smothered in a slime-like residue of slobber and dirt from the herb garden, followed by a night in which I go to bed at 9pm, arms sore and grateful, brain too empty to entertain any thought of the days ahead.</p>
<p>I hope you had a lovely May.  Mine was filled with rest and unanswered push notifications, and now it is time to spend a little bit of the former on a little bit of the latter.</p>
<div style="display: grid;grid-template-columns: 1fr 1fr;gap: 2rem;align-items: start;width: 100vw;margin-left: calc(-50vw + 50%);padding: 0.5rem;">
<div style="width: 30vw;margin-left: 20vw;">
<table>
<thead><tr><th>Post</th></tr></thead>
<tbody>
<tr><td><strong><a href="https://jmduke.com/posts/self-updating-screenshots/">On self-updating screenshots</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/llm-born/">LLMs and Buttondown</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/difficulty-scores/">Just aim the cannon correctly</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/no-more-redis/">Buttondown no longer runs Redis</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/screen-record-more/">Screen record more</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/be-careful-what-you-make-easier/">Be careful what you make easier</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/what-matters/">What matters</a></strong></td></tr>
<tr><td><strong><a href="https://jmduke.com/posts/ccusage/">ccusage</a></strong></td></tr>
</tbody>
</table>
</div>
<div class="media-grid" style="display: grid;grid-template-columns: repeat(3, 1fr);gap: 0.5rem;width: 30vw;padding: 0;margin-left: 0;">
<a href="/posts/sweet-smell-of-success/" class="media-grid-item"><img src="/img/sweet-smell-of-success.jpg" alt="Sweet Smell of Success" loading="lazy"></a>
<a href="/posts/network/" class="media-grid-item"><img src="/img/network.jpg" alt="Network" loading="lazy"></a>
<a href="/posts/murder-by-death/" class="media-grid-item"><img src="/img/murder-by-death.jpg" alt="Murder by Death" loading="lazy"></a>
<a href="/posts/the-in-laws/" class="media-grid-item"><img src="/img/the-in-laws.jpg" alt="The In-Laws" loading="lazy"></a>
<a href="/posts/the-best-and-the-brightest/" class="media-grid-item"><img src="/img/the-best-and-the-brightest.jpg" alt="The Best and the Brightest" loading="lazy"></a>
</div>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>