<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://strangeleaflet.com</id>
  <title>Strange Leaflet</title>
  <subtitle>A nerdy blog by Stephen Ball focusing on Elixir, Go, TypeScript, shell scripts, and other cool weird stuff.</subtitle>
  <updated>2026-11-07T17:34:50+00:00</updated>
  <author>
    <name>Stephen Ball</name>
  </author>
  <link href="https://strangeleaflet.com/" rel="alternate"/>
  <link href="https://strangeleaflet.com/feed/" rel="self"/>
  <entry>
    <id>https://strangeleaflet.com/making-zork-an-almost-pure-puzzle-game/</id>
    <title>Making Zork an (almost) pure puzzle game</title>
    <link href="https://strangeleaflet.com/making-zork-an-almost-pure-puzzle-game/"/>
    <published>2026-11-07T17:34:50+00:00</published>
    <updated>2026-11-07T17:34:50+00:00</updated>
    <category term="videogames"/>
    <category term="zork"/>
    <content type="html">&lt;p&gt;I&#x27;ve always loved ZORK but parts of it have always kind of grated on me in that it isn&#x27;t purely a cerebral puzzle game but depends on some luck and essentially requires you to save/restore your way through the game.&lt;/p&gt;
&lt;zork-screen room=&quot;West of House&quot; score=&quot;0&quot; moves=&quot;0&quot;&gt;

&lt;pre&gt;ZORK I: The Great Underground Empire
Infocom interactive fiction - a fantasy story
Copyright (c) 1981, 1982, 1983, 1984, 1985, 1986 Infocom, Inc. All rights reserved.
ZORK is a registered trademark of Infocom, Inc.
Release 0 / Serial number 261104

West of House
You are standing in an open field west of a white house, with a boarded front door.
There is a small mailbox here.

&amp;gt;&lt;/pre&gt;

&lt;/zork-screen&gt;

