<?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>Mon, 07 Sep 2026 20:42:34 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>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>
]]></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>
    <item>
      <title>Self-hosting our CI, three months later</title>
      <link>https://jmduke.com/posts/self-hosting-ci-three-months-later.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/self-hosting-ci-three-months-later.html</guid>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <description>A couple of folks have written in over the past month asking how my experiments in self-hosting GitHub Actions runners have held up. And three months seems like a reasonable amount of time to post a follow-up.</description>
      <content:encoded><![CDATA[<p>A couple of folks have written in over the past month asking how my experiments in <a href="https://www.jmduke.com/posts/how-i-saved-100.html">self-hosting GitHub Actions runners</a> have held up. And three months seems like a reasonable amount of time to post a follow-up.</p>
<p>I&#39;ll also treat this as a bit of a first draft for a longer engineering post on the Buttondown blog itself — so please write in if there&#39;s something you wish I&#39;d covered here.</p>
<p>The short version: the experiment graduated into the plan. That March post ended on a half-joking aside — &quot;maybe we&#39;re just going to self-host the entire CI suite&quot; — and, reader, we did.</p>
<p>When I wrote that post back in March, I called out two things that were true at the time:</p>
<ol>
<li>We were continuing to use Blacksmith for our heaviest suite of jobs — the backend test suite.</li>
<li>We had touched essentially nothing since setting it up; it just ran.</li>
</ol>
<p>Neither is quite true anymore, and — as you might expect — the way each stopped being true turns out to be somewhat commensal.</p>
<p>Around a month or so ago, on a lark and the back of a Blacksmith incident, I decided to try running the entirety of CI on Pythia just to see what would happen. As is often the case, experiments are really just preludes to decisions; what seemed fairly promising — a 30% slowdown in performance on a quote-unquote hot server, but saving a hundred or so bucks a month in exchange — felt good enough to commit to.</p>
<p>To put some numbers on it: that January Blacksmith bill was $300, and by the time I got around to this it had crept up toward $400 as the team merged more. The backend suite was the single fattest line item — around $100/month on its own. Moving it over was the last domino; our Blacksmith bill now rounds to zero.</p>
<p>The 30% is less scary than it sounds in the body of an actual workday. The backend suite that used to go green in around six minutes on Blacksmith&#39;s 8-CPU runner now lands closer to eight. You notice it; you do not particularly care.</p>
<p>The flip side is that it&#39;s very easy to unintentionally starve yourself.</p>
<p>Just like in the initial post, we have five GitHub Actions runners running in parallel on a single box. This works well for our smaller jobs, which are IO-bound and don&#39;t really use multi-threading in any real capacity. But we do still have very big jobs, and poor Pythia suffers the consequences when we try to run three or so backend test jobs simultaneously.</p>
<p>GitHub Actions helpfully provides a <a href="https://docs.github.com/en/actions/using-jobs/using-concurrency"><code>concurrency</code></a> parameter, but it&#39;s a bit finicky to get working in exactly the right way, because it applies at an overall <em>workflow</em> level and not a <em>job</em> level. To enforce the concurrency I actually want, I&#39;d have to isolate the backend tests into their own workflow.</p>
<p>All of this is a very in-the-weeds way of saying: migrating the whole gestalt of our CI onto a dinky little box in my office has resulted in tiny amounts of pain that could probably go away if I spent an afternoon thinking really hard about the problem.</p>
<p>And then there&#39;s the objection everyone reaches for first: you&#39;ve put <em>all</em> of your CI behind a single point of failure, and that single point of failure is a box in your office. Which is true! But that single point of failure resides in my office, which — notably — is not the same thing as residing in my head. The total number of times I have had to bike over to the office and restart the server over the past 90 days has been exactly one.[^bike]</p>
<p>[^bike]: It would be disingenuous not to also cop to the <em>other</em> time this happened — except that one doesn&#39;t count, because I was already at the office.</p>
<p>But the fact that I&#39;ve been able to save the team and myself almost $400 a month — with very, very little work, and no marginal cost — has been a bit of a revelation. I highly encourage you to spend an afternoon giving it a shot yourself.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Let Them All Talk</title>
      <link>https://jmduke.com/posts/let-them-all-talk.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/let-them-all-talk.html</guid>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <description>This was a film that I found, in some order, slight, confounding, sweet, clever, and — above all of these things — reaching but not yet grasping.</description>
      <content:encoded><![CDATA[<p>This was a film that I found, in some order, slight, confounding, sweet, clever, and — above all of these things — reaching but not yet grasping.</p>
<p>It is interesting to me how little of a cultural footprint it has, given that it&#39;s a Soderbergh film starring, amongst other luminaries, Meryl Streep, Candice Bergen, and Lucas Hedges.</p>
<p>Soderbergh appears to have exactly two speeds: perfectly crafted and honed, and hodgepodge. This film is in the latter camp. It is tempting, as other reviewers have done, to call it lighthearted — but it&#39;s not so much lighthearted as it is <em>lightfooted</em>. Watching each scene bleed into the next, with confounding but naturalistic plot developments unfolding in a quasi–Dogme 95 sense, contributes above all else to the feeling that you are watching a dream. My dreams are wistful and incoherent, and I wake from them happy to be back in the real world, yet already nostalgic for a place I can no longer revisit.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Best and the Brightest</title>
      <link>https://jmduke.com/posts/the-best-and-the-brightest.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-best-and-the-brightest.html</guid>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
      <description>I started this book on the recommendation of Scholar&amp;#39;s Stage, who I would describe as one of the few deeply interesting and serious conservative historians on X, the Everything App — someone whose recommendations and commentary I find uniformly interesting. His was a rapturous recommendation, albeit one prefaced with a caveat: that the book is deeply liberal, to the point of some small amount of bias.</description>
      <content:encoded><![CDATA[<p>I started this book on the recommendation of <a href="https://scholars-stage.org/">Scholar&#39;s Stage</a>, who I would describe as one of the few deeply interesting and serious conservative historians on X, the Everything App — someone whose recommendations and commentary I find uniformly interesting. His was a rapturous recommendation, albeit one prefaced with a caveat: that the book is deeply liberal, to the point of some small amount of bias.</p>
<p>As a leftist I didn&#39;t expect to have a problem with this <em>except</em> for the fact that I find the truly great works of non-fiction — those of Caro, or <a href="/posts/postwar.html">Tony Judt</a> — to be <em>non-ideological</em>: not centrist, exactly, but focused on a discourse that cannot be reduced to one side of the political axis. </p>
<p>(As an aside, I agree with Scholar&#39;s Stage that this kind of book is the new great American novel; I have waxed and waned online and offline about Caro&#39;s work long enough to make my opinion clear in that regard. The downside of this kind of book, however, can be worse than the downside of overwrought fiction. Most recently, I failed to make it through <em>Nixonland</em> for reasons along these lines: partisan, scattered, poorly researched, and above all else, incoherent.)</p>
<p><em>The Best and the Brightest</em> does not share this problem. First and foremost, this is clearly a well-researched book, full of individual reportage and fact-finding. And unlike Nixonland, it has a clear and specific thesis it aims to espouse. I think you could argue that the thesis — even if it&#39;s old hat by now, thanks to works like The Fog of War — is arguably non-partisan. The author spends much of his critique on Kennedy for being a centrist rather than the liberal he campaigned on. But that is more of an ancillary concern relative to the main one: that the centrism itself, rather than being inherently problematic, was <em>indicative</em> of Kennedy&#39;s lack of a coherent platform or ideal besides competence and intelligence.</p>
<p>Where I find the book wanting — and where, around a third of the way through, I discovered that it was simply not my kind of book, nor did it live up to the admittedly lofty bar of works like <a href="/posts/postwar.html">Postwar</a> and <em>The Power Broker</em> — is in its plotting and structure. Reading Caro sometimes feels like reading Will and Ariel Durant: slow and meticulous, but rewarding patience. <em>The Best and the Brightest</em> gives a sense, more than anything else, of unpleasant déjà vu. You are constantly bouncing between Eisenhower and Truman and Kennedy and LBJ, from the &#39;40s into the &#39;50s into the &#39;60s, as the author redoubles and re-triples his points about fatalism and poor appointments and poor choices — often under the auspices of a micro-biography of an undersecretary or erstwhile diplomat.</p>
<hr>
<p>There are two things I appreciate about this book. One is that the author really does spend the time to capably and exhaustively illustrate the people in the room, transforming the Kennedy administration from a homogenous blob of former executives for Dow Chemical into a realistic, albeit samey, cast of characters with subtly competing agendas, ideologies, and win conditions. The second is that he successfully makes the point that there was not one single thing that <em>caused</em> Vietnam. It was a preponderance of own goals and blunders, all stemming from a couple of poor base assumptions during the early days of the Kennedy administration — assumptions that themselves had echoes in the final, waning days of the Eisenhower administration.</p>
<p>But the book is slow and repetitive, and given its immense size and length, does not wield its heft to full advantage.</p>
<p>All of this is to say: I&#39;m happy for having read it. I do feel like I learned much — not just about the preconditions of the Vietnam War, but about the true inner workings of power within the executive branch. But I have to keep this book at arm&#39;s length from the glittering gems to which it might otherwise be compared.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ccusage</title>
      <link>https://jmduke.com/posts/ccusage.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/ccusage.html</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <description>Inspired by a recent Simon Willison post, I just ran ccusage on my laptop and learned that over the past thirty days, on my sole subscription of $200 a month for Claude, I have consumed $2,422.13 worth of tokens. 1All of this elides the fact that ccusage anchors onto something that is itself slightly lossy: we have to take as given the assumption that the unit cost of tokens through metered billing for companies like Anthropic is, in and of itself, profitable. I suspect that it is. But it&amp;#39;s...</description>
      <content:encoded><![CDATA[<p>Inspired by a <a href="https://simonwillison.net/2026/May/27/product-market-fit/">recent Simon Willison post</a>, I just ran <code>ccusage</code> on my laptop and learned that over the past thirty days, on my sole subscription of $200 a month for Claude, I have consumed $2,422.13 worth of tokens. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">All of this elides the fact that <code>ccusage</code> anchors onto something that is itself slightly lossy: we have to take as given the assumption that the unit cost of tokens through metered billing for companies like Anthropic is, in and of itself, profitable. I suspect that it is. But it&#39;s worth calling out, since the entire $2,422.13 number rests on it.</span></p>
<p>Talk about getting my money&#39;s worth.</p>
<p>It is interesting — and a little bracing — to think about the hypothetical world in which no prosumer subsidy exists, and I would have to actually pay $2,422.13 to receive the output of these tokens.</p>
<p>First off, I think my usage patterns would change <em>dramatically</em>. The vast majority of these tokens are spent on Buttondown, and at that price point Anthropic would be the second-largest vendor on the Buttondown books, behind only Stripe. And this doesn&#39;t even include anyone else on the team. I would imagine that my actual spend would, in that world, dwindle to a third or a fourth of its current size — not because the marginal cost outweighs the marginal value, but because there is simply so much low-hanging fruit. I am generally in the business of saving $1,000 a month if it&#39;s easy to do so.</p>
<hr>
<p>Two other notes prompted by Simon&#39;s essay.</p>
<p>One: LLM spending, at least from the outside, feels like a bit of a bokeh. I know many companies have grown much more sophisticated about this in the past four years, but during my time at Stripe and Amazon, a lot of the <em>efficiency</em> work <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">&quot;Efficiency&quot; being the buzzword used to mean, roughly, <em>we would like to lower our OpEx in preparation for either the next quarterly earnings report or the next round of layoffs.</em></span> was not really spent doing fancy backbreaking things — it was spent figuring out which fleets of servers were simply collecting dust because some random team had turned them on six months ago and never spun them down. I joke a lot that my single most meaningful contribution to Amazon was saving us tens of millions of dollars a year because I had the great fortune of realizing one of our ad-hoc clusters for one-off jobs was not scaling down, and we were therefore burning a huge amount of money for no reason in particular.</p>
<p>LLM spend, at the org-chart level, smells identical to me. Distributed, badly telemetered, growing fast enough that no one at the top has had time to build intuition for what <em>right</em> looks like.</p>
<p>Two: my already fervent interest in local LLMs — and getting to the point where I can run some of the more recent engineering-grade models locally — would, in that hypothetical world, become the single highest-leverage thing I could do from a financial standpoint. The calculus on local inference is not just an aesthetic or moral preference (see <a href="/posts/uber-for-tokens.html">VC-subsidized tokens</a>); it is also an economic one, and one that I suspect will become increasingly load-bearing.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The In-Laws</title>
      <link>https://jmduke.com/posts/the-in-laws.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/the-in-laws.html</guid>
      <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
      <description>It was fifteen minutes into The In-Laws that I suspected an uncanny feeling of déjà vu, and thirty minutes in that I confirmed my suspicions with an unlocked memory of having watched it somewhere between ten and fifteen years ago, in a context I cannot recall beyond mild insobriety. With this revelation, the remainder of the plot — already formulaic and predictable — snapped into place, and I was left with wackiness and some sensible chuckle humor that I can admire without loving. This Blazing S...</description>
      <content:encoded><![CDATA[<p>It was fifteen minutes into <em>The In-Laws</em> that I suspected an uncanny feeling of déjà vu, and thirty minutes in that I confirmed my suspicions with an unlocked memory of having watched it somewhere between ten and fifteen years ago, in a context I cannot recall beyond mild insobriety. With this revelation, the remainder of the plot — already formulaic and predictable — snapped into place, and I was left with wackiness and some sensible chuckle humor that I can admire without loving. This <em>Blazing Saddles</em>-esque style of broad comedy, which leans into action to punctuate and yet ends up deflating, is simply not for me.</p>
<p>And I mean that sincerely. There&#39;s a lot about the film that I admire. First and foremost, the commitment to the bit that Peter Falk showcases: his dogged aloofness works in a compounding way, especially in comparison to Alan Arkin&#39;s self-serious nice — a contrast that had nonetheless grown threadbare and overdone somewhere in the film&#39;s second act. The schtick of the film feels more well-suited for a longer-runtime SNL sketch than an actual film, and the script&#39;s necessity to lampshade every single joke (the Bay of Pigs gag, to pick one) is the closest I can come to a sincere and critical critique.</p>
<hr>
<p>This and <a href="/posts/murder-by-death.html"><em>Murder by Death</em></a> make two films in a row that I didn&#39;t really enjoy despite loving their usage of Peter Falk — which is perhaps a sign that I should just start watching <em>Columbo</em> instead.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Murder by Death</title>
      <link>https://jmduke.com/posts/murder-by-death.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/murder-by-death.html</guid>
      <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
      <description>Murder by Death is a film that is easy to laugh at and easy to like. It is something like Clue meets Knives Out — a broad farce, lovingly rendered, that gathers the biggest detectives of the day (most of whom have survived and or thrived in the public consciousness all of these years) to solve the purportedly unsolvable murder of and/or by Truman Capote.</description>
      <content:encoded><![CDATA[<p><em>Murder by Death</em> is a film that is easy to laugh at and easy to like. It is something like <em>Clue</em> meets <em>Knives Out</em> — a broad farce, lovingly rendered, that gathers the biggest detectives of the day (most of whom have survived and or thrived in the public consciousness all of these years) to solve the purportedly unsolvable murder of and/or by Truman Capote.</p>
<p>I can&#39;t quite put my finger on why I didn&#39;t like it as much as I should have, or why it felt oddly slow considering its 94-minute runtime. Perhaps because it is so explicitly <em>facile</em>. It is not a madcap romp like <em>Clue</em>, nor does it wish to be a serious mystery like <em>Knives Out</em>, nor does it really have fun with metafiction like any of the other films in this genre. It is fun to see these actors clearly have a blast with each other — but it is a spoof, and spoofs make for entertaining evenings and poor cinema.</p>
<p>My favorite individual performance was Peter Falk playing a Sam Spade slash Humphrey Bogart composite. Less for his imitation&#39;s efficacy and more because you can see the seeds of Columbo in his affectations.</p>
<p>Would I recommend this movie? If you&#39;re bored and have nothing else to watch, and are comfortable keeping your expectations low.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What matters</title>
      <link>https://jmduke.com/posts/what-matters.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/what-matters.html</guid>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
      <description>As I often do after finishing a movie I loved, I have spent the past few days burning spare compute (as they say) turning Network over in my head and situating it within the other works that I love. Network&amp;#39;s influence is vast. But my personal canon implicates one writer in particular, above the rest: Aaron Sorkin.</description>
      <content:encoded><![CDATA[<div class="teleplay">
  <p class="character">Toby</p>
  <p class="dialogue">I turned it on just as they got to the scene when Richard, Geoffrey and John were locked in the dungeon and Henry was coming down to execute them. Richard tells his brothers not to cower but to take it like men. And Geoffrey says, "You fool! As if it matters how a man falls down." And Richard says...</p>
  <p class="character">Both</p>
  <p class="dialogue">"When the fall is all that's left...</p>
  <p class="character">Bartlet</p>
  <p class="dialogue">...it matters a great deal."</p>
</div>

<hr>
<p>As I often do after finishing a movie I loved, I have spent the past few days burning spare compute (as they say) turning <a href="/posts/network.html">Network</a> over in my head and situating it within the other works that I love. Network&#39;s influence is vast. But my personal canon implicates one writer in particular, above the rest: Aaron Sorkin.</p>
<p>Sorkin&#39;s love of Chayefsky is broad and obvious. You do not need to listen to him speak to hear it; the series premiere of the ill-fated and ill-conceived <em>Studio 60 on the Sunset Strip</em> opens in direct homage and reference to the film.</p>
<p>At first glance, it&#39;s easy to be disingenuous about this adoration — especially given our current cultural moment, which has largely lampooned Sorkin&#39;s politics, and not just Sorkin&#39;s politics but his ideas <em>about</em> politics. It is easy to say that Sorkin made a career out of aping Chayefsky&#39;s bombastic, operatic dialogue style without ever really pushing to sell something of depth the way Chayefsky did.</p>
<p>I think that&#39;s an unfair reading of Sorkin, regardless of how you feel about his politics. Starting with <em>Sports Night</em> and moving all the way up to <em>The Newsroom</em>, <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">I&#39;m not counting his film work, largely because — with the exception of <em>The American President</em> — they&#39;re all adaptation and cash-grab jobs. Which I don&#39;t mean as criticism, but to highlight the fact that they aren&#39;t part of his central oeuvre. And Sorkin&#39;s run on the West Wing is just the first four seasons.</span> Sorkin, like Paddy, treats the office as a place of worship — and members of the institutions he portrays are virtuous to the extent that they devote their entire selves to them. The widely accepted reading of The West Wing, as such, is that of a liberal Fantasia, not because it depicts the Bartlet administration as being liberal, but because it depicts a world in which the best possible thing you can do is to try very hard to do the right thing — and the liberals, or really the centrist-leaning Democrats, are the ones who do that.</p>
<p>Now might be a good time to mention that I love the West Wing. It holds a special place in my heart — not because it prompted me to begin a life of civic duty, nor to become a man defined by his institution, but because it was the first television show I watched that made me say: <em>whoa, shows can be like that.</em> I care nothing about it&#39;s nostalgia, nor agree with its retrograde politics — but the show is good, dammit, and the back half of Season 2 is up there with any other show in my personal canon.</p>
<p>Watch any episode in Sorkin&#39;s run of the West Wing and strip away whatever pretense and prejudice you have about his politics, and it is still some of the greatest TV writing, with performances to match. Moreover, the West Wing is, to a large extent, an auteurist text, with Sorkin having famously written much of it himself (on copious amounts of cocaine.)</p>
<hr>
<blockquote>
<p>No one in government takes responsibility for anything any more. We foster, we obfuscate, we rationalize. &quot;Everybody does it,&quot; that&#39;s what we say. So we come to occupy a moral safe house where everyone&#39;s to blame, so no one&#39;s guilty. I&#39;m to blame. I was wrong.</p>
</blockquote>
<p>So what does this all have to do with Chayefsky?</p>
<p>Clearly the two men&#39;s worldviews are oppositional. Network is a story about the inevitability of institutions to get corrupted and corrupt in turn. The West Wing is a paean to not just an institution but the individuals who comprise it. Again and again, in the West Wing, we are told the most virtuous possible thing to do is to devote yourself to an institution, and the show&#39;s camera follows that precept accordingly: it&#39;s not that we know little about Josh and Toby and CJ&#39;s personal lives because they happen off-screen, it&#39;s that we are told, every episode, that the White House <em>is</em> their personal life, and that in the noblest possible American quest one must subsume yourself into the greater cause — precisely the thing Chayefsky warns about, because he contends that the greater cause will devour your soul.</p>
<p>But back to that liberal Fantasia for a second. Discussions of the West Wing online often imply that the Bartlet administration was faultless and perfect (to the scorn of its critics and the glee of its fandom) — that nothing goes wrong, and that every situation is not just salvaged but transcended by its protagonists. This is an immature reading!</p>
<p>While the show does take necessary textual pains to pretend that everything lies in the hands of the cast&#39;s agency, a recurring theme throughout Sorkin&#39;s run is that, despite these lovely, brilliant, devoted, earnest, and dignified people in the Oval Office, the Bartlet administration kind of sucks. In the universe of the show, Bartlet passes no major domestic legislation, commits multiple war crimes against foreign officials, lies to the public about a serious medical condition during his campaign and first term, and appoints one Supreme Court justice. And that&#39;s sort of it. LBJ, he is not. His tally sheet looks more like Carter&#39;s than FDR&#39;s; he wins a second term, but more off the back of his opponent&#39;s cartoonish incompetence than his own track record.</p>
<p>Why does he not do more? This is the through-line of much of the show, the administration&#39;s conflict between what is right and what is expedient — on one hand, you have the oft-repeated <em>let Bartlet be Bartlet</em>: to not capitulate, to not accept half measures, to not do what is convenient or legible but to act with confidence and moral imperity. And then, on the other hand, it doesn&#39;t work: which is not an indictment of the characters so much as an indictment of the worldview that celebrates them as heroes.</p>
<hr>
<blockquote>
<p>Decisions are made by those who show up.</p>
</blockquote>
<p>To call this a Straussian reading is probably an understatement. I do not at all think Sorkin intended to slyly deliver this message; I think he probably wasn&#39;t thinking that hard about some of the long-term through-lines implied by his storytelling. <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">As is made abundantly clear by every single public statement he&#39;s made in the past two decades — including, perhaps most famously and recently, his call for the Democratic Party to run Mitt Romney against Trump in the 2024 election. A moment of true bipartisan unity, in that every single person from every part of the political spectrum correctly derided him for the take, and the New York Times for airing it as an op-ed column.</span></p>
<p>But I still love the West Wing, even at its most obnoxious. And I still, despite myself, love Sorkin — though his best works, like The Social Network with Fincher, are produced with an equally strong, opposing voice in concert.</p>
<p>Why is that? Two reasons:</p>
<ol>
<li>He is a very good writer of dialogue and oratory.</li>
<li>He celebrates honor and dignity and loyalty, but he does not make great pains to pretend that those things are antidotes to what ails us — which is perhaps the more important message, because if they were antidotes they&#39;d be easier to administer.</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Network</title>
      <link>https://jmduke.com/posts/network.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/network.html</guid>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
      <description>It is perhaps embarrassing to admit that I had never seen Network, and this year — its fiftieth anniversary — felt as good a time as any, especially considering how intimately familiar I already was with the film&amp;#39;s plot, its two capstone monologues, and its general influence on culture and, if not journalism itself, then the lens through which we view journalism. And now, having watched it and spent a few days really chewing on what I thought and what I think it means, I have arrived at an i...</description>
      <content:encoded><![CDATA[<p>It is perhaps embarrassing to admit that I had never seen <em>Network</em>, and this year — its fiftieth anniversary — felt as good a time as any, especially considering how intimately familiar I already was with the film&#39;s plot, its two capstone monologues, and its general influence on culture and, if not journalism itself, then the lens through which we view journalism. And now, having watched it and spent a few days really chewing on what I thought and what I think it means, I have arrived at an idiosyncratic answer:</p>
<p><strong>Institutions, even the ones we revere, will be consumed by forces greater than human understanding. And in so doing, they also consume anyone who has devoted themself fully to those institutions.</strong></p>
<p>The film opens with Howard Beale becoming a childless widower whose sole identity is suddenly that of his news broadcast. Max Schumacher&#39;s fall from grace coincides with an off-screen decision not to go with his wife to Seattle to visit his pregnant daughter — instead staying behind in New York to work the news. Paddy Chayefsky himself, for all his great work, was a tyrant with an anger management problem: an absent husband and an absent father.</p>
<p>There is only one character in this film who conducts herself with anything approaching grace and dignity: Beatrice Straight, playing Max&#39;s wife, who won her Oscar for a five-minute monologue and then is never seen from again. It is easy and natural to declare Beale and Jensen&#39;s rants as prophetic — they are great bits of writing performed radically well — but they are performances by madmen, meant to persuade and to dazzle. Straight is the one whose message is worth keeping close to our heart:</p>
<blockquote>
<p>Then get out, go to a hotel, go anywhere you want, go live with her, but don&#39;t come back! Because after twenty-five years of building a home and raising a family and all the senseless pain we&#39;ve inflicted on each other, I&#39;ll be damned if I&#39;ll just stand here and let you tell me you love somebody else! [...] Is that what&#39;s left for me? Is that my share? She gets the great winter passion, and I get the dotage? Am I supposed to sit at home knitting and purling till you slink back like a penitent drunk? I&#39;m your wife, damn it! If you can&#39;t work up a winter passion for me, then the least I require is respect and allegiance! I&#39;m hurt! Don&#39;t you understand that? I&#39;m hurt badly!</p>
</blockquote>
<p>And the most fascinating choice made by the film is the decision <em>not</em> to end with Max&#39;s renunciation of Diana — to treat him slinking back sheepishly to his wife and family like the resolution of a B-plot rather than a salvation. As great as the final two scenes of the film are, they reveal that the rot Chayefsky depicts in his film&#39;s universe has spread to him as well. Because as soon as a character leaves the newsroom, they are nobody at all to him.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Be careful what you make easier</title>
      <link>https://jmduke.com/posts/be-careful-what-you-make-easier.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/be-careful-what-you-make-easier.html</guid>
      <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
      <description>I have found much peace this year going offline to shelter myself from the whiplash of LLM companies jockeying for mindshare by cosplaying as DevRel. Every now and then something gets through the filter bubble — usually because it concerns Markdown, a topic near and dear to my heart and one increasingly in vogue in the age of LLMs as a message bus.</description>
      <content:encoded><![CDATA[<p>I have found much peace this year going offline to shelter myself from the whiplash of LLM companies jockeying for mindshare by cosplaying as DevRel. Every now and then something gets through the filter bubble — usually because it concerns Markdown, a topic near and dear to my heart and one increasingly in vogue in the age of LLMs as a message bus.</p>
<p>The most recent case: <em>The Unreasonable Effectiveness of HTML</em>.</p>
<p>The dynamic half of this essay is unimpeachable. What Thariq calls &quot;Custom Editing Interfaces&quot; — throwaway drag-and-drop kanbans, sliders for tuning an animation, side-by-side prompt editors with live preview — I totally agree! The ability to drive down the cost of throw-away snippets and playgrounds to ~zero is one of my favorite uses of his product.</p>
<p>But the implicit framing of the essay is &quot;HTML is also strictly better than Markdown for all use cases&quot;, and I think he uses the unimpeachable bits to oversell the other half of the argument.</p>
<p>The single most important sentence in the piece, presented as a casual aside, is this: <em>in practice, I&#39;ve found I tend to not actually read more than a 100-line markdown file</em>. The proposed response is a richer rendering format. The actual response — the boring, unfashionable, correct one — is a shorter, denser, and more comprehensible plan, both for humans and LLMs alike. </p>
<hr>
<p><strong>Be careful what you make easier.</strong> Making it more pleasant to claim to have skimmed a 600-line spec is not the same as fixing the fact that the spec is 600 lines, in much the same way biking 26.2 miles is not quite the same achievement as running them.</p>
<p>There are other soft parts of the essay, that I feel duty-bound to highlight:</p>
<ol>
<li><p>&quot;Ease of sharing&quot; is presented as an advantage of HTML, with <em>uploading to S3</em> offered as the suggested mechanism. It is hard to interpret such a take in good faith, given that <em>the author wrote the post itself in Markdown and had to link externally to GitHub pages for the companion HTML artifact.</em></p>
</li>
<li><p>As Thariq admits in the FAQ, HTML takes 2-4x longer to generate, HTML diffs are noisy and hard to review (let alone trivially edit), and HTML is more expensive for LLMs to parse.</p>
</li>
</ol>
<p>HTML artifacts are good! But I get worried about stuff like this, and not just because I&#39;m a Markdown dork (the beauty of being a Markdown dork is that it doesn&#39;t really matter who else uses Markdown.) When you frame stuff like this in unrigorous absolutes, I am forced to worry about what else you frame in unrigorous absolutes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Screen record more</title>
      <link>https://jmduke.com/posts/screen-record-more.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/screen-record-more.html</guid>
      <pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate>
      <description>One of the things I miss most about working in an office is osmosis: the ability to absorb information from coworkers purely by peering over their shoulder for five minutes and seeing how they did their work. This is how I learned about using a debugger. About NeoVim. About a dozen other small ergonomic tricks that I&amp;#39;ve since internalized to the point I can&amp;#39;t remember a time without them.</description>
      <content:encoded><![CDATA[<p>One of the things I miss most about working in an office is osmosis: the ability to absorb information from coworkers purely by peering over their shoulder for five minutes and seeing how they did their work. This is how I learned about using a debugger. About NeoVim. About a dozen other small ergonomic tricks that I&#39;ve since internalized to the point I can&#39;t remember a time without them.</p>
<p>The other thing I miss — and this one is more niche — is rubber ducking. The term is a bit of a meme at this point, but if you haven&#39;t encountered it: to rubber duck a problem is to walk through it out loud, explaining it to a rubber duck as if the duck were an actual person. The trick, of course, is that the act of articulating the problem is itself the thing that surfaces the solution. In the office version, the duck is a real person who passively observes and provides no input.</p>
<p>The good news — and something I forget, and am writing this post primarily as a reminder to myself — is that we have the technology to do both of these things, albeit without the ambience.</p>
<p>It&#39;s called <em>taking a screen recording of yourself</em>.</p>
<hr>
<p>It doesn&#39;t have to be while doing anything in particular. I&#39;ve both sent and watched screen recordings of me literally just triaging Linear, going through support escalations, and implementing a new bulk action — to give you a sense of the banality. They can be long. They should ideally be completely unfiltered and unedited.</p>
<p>The only real caveat is that you should narrate while recording: talk about what&#39;s on your mind and why you&#39;re doing the things you&#39;re doing. But you should <em>not</em> change your behavior. No tidying up the desktop, no rehearsing the click path, no skipping the part where you fumble through a menu for thirty seconds because you can&#39;t remember where the setting lives. The fumbling is the point.</p>
<p>It sounds obvious, I know. But if you haven&#39;t done it a lot, it is tremendously beneficial as a way to share tacit knowledge — the kind of knowledge that nobody writes documentation for because nobody realizes they have it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Buttondown no longer runs Redis</title>
      <link>https://jmduke.com/posts/no-more-redis.html</link>
      <guid isPermaLink="true">https://jmduke.com/posts/no-more-redis.html</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Buttondown no longer runs Redis!</description>
      <content:encoded><![CDATA[<p>Buttondown no longer runs Redis!</p>
<p>I added it years ago for the same reason almost every Django app has Redis: that&#39;s just what you do. Workers wanted a queue, the queue wanted a broker, the broker was Redis. The cache wanted a backend, the backend was Redis. Sessions wanted a store, the store was Redis. And then it festers from there. <label class="sidenote-toggle" for="sn-1">1</label><input type="checkbox" id="sn-1" class="sidenote-toggle-checkbox"><span class="sidenote">Though &quot;festers&quot; is unkind: I have no qualms with Redis as a technology, I just have qualms with twice as many datastores as I ought to have.</span></p>
<p>I wrote <a href="/posts/postgres-jobs.html">earlier this year</a> about pulling django-rq and the worker queue off of Redis. What was left after that was mostly small: rate-limit counters, a few short-TTL caches, an idempotency-key fast-path, and session storage. Not enough to really cause any issues, <em>but</em> we&#39;re working on our Heroku migration <label class="sidenote-toggle" for="sn-2">2</label><input type="checkbox" id="sn-2" class="sidenote-toggle-checkbox"><span class="sidenote">Stay tuned for more.</span>, and big infrastructural changes are made slightly easier by one fewer dependency, even if it&#39;s a fairly static one.</p>
<p>When I actually measured the replacements against production Postgres, they came in well under the Redis round-trip they were replacing, which has to cross AWS regions to reach our RedisCloud instance. The &quot;fast in-memory store&quot; was, in this configuration, slower than the database itself. (Thanks, <a href="/posts/planetscale.html">PlanetScale</a>!)</p>
<p>The few caches that didn&#39;t have a good home in Postgres became per-process in-memory dicts. We deploy enough times a day that a process-local cache lives long enough to do its job and gets cleared often enough that staleness isn&#39;t meaningfully real.</p>
<p>When I wrote <a href="/posts/difficulty-scores.html">yesterday about maintenance costs</a>, this is exactly the kind of thing I had in mind. It is both wild and accurate to say that the Buttondown stack, as of right this second, is dramatically simpler — let alone more stable — than it was two years ago.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>