&lt;p&gt;&lt;small&gt;The start of Zork I in the curio&#x27;s Atari 800 screen. &lt;a href=&quot;https://curious.strangeleaflet.com/z-machine-interpreter/#zork1&quot;&gt;Play it there&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;What to do about it? I thought it would mean having to compile a custom version of the game. But it turnss out to be possible to keep the z-machine game completely as-is and have the z-machine interpreter optionally manipulate how the game plays.&lt;/p&gt;
&lt;p&gt;So Claude and I did. I&#x27;ve got an &lt;a href=&quot;https://curious.strangeleaflet.com/z-machine-interpreter/#zork1&quot;&gt;in-browser z-machine interpreter&lt;/a&gt; over on the cabinet of curios.&lt;/p&gt;
&lt;h2 id=&quot;cheats&quot;&gt;Cheats&lt;/h2&gt;
&lt;p&gt;For ZORK you can set a few options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Thief stays home&lt;/strong&gt;: ensure the thief stays in his treasure room instead of randomly wandering around the map.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable objects&lt;/strong&gt;: ensure that items remain where you dropped them instead of randomly teleporting around the map.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Endless lights&lt;/strong&gt;: ensure that none of the light sources can run out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Well lit&lt;/strong&gt;: ignore darkness completely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those last two are absolutely cheats, but I think the first two really nicely fit with the game. Or with my idea of the game.&lt;/p&gt;
&lt;p&gt;Having the thief stay in the treasure room turns him into a puzzle instead of a potentially game ending random encounter.&lt;/p&gt;
&lt;p&gt;When you have enough of a score you can find his treasure room and find him there guarding the chalice (and any stolen treasures if you made him stay home after he&#x27;s stolen things from you). You can still have him open the egg if you realize that&#x27;s possible (uh spoilers).&lt;/p&gt;
&lt;p&gt;There is still an element of randomness in the combat. But the point is that you can face the thief on your terms with intent by thinking about it instead of saving and reloading frequently.&lt;/p&gt;
&lt;p&gt;The stable objects also mean you can actually map out the mazes directly instead of having to get lucky and hope that the game keeps the items stable while you&#x27;re mapping.&lt;/p&gt;
&lt;h2 id=&quot;enhanced&quot;&gt;Enhanced&lt;/h2&gt;
&lt;p&gt;And there&#x27;s more! I have an option to turn on &amp;quot;Enhanced&amp;quot; Zork which gives you a few things that feel like you should have as the player character.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Know how much of a burden you&#x27;re carrying instead of getting surprised when your character can&#x27;t pick something up.&lt;/li&gt;
&lt;li&gt;See your health directly instead of having to type diagnose.&lt;/li&gt;
&lt;li&gt;See the power level of the lamp. It&#x27;s battery powered after all.&lt;/li&gt;
&lt;li&gt;Keep track of your treasure count.&lt;/li&gt;
&lt;li&gt;Have an indicator to know if the room you&#x27;re in is naturally lit or not. This one always really bugged me because your character should just see that instead of making you turn off the lamp to find out.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;
&lt;p&gt;There&#x27;s also an inspector view to see the current game state and object list. Kind of like a web browser inspector for the z-machine.&lt;/p&gt;
&lt;p&gt;An automatically generating map if you want to use it.&lt;/p&gt;
&lt;p&gt;A built-in notes editor.&lt;/p&gt;
&lt;p&gt;The saves also use the Quetzal formatting standard so you can save/load from other interpreters.&lt;/p&gt;
&lt;p&gt;AND the built-in notes and map are included in the save files as you and you can choose if you want to reload them from the save.&lt;/p&gt;
&lt;p&gt;There&#x27;s a few themes to pick from as well including an Atari 800 theme that&#x27;s pretty close to how I remember playing in the 80s. Although I still need to make some more tweaks.&lt;/p&gt;
&lt;p&gt;I&#x27;m having a blast re-discovering the games and making them more of the pure puzzle experience I always wanted.&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://strangeleaflet.com/making-zork-an-almost-pure-puzzle-game/zork-screen.js&quot;&gt;&lt;/script&gt;

</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/</id>
    <title>The Last Starfighter&#x27;s arcade game was ahead of its time</title>
    <link href="https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/"/>
    <published>2026-11-06T04:03:44+00:00</published>
    <updated>2026-11-06T04:03:44+00:00</updated>
    <category term="movies"/>
    <category term="videogames"/>
    <content type="html">&lt;p&gt;Let&#x27;s talk about one of my favorite movies, The Last Starfighter. A fun movie from 1984 telling the tale of a trailer park kid who was so talented at a videogame that he was tapped to fight fascism in space using the same arcade controls to fly a supremely powerful spaceship. One gunstar vs the entire armada. Spoilers: they win!&lt;/p&gt;
&lt;p&gt;Even that quick synopsis already points to some interestingly forward-thinking ideas like the rise of competitive e-sports. But I want to focus in on a different aspect of the movie: the arcade game itself.&lt;/p&gt;
&lt;p&gt;Check out this clip of the in-movie &amp;quot;Starfighter&amp;quot; arcade game starting up.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/starfighter-arcade.jpg&quot; width=&quot;480&quot; height=&quot;270&quot; aria-label=&quot;The Starfighter arcade cabinet in The Last Starfighter (1984): its attract mode shows a ship over mountains, the camera swoops in close, and the screen becomes the green and orange first-person cockpit view&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/starfighter-arcade.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/starfighter-arcade.jpg&quot; alt=&quot;The Starfighter arcade cabinet in The Last Starfighter (1984): its attract mode shows a ship over mountains, the camera swoops in close, and the screen becomes the green and orange first-person cockpit view&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;The Last Starfighter&lt;/em&gt; (1984, Lorimar/Universal).&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;In a few seconds we have several motifs that didn&#x27;t even exist in videogames yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a camera that moves through a 3D scene&lt;/li&gt;
&lt;li&gt;zooming in from a third-person overview to a first-person in-game perspective&lt;/li&gt;
&lt;li&gt;a HUD showing a complete interface to various ship systems and orientation in 3D space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The movie didn&#x27;t invent all of this from nothing. There were already games putting players in a cockpit in 3D space. Star Raiders, from 1979 on Atari&#x27;s home computers, had a crosshair, a row of ship readouts along the bottom (velocity, kills, energy, and the target&#x27;s bearing and range), and an attack computer display in the corner that tracks the enemy you&#x27;re aiming at.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-raiders.jpg&quot; width=&quot;480&quot; height=&quot;306&quot; aria-label=&quot;Star Raiders (Atari, 1979) on the Atari 800: a first-person view of space with a crosshair in the center, an attack computer display in the lower right that tracks the target, and a row of readouts along the bottom; enemy ships close in and explode, and the background turns dark blue as &amp;quot;SHIELDS ON&amp;quot; appears&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-raiders.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-raiders.jpg&quot; alt=&quot;Star Raiders (Atari, 1979) on the Atari 800: a first-person view of space with a crosshair in the center, an attack computer display in the lower right that tracks the target, and a row of readouts along the bottom; enemy ships close in and explode, and the background turns dark blue as &amp;quot;SHIELDS ON&amp;quot; appears&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;Star Raiders&lt;/em&gt; (1979, Atari), from &lt;a href=&quot;https://www.youtube.com/watch?v=L8YdO6PYViw&amp;amp;t=51s&quot;&gt;Old Classic Retro Gaming&#x27;s playthrough&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;But no actual arcade or videogame was anywhere close to what they dreamed up as the Starfighter arcade game.&lt;/p&gt;
&lt;p&gt;In 1980 Atari brought first-person 3D to arcades with Battlezone. You drive a tank across a green wireframe battlefield with a gunsight in the middle of the screen, and a radar at the top sweeps around to show enemies on every side of you.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/battlezone.jpg&quot; width=&quot;480&quot; height=&quot;360&quot; aria-label=&quot;Battlezone (Atari, 1980) arcade gameplay: a green wireframe first-person view across a plain with mountains on the horizon, a radar sweep and the score at the top, and a gunsight in the center; the player&amp;#x27;s tank runs into a pyramid, then lines up an enemy tank and blows it apart&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/battlezone.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/battlezone.jpg&quot; alt=&quot;Battlezone (Atari, 1980) arcade gameplay: a green wireframe first-person view across a plain with mountains on the horizon, a radar sweep and the score at the top, and a gunsight in the center; the player&amp;#x27;s tank runs into a pyramid, then lines up an enemy tank and blows it apart&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;Battlezone&lt;/em&gt; (1980, Atari), from &lt;a href=&quot;https://www.youtube.com/watch?v=Ctr54kopo8I&amp;amp;t=6s&quot;&gt;Shane McComas&#x27;s video&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Here&#x27;s Gyruss, a Konami game from 1983 that was in arcades while the movie was being made.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/gyruss.jpg&quot; width=&quot;360&quot; height=&quot;412&quot; aria-label=&quot;Gyruss (Konami, 1983) arcade gameplay: the player&amp;#x27;s ship flies in along the bottom of a starfield as &amp;quot;2 WARPS TO NEPTUNE&amp;quot; appears, then a wave of blue enemy ships swirls in from the center and the ship fires up at them&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/gyruss.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/gyruss.jpg&quot; alt=&quot;Gyruss (Konami, 1983) arcade gameplay: the player&amp;#x27;s ship flies in along the bottom of a starfield as &amp;quot;2 WARPS TO NEPTUNE&amp;quot; appears, then a wave of blue enemy ships swirls in from the center and the ship fires up at them&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;Gyruss&lt;/em&gt; (1983, Konami), from &lt;a href=&quot;https://www.youtube.com/watch?v=CrrMQBLqqVo&amp;amp;t=33s&quot;&gt;Old Classic Retro Gaming&#x27;s playthrough&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;All great games. Iconic, classic, very 1980s arcade. But nothing like what the movie&#x27;s game was showing.&lt;/p&gt;
&lt;p&gt;For 3D space games at the time the state of the art was Atari&#x27;s Star Wars, also from 1983. It has real 3D ships and a cockpit view, but the ships are wireframe outlines, the camera is fixed to the cockpit, and the HUD is a shield gauge and a score. Nothing close to the cinematic design of the movie&#x27;s Starfighter game.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-wars.jpg&quot; width=&quot;480&quot; height=&quot;360&quot; aria-label=&quot;Star Wars (Atari, 1983) arcade gameplay: after a &amp;quot;Select a Death Star&amp;quot; screen of three wireframe Death Stars, the view becomes an X-wing cockpit with a shield gauge at the top, and green wireframe TIE fighters and Darth Vader&amp;#x27;s ship swoop past the targeting reticle as the player fires blue lasers&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-wars.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/star-wars.jpg&quot; alt=&quot;Star Wars (Atari, 1983) arcade gameplay: after a &amp;quot;Select a Death Star&amp;quot; screen of three wireframe Death Stars, the view becomes an X-wing cockpit with a shield gauge at the top, and green wireframe TIE fighters and Darth Vader&amp;#x27;s ship swoop past the targeting reticle as the player fires blue lasers&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;Star Wars&lt;/em&gt; (1983, Atari), from &lt;a href=&quot;https://www.youtube.com/watch?v=nJv94FPRddA&amp;amp;t=81s&quot;&gt;AL82 Retrogaming Longplays&#x27; longplay&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Now let&#x27;s zoom in on the Starfighter HUD.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/starfighter-cockpit.webp&quot; alt=&quot;The Starfighter cabinet&#x27;s first-person cockpit display: a targeting reticle in a radar ring, with ship and enemy panels on either side and the score below&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Still from &lt;em&gt;The Last Starfighter&lt;/em&gt; (1984, Lorimar/Universal).&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Just look at the artistic beauty of that imagined videogame UI! Sure some games had some of those ideas already like a targeting reticle, power levels. But no actual game had put them all together so elegantly and also added 3D space specific visualizations like the ship model and 3D radar view. That&#x27;s a lot of complexity to keep up with and it still reads intuitively like a game that you could actually play.&lt;/p&gt;
&lt;p&gt;Speaking of actually playing, credit to Lance Guest for really conveying the sense that he&#x27;s &lt;em&gt;actually&lt;/em&gt; playing a game that couldn&#x27;t have existed. In even more recent movies and tv shows we&#x27;re all too familiar with the &amp;quot;act like you&#x27;re playing a videogame&amp;quot; trope that&#x27;s just mashing buttons and wildly flipping the joystick. In The Last Starfighter the character Alex is playing with careful intent that&#x27;s completely convincing.&lt;/p&gt;
&lt;p&gt;How did they do it? Well from a technical level of course the Starfighter game never had to actually run on arcade hardware. The movie&#x27;s effects were made by Digital Productions, the company John Whitney Jr. and Gary Demos founded, on a Cray X-MP supercomputer. That was around 25 minutes of computer graphics across nearly 300 shots. An actual arcade game has to draw a new frame many times a second, live. The movie&#x27;s &amp;quot;game&amp;quot; could take as long as it needed on each frame, so it could show what a game would look like once the hardware caught up.&lt;/p&gt;
&lt;p&gt;From a design standpoint I have no idea! I&#x27;ve searched for any kind of explanation and haven&#x27;t found anything that goes into detail about the making of the movie arcade game concept itself.&lt;/p&gt;
&lt;p&gt;So was the movie predicting where videogames were going, or showing them the way? I&#x27;d guess predicting, because I&#x27;ve never heard any game developer call out The Last Starfighter as a direct inspiration.&lt;/p&gt;
&lt;p&gt;The Last Starfighter holds up when compared to other arcade movies of the time as well. TRON of course had Flynn&#x27;s arcade showcasing the in-movie game Space Paranoids. But Space Paranoids is more like an enhanced version of Battlezone than an arcade game way ahead of its time.&lt;/p&gt;
&lt;video loop muted playsinline controls preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/space-paranoids.jpg&quot; width=&quot;480&quot; height=&quot;270&quot; aria-label=&quot;Space Paranoids in TRON (1982): the game&amp;#x27;s blue screen inside its cabinet bezel, then the full-screen view of green HUD brackets and a gunsight around a red wireframe Recognizer that the player locks onto with a yellow ring and blows apart&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/space-paranoids.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;img src=&quot;https://strangeleaflet.com/the-last-starfighters-arcade-game-was-ahead-of-its-time/space-paranoids.jpg&quot; alt=&quot;Space Paranoids in TRON (1982): the game&amp;#x27;s blue screen inside its cabinet bezel, then the full-screen view of green HUD brackets and a gunsight around a red wireframe Recognizer that the player locks onto with a yellow ring and blows apart&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;TRON&lt;/em&gt; (1982, Walt Disney Productions), from &lt;a href=&quot;https://www.youtube.com/watch?v=6QWEcj7UXFs&amp;amp;t=98s&quot;&gt;Iamthe80sguy2&#x27;s upload&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Every time I watch The Last Starfighter I&#x27;m impressed. The filmmakers clearly loved arcade games and managed to dream one up that would still hold up as a game today.&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://strangeleaflet.com/loops.js&quot;&gt;&lt;/script&gt;

</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/we-take-it-back/</id>
    <title>We take it back</title>
    <link href="https://strangeleaflet.com/we-take-it-back/"/>
    <published>2026-11-04T14:08:45+00:00</published>
    <updated>2026-11-04T14:08:45+00:00</updated>
    <category term="politics"/>
    <category term="movies"/>
    <content type="html">&lt;p&gt;Wow I&#x27;d hoped for good results from election day (November 3, 2026: yesterday) but these results are amazing. This clip has been running in my head:&lt;/p&gt;
&lt;video controls playsinline preload=&quot;metadata&quot; poster=&quot;https://strangeleaflet.com/we-take-it-back/poster.jpg&quot; width=&quot;854&quot; height=&quot;480&quot; style=&quot;max-width:100%;height:auto&quot;&gt;
  &lt;source src=&quot;https://strangeleaflet.com/we-take-it-back/robin-hood-speech.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;track kind=&quot;captions&quot; src=&quot;https://strangeleaflet.com/we-take-it-back/robin-hood-speech.vtt&quot; srclang=&quot;en&quot; label=&quot;English&quot; default&gt;
  &lt;img src=&quot;https://strangeleaflet.com/we-take-it-back/poster.jpg&quot; alt=&quot;Robin Hood looking back over his shoulder in a forest, from his speech in Robin Hood: Prince of Thieves&quot;&gt;
&lt;/video&gt;

&lt;p&gt;&lt;small&gt;Clip from &lt;em&gt;Robin Hood: Prince of Thieves&lt;/em&gt; (1991, Morgan Creek/Warner Bros.).&lt;/small&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/my-mesh-wifi-died-so-im-running-fiber-to-the-attic/</id>
    <title>My mesh WiFi died, so I&#x27;m running fiber to the attic</title>
    <link href="https://strangeleaflet.com/my-mesh-wifi-died-so-im-running-fiber-to-the-attic/"/>
    <published>2026-10-26T17:47:13+00:00</published>
    <updated>2026-10-26T17:47:13+00:00</updated>
    <category term="networking"/>
    <category term="hardware"/>
    <content type="html">&lt;p&gt;On Saturday morning, October 24th, we all woke up to no Internet. Well almost entirely no Internet. Two of our Plume SuperPods were offline, one was going on and off randomly. Restarting the pods didn&#x27;t help at all. They&#x27;d worked for years with no changes but I guess with Plume&#x27;s residential support shutting down this was finally the impetus to change our network.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A laptop plugged straight into the AT&amp;amp;T fiber gateway got online just fine.
The ISP connection was working.&lt;/li&gt;
&lt;li&gt;A device wired into the main Plume pod, the one connected to the gateway via ethernet, got
nothing at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe there was a power surge or maybe a bad firmware update overnight. Either way let&#x27;s change it up!&lt;/p&gt;
&lt;h2 id=&quot;the-new-plan&quot;&gt;The new plan&lt;/h2&gt;
&lt;p&gt;Our house is three stories with my office in the attic. Originally the Plume network was great to cover WiFi because AT&amp;amp;T&#x27;s gateway was really slow and didn&#x27;t provide a strong signal. But since then we&#x27;ve upgraded to the BGW320 gateway. So hey maybe the gateway&#x27;s own WiFi can handle things.&lt;/p&gt;
&lt;p&gt;Turns out it works great! I setup its internal WiFi to match the Plume network SSID and password and all of our devices could just hop right back on without the lag or dead spots we had before.&lt;/p&gt;
&lt;p&gt;So great! The plan now is the gateway&#x27;s WiFi for the house, and a new wired link to the attic.&lt;/p&gt;
&lt;p&gt;I&#x27;ve thought for a while about having a fiber run instead of two ethernet runs with a Plume superpod intermediary. So this is a great time to try that out and setup a 10G fiber link.&lt;/p&gt;
&lt;div class=&quot;highlight&quot; data-lang=&quot;text&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;AT&amp;amp;T fiber
    |
BGW320-500 gateway  (WiFi for the house)
    |  ethernet
ES210X-M2 switch
    |  10G single-mode fiber
ES210X-M2 switch  (attic office)
    |  ethernet
all the wired things in my office
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two TP-Link Omada ES210X-M2 switches. Each has eight 2.5G ports and two 10G
SFP+ slots.
One goes beside the gateway, and the other replaces a 6-port switch in
the attic office.&lt;/li&gt;
&lt;li&gt;Two TP-Link SM5110-LR modules: 10GBASE-LR, single-mode. One for each
switch&#x27;s SFP+ slot.&lt;/li&gt;
&lt;li&gt;A run of OS2 single-mode armored fiber cable, LC to LC (UPC), uniboot.
Uniboot means both strands of the pair share one connector boot, so it&#x27;s a
single thin cable end to end.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The run from the gateway to the attic goes through a surface raceway I setup for the Plume ethernet backhaul. Now it&#x27;ll carry a single fiber run directly from the gateway to the office switch.&lt;/p&gt;
&lt;h2 id=&quot;why-fiber&quot;&gt;Why fiber?&lt;/h2&gt;
&lt;p&gt;Capacity and coolness! A fiber run should be plenty futureproofed for future speed and it&#x27;s just cool to have data via light.&lt;/p&gt;
&lt;h3 id=&quot;an-ethernet-coupler-for-now&quot;&gt;An ethernet coupler for now&lt;/h3&gt;
&lt;p&gt;Until the fiber is in, the attic still needs a wired connection. The old Plume
pod on the second floor used to sit between the two ethernet cables, so
I joined them with an RJ45 coupler right where it used to be. One
continuous-ish cable to the office.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/back-to-a-static-site/</id>
    <title>Back to a static site</title>
    <link href="https://strangeleaflet.com/back-to-a-static-site/"/>
    <published>2026-10-25T16:12:23+00:00</published>
    <updated>2026-10-25T16:12:23+00:00</updated>
    <category term="blog"/>
    <category term="tools"/>
    <content type="html">&lt;p&gt;A year ago I &lt;a href=&quot;https://strangeleaflet.com/switched-to-bear/&quot;&gt;switched to Bear&lt;/a&gt; and I still think Bear is great. If you want to simply write words and have them show up on the Internet, go use Bear. It&#x27;s fast, it&#x27;s human, it&#x27;s delightful, and it gets out of your way.&lt;/p&gt;
&lt;p&gt;But recently I&#x27;ve been building &lt;a href=&quot;https://strangeleaflet.com/introducing-curiousstrangeleafletcom-and-a-new-theme/&quot;&gt;the Cabinet of Curios&lt;/a&gt; and working on &lt;a href=&quot;https://furtherfrom.com&quot;&gt;FurtherFrom&lt;/a&gt; with Claude. Working on both sites has reminded me how nice it is to have a site that&#x27;s just files. Way back in the early 1990s I hand edited HTML files as my blog originally hosted from the user hosting account of our ISP, Interpath. Back when publishing was &lt;code&gt;ftp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I&#x27;m getting that same kind of vibe with GitHub Pages which I&#x27;d always kind of relegated to either Jekyll things or simple single page HTML. With Claude I&#x27;ve found that it&#x27;s really quite nice to get back to self-contained HTML files. Push some HTML to GitHub, GitHub Pages serves it, done. And the more curios I made with Claude the more I missed being able to drop interactive things right into blog posts like I could back when this blog was running in SvelteKit.&lt;/p&gt;
&lt;p&gt;Bear is very intentionally not that. No JavaScript, just words. That&#x27;s a feature! But it&#x27;s just not the feature I want anymore.&lt;/p&gt;
&lt;p&gt;Strange Leaflet is a static site again!&lt;/p&gt;
&lt;p&gt;So let&#x27;s walk through some blogging history as best I can remember it. My blogging has changed domains and hosting and frameworks several times.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1990s: something like &lt;code&gt;interpath.com/~ballfam&lt;/code&gt; because no one else really cared to put files into our user account. This was purely handwritten HTML files wow.&lt;/li&gt;
&lt;li&gt;1990s: At UNC we also got a user hosted space so it was something like &lt;code&gt;web.unc.edu/~sdball&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;2000s: I ran a livejournal for some time&lt;/li&gt;
&lt;li&gt;2000s: There was an iBlog in there too which was a macOS app to compile posts into static HTML&lt;/li&gt;
&lt;li&gt;2010s: I spun up a Ruby/Rails blog at rakeroutes.com which was variously a mephisto blog, jekyll, comfortable mexican sofa, WordPress, and ghost blog&lt;/li&gt;
&lt;li&gt;2020s: I started up strangeleaflet and it&#x27;s been jekyll, blot.im, SvelteKit, Phoenix, and bearblog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now back to plain HTML files but now with a light build script and help from Claude which is turning out to be super fun. Going from idea to self-contained HTML file is a great flow and we&#x27;ve been able to extract out my old SvelteKit widgets back into self-contained JavaScript within the posts. Woo!&lt;/p&gt;
&lt;h2 id=&quot;what-i-gave-up&quot;&gt;What I gave up&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A web UI to write and edit posts. Posts are markdown files in a git repo again.&lt;/li&gt;
&lt;li&gt;Bear&#x27;s upvotes (&amp;quot;toasts&amp;quot;), visibility toggles, and analytics.&lt;/li&gt;
&lt;li&gt;An RSS feed that I never had to think about.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-i-got&quot;&gt;What I got&lt;/h2&gt;
&lt;p&gt;Every post is its own HTML page that Claude and I fully control. Here&#x27;s the walking penguin from my &lt;a href=&quot;https://strangeleaflet.com/rebooting-this-blog-in-svelte-and-sveltekit/&quot;&gt;SvelteKit reboot post&lt;/a&gt;, back from being a screenshot on Bear:&lt;/p&gt;
&lt;penguin-walker walk&gt;

&lt;p&gt;&lt;img src=&quot;https://strangeleaflet.com/rebooting-this-blog-in-svelte-and-sveltekit/19am.webp&quot; alt=&quot;screenshot of an animated cartoon walking penguin&quot; /&gt;&lt;/p&gt;
&lt;/penguin-walker&gt;

&lt;p&gt;The &lt;a href=&quot;https://strangeleaflet.com/shrink-your-data-into-bitfields-and-out-again/&quot;&gt;bitfields post&lt;/a&gt; has its interactive explorers back too.&lt;/p&gt;
&lt;p&gt;Those used to be Svelte components. Now they&#x27;re plain JavaScript custom elements that live in the same directory as their post. No framework, no bundler. Each one wraps the static version that was on Bear (a screenshot, some code blocks) so feed readers and anyone without JavaScript still see something sensible.&lt;/p&gt;
&lt;h2 id=&quot;a-custom-generator-written-by-claude&quot;&gt;A custom generator, written by Claude&lt;/h2&gt;
&lt;p&gt;I&#x27;ve been down the static site generator road before. I don&#x27;t want to learn another generator&#x27;s opinions about templates and themes and plugins. I wanted exactly one thing: take the markdown that Bear exported and turn it into the same HTML Bear was making, so my theme just keeps working.&lt;/p&gt;
&lt;p&gt;So I asked Claude (Claude Code, specifically) whether that was feasible. It looked at the export, my Bear theme, and my other static sites, said yes, and then built it with me.&lt;/p&gt;
&lt;p&gt;The whole generator is &lt;a href=&quot;https://github.com/sdball/strangeleaflet/blob/main/scripts/build.py&quot;&gt;one Python file&lt;/a&gt; of about 370 lines using &lt;a href=&quot;https://github.com/lepture/mistune&quot;&gt;mistune&lt;/a&gt; for markdown and &lt;a href=&quot;https://pygments.org/&quot;&gt;Pygments&lt;/a&gt; for syntax highlighting. It makes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a page for every post, at the same URLs Bear used&lt;/li&gt;
&lt;li&gt;the home page and the blog list, including Bear&#x27;s &lt;code&gt;?q=tag&lt;/code&gt; filtering&lt;/li&gt;
&lt;li&gt;an Atom feed at the same &lt;code&gt;/feed/&lt;/code&gt; URL with the same entry ids, so existing subscribers shouldn&#x27;t notice a thing&lt;/li&gt;
&lt;li&gt;redirects for old URLs from earlier versions of this blog&lt;/li&gt;
&lt;li&gt;a sitemap and a 404 page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pushing to main builds the site with GitHub Actions and deploys it to GitHub Pages.&lt;/p&gt;
&lt;p&gt;The part I appreciated most was the checking. Claude fetched every page of the live Bear blog and compared it against what the new generator produced. That turned up a couple of tables that were missing their header rows, which Bear had been quietly rendering wrong, and a dozen links and images that had been broken since earlier migrations. It copied my images off Bear&#x27;s CDN, dug the missing ones out of this repo&#x27;s git history, and fixed the links.&lt;/p&gt;
&lt;h2 id=&quot;how-the-widgets-work&quot;&gt;How the widgets work&lt;/h2&gt;
&lt;p&gt;The penguin up above is just a tag in this post&#x27;s markdown:&lt;/p&gt;
&lt;div class=&quot;highlight&quot; data-lang=&quot;markdown&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;penguin-walker walk&amp;gt;

![&lt;span class=&quot;nt&quot;&gt;screenshot of an animated cartoon walking penguin&lt;/span&gt;](&lt;span class=&quot;na&quot;&gt;/rebooting-this-blog-in-svelte-and-sveltekit/19am.webp&lt;/span&gt;)

&amp;lt;/penguin-walker&amp;gt;

&amp;lt;script type=&quot;module&quot; src=&quot;https://strangeleaflet.com/rebooting-this-blog-in-svelte-and-sveltekit/penguin-walker.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Any HTML tag with a hyphen in its name is a valid &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements&quot;&gt;custom element&lt;/a&gt; name. The markdown renderer sees &lt;code&gt;&amp;lt;penguin-walker walk&amp;gt;&lt;/code&gt; alone on a line, treats it as raw HTML, and passes it straight through. The blank line after it ends the raw HTML, so the screenshot inside is still rendered as regular markdown.&lt;/p&gt;
&lt;p&gt;Until the script runs, the browser has no idea what a &lt;code&gt;&amp;lt;penguin-walker&amp;gt;&lt;/code&gt; is, so it just shows what&#x27;s inside: the screenshot. That&#x27;s also all that a feed reader or a browser without JavaScript will see.&lt;/p&gt;
&lt;p&gt;Then the script defines the element:&lt;/p&gt;
&lt;div class=&quot;highlight&quot; data-lang=&quot;javascript&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;customElements&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;penguin-walker&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;HTMLElement&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;connectedCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;// read attributes like walk, insight, speed=&quot;80&quot;, and controls&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;// swap the screenshot for a real penguin and start it walking&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The browser finds every &lt;code&gt;&amp;lt;penguin-walker&amp;gt;&lt;/code&gt; already on the page and runs &lt;code&gt;connectedCallback()&lt;/code&gt; on each one. Each penguin reads its own attributes, replaces its screenshot with the live version, and starts walking.&lt;/p&gt;
&lt;p&gt;The script and the penguin GIFs live in the reboot post&#x27;s directory, and the build copies them next to that post&#x27;s page. The script finds its GIFs relative to itself (&lt;code&gt;new URL(&amp;quot;penguin.gif&amp;quot;, import.meta.url)&lt;/code&gt;) rather than relative to the page, which is how this post can borrow the penguin from another post without copying anything.&lt;/p&gt;
&lt;p&gt;So making a new widget is: drop a &lt;code&gt;.js&lt;/code&gt; file into a post&#x27;s directory, define an element with a hyphenated name, put the tag in the markdown with something sensible inside it, and add the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; line.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;Bear was the right move a year ago and this is the right move now. I get my words in plain markdown files, my theme, and the freedom to make any post as weird and interactive as I want.&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://strangeleaflet.com/rebooting-this-blog-in-svelte-and-sveltekit/penguin-walker.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;This site is also now on a public repo: enjoy! &lt;a href=&quot;https://github.com/sdball/strangeleaflet&quot;&gt;github.com sdball/strangeleaflet&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/respect-your-tools/</id>
    <title>Respect your tools</title>
    <link href="https://strangeleaflet.com/respect-your-tools/"/>
    <published>2026-10-23T13:17:23.171937+00:00</published>
    <updated>2026-10-23T13:17:23.171937+00:00</updated>
    <content type="html">&lt;p&gt;I really dislike folks using the term &amp;quot;clanker&amp;quot; for LLM things. It seems way too close to other -er slurs and used in the same derogatory way. Maybe there are people out there that also use weird terms to refer to their hammers, drills, trucks, cooking utensils, etc tools but I don&#x27;t see the point.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/introducing-curiousstrangeleafletcom-and-a-new-theme/</id>
    <title>Introducing curious.strangeleaflet.com and a new theme</title>
    <link href="https://strangeleaflet.com/introducing-curiousstrangeleafletcom-and-a-new-theme/"/>
    <published>2026-10-13T23:47:00+00:00</published>
    <updated>2026-10-13T23:47:00+00:00</updated>
    <content type="html">&lt;p&gt;Hello! I&#x27;ve been having a ton of fun vibing up self-contained HTML pages to explore random interests and I finally assembled a hosting setup. You can find them all at &lt;a href=&quot;https://curious.strangeleaflet.com&quot;&gt;https://curious.strangeleaflet.com&lt;/a&gt; and they are literally straight up from the public folder of &lt;a href=&quot;https://github.com/sdball/strangeleaflet-curious&quot;&gt;curious-strangeleaflet&lt;/a&gt;. Very intentionally there&#x27;s no cohesive theming, no build step, no script at all required. There &lt;em&gt;is&lt;/em&gt; a script to serve them all up locally but that&#x27;s just for convenience the pages work equally well when opened directly as HTML.&lt;/p&gt;
&lt;p&gt;You can find a page on how &lt;a href=&quot;https://curious.strangeleaflet.com/bitfield-explorer/&quot;&gt;bitfield encoding&lt;/a&gt; works which is a much more feature-filled version of the &lt;a href=&quot;https://strangeleaflet.fly.dev/widgets/bitfield-explorer&quot;&gt;bitfield explorer&lt;/a&gt; I have on my toy Elixir site.&lt;/p&gt;
&lt;p&gt;Or maybe mess around with &lt;a href=&quot;https://curious.strangeleaflet.com/complex-numbers/&quot;&gt;complex numbers&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Or check out how &lt;a href=&quot;https://curious.strangeleaflet.com/morse-code/&quot;&gt;morse code&lt;/a&gt; operators were basically doing pro-gamer speed things in the 1800s?&lt;/p&gt;
&lt;p&gt;Check out the &amp;quot;text adventure interface&amp;quot; on the index page where you can jump back to like 1983 when I, as a little kid, was completely entranced by ZORK and Enchanter and the like. It&#x27;s all themed like I remember the INFOCOM games running on our Atari 800XL.&lt;/p&gt;
&lt;p&gt;I also finally decided to work up a proper theme for this blog. I hope you enjoy!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/a-history-degree-is-a-programming-superpower-in-the-age-of-ai/</id>
    <title>A History Degree Is A Programming Superpower in the Age of AI</title>
    <link href="https://strangeleaflet.com/a-history-degree-is-a-programming-superpower-in-the-age-of-ai/"/>
    <published>2026-05-06T16:21:00+00:00</published>
    <updated>2026-05-06T16:21:00+00:00</updated>
    <content type="html">&lt;p&gt;A history degree was always a cheat code for being a high level software engineer, but large language models have turned it into even more of a superpower.&lt;/p&gt;
&lt;h2 id=&quot;the-original-case-programming-is-mostly-narrative&quot;&gt;The original case: programming is mostly narrative&lt;/h2&gt;
&lt;p&gt;Most people think programming is about writing code. After a few years in the industry, you realize programming is mostly about figuring out what’s going on. A bug report says one thing. The Slack thread says another. The commit history tells a third story. The person who wrote the original system left two years ago, and the design doc was already out of date before the feature even shipped.&lt;/p&gt;
&lt;p&gt;Your job, before you write a single line of code, is to reconstruct what happened from incomplete and contradictory evidence. Then you have to tell the story back to your team in a way that lets them act on it.&lt;/p&gt;
&lt;p&gt;This is what historians are trained to do. Sift sources of varying reliability. Notice the gap between what someone claimed at the time and what they actually did. Reconcile accounts that disagree. Build a narrative that holds up to scrutiny and lets the reader follow your reasoning back to the evidence. Swap “primary source” for “repo history” and the muscle is identical.&lt;/p&gt;
&lt;p&gt;Engineers with humanities backgrounds tend to be unusually good at the messy, ambiguous middle of a project — the part where you’re not yet sure what you’re building or why the existing thing is broken. They’ve been training that exact skill since their first undergraduate seminar.&lt;/p&gt;
&lt;h2 id=&quot;what-llms-change&quot;&gt;What LLMs change&lt;/h2&gt;
&lt;p&gt;Now add LLMs to the picture. Suddenly, generating plausible-looking code, prose, and explanations is essentially free. The bottleneck shifts. The scarce skill is no longer “can you produce text that compiles or reads well.” It’s “can you tell whether what you’re looking at is actually true.”&lt;/p&gt;
&lt;p&gt;This is exactly the part of historical training that doesn’t get talked about much in the “history teaches you to write” pitch. Historians are trained to be suspicious. Where did this claim come from? Who is making it, and what’s their incentive? Is this a primary source or someone summarizing a summary of a summary? Does this document say what people remember it saying, or has the meaning drifted through retelling?&lt;/p&gt;
&lt;p&gt;An LLM is, structurally, the worst possible source by these standards. It’s a confident narrator with no citations, no incentives you can audit, and a tendency to smooth over gaps with fluent invention. It is, in historian terms, a chronicler writing centuries after the fact who has heard a lot of stories and can’t always remember which ones were true.&lt;/p&gt;
&lt;p&gt;If your instinct when reading any text is “where’s this coming from and how would I verify it,” you are dramatically better equipped to use these tools than someone whose instinct is “this sounds right, ship it.” The historian’s reflex — cross-reference, check the footnote, find the original — is the same reflex that catches a hallucinated API method before it makes it into production.&lt;/p&gt;
&lt;h2 id=&quot;writing-things-down-but-more-so&quot;&gt;Writing things down, but more so&lt;/h2&gt;
&lt;p&gt;The other classic history-major skill is writing clearly. This was already useful in software, where most of the work product that matters long-term is documentation, design docs, and post-mortems. Code rots. Prose rots more slowly.&lt;/p&gt;
&lt;p&gt;LLMs raise the stakes here too, in two directions.&lt;/p&gt;
&lt;p&gt;First, the quality of what you get out of these models is downstream of the quality of what you put in. Vague, ambiguous prompts produce vague, ambiguous output.&lt;/p&gt;
&lt;p&gt;Engineers who can specify a problem precisely in prose get dramatically better results than engineers who can’t. Writing clear paragraphs describing the system, its constraints, its desired behavior, and its edge cases has a huge payoff.&lt;/p&gt;
&lt;p&gt;Prompting is a writing skill that wears a programming costume.&lt;/p&gt;
&lt;p&gt;Second, as more code gets generated rather than hand-written, the comments, commit messages, and architecture docs become the actual record of human intent. The code shows what the machine produced. The prose shows what the humans were trying to do.&lt;/p&gt;
&lt;p&gt;Future engineers and future LLMs reading the codebase will rely on that prose far more than they used to. Being a person on the team who writes it well is a compounding advantage.&lt;/p&gt;
&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;/h2&gt;
&lt;p&gt;None of this means a history degree replaces learning to code. You still have to learn to code.&lt;/p&gt;
&lt;p&gt;The argument is about which adjacent skills give you leverage on top of that, and how those skills are revalued in a world where generation is cheap and judgment is scarce.&lt;/p&gt;
&lt;p&gt;It’s also not really about the degree itself but the habits the degree is supposed to instill. Plenty of CS majors have those habits, and plenty of history majors don’t. The point is that the training is well-matched to what software work actually demands now in a way that wasn’t obvious five years ago and is becoming more obvious every month.&lt;/p&gt;
&lt;h2 id=&quot;the-advantage&quot;&gt;The advantage&lt;/h2&gt;
&lt;p&gt;Software engineering has always rewarded people who can extract a clean story from a messy pile of evidence and write it down so others can act on it. LLMs make generating plausible stories trivial, which makes verifying them and writing them more clearly the bottleneck.&lt;/p&gt;
&lt;p&gt;That bottleneck is the historian’s expertise.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/id-use-spinel-for-ruby-projects/</id>
    <title>I’d use Spinel for Ruby projects</title>
    <link href="https://strangeleaflet.com/id-use-spinel-for-ruby-projects/"/>
    <published>2025-09-23T23:52:34.502231+00:00</published>
    <updated>2025-09-23T23:52:34.502231+00:00</updated>
    <content type="html">&lt;p&gt;From &lt;a href=&quot;https://joel.drapper.me/p/rubygems-takeover/&quot;&gt;Shopify, pulling strings at Ruby Central, forces Bundler and RubyGems takeover&lt;/a&gt; my takeaway is that on any of my Ruby projects I’d absolutely use Spinel and stay far away from rubygems.org.&lt;/p&gt;
&lt;p&gt;It’s a sad state that a core part of the Ruby ecosystem has been taken over by private parties and taken away from the community.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://youtu.be/VyCiE3GjQps?si=tMoXsbuXPwOL4TeY&quot;&gt;video from Ruby Central to try and qualify their recent actions&lt;/a&gt; is woefully insufficient to justify their behavior.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://strangeleaflet.com/switched-to-bear/</id>
    <title>Switched to Bear</title>
    <link href="https://strangeleaflet.com/switched-to-bear/"/>
    <published>2025-09-14T13:56:00+00:00</published>
    <updated>2025-09-14T13:56:00+00:00</updated>
    <content type="html">&lt;p&gt;I was browsing around the &lt;a href=&quot;https://kagi.com/smallweb&quot;&gt;Kagi small web&lt;/a&gt; and found that I was on a blog powered by Bear. A couple things caught my eye.&lt;/p&gt;
&lt;p&gt;The blog was nice, readable, and fast enough to be a fine human experience.&lt;/p&gt;
&lt;p&gt;The little bear unicode logo at the bottom was adorable.&lt;/p&gt;
&lt;p&gt;I&#x27;ve been feeling more of a spark of annoyance than a spark of joy maintaining my own stack of blogging lately. While I love having the capability to add games like &lt;a href=&quot;https://strangeleaflet.fly.dev/games/life&quot;&gt;LiveView Life&lt;/a&gt; and &lt;a href=&quot;https://strangeleaflet.fly.dev/games/mowing-wide-multi&quot;&gt;a world-wide multiplayer minesweeper clone&lt;/a&gt;. The blog writing experience wasn&#x27;t it.&lt;/p&gt;
&lt;p&gt;The major stumbling block is that to write and publish a blog post required that I had to stack together a chain of tooling starting from writing a post an on arbitrary device to getting those words committed to my repo to publishing to fly.io. I&#x27;ve been contemplating writing an actual in-app editing stack but that would mean dealing with authentication and whatever data stacks e.g. probably storing the posts in Tigris.&lt;/p&gt;
&lt;p&gt;Static site generators are an option but that&#x27;s already what I&#x27;d written for Strange Leaflet using the excellent &lt;a href=&quot;https://github.com/dashbitco/nimble_publisher&quot;&gt;Nimble Publisher&lt;/a&gt;. I don&#x27;t want a static site generator I just want to write words and share code snippets.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blot.im/&quot;&gt;blot.im&lt;/a&gt; is a nice in-between a hosted option and a static site generator that I used before my journey into SvelteKit and then Nimble Publisher. Blot is joyfully scoped but I kept running into friction with its dropbox/git interface. I never found a writing experience that I enjoyed that also supported the mechanics of writing markdown files to Dropbox or committing files to a Git repo.&lt;/p&gt;
&lt;p&gt;With a hosted blogging experience I get to leave more of my day job behind when I&#x27;m writing for my blog. Here are my words: please put them on the Internet in some kind of way.&lt;/p&gt;
&lt;p&gt;Over my years of blogging I&#x27;ve had pretty good but not great experiences from many hosted blogging platforms.&lt;/p&gt;
&lt;p&gt;I was writing with and writing plugins for Wordpress more than a decade ago. It is a supremely capable platform but it&#x27;s also just that: a platform. Wordpress offers hundreds and hundreds of integrations and extensions and customizations. There&#x27;s also the drama of .org vs .com and I don&#x27;t really care.&lt;/p&gt;
&lt;p&gt;That issue of hosted platforms trying to be appealing platforms for many uses is at the core of my hesitance towards going back to any of them. I&#x27;m not a writing team. I don&#x27;t need editor/publisher roles. I don&#x27;t need to integrate with single sign-on systems.&lt;/p&gt;
&lt;p&gt;That left me wanting to find something but not really with any sense of urgency. So when I spotted that &amp;quot;Powered by &lt;a href=&quot;https://bearblog.dev/&quot;&gt;Bear ʕ•ᴥ•ʔ&lt;/a&gt;&amp;quot; I was primed to click and see whatever the deal was. And what I found is exactly what I wanted and more!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A privacy-first, no-nonsense, super-fast blogging platform&lt;/p&gt;
&lt;p&gt;No trackers, no javascript, no stylesheets. Just your words.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;YES. And then I found the &lt;a href=&quot;https://herman.bearblog.dev/manifesto/&quot;&gt;Bear Manifesto&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bear won&#x27;t shut down.&lt;/p&gt;
&lt;p&gt;Bear won&#x27;t sell.&lt;/p&gt;
&lt;p&gt;Bear won&#x27;t show ads.&lt;/p&gt;
&lt;p&gt;Built to last&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&#x27;s beautiful. Even further I found that &lt;a href=&quot;https://herman.bearblog.dev/license/&quot;&gt;Bear is source-available&lt;/a&gt; with a switch away from the MIT liecnse as of September 1, 2025. I am a huge fan of this approach.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This new license is almost identical to the MIT license but with the stipulation that the software cannot be provided as a hosted or managed service. Everything else is still permitted.&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;We&#x27;re entering a new age of AI powered coding, where creating a competing product only involves typing &amp;quot;Create a fork of this repo and change its name to something cool and deploy it on an EC2 instance&amp;quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am more than happy to support human programming and explicitly human programming that is focused on human use.&lt;/p&gt;
&lt;p&gt;While migrating to Bear I also found that I appreciated &lt;a href=&quot;https://docs.bearblog.dev/migrate/&quot;&gt;its approach to content migration&lt;/a&gt; as well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The easiest way to move existing content to Bear is to create new posts and copy the text content from your existing web pages one at a time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah! We aren&#x27;t trying to seamlessly integrate writing and metadata from dozens of arbitrary systems. Get your words together and put them into Bear or don&#x27;t.&lt;/p&gt;
&lt;p&gt;I did.&lt;/p&gt;
</content>
  </entry>
</feed>
