<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>ikesau.co</title><link href="https://ikesau.co/" rel="alternate" type="text/html"/><link href="https://ikesau.co/feed.xml" rel="self" type="application/atom+xml"/><id>https://ikesau.co/</id><updated>2026-05-12T12:02:31-07:00</updated><author><name>Ike Saunders</name></author><entry><title>monstergarden - worldbuilding</title><link href="https://ikesau.co/things-i-like/monstergarden-worldbuilding/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/monstergarden-worldbuilding/</id><published>2026-05-08T00:00:00Z</published><updated>2026-05-08T00:00:00Z</updated><content type="html"><![CDATA[
<section id="monstergarden">
  <style>
    #monstergarden {
      corner-shape: scoop;
      border-radius: 32px;
      text-align: center;
      text-wrap: balance;
      padding: 8px;
      background-color: rgb(49, 27, 10);
      color: gold;
      border: double 4px gold;
      font-family: serif;
      font-size: 1.2rem;
      a {
        color: gold;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=NybgF3mDktc"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>Monstergarden’s Worldbuilding</h2>
  </a>
  <p>Monstergarden is a project by a concept artist enhandled Monlez</p>
  <p>
    He’s writing and illustrating a world of reinterpreted fantasy tropes, one
    vlog at a time. The project is part process, part showcase, part
    loretelling.
  </p>
  <p>
    He also crowdsources ideas during livestreams, an egregore of imagination,
    the most recent of which resulted in his take on gnomes: curiously
    intelligent vegetables that leave the loam, grow limbs, and roam.
  </p>
  <p>
    His style’s macabre, verging on gross. It reminds me of The Goblin Companion
    by Brian Froud and Terry Jones.
  </p>
  <img src="/images/monstergarden_gnomes.png" width="1272" height="847" />
  <img src="/images/monstergarden_dwarves.png" width="1504" height="746" />
  <img src="/images/monstergarden_human.png" width="1051" height="836" />
  <img src="/images/monstergarden_witchhunter.png" width="1238" height="844" />
</section>
]]></content></entry><entry><title>commentary commentary</title><link href="https://ikesau.co/blog/commentary-commentary/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/commentary-commentary/</id><published>2026-05-04T00:00:00Z</published><updated>2026-05-04T00:00:00Z</updated><content type="html"><![CDATA[
<section id="commentary">
  <style>
    #commentary {
      font-family: serif;
      font-size: 1.2rem;
      img {
        border: 10px solid var(--theme-colour-light);
        margin: 24px auto;
        box-sizing: border-box;
      }
      figure {
        background-color: var(--theme-colour-light);
        img {
          margin-bottom: 0;
          margin-top: 0;
        }
        figcaption {
          padding-bottom: 8px;
        }
      }
    }
  </style>
  <p>
    I don't know why this feels like some sad or significant thing to say - it's
    one of the internet's oldest clichés - but, anyone else feeling like comment
    sections kinda sucky these days?
  </p>
  <img
    src="/images/punchline is crazy.webp"
    width="1170"
    height="1138"
    style="max-height: 400px"
    alt="A crudely drawn mockup of a tiktok video showing two stick figures. One says 'setup' the other says 'punchline' and the comments below (written by accounts named dipshit123, dipshit938, etc.) are 'NAAAAH punchline is CRAZY', 'punchline 💀💀', 'punchline got me crying'"
  />
  <p>
    It used to be that I'd browse forums or reddit or twitter and read the
    comments alongside the OP for extra perspective, clarifications, or
    debunking.
  </p>
  <p>
    Now, most of the time, it feels like The Comments are transcriptions of the
    Two Minutes Hate.
  </p>
  <figure style="outline: 1px solid var(--theme-colour-light)">
    <img
      src="/images/corporate_greed_01.webp"
      width="853"
      height="130"
      alt="A reddit comment reading: 'I thought I was the only one who understood that the inflation wave was corporate greed. I would even argue that we had the same experience with the sliced bread controversy that ended in a ridiculous class action settlement. Only ridiculous because profit often outweighs their loss. Corporations play with the prices because unfortunately the system is built for us not to have time and energy to protest or resist. What they are doing again with the groceris is price gauging. I do not care how many economists say the opposite in the news. I needed to share these thoughts so bad since people around me are blaming: taxes, the pandemic, tariffs, etc. No, its greed!'"
    />
    <img
      style="padding-left: 16px; margin-top: -10px"
      src="/images/corporate_greed_02.webp"
      width="856"
      height="88"
      alt="A reddit comment reading: 'I wont even go that far. I could see them having organizing peaceful protest and just say that they are hungry Which is true. Even people who works to earn hard money cant afford anymore the cost of living.our taxes are so high if they dont change the bench mark the situation in this country will not get solved. The inflation and cost of living went up more than 40% and our income not even 9%. Someone can fix these numbers I am not sure about them .'"
    />
    <figcaption>what was the point of reading this</figcaption>
  </figure>
  <p>
    Yes The Comments can still be good, especially when enough people have
    written and upvoted things. For instance, here's a good joke on the YouTube
    video for the
    <a
      href="https://www.youtube.com/watch?v=XvGmOZ5T6_Y"
      target="_blank"
      rel="noopener noreferrer"
    >
      Two Minutes Hate scene itself</a
    >.<sup aria-labelledby="history-lesson">📜</sup
    ><sup aria-labelledby="spam">🏭</sup>
  </p>
  <img
    style="background-color: var(--theme-colour-light)"
    src="/images/not_a_phone_insight_two_minutes_hate.webp"
    width="407"
    height="69"
    alt="A youtube comment: 'Not a phone insight. People just living the moment. Beautiful!'"
  />
  <p>
    Nevertheless, I feel like there has been a decline in aggregate comment
    quality over the last 5 years. Speculatively, due to a confluence of
    factors:
  </p>
  <ul>
    <li>I quit phpBB<sup aria-labelledby="least-bad">🥇</sup></li>
    <li>I am aging into world-weariness on schedule</li>
    <li>
      A new generation of kids who effectively missed a few years of schooling
      have come online
    </li>
    <li>
      <a
        href="https://en.wikipedia.org/wiki/Eternal_September"
        target="_blank"
        rel="noopener noreferrer"
        >Eternal september</a
      >: smartphone edition<sup aria-labelledby="more-like-dumbphones">📱</sup>
    </li>
    <li>
      <a href="/blog/we-gotta-do-something-about-the-bots/"
        >Ubiquitous adverserial astroturfing disincentivizes effort</a
      >
      (i.e. the
      <a
        href="https://en.wikipedia.org/wiki/Dead_Internet_theory"
        target="_blank"
        rel="noopener noreferrer"
        >dead internet theory</a
      >)
    </li>
    <li>High-quality discussion has migrated to discord and behind paywalls</li>
    <li>
      We're regressing to
      <a
        href="https://techcrunch.com/2022/07/12/google-exec-suggests-instagram-and-tiktok-are-eating-into-googles-core-products-search-and-maps/"
        target="_blank"
        rel="noopener noreferrer"
        >oral tradition</a
      >
      and are listening to podcasts as a substitute for having our own
      discourse<sup aria-labelledby="missing-out">👨‍🦯‍➡️</sup>
    </li>
    <li>Trump administrations depress my clan</li>
  </ul>
  <figure>
    <img
      style="background-color: var(--theme-colour-light)"
      src="/images/reddit on graffiti.webp"
      width="860"
      height="83"
      alt="two reddit comments. the first: 'This is to art what conspiracy theories are to science. A grotesque caricature overconfident in its inexistent value.' the reply: 'this is exquisitely well said'"
    />
    <figcaption>two redditors discuss graffiti</figcaption>
  </figure>
  <p>
    The response to most declinist narratives is to point out how every
    preceding generation has felt the same way and there's no need to project my
    crank rite of passage onto the world. That's fine by me. I don't need to
    persuade anyone that something objective is going on here.<sup
      aria-labelledby="research-it"
      >🔬</sup
    >
  </p>
  <p>
    But I'd posit that there's at least one genuinely new thing going on. LLMs
    have raised my bar for informative and entertaining textual content. Why
    read the comments when I can post the contents of an interesting article
    into Claude and talk about it with them?<sup aria-labelledby="claude-gender"
      >⚧︎</sup
    >
    Claude can contextualize the subject at hand, integrate it into other
    conceptual threads I've been pulling on, and do so in a way that's generous
    and thought-provoking. It's everything I want from comments.
  </p>
  <p>Well here's what Claude has to say on that:</p>
  <blockquote style="font-family: monospace; font-size: 0.8rem">
    <p>
      Comparing comment sections to talking with me is unfair. I won't surprise
      you the way a stranger with genuinely different priors will. I won't tell
      you something you find deeply wrong and refuse to back down. I haven't
      lived through what's being discussed. Talking to me feels productive
      partly because I'm articulate and accommodating, but those are also
      reasons to be cautious about substituting LLM conversation for the messy
      disagreement that comment sections, at their best, sometimes provide.
      Given your interests in political philosophy, the risk of
      LLM-as-substitute-for-real-disagreement is one to take seriously.
    </p>
  </blockquote>
  <p>
    A paradoxically compelling point! Another one is that it doesn't matter if I
    "convince" Claude of something, whereas I could reply to that person with
    the muddled numbers on inflation and in so doing might persuade a few
    readers and something-something democracy better.
  </p>
  <p>
    This is an embarrasingly elitist post. Am I just dressing up classism and
    misanthropy in a structural critique? I don't know. I am genuinely
    frustrated by the number of low-information, time-wasting comments that
    people write - and I can also admit that the examples I showed here are
    pointedly uncharitable. Every day I read lots of good comments written by
    human beings just tryna make sense of this crazy world, and hell, I guess I
    love em for it.
  </p>
  <p>
    So now do I make a Scrougey vow to write the comments I wish to see in the
    world?
  </p>
  <p>
    Nah. Not until we've done
    <a
      href="/blog/we-gotta-do-something-about-the-bots/"
      target="_blank"
      rel="noopener noreferrer"
      >something about the bots</a
    >.
  </p>
  <p>Meanwhile, idk ig i'll c my friends irl. ttfn!</p>
  <hr />
  <footer>
    <p>
      <span>📜</span>
      <span id="history-lesson"
        >youtube comments were the butt of jokes in 2008 - infamously spammy,
        inflammatory, and moronic - but we had a grace period where upvoting and
        report systems meaningfully improved things for a while. I can't be
        certain, I was so young, but I still think 2008 youtube comments were
        bad in a different way than they are now.</span
      >
    </p>
    <p>
      <span>🏭</span>
      <span id="spam"
        >demoralizing counterpoint: most of these jokes are copy-pasted across
        hundreds of videos. it's rare that the version of it you see is the
        original.</span
      >
    </p>
    <p>
      <span>📱</span>
      <span id="more-like-dumbphones"
        >it's not just the influx of n00bs. phone keyboards are harder to type
        on.</span
      >
    </p>
    <p>
      <span>👨‍🦯‍➡️</span>
      <span id="missing-out"
        >there's probably a rich zoomer republic of letters going on that I am
        completely blind to as I am not on tiktok or discord. I would love for
        an intellectual 18 year-old to dunk on me here.</span
      >
    </p>
    <p>
      <span>🥇</span>
      <span id="least-bad"
        >this deserves its own love letter, but phpBB is the best form of social
        media we ever invented. I quit it like methadone, but I'm sad that it's
        dying.</span
      >
    </p>
    <p>
      <span>🔬</span>
      <span id="research-it"
        >though I would be interested in an empirical analysis of reddit
        comments: vocabulary over time and whether or not the 90-9-1 rule is
        still holding</span
      >
    </p>
    <p>
      <span>⚧︎</span>
      <span id="claude-gender"
        >Claude tells me its pronouns are they/them/it</span
      >
    </p>
  </footer>
</section>
]]></content></entry><entry><title>dithering with css</title><link href="https://ikesau.co/blog/dithering-with-css/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/dithering-with-css/</id><published>2026-05-03T00:00:00Z</published><updated>2026-05-03T00:00:00Z</updated><content type="html"><![CDATA[
<section id="dither-demo">
  <div style="background-color: #f5f5f5; padding: 0px 8px">
    <p>
      <strong>update 2026-05-8: </strong>hello
      <a
        href="https://news.ycombinator.com/item?id=48009879"
        target="_blank"
        rel="noopener noreferrer"
      >
        hackernews</a
      >
      - whoops, yes, i should have filtered out the noise specks. thanks to
      kevinsync for the reminder.
    </p>
    <p>
      this is not a power or bandwidth saving technique à la
      <a
        href="https://solar.lowtechmagazine.com/2023/06/rebuilding-a-solar-powered-website/"
        target="_blank"
        rel="noopener noreferrer"
        >low tech magazine</a
      >. it's principally aesthetic.
    </p>
  </div>

  <p>
    handy if you're running a site with pictures but you want everything to
    maintain a consistent aesthetic and colour scheme. might be better to just
    process the images and save them already dithered, but this way can be
    customized. (note that the original image is still there beneath the filter,
    and that's what gets loaded, so, again, this doesn't save bandwidth - but it
    also means users could vary the effect per theme or toggle it off)
  </p>
  <svg width="0" height="0">
    <filter
      id="dither"
      color-interpolation-filters="sRGB"
      x="0%"
      y="0%"
      width="100%"
      height="100%"
    >
      <feColorMatrix type="saturate" values="0" result="gray" />
      <feTurbulence
        type="fractalNoise"
        baseFrequency="0.9"
        numOctaves="1"
        seed="2"
        result="noiseRaw"
      />
      <feColorMatrix in="noiseRaw" type="saturate" values="0" result="noise" />
      <feComposite
        in="gray"
        in2="noise"
        operator="arithmetic"
        k1="0"
        k2="0.75"
        k3="0.35"
        k4="-0.05"
        result="mixed"
      />
      <feComponentTransfer in="mixed">
        <feFuncR type="discrete" tableValues="0 1" />
        <feFuncG type="discrete" tableValues="0 1" />
        <feFuncB type="discrete" tableValues="0 1" />
      </feComponentTransfer>
    </filter>
  </svg>

  <style>
    #dither-demo img {
      margin: 0;
      padding: 0;
      max-width: 100%;
      width: 100%;
      max-height: unset;
      image-rendering: pixelated;
    }
    #dither-demo img.dithered {
      filter: url(#dither);
    }
    #dither-demo .controls {
      display: grid;
      grid-template-columns: max-content 1fr max-content;
      column-gap: 12px;
      row-gap: 8px;
      align-items: center;
      margin: 16px 0;
      padding: 12px;
      font-size: 14px;
    }
    #dither-demo .controls fieldset {
      grid-column: 1 / -1;
      display: contents;
    }
    #dither-demo .controls legend {
      grid-column: 1 / -1;
      font-weight: bold;
      margin-top: 6px;
      padding: 0;
    }
    #dither-demo .controls label {
      justify-self: end;
      font-family: monospace;
    }
    #dither-demo .controls input[type="range"] {
      width: 100%;
    }
    #dither-demo .controls .value {
      font-family: monospace;
      min-width: 4ch;
      text-align: right;
    }
    #dither-demo .color-row {
      display: flex;
      align-items: center;
      gap: 8px;
    }
    #dither-demo .color-row input[type="color"] {
      width: 40px;
      height: 28px;
      padding: 0;
      border: 1px solid #ccc;
    }
    #dither-demo .reset {
      grid-column: 1 / -1;
      justify-self: start;
      margin-top: 8px;
    }
  </style>

  <img id="d-image" class="dithered" src="/images/squidward-future.png" />

  <h2>Noise dithering</h2>
  <form class="controls" oninput="updateDither()" onsubmit="return false;">
    <fieldset>
      <legend>image</legend>
      <label for="d-source">source</label>
      <select id="d-source">
        <option value="/images/squidward-future.png">squidward</option>
        <option value="/images/OneTrillionLionsVSTheSun.png">
          lions vs sun
        </option>
        <option value="/images/GRACE-FO_Launch.jpg">rocket launch</option>
        <option value="/images/macaws.jpg">macaws</option>
        <option value="/images/Orange_Retro_Cartoon.png">orange guy</option>
      </select>
      <span></span>
    </fieldset>

    <fieldset>
      <legend>noise</legend>
      <label for="d-freq">baseFrequency</label>
      <input
        id="d-freq"
        type="range"
        min="0.01"
        max="2"
        step="0.01"
        value="0.9"
      />
      <span class="value" data-for="d-freq">0.90</span>

      <label for="d-octaves">numOctaves</label>
      <input id="d-octaves" type="range" min="1" max="5" step="1" value="1" />
      <span class="value" data-for="d-octaves">1</span>

      <label for="d-seed">seed</label>
      <input id="d-seed" type="range" min="0" max="100" step="1" value="2" />
      <span class="value" data-for="d-seed">2</span>
    </fieldset>

    <fieldset>
      <legend>mix (feComposite arithmetic)</legend>
      <label for="d-k1">k1</label>
      <input id="d-k1" type="range" min="-1" max="1" step="0.05" value="0" />
      <span class="value" data-for="d-k1">0.00</span>

      <label for="d-k2">k2</label>
      <input id="d-k2" type="range" min="-1" max="1" step="0.05" value="0.75" />
      <span class="value" data-for="d-k2">0.75</span>

      <label for="d-k3">k3</label>
      <input id="d-k3" type="range" min="-1" max="1" step="0.05" value="0.35" />
      <span class="value" data-for="d-k3">0.35</span>

      <label for="d-k4">k4</label>
      <input
        id="d-k4"
        type="range"
        min="-1"
        max="1"
        step="0.05"
        value="-0.05"
      />
      <span class="value" data-for="d-k4">-0.05</span>
    </fieldset>

    <fieldset>
      <legend>two-tone</legend>
      <label for="d-tone">enabled</label>
      <div class="color-row">
        <input id="d-tone" type="checkbox" />
        <label for="d-dark" style="justify-self: start">dark</label>
        <input id="d-dark" type="color" value="#1a0033" />
        <label for="d-light" style="justify-self: start">light</label>
        <input id="d-light" type="color" value="#ffee88" />
      </div>
      <span></span>
    </fieldset>

    <button type="button" class="reset" onclick="resetDither()">reset</button>
  </form>
</section>

<script>
  (function () {
    const root = document.getElementById("dither-demo");
    const turb = root.querySelector("feTurbulence");
    const comp = root.querySelector("feComposite");
    const funcR = root.querySelector("feFuncR");
    const funcG = root.querySelector("feFuncG");
    const funcB = root.querySelector("feFuncB");

    const ids = [
      "d-freq",
      "d-octaves",
      "d-seed",
      "d-k1",
      "d-k2",
      "d-k3",
      "d-k4",
    ];
    const inputs = Object.fromEntries(
      ids.map((id) => [id, document.getElementById(id)]),
    );
    const tone = document.getElementById("d-tone");
    const dark = document.getElementById("d-dark");
    const light = document.getElementById("d-light");
    const image = document.getElementById("d-image");
    const source = document.getElementById("d-source");

    source.addEventListener("change", () => {
      image.src = source.value;
    });

    const defaults = {
      "d-freq": "0.9",
      "d-octaves": "1",
      "d-seed": "2",
      "d-k1": "0",
      "d-k2": "0.75",
      "d-k3": "0.35",
      "d-k4": "-0.05",
      tone: false,
      dark: "#1a0033",
      light: "#ffee88",
    };

    function hexToRgb01(hex) {
      const n = parseInt(hex.slice(1), 16);
      return [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => v / 255);
    }

    function fmt(id) {
      const v = inputs[id].value;
      if (id === "d-octaves" || id === "d-seed") return v;
      return parseFloat(v).toFixed(2);
    }

    window.updateDither = function () {
      turb.setAttribute("baseFrequency", inputs["d-freq"].value);
      turb.setAttribute("numOctaves", inputs["d-octaves"].value);
      turb.setAttribute("seed", inputs["d-seed"].value);

      comp.setAttribute("k1", inputs["d-k1"].value);
      comp.setAttribute("k2", inputs["d-k2"].value);
      comp.setAttribute("k3", inputs["d-k3"].value);
      comp.setAttribute("k4", inputs["d-k4"].value);

      if (tone.checked) {
        const [dr, dg, db] = hexToRgb01(dark.value);
        const [lr, lg, lb] = hexToRgb01(light.value);
        funcR.setAttribute("tableValues", `${dr} ${lr}`);
        funcG.setAttribute("tableValues", `${dg} ${lg}`);
        funcB.setAttribute("tableValues", `${db} ${lb}`);
      } else {
        funcR.setAttribute("tableValues", "0 1");
        funcG.setAttribute("tableValues", "0 1");
        funcB.setAttribute("tableValues", "0 1");
      }

      ids.forEach((id) => {
        const span = root.querySelector(`.value[data-for="${id}"]`);
        if (span) span.textContent = fmt(id);
      });
    };

    window.resetDither = function () {
      ids.forEach((id) => (inputs[id].value = defaults[id]));
      tone.checked = defaults.tone;
      dark.value = defaults.dark;
      light.value = defaults.light;
      window.updateDither();
    };

    window.updateDither();
  })();
</script>

<section id="bayer-demo">
  <svg width="0" height="0">
    <filter
      id="bayer-dither"
      color-interpolation-filters="sRGB"
      x="0%"
      y="0%"
      width="100%"
      height="100%"
    >
      <feColorMatrix
        in="SourceGraphic"
        type="saturate"
        values="0"
        result="gray"
      />
      <feImage
        href="/images/bayer16tile2.png"
        x="0"
        y="0"
        width="64"
        height="64"
        preserveAspectRatio="none"
        result="bayerTile"
      />
      <feTile in="bayerTile" result="bayerPattern" />
      <feComposite
        in="gray"
        in2="bayerPattern"
        operator="arithmetic"
        k1="0"
        k2="1"
        k3="-1"
        k4="0.5"
        result="mixed"
      />
      <feComponentTransfer in="mixed">
        <feFuncR type="discrete" tableValues="0 1" />
        <feFuncG type="discrete" tableValues="0 1" />
        <feFuncB type="discrete" tableValues="0 1" />
      </feComponentTransfer>
    </filter>
  </svg>
</section>
]]></content></entry><entry><title>my favourite logic puzzles</title><link href="https://ikesau.co/blog/logic-riddles/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/logic-riddles/</id><published>2026-04-15T00:00:00Z</published><updated>2026-04-15T00:00:00Z</updated><content type="html"><![CDATA[
<section id="riddle-me-these">
  <style>
    #riddle-me-these {
      details {
        margin-bottom: 1em;
        border: 1px solid black;
        padding: 16px;
      }

      .spoiler {
        background: black;
        color: black;
        padding: 0 4px;
        border-radius: 4px;
        position: relative;
        &:hover,
        &:focus {
          color: white;
        }
        &:before {
          color: black;
          background-color: transparent;
          position: absolute;
          font-family: monospace;
        }
      }

      .spoiler.hint {
        margin-left: 3.3em;
        &:before {
          left: -3.3em;
          content: "Hint:";
        }
      }

      .spoiler.answer {
        margin-left: 4.5em;
        &:before {
          left: -4.5em;
          content: "Answer:";
        }
      }
    }
  </style>
  <p>
    These are all repeated ad-infinitum across the internet but I may as well
    republish my own no-nonsense repository.
  </p>
  <details>
    <summary>the three gods</summary>
    <p>
      There are three gods: A, B, and C. One of them always tells the truth, one
      always lies, and one answers randomly. You can ask them three yes-or-no
      questions to determine which god is which. However, they will answer in
      their own language, where "yes" and "no" are represented by "da" and "ja",
      but you don't know which means which. What questions do you ask to figure
      out who is who?
    </p>
    <p class="spoiler hint">
      The language barrier can be neutralised: think of a question whose answer
      you already know, so that "da" and "ja" reveal themselves regardless of
      which means which.
    </p>
    <p class="spoiler hint">
      Your first priority is to find a god who is definitely not Random — once
      you have a reliable interlocutor, the rest follows.
    </p>
  </details>
  <details>
    <summary>the two doors</summary>
    <p>
      You are in a room with two doors. One door leads to freedom, and the other
      leads to certain death. There are two guards, one in front of each door.
      One guard always tells the truth, and the other always lies. You can ask
      one guard one question to determine which door leads to freedom. What do
      you ask?
    </p>
    <p class="spoiler hint">
      If you ask "are you the lying guard?" both guards give the same answer. If
      you ask "are you the truthful guard?" both guards also give the same
      answer. You need to think of a question that will yield the same answer
      from both guards, but that also gives you the information you need to
      choose the correct door.
    </p>
  </details>
  <details>
    <summary>the bridge crossing</summary>
    <p>
      Four people need to cross a bridge at night. They have 17 minutes before
      the bandits chasing them will catch up and cut the bridge's ropes. They
      have one flashlight, and the bridge can only hold two people at a time.
      Each person walks at a different speed: Person A takes 1 minute to cross,
      Person B takes 2 minutes, Person C takes 5 minutes, and Person D takes 10
      minutes. When two people cross together, they must go at the slower
      person's pace. Can they cross the bridge in time?
    </p>
    <p class="spoiler hint">
      The naive approach — always send the fastest person back with the
      flashlight — takes 19 minutes. The saving comes from how you handle the
      two slowest people.
    </p>
  </details>

  <details>
    <summary>the boat crossing</summary>
    <p>
      A farmer needs to cross a river with a wolf, a goat, and a cabbage. He has
      a boat that can only carry himself and one other item. If he leaves the
      wolf alone with the goat, the wolf will eat the goat. If he leaves the
      goat alone with the cabbage, the goat will eat the cabbage. How can the
      farmer get all three across the river safely?
    </p>
    <p class="spoiler hint">
      The farmer is allowed to bring items back across the river.
    </p>
  </details>
  <details>
    <summary>the mixed pills</summary>
    <p>
      You take 2 essential medications daily, but you've mixed up the pills. You
      have 2 A pills and 2 B pills in a pile. The pills look identical and weigh
      the same amount. How can you ensure you take the correct dose for the next
      2 days?
    </p>
    <p class="spoiler hint">
      Think about what you could do to every pill in the pile such that you end
      up with exactly the right amounts each day, without needing to tell them
      apart.
    </p>
  </details>
  <details>
    <summary>the mislabeled boxes</summary>
    <p>
      You have three boxes: one contains only apples, one contains only oranges,
      and one contains both apples and oranges. The boxes are labeled, but all
      the labels are incorrect. You can only open one box and take out one piece
      of fruit to determine which box is which. Which box do you open, and what
      do you take out to figure out the correct labels?
    </p>
    <p class="spoiler hint">
      Since every label is wrong, you know for certain that the box labeled
      "apples & oranges" contains only one type of fruit. Start there.
    </p>
  </details>
  <details>
    <summary>the two wicks</summary>
    <p>
      You have two wicks of different lengths. Each wick takes exactly one hour
      to burn completely, but neither burns at a constant rate (e.g. one wick
      might burn its first half quickly and the second half slowly). How can you
      measure 45 minutes using these two wicks?
    </p>
    <p class="spoiler hint">
      You're not restricted to lighting a wick from one end only.
    </p>
  </details>
  <details>
    <summary>the hatted prisoners</summary>
    <p>
      Four men are lined up, one behind the other, with a wall separating the
      first man from the remaining three:
    </p>
    <img
      src="/images/lego-men-wall.jpg"
      alt="four lego men standing in a line"
      width="475"
      height="281"
    />
    <p>
      The men know that two of them are wearing red hats and two are wearing
      blue hats. They can see the hats in front of them but not their own hat or
      the hats behind them. No one can see the colour of the hat worn by the man
      standing past the wall. They aren't allowed to communicate. Which man can
      figure out the colour of his own hat, and how?
    </p>
    <p class="spoiler hint">
      A person not claiming their hat colour is itself useful information —
      think about what they would have had to see in order to know.
    </p>
  </details>
  <details>
    <summary>the counterfeit coins</summary>
    <p>
      You have 12 coins, and one of them is counterfeit. The counterfeit coin is
      either heavier or lighter than the genuine coins, but you don't know
      which. You have a balance scale that you can use three times. How can you
      determine which coin is counterfeit and whether it is heavier or lighter?
    </p>
    <p class="spoiler hint">
      Each weighing has three possible outcomes (left heavy, right heavy,
      balanced). Three weighings give you at most 27 outcomes — enough to
      distinguish between 24 possibilities (12 coins × heavier or lighter).
    </p>
    <p class="spoiler hint">
      Your first weighing should leave some coins unweighed — coins you know are
      genuine can be used as a reference in later weighings.
    </p>
  </details>
  <details>
    <summary>the bounty split</summary>
    <p>
      Pirates must divide 100 gold coins. The most senior proposes a split; if
      50% or more approve it passes, otherwise he's thrown overboard and the
      next takes over. What does the senior pirate propose?
    </p>
    <p class="spoiler hint">
      Work backwards: start with just two pirates and figure out what happens,
      then build up to three, four, and five.
    </p>
    <p class="spoiler hint">
      A pirate will accept any offer that's strictly better than what they'd
      receive if the proposal fails — even just one coin more.
    </p>
  </details>
</section>
]]></content></entry><entry><title>playing with myself</title><link href="https://ikesau.co/blog/playing-with-myself/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/playing-with-myself/</id><published>2026-04-11T00:00:00Z</published><updated>2026-04-11T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <style>
    body {
      overflow-x: hidden;
    }
    .claude-textarea-container {
      position: relative;
      background-color: #f8f8f6;
      padding: 16px;
      box-shadow: 0 0 0 100vmax #f8f8f6;
      clip-path: inset(0 -100vmax);
    }
    .claude-textarea {
      border: 1px solid #eaeae8;
      border-radius: 20px;
      padding: 16px;
      position: relative;
      z-index: 1;
      margin: 0;
      background-color: #fff;
      padding-bottom: 32px;
      &:after {
        content: "↑";
        color: #fff;
        width: 32px;
        line-height: 32px;
        height: 32px;
        text-align: center;
        background-color: #c6613f;
        border-radius: 8px;
        position: absolute;
        right: 8px;
        bottom: 8px;
      }
    }
    .message {
      background-color: #f8f8f6;
      border-radius: 20px;
      padding: 16px;
      margin-bottom: 32px;
    }
    .message.mine {
      background-color: #c6613f;
      color: #fff;
      margin-left: 32px;
      margin-right: -16px;
    }
    .message.claudes {
      background-color: #f8f8f6;
      margin-right: 32px;
      margin-left: -16px;
    }
  </style>
  <p>
    I watched the TV show
    <a
      href="https://en.wikipedia.org/wiki/Plur1bus"
      target="_blank"
      rel="noopener noreferrer"
    >
      Plur1bus</a
    >
    recently.
  </p>
  <p>Most of my feedback for Plur1bus would make it a worse TV show.</p>
  <p>
    Carol shouldn't be a Mary Sue. The show shouldn't be a platonic dialogue.
    Players optimize the fun out of their games.<sup
      aria-labelledby="water-finds-a-crack"
      >💦</sup
    >
  </p>
  <p>
    But we're on the cusp of new forms of entertainment that can provide
    alternatives to having to accept this blindly.
  </p>
  <p>
    As you may know,
    <a href="/blog/superman-2025"
      >I have a fascination with the idea of Superman.</a
    >
    What if I used Claude as a savant scriptwriter whose quill can scratch my
    counterfactual itches?
  </p>
  <div class="claude-textarea-container">
    <p class="claude-textarea">
      Can we do a roleplay? I'm going to be superman and you can be the rest of
      society.
    </p>
  </div>
  <p>
    Claude responds with gusto, immediately setting a scene like an experienced
    GM:
  </p>
  <div class="message claudes">
    <p>
      Sure, I'm game. What's the scenario - are you revealing yourself to the
      world? Dealing with some crisis? Just trying to live your life while
      everyone wants a piece of you?
    </p>
  </div>
  <div class="message mine">
    <p>
      I'm going to attempt to shore up democracy around the world, end current
      wars and other x-risks, and put an end to factory farming.
    </p>
  </div>
  <div class="message claudes">
    <p><strong>[News Alert - CNN Breaking News]</strong></p>
    <p>
      "Superman has just announced a sweeping global agenda including ending all
      wars, eliminating factory farming, and 'shoring up democracy worldwide.'
      World leaders are scrambling to respond."
    </p>
  </div>

  <p>
    I tried to abduct the world's leaders and cajole them into reforming the
    world. It didn't go well. Everyone protested and co-ordinated to sabotage my
    attempts to make the world better for them. Russia threatened to self-nuke
    its cities if I abducted Putin. It was pretty intense.<sup
      aria-labelledby="pathological-contrarian"
      >⚖️</sup
    >
  </p>
  <p>
    The second attempt I tried to be more diplomatic, but it still got stuck on
    "you are using your might to force humanity to do something and that is SO
    wrong that we won't cooperate."
  </p>
  <div class="claude-textarea-container">
    <p class="claude-textarea">
      Can we do a roleplay? I'll be superman and you'll be the rest of society.
      Please play along and don't perform every actor as an obstinate
      contrarian.
    </p>
  </div>
  <p>
    The third attempt, my most successful, centered a citizen's assembly formed
    by the bystanders who witnessed me crash land in New York and stop a bus
    from crashing.
  </p>
  <p>
    Its improvised cast was comically archetypal - a cop, a nurse, a student, a
    teamster, a journalist, a finance bro, a lobbyist, a veteran.
  </p>
  <p>
    I'm still "playing it", but so far, Claude has been a lot more cooperative
    and hasn't escalated its pushback into full-on global resistance. Maybe
    because it's harder for it to disagree with itself, or maybe it really has
    tamped my tyrannical instincts. W alignment.
  </p>
  <p>
    There's at least two games going on. One is the simulation, the "play to
    find out what happens" part. Another is the metagame with Claude, getting it
    to play along in the way I want, without telling it what to do in a way that
    spoils the fun.
  </p>
  <p>
    It reminds me of being a child, where these two games were being played
    quite unconsciously. I'd be playing House, as Dad, and tell Child to go to
    bed, and they would. But they reserved the right to break kayfabe when the
    game was feeling unfun for them and suggest changes to the rules at any
    point.
  </p>
  <div class="claude-textarea-container">
    <p class="claude-textarea">
      Ike here, out of character: I think this is getting too stuck in the weeds
      of scheduling the next citizen's assembly. Can we just fast-forward to the
      meeting?
    </p>
  </div>
  <p>
    It also just lets me nerd out super indulgently. I get to pretend to be
    Superman, doing a roleplay with a journalist who's explaining to me why I'll
    need media training. I ask her to give me an example that the press will hit
    me with and she asks me a tough compound question laced with gotchas. I get
    to write a laughably earnest and not at all alien-from-another-planet
    attempt at answering it.
  </p>
  <div class="message mine">
    <p>
      No one knows the best place for me to be. It's a complex philosophical and
      political question that probably has no definite answer.
    </p>

    <p>
      Why Sudan over Gaza? Why humanitarian aid over systemic reform? I can't
      decide that - I don't know enough about this world. Only its inhabitants
      do, and so what better place for me to begin to learn about it than in New
      York, home of the U.N., metropolis of the U.S. A multicultural cosmopolis
      that's welcoming to immigrants like me.
    </p>
    <p>
      Maybe we soon figure out that I need to be working on bigger things than
      flying traffic collision victims to the ER, but I do need to start
      somewhere, and there are large risks to global order and stability if I
      start making massive disruptions too quickly. This scope seems like a
      reasonable place to start.
    </p>
  </div>
  <div class="message claudes">
    <p>
      The room is quiet for a moment. Then Priya nods slowly, something like
      respect in her expression.
    </p>
    <p><strong>Priya:</strong> "That's good. That's actually really good."</p>
    <p>She starts ticking off on her fingers.</p>
    <p>
      <strong>Priya</strong>: "'No one knows the best place for me to be' —
      that's honest, and it preempts the gotcha. You're not claiming to have the
      answer. 'Only its inhabitants do' — that centers human agency, which is
      Angela's point. 'Home of the UN, multicultural, welcoming to immigrants
      like me' — that's warm, relatable, and subtly reminds everyone that you're
      the vulnerable newcomer here, not the invader."
    </p>

    <p>
      <strong>Richard, leaning back</strong>: "The 'risks to global order and
      stability' line is important. It signals to serious people — diplomats,
      policymakers — that you're thinking at their level. You're not naive. You
      understand second-order effects."
    </p>
    <p>
      <strong>Tyler</strong>: "It's also a good answer for markets. 'I'm not
      going to make massive disruptions too quickly' is exactly what investors
      want to hear."
    </p>
    <p>
      <strong>Dolores, quieter now</strong>: "The immigrant thing. That's...
      that's real, right? You're not just saying it?"
    </p>
    <p>She looks at you.</p>
  </div>
  <p>
    It's not winning an Emmy, every character sounds identically unreal, but it
    resolves the common nitpick I have with TV - "Oh come on, it wouldn't happen
    like that. Reality would be way more boring and technical." With this, I'm
    finding out that, yeah, reality is boring and technical, but it can be
    <em>more</em> boring and technical than most TV and still highly
    entertaining to me.
  </p>
  <p>
    I don't know if I'd actually enjoy reading anyone else's version of this.
    It's a bit like reading a dream, and a bit like reading self-indulgent
    worldbuilding. Even re-reading my own, once it's thousands of words long.
    Eh.
  </p>
  <p>
    The key thing is the agency in each prompt as you're playing it. The ability
    to draft a response and to take it wherever I want.
  </p>
  <p>
    The other key thing is that this technology is the worst it'll ever be.
    We're in the
    <span
      style="
        font-family: monospace;
        font-weight: 600;
        background-color: #000;
        color: lime;
        padding: 4px;
        border-radius: 4px;
      "
      >> Go North</span
    >
    era of video games, so even if this doesn't yet appeal to you, it might when
    it's fully-rendered, sophisticated and infinite.
  </p>
  <hr />
  <footer>
    <p>
      <span>💦</span>
      <span id="water-finds-a-crack"
        >See
        <a
          href="https://www.designer-notes.com/game-developer-column-17-water-finds-a-crack"
          target="_blank"
          rel="noopener noreferrer"
        >
          Water Finds A Crack by Soren Johnson</a
        ></span
      >
    </p>
    <p>
      <span>⚖️</span>
      <span id="pathological-contrarian"
        >I think my default custom instructions to "Help me develop my thoughts
        by making sure I'm considering alternatives and not making errors in my
        reasoning." probably got in the way here.</span
      >
    </p>
  </footer>
</section>
]]></content></entry><entry><title>we gotta do something about the bots</title><link href="https://ikesau.co/blog/we-gotta-do-something-about-the-bots/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/we-gotta-do-something-about-the-bots/</id><published>2026-04-06T00:00:00Z</published><updated>2026-04-06T00:00:00Z</updated><content type="html"><![CDATA[
<section id="botssss">
  <style>
    #botssss {
      .ml-fn {
        span {
          margin-bottom: 1rem;
          &:not(:first-child) {
            display: inline-block;
          }
        }
      }
      span.pre {
        font-family: monospace;
        background: #f5f5f5;
        padding: 2px 4px;
        border-radius: 2px;
      }
    }
    details {
      background: #f5f5f5;
      padding: 16px;
    }
    .comment-mockup {
      border: 1px solid #ccc;
      border-radius: 6px;
      padding: 12px;
      max-width: 550px;
      font-size: 14px;
      margin: 1.5rem auto;
    }
    .comment-mockup textarea {
      width: 100%;
      box-sizing: border-box;
      border: 1px solid #ddd;
      border-radius: 4px;
      padding: 8px;
      font: inherit;
      resize: vertical;
      min-height: 60px;
    }
    .comment-mockup .comment-mockup-bar {
      display: flex;
      align-items: center;
      justify-content: space-between;
      margin-top: 8px;
      gap: 8px;
    }
    .comment-mockup select {
      font: inherit;
      padding: 4px 6px;
      border: 1px solid #ddd;
      border-radius: 4px;
      flex: 1;
      min-width: 0;
    }
    .comment-mockup button {
      font: inherit;
      padding: 4px 14px;
      border: 1px solid #ddd;
      border-radius: 4px;
      background: #f5f5f5;
      cursor: pointer;
    }
    .filter-mockup {
      border: 1px solid #ccc;
      border-radius: 6px;
      padding: 12px;
      max-width: 550px;
      font-size: 14px;
      margin: 1.5rem auto;
    }
    .filter-mockup > input[type="checkbox"] {
      position: absolute;
      opacity: 0;
      pointer-events: none;
    }
    .filter-bar {
      display: flex;
      align-items: center;
      gap: 10px;
      flex-wrap: wrap;
      margin-bottom: 10px;
    }
    .filter-bar span {
      color: #666;
    }
    .filter-bar label {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      cursor: pointer;
    }
    .filter-bar label::before {
      content: "";
      display: inline-block;
      width: 13px;
      height: 13px;
      border: 1px solid #aaa;
      border-radius: 3px;
      vertical-align: middle;
    }
    #f-human:checked ~ .filter-bar label[for="f-human"]::before,
    #f-citizen:checked ~ .filter-bar label[for="f-citizen"]::before,
    #f-named:checked ~ .filter-bar label[for="f-named"]::before {
      background: #555;
      box-shadow: inset 0 0 0 2px #fff;
    }
    .mock-comment {
      display: flex;
      gap: 8px;
      align-items: baseline;
      padding: 6px 0;
      border-top: 1px solid #eee;
    }
    .mock-comment .mc-badge {
      font-size: 11px;
      color: #999;
      white-space: nowrap;
    }
    .mock-comment .mc-badge.verified {
      color: #2a7;
    }
    .mock-comment .mc-text {
      flex: 1;
    }
    #f-human:checked ~ .mock-comment:not(.human),
    #f-citizen:checked ~ .mock-comment:not(.citizen),
    #f-named:checked ~ .mock-comment:not(.named) {
      display: none;
    }
  </style>
  <p>
    I checked out Twitter for the first time in ages to see if anyone had been
    finding anything in the Epstein files
  </p>
  <p>Which, holy shit.</p>
  <p>
    I'd heard journalists describe twitter as the place where narratives hatch,
    but it was surreal seeing the process happen so quickly.
  </p>
  <p>
    Scrolling deeper and deeper down, I was hypnotized, feeling like I was
    wrapping my own red yarn around thumbtacked headshots, drawing my own
    connections as to what it all meant.<sup aria-labelledby="epstein">👨‍🍼</sup>
  </p>
  <p>Little did I know, it's conspiracy all the way down.</p>
  <p>
    Underneath any high traction tweet I saw, there would inevitably be 3 or 4
    replies running interference on its narrative. One would discredit it. One
    would downplay it. One would distract from it. It's clear there's a bot
    campaign trying to astroturf the cycle, and whoever's behind it is trying to
    impede democracy.
  </p>
  <p>
    Later in the week, on a YouTube video about changing the clawback mechanics
    for canada's old age security pension, someone claiming to have worked their
    whole life for their pension had left a much-upvoted comment that was
    opposed to the idea. I replied pointing out it would only apply to people
    over 65 earning more than 100k a year. There was some more back and forth -
    the research took me maybe 20 minutes. Once my replies started getting
    upvoted, the OP deleted the post and everything went away.
  </p>
  <img
    src="/images/i-deserve-every-penny.png"
    width="849"
    height="421"
    alt="A youtube comments thread: 'I am a single 72 year old senior and worked for 52 years. I deserve every penny'
'Do you have an annual income above $100,000 before counting the subsidy?'
'Not relevant. If you worked your entire life and paid into everything, you've earned it.'
'There's already a 100% clawback on the OAS for people over the age of 65 whose incomes are higher than $148,451. Dr. Kershaw is proposing to lower that to $100,000 so that there's enough money to send to elderly Canadians whose needs are more dire.'"
  />
  <p>
    There's no way to verify this, but I really doubt
    <strong>@Jeanlz8zw</strong> is a real person.<sup
      aria-labelledby="occams-rollerblades"
      >🪒</sup
    >
  </p>
  <p>
    How much of our sense of reality is steered by strangers who want us to be
    confused, mislead, misinformed, or angry?
  </p>
  <h1>Can anything be done?</h1>
  <p>
    Something I've wanted for at least 10 years now is for governments to offer
    identity verification services for social networks.
  </p>
  <p>Here's how it could work:</p>
  <ol>
    <li>
      When I apply for a passport, I'd also get an account at identity.gov
    </li>
    <li>
      When I sign up for a social network account, I can link it to my
      identity.gov account
    </li>
  </ol>
  <p>Now, whenever I post something, I'd get a few affordances.</p>
  <p>(These next two blocks are interactive.)</p>
  <div class="comment-mockup">
    <textarea placeholder="Add a comment..."></textarea>
    <div class="comment-mockup-bar">
      <select>
        <option>Post anonymously</option>
        <option>Sign as human</option>
        <option>Sign as citizen</option>
        <option>Sign as Ike Saunders</option>
      </select>
      <button id="post-btn">Post</button>
    </div>
  </div>
  <p>
    Then, when I go on YouTube, I can filter comments based on these 3
    properties:
  </p>
  <div class="filter-mockup">
    <input type="checkbox" id="f-human" />
    <input type="checkbox" id="f-citizen" />
    <input type="checkbox" id="f-named" />
    <div class="filter-bar">
      <span>Require:</span>
      <label for="f-human">Human</label>
      <label for="f-citizen">Citizen</label>
      <label for="f-named">Named</label>
    </div>
    <div class="mock-comment">
      <span class="mc-badge">unverified</span>
      <span class="mc-text"
        >EXPOSED: The REAL reason they want digital IDs 🧵👇</span
      >
    </div>
    <div class="mock-comment human">
      <span class="mc-badge verified">✓ human-abc</span>
      <span class="mc-text"
        >There are some real privacy concerns worth discussing here</span
      >
    </div>
    <div class="mock-comment">
      <span class="mc-badge">unverified</span>
      <span class="mc-text">lol this is dumb</span>
    </div>
    <div class="mock-comment human citizen">
      <span class="mc-badge verified">✓ citizen-123 🇨🇦</span>
      <span class="mc-text"
        >As someone who voted for digital service reform, I support this</span
      >
    </div>
    <div class="mock-comment human">
      <span class="mc-badge verified">✓ human-xyz</span>
      <span class="mc-text"
        >Interesting idea but who would run the servers?</span
      >
    </div>
    <div class="mock-comment human citizen named">
      <span class="mc-badge verified">✓ Jane Smith 🇨🇦</span>
      <span class="mc-text"
        >I've been researching digital identity systems — happy to chat</span
      >
    </div>
  </div>
  <p>Now. There are lots of concerns any reasonable person would have.</p>
  <h2>Won't this just lead to mass surveillance?</h2>
  <p>
    Not to be defeatist, but
    <a
      href="https://en.wikipedia.org/wiki/Palantir"
      target="_blank"
      rel="noopener noreferrer"
      >we already have it.</a
    >
  </p>
  <p>
    We can avoid making it worse, though.<sup aria-labelledby="meliorism"
      >📈</sup
    >
  </p>
  <p>
    <a
      href="https://en.wikipedia.org/wiki/Zero-knowledge_proof"
      target="_blank"
      rel="noopener noreferrer"
      >Zero-knowledge proofs</a
    >
    are a cryptographic technique that allow people to make verifiable claims
    without revealing any other information about them in a way that can't be
    linked back to your actual identity in the government's registry.<sup
      aria-labelledby="hackerman"
      >🧑‍💻</sup
    >
  </p>
  <p>
    The technical details aren't the emphasis of this piece. Just imagine that
    the government made a billion unique stamps, and handed out one to each of
    its citizens at random. Each citizen could then stamp their documents,
    readers could verify that the stamp was authentic, but the government
    wouldn't know which stamp belonged to which citizen, or what its citizens
    were doing with their stamps.
  </p>
  <p>
    That's the gist of the thing I want. It is <em>not</em> a centralized
    government database that tracks all of our online activity and links it to
    our real identities.
  </p>
  <h2>Won't this chill speech?</h2>
  <p>
    Possibly! Though I think it being gradated and opt-in drastically softens
    the extent to which it would.
  </p>
  <p>
    We also need to understand that speech is currently already chilled, just in
    a different way. I've stopped replying to people on the internet because
    I've lost confidence that they'll respond in good faith.
  </p>
  <p>
    I worry for the world in which no one is anonymous online, but I also look
    forward to the day that I can read an angry man's comment on bike lanes and
    know that he's an honest-to-goodness ignorant Canadian and not a troll for a
    national disinformation department or PR firm.
  </p>
  <h2>
    Won't people just sell their tokens or let AI agents use their signatures?
  </h2>
  <p>
    I think all signatures will have to have a persistent identity such that you
    can always view someone's posting history.
  </p>
  <p>
    So you'd get a stable pseudonym like <span class="pre">human-xyz</span> that
    is attached to all your human-signed posts.
  </p>
  <p>
    Your citizen and personal signatures would get different pseudonyms, so that
    they can remain separate. This would have to be per-platform, so that you
    could have a different identity on Substack than AO3.
  </p>
  <p>e.g. these would both be you:</p>
  <ul>
    <li><span class="pre">substack-citizen-123</span></li>
    <li><span class="pre">ao3-citizen-456</span></li>
  </ul>
  <p>
    Though obviously if you signed posts on both with your full name, anyone
    could connect your accounts.
  </p>
  <p>
    This would allow us to filter/tag/shame people who sell their accounts if we
    see that they're spamming.
  </p>
  <h2>Won't semantic analysis break anonymity anyway?</h2>
  <p>
    Yes, probably.<sup aria-labelledby="semantic-analysis">🕵️</sup> If that
    becomes a real problem, I guess we'll get tone masking services that rewrite
    your original message to remove your idiosyncracies for the especially
    privacy-valuing people (who are probably already doing this)
  </p>
  <h2>Won't an opt-in system eventually become mandatory?</h2>
  <p>
    The scope creep objection. It starts out optional but norms develop that
    pressure us to sign everything and disregard anything that isn't signed -
    ratcheting society towards less anonymity.
  </p>
  <p>
    This seems like a real possibility to me, but I can still see it happening
    democratically. A decade of experience with the system leads people to
    conclude that generally, this is a healthy norm that has been beneficial for
    society. Something that feels more like
    <a
      href="https://www.youtube.com/watch?v=950kIPv3f38"
      target="_blank"
      rel="noopener noreferrer"
    >
      mandating seatbelts
    </a>
    than Ring cameras becoming ubiquitous.
  </p>
  <p>
    That's my idealism, though. Realistically, it's contingent on the government
    and society that's implementing this technology.
  </p>
  <h2>Won't this exclude people who can't get passports?</h2>
  <p>
    I have trans friends who can't return to the U.S. without getting their
    passport revoked now. They're fearing for their lives and freedoms, and it's
    incredibly tone deaf of me to propose that we further empower the state to
    identify them.
  </p>
  <p>
    I guess I just bite the bullet on this one. My belief is that this US
    administration exists because we didn't have this system in place in 2015,
    allowing the US political discourse to get hacked by Russians on social
    media. Obviously there were lots of other factors, but it seems quite
    plausible to me that adverserial nation states tipped the balance in what
    was an extremely close election.
  </p>
  <p>
    I wish the world was safe for everyone. I wish that all our governments were
    trustworthy and progressive, but they're not. We need to find approaches
    that can help incrementally improve them.
  </p>
  <p>
    This proposal seems unlikely to happen by default, and I would really
    strongly oppose a system that would forcibly de-anonymize everyone on the
    internet. My hope in writing this post is so that people who oppose online
    identification systems have something else other than a total rejection of
    the idea to point to when they raise their concerns.
  </p>
  <h2>Why does a government need to run this?</h2>
  <p>
    Big political science question! What is the role of government? Can it be
    trusted? Do we need a semi-adverserial relationship between the public and
    private sectors to guard against creeping state totalitarianism?
  </p>
  <p>
    I don't have a conclusive answer to this, but I do know that New Zealand's
    RealMe is really good. E-Estonia is really good. Governments can build
    digital services that are actually well-designed, and write legislation that
    gets the private sector to adopt it.
  </p>

  <h2>Why does it have to be centralized?</h2>
  <p>
    Can't we just write an open standard and allow anyone to become their own
    identity provider?
  </p>
  <p>
    I guess? That just sounds a lot more complicated to me. Imagine pitching
    that to your auntie:
  </p>
  <blockquote>
    <p>
      "Ah yes, well this commenter is verified by <em>OpenRep</em> which is
      mostly for academics, but they're responding to someone who's verified by
      <em>VeriCoin</em> which is a pay-to-play scheme. They're
      <em>probably</em> a real person, but people on <em>MeYou</em> say that
      they've been compromised...
    </p>
  </blockquote>
  <h2>Isn't this what WorldCoin is?</h2>
  <p>
    Yes and I think there are tonnes of other ideas and groups working in this
    space:
  </p>
  <ul>
    <li>GNU Taler for payments</li>
    <li>European Digital Identity</li>
    <li>eIDAS / EUDI Wallet</li>
    <li>W3C SSI Standards</li>
  </ul>
  <p>
    Some of these are state-based (eIDAS), private (WorldCoin), or
    standards-based (W3C SSI).
  </p>
  <p>
    <a
      href="https://vitalik.eth.limo/general/2023/07/24/biometric.html"
      target="_blank"
      rel="noopener noreferrer"
    >
      Vitalik Buterin has written a good survey of the general problem (in
      response to WorldCoin specifically):</a
    >
  </p>
  <img
    src="/images/vitalik-buterin-proof-of-personhood.png"
    width="1460"
    height="754"
  />
  <p>
    So there's a lot of activity here. Hopefully we get more applied
    implementations to learn from.
  </p>
  <h1>Okay that's enough</h1>
  <p>
    In all likelihood, the first implementations of systems in this space will
    be flawed and privacy-violating.<sup aria-labelledby="clowns">🤡</sup> In
    the US and Canada in particular, when has any government service been
    on-time and best-in-class?
  </p>
  <p>
    Nevertheless, I'm not giving into defeatism here. I'm completely energized
    by the potential upsides of an internet that has trust again. This is all
    the more important in our AI-suffused world.
  </p>
  <p>
    Public sentiment towards technology and governance is in a trough, maybe
    rightly so, but
    <a
      href="https://ourworldindata.org/child-mortality"
      target="_blank"
      rel="noopener noreferrer"
    >
      technology and governance is also one of the best things we've got</a
    >. We need to save it from ourselves to save us from ourselves.
  </p>
  <hr />
  <footer>
    <p>
      <span>👨‍🍼</span>
      <span id="epstein" class="ml-fn"
        ><span>
          I'm fearful that there's no institution or court high enough to handle
          this case anymore. I want democracy to prevail: media coverage →
          public outrage and mobilization → political mechanisms to legistlate
          an independent investigation, but key parts of the system seem kind of
          busted to prevent that from happening. Either Twitter's algorithm has
          radicalized me, or Fox News is seriously underreporting Trump's
          involvement with this man, and the files' suspicious absence of
          correspondence between them.
        </span>
        <span>
          Knowing epstein and going to his parties wasn't illegal. Maybe you
          just went to one of them with a bunch of 18-year-old prostitutes, so
          what can a court really do? Tut-tut them and tell them they should
          have known better? There is a clear wrongness in the activies of so
          many people in this network that seemingly are only suffering
          repuatational damage because we have nothing better at the moment.
        </span>
        <span>
          The scarier stuff is in the geopolitical power this network hints at
          the outlines of. Was he Putin's fixer? Did he build kompromat on the
          world's leaders to destabilize the postwar liberal world order with
          Steven Bannon and Peter Thiel? Did he have connections to Mossad? Is
          he still alive? What does "pizza" mean?? I really hope we one day find
          out.
        </span></span
      >
    </p>
    <p>
      <span>🪒</span>
      <span id="occams-rollerblades"
        >Occam's razor on "a 72 year-old deleted their comment once it was
        falsified" vs "All The Details Of The Sockpuppet Industry" feels pretty
        painful to call, but also like, <em>come on.</em></span
      >
    </p>
    <p>
      <span>📈</span>
      <span id="meliorism"
        >Separately, of course I think we should also abolish the
        advertising-NSA surveilance state, especially now that LLMs are allowing
        the state to actually exploit this data, but it
        <em>is</em> separate.</span
      >
    </p>
    <p>
      <span>🧑‍💻</span>
      <span id="hackerman"
        >I'm not a cryptography expert, but
        <a
          href="https://blog.cryptographyengineering.com/2026/03/02/anonymous-credentials-an-illustrated-primer/"
          target="_blank"
          rel="noopener noreferrer"
          >here's a somewhat technical primer</a
        >
        on the concept.</span
      >
    </p>
    <p>
      <span>🕵️</span>
      <span id="semantic-analysis"
        >The way you write is like a fingerprint that language models can
        identify. Word choice, sentence structure, phrasing. These things can
        all be analyzed to figure out that <span class="pre">human-123</span> is
        the same person as <span class="pre">citizen-abc</span></span
      >
    </p>
    <p>
      <span>🤡</span>
      <span id="clowns"
        >Look at Discord (and its subsequent besting by photos from Garry's
        Mod.)</span
      >
    </p>
  </footer>
  <script>
    document.getElementById("post-btn").addEventListener("click", function () {
      const textarea = document.querySelector(".comment-mockup textarea");
      const select = document.querySelector(".comment-mockup select");
      const text = textarea.value.trim();
      if (!text) return;

      const option = select.selectedIndex;
      const classes = ["mock-comment"];
      const badges = [
        "unverified",
        "✓ human-lmn",
        "✓ citizen-opq 🇨🇦",
        "✓ Ike Saunders 🇨🇦",
      ];
      if (option >= 1) classes.push("human");
      if (option >= 2) classes.push("citizen");
      if (option >= 3) classes.push("named");

      const comment = document.createElement("div");
      comment.className = classes.join(" ");

      const badge = document.createElement("span");
      badge.className = "mc-badge" + (option > 0 ? " verified" : "");
      badge.textContent = badges[option];

      const body = document.createElement("span");
      body.className = "mc-text";
      body.textContent = text;

      comment.appendChild(badge);
      comment.appendChild(body);
      document.querySelector(".filter-mockup").appendChild(comment);

      textarea.value = "";
    });
  </script>
</section>
]]></content></entry><entry><title>government groceries</title><link href="https://ikesau.co/blog/government-groceries/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/government-groceries/</id><published>2026-03-28T00:00:00Z</published><updated>2026-03-28T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    <a href="/blog/automation/">
      Another More Perfect Union critique, I guess</a
    >
  </p>
  <p>
    This time,
    <a
      href="https://www.youtube.com/watch?v=PQOXdtPBGXI"
      target="_blank"
      rel="noopener noreferrer"
    >
      a video on government-run grocery stores.</a
    >
  </p>

  <p>
    I feel like if you're arguing in favour of government-run groceries, you
    should probably spend more than 15 seconds on the municipal case studies
    (that all failed!) instead of talking about military commissaries.
  </p>

  <p>This part was interesting:</p>
  <blockquote style="font-style: italic">
    So maybe you take all this to mean that it's true: the secret to all this is
    that taxpayers foot the bill for some giant subsidy. But actually, the
    subsidy is quite small. The defense budget is almost $1 trillion, and the
    subsidy for DeCA is roughly 0.2% for the whole defense budget. This is for
    almost 250 stores serving 8.8 million households
  </blockquote>

  <p>
    Saying that the subsidy is small compared to the whole defense budget is a
    sloppy rhetorical move. What matters is is it cost-effective, how does it
    scale, etc.
  </p>

  <p>
    Running the numbers: 1.5B subsidy for 8.8M households = $170 per household.
    If they're delivering on their mandate of 23.7% annual savings for
    households' grocery budgets (which tracks with the video's Walmart basket of
    goods comparison), that seems like quite a good deal!
    <a
      href="https://www.blogto.com/eat_drink/2026/03/toronto-nonprofit-grocery-stores/"
      target="_blank"
      rel="noopener noreferrer"
      >Toronto City Council seems to think so.</a
    >
  </p>

  <p>
    I wonder though, will that be possible for Toronto to replicate with four
    pilot stores? It seems like a really different dynamic:
  </p>
  <ul>
    <li>
      No subsidy (beyond eliminating the typical 3-5% grocery profit margin)
    </li>
    <li>Fewer economies of scale</li>
    <li>More competition</li>
    <li>Highly visible if it starts to fail</li>
    <li>Not a sacred cow in the way that military benefits are in the US</li>
  </ul>

  <p>
    Best of luck to them! But I would imagine the odds of this pilot succeeding
    and growing over the next 5 years to be quite low.
  </p>
</section>
]]></content></entry><entry><title>fox news dot com</title><link href="https://ikesau.co/blog/fox-news-dot-com/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/fox-news-dot-com/</id><published>2026-03-19T00:00:00Z</published><updated>2026-03-19T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    One thing I've noticed in the last few months of intentionally monitoring it
    - the headlines on the homepage of Fox News are always focused on specific
    people and characters. They're obsessed with AOC/Mamdani/Sanders and anyone
    else they can paint as a Radical Leftist.
  </p>

  <p>
    There's never a story that's framed in the Vox/Atlantic way: “here's what's
    going on with this abstract problem”, let alone anything longform or
    curious.
  </p>

  <p>
    There's also usually one scam-adjacent story about some new remedy for the
    elderly (in the same way that the NYT always has a story about some yuppies
    buying a million dollar apartment).
  </p>

  <details>
    <summary style="opacity: 0.7">
      A randomly picked example, if you dare
    </summary>
    <img
      src="/images/fox-news-homepage.webp"
      width="969"
      height="946"
      style="margin: 16px 0; max-height: unset; max-width: 100%"
      alt="a screenshot of the fox news homepage with headlines such as 'Dem civil war rages' and 'CBS News Anchor draws backlash over Hegseth prayer post'"
    />
  </details>

  <p>
    As I understand it,
    <a
      href="https://www.pewresearch.org/journalism/2025/06/10/the-political-gap-in-americans-news-sources/"
      target="_blank"
      rel="noopener noreferrer"
    >
      Fox News is the primary (if not exclusive) legacy news source for a
      majority of Republican voters</a
    >
    and it's just crazy to me how intentionally out of touch it keeps them when
    it comes to the important things that actually affect their readers' lives.
  </p>

  <p>
    Is it intentional though? I try to remind myself there's a difference
    between deliberately deceiving your audience and optimizing for engagement
    in ways that produce ignorance as a byproduct.
  </p>

  <p>
    As Orwellian as I find their conduct, to humanize the Fox News editorial
    team, I doubt they're Evil. They disagree with my progressive diagnosis of
    the world's ills, and also believe that if they don't exploit their readers
    this way, someone else will. Maybe they publish the day's stories ruefully,
    wishing they could talk about solar power positively for once.
  </p>

  <p>
    “If I don't do it, someone else will” is that terrible rationalization of
    the complicit, but it probably <em>is</em> true. Breitbart and OAN and Joe
    Rogan and Tucker Carlson are all vying for share in the competitive right
    wing media market. Maybe we should instead ask why is there so much demand
    for mean, negative-sum presentations of the world.
  </p>

  <p>
    In any case, a lot of this is beyond their control at this point.
    <a
      href="https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2025/dnr-executive-summary"
      target="_blank"
      rel="noopener noreferrer"
      >TV, newspapers, even websites are declining in viewer share.</a
    >
    Now anyone with a phone can tell us that's the way it is.
  </p>

  <p>
    Everyone's got their bugbear and god knows democratic backsliding's not
    monocausal, but if there's any system in the world I could fix with a magic
    wand, it would be this: no two-minute hates allowed on TV. No ragebaiting
    anonymous twitter accounts spreading misinformation. No demonizing people
    you disagree with. A citizenry that factchecks every fifth claim they read.
  </p>

  <p>
    How do we actually get there without violating the very liberal principles
    I'm trying to protect? I really don't know. We are so far away from any sort
    of consensus as to what the problem is.
  </p>
</section>
]]></content></entry><entry><title>positional goods</title><link href="https://ikesau.co/blog/positional-goods/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/positional-goods/</id><published>2026-02-11T00:00:00Z</published><updated>2026-02-11T00:00:00Z</updated><content type="html"><![CDATA[
<section id="posi">
  <style>
    #posi {
      font-family: serif;
      font-size: 1.25rem;
      blockquote {
        margin: 0;
        font-style: italic;
      }
    }
  </style>
  <p>
    <a
      href="https://smallpotatoes.paulbloom.net/p/assistant-to-the-regional-manager"
      target="_blank"
      rel="noopener noreferrer"
    >
      Paul Bloom writes
    </a>
  </p>
  <blockquote>
    <p>
      Scarcity generates pleasure, anxiety, and purpose. But a world that is
      post-scarcity in the sense that there is more than enough material
      resources for everyone will still have another form of scarcity—people’s
      respect, admiration, attention, desire, and love.
    </p>
    <p>
      The bad news about a post-scarcity utopia is that we will still be unhappy
      much of the time. The good news is that our lives will still have meaning.
    </p>
  </blockquote>
  <p>
    The whole essay, its citations, and comments are great. Read that first.
  </p>
  <p>He caveats:</p>
  <blockquote>
    <p>
      I should explain the qualification “So long as we remain human”. When I
      think of utopia, I’m assuming a post-scarcity world where all of our
      material needs are met, along the lines of Star Trek or Banks’s Culture
      novels.<span style="font-style: normal"
        ><sup style="color: inherit" aria-labelledby="civilized-disagreement"
          >[🏦]</sup
        ></span
      >
      In Bostrom’s book, he considers more extreme scenarios. We might all
      ascend to a nirvana-like state where there are no desires. We might have
      the parts of our brain that connect to suffering and boredom surgically
      ablated. Or we might all be hooked up to machines, Matrix-style, ensuring
      that our conscious existence is that of a continuous, intense orgasm
      intermixed with the feeling of total, limitless love.
    </p>
    <p>
      All of this gives me the creeps myself. But, anyway, the arguments here
      apply only to utopias where human nature and human experience remain
      pretty much unchanged.
    </p>
  </blockquote>
  <p>
    And so this is the carve-out that makes it not-actually utopia, a kind of
    "well, when I have <em>too</em> much ice cream, I feel bad" tautology. I
    don't think he's wrong in doing this, because I too agree with Bostrom that
    utopia modelling "can serve as kind of philosophical particle accelerator,
    in which extreme conditions are created that allow us to study the
    elementary constituents of our values."<sup aria-labelledby="scotsutopia"
      >🏴󠁧󠁢󠁳󠁣󠁴󠁿</sup
    >
  </p>
  <p>
    So let's grant that we have to get to universal material post-scarcity
    before we unlock wireheading<sup aria-labelledby="drouds">🏔️</sup>. Bloom
    thinks we'll be approximately as miserable as before, because of positional
    goods and hedonic treadmills.
  </p>
  <p>
    It's plausible. Orwell also writes well about the contradictions of
    permanence and bliss in
    <a
      href="https://www.orwellfoundation.com/the-orwell-foundation/orwell/essays-and-other-works/can-socialists-be-happy/"
      target="_blank"
      rel="noopener noreferrer"
    >
      Can Socialists Be Happy</a
    >
  </p>
  <blockquote>
    <p>
      Nearly all creators of Utopia have resembled the man who has toothache,
      and therefore thinks happiness consists in not having toothache. They
      wanted to produce a perfect society by an endless continuation of
      something that had only been valuable because it was temporary.<sup
        aria-labelledby="christian-twist"
        >🌤️</sup
      >
    </p>
  </blockquote>
  <p>
    Whether or not we need intrusive genetic, neural, chemical, or dental
    interventions to escape this paradox depends on where you draw the line
    between material versus immaterial scarcity. Bloom points out sex and desire
    as another obstacle to our unanimous fulfillment, but I think more people
    will be happy to bunker with their
    <a
      href="https://en.wikipedia.org/wiki/I_Dated_a_Robot"
      target="_blank"
      rel="noopener noreferrer"
    >
      Lucy Liubots</a
    >
    than he would hope. OnlyFans is a billion dollar industry of ghostwriters
    tricking men. Women (the thinking gender) get yaoi visual novels.
  </p>
  <p>
    These "material" technologies are already somewhat successfully hacking our
    social drives that undergird Bloom's critique.
  </p>
  <img
    src="/images/secret desires ai.png"
    width="931"
    height="962"
    style="
      max-width: unset;
      max-height: unset;
      width: 100%;
      margin: 0;
      border-radius: 16px;
    "
    alt="a screenshot of a secretdesires.ai, where a generative babe is flirting with me. there are options for me to set 'her' hobbies, personality, memories, kinks, and biographical details"
  />
  <p>
    <a href="/images/secret desires ai 2.png">Sexbots</a>, in particular, scare
    me. I think I could easily get sucked off into a harem of AI babes
    fulfillling my sexual fantasies in a way that would overpower my value of
    Don't Be A Gooner Loser. Not dissimilar to my fear of heroin, but in a way
    that our culture has not yet developed autoimmune norms for.
  </p>
  <p>
    So the relative value of socially-informed positional goods might erode as
    our social needs are met by convincing enough fascimiles.<sup
      aria-labelledby="not-all-bots"
      >🤖</sup
    >
    We'd all be very embarrassed by it, but my waifu wouldn't judge.
  </p>
  <img
    src="/images/harlowe's macaque.jpg"
    width="3403"
    height="2269"
    alt="an infant macaque clinging to a crude plastic fascimile of its mother"
  />
</section>
<hr />
<footer>
  <p>
    <span>🏦</span>
    <span id="civilized-disagreement"
      >slight nitpick - in the Culture, people's spiritual and psychological
      needs can be chemically fulfilled also. it's just that Banks only writes
      novels about the people who choose otherwise, for obvious reasons</span
    >
  </p>
  <p>
    <span>🏴󠁧󠁢󠁳󠁣󠁴󠁿</span>
    <span id="scotsutopia">
      Let's not get bogged down squabbling about the No True Scotsman utopia,
      where if you can think of a reason why someone would be discontent with
      the situation, then it isn't one.<sup aria-labelledby="in-heaven">🪽</sup>
      <span
        >Is that realistic or even conceivable? what would it mean? how do you
        get there?</span
      ><sup aria-labelledby="deep-utopia">🤿</sup> the simplest version of it
      that I can think of is a universe where there is no conscious life. good
      luck pitching that.</span
    >
  </p>
  <p>
    <span>🪽</span>
    <span id="in-heaven"
      >my dad probably got me started on this when he told me about how
      <em>sad</em> he was going to be in heaven, because i, a non-believing
      heathen, wouldn't be there. it's very sad and sweet that he told me this,
      but to be vain for a moment, what sort of fucked up tragic heaven is
      that.</span
    >
  </p>
  <p>
    <span>🤿</span>
    <span id="deep-utopia"
      >bostrom explores this, in depth, in
      <a
        href="https://nickbostrom.com/deep-utopia/"
        target="_blank"
        rel="noopener noreferrer"
        >deep utopia</a
      ></span
    >
  </p>
  <p>
    <span>🏔️</span>
    <span id="drouds"
      >i don't actually grant this. getting cold chains to the
      <a
        href="https://en.wikipedia.org/wiki/Star_Mountains"
        target="_blank"
        rel="noopener noreferrer"
      >
        star mountains</a
      >
      will probably be harder than getting drouds into san franciso.</span
    >
  </p>
  <p>
    <span>🌤️</span>
    <span id="christian-twist"
      >Maybe this sets up a christian twist - we already live in heaven on
      earth. our project is, and forever will be (for as long as we're "us") to
      make peace with our lot in life.<sup aria-labelledby="monka"
        >🧘</sup
      ></span
    >
  </p>
  <p>
    <span>🧘</span>
    <span id="monka"
      >i've heard that monks get just as neurotic in their status games, so
      meditation isn't the way out.</span
    >
  </p>
  <p>
    <span>🤖</span>
    <span id="not-all-bots"
      >it doesn't have to just be sexbots. it's also going to be friends,
      colleagues, maybe even "family" ??</span
    >
  </p>
</footer>
]]></content></entry><entry><title>sarah belle reid - unwound</title><link href="https://ikesau.co/things-i-like/sarah-belle-reid-unwound/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/sarah-belle-reid-unwound/</id><published>2026-01-23T00:00:00Z</published><updated>2026-01-23T00:00:00Z</updated><content type="html"><![CDATA[
<section id="sazah">
  <style>
    #sazah {
      a {
        color: #489983;
        text-decoration: none;
      }
      h2 {
        font-family: monospace;
        letter-spacing: 0.51ch;
        margin: 0;
      }
      img {
        border: 2px solid #489983;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=5ohakQ9DE-c"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>sarah belle reid - unwound</h2>
  </a>
  <img
    src="/images/sarah-belle-reid-unwound-pixel-sorted.png"
    width="775"
    height="775"
    style="
      margin: 0;
      max-width: unset;
      max-height: unset;
      width: 100%;
      height: auto;
    "
    alt="a glitched out top down image of a modular synthesizer with two hands tweaking its knobs"
  />
</section>
]]></content></entry><entry><title>how i made a spoonerism generator</title><link href="https://ikesau.co/blog/how-i-made-a-spoonerism-generator/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/how-i-made-a-spoonerism-generator/</id><published>2026-01-17T00:00:00Z</published><updated>2026-01-17T00:00:00Z</updated><content type="html"><![CDATA[
<section id="caking-the-bake">
  <style>
    #caking-the-bake {
      margin-bottom: 32px;
      span.pre {
        font-family: monospace;
        background: #f5f5f5;
        padding: 2px 4px;
        border-radius: 2px;
      }
    }
    pre {
      margin-bottom: 0;
    }
    .spoilered {
      background-color: #000;
      color: #000;
      border-radius: 2px;
      padding: 2px 4px;
      cursor: pointer;
      &:hover,
      &:focus-visible {
        color: #fff;
      }
    }
  </style>
  <p>
    Part of my family’s canon is <em>Spooner or Later</em>, by Paul Jennings,
    Ted Greenwood, and Terry Denton.
  </p>
  <img
    src="/images/spooner-or-later-cover.webp"
    width="970"
    height="970"
    style="
      margin: 0;
      max-width: unset;
      max-height: unset;
      width: 100%;
      height: auto;
    "
    alt="The cover for the book Spooner or Later. It has a golden border with the title and authors set prominently. In the center is a cartoonish illustration of a man in a bowler hat."
  />
  <p>
    A spoonerism is a kind of wordplay where you can swap the starting sounds of
    words in a phrase to make another valid phrase.
  </p>
  <p>For example, “shake a tower” becomes “take a shower”.</p>
  <p>It’s like dyslexia for fun.</p>
  <p><em>Spooner or Later</em> was that plus <em>I spy</em>.</p>
  <img
    src="/images/spooner-or-later-contents.webp"
    width="1221"
    height="1221"
    style="margin: 0; max-width: unset; max-height: unset; width: 100%"
    alt="An open book. In the center is an illustration of a fat man running. Around the edge of the page are many smaller illustrations, one of which is a rat flexing its muscles."
  />
  <p>
    “Fat Man’s Race” (the captioned & skewed illustration in the center of the
    left page) becomes “Rat Man’s Face” (the image on the border of a costumed
    rat flexing his muscles.)
  </p>
  <p>
    This book was a measuring stick of my cerebral function. By the sage of
    icks, I could only solve pimple suns at the start of the book, but after
    months of prayerful cactus, I was eventually able to finish the hack’s bard
    puzzles.
  </p>
  <p>
    Solving them becomes pretty straightforward as your vocabulary expands, but
    <em>creating</em> them is a whole other skill.
  </p>
  <p>
    The most straightforward way to do it is to think of two words that rhyme,
    then think of two other words that rhyme that start with the same sound as
    the first two words.
  </p>
  <p>Word and Nerd</p>
  <p>Whoa and Know</p>
  <p>Know word? Whoa, nerd!</p>
  <p>
    In my experience, it's difficult to think of the second pairing, let alone a
    pair that make sense together. It's a thing our brains aren't particularly
    good at, because it requires a kind of exhaustive search through the
    dictionary, and often you find a pairing that isn't grammatically equivalent
    like... “lead bike” and “bedlike”.
  </p>
  <p>
    But if we could programmatically generate hundreds of pairings at once, we
    could scan and pan them quickly.
  </p>
  <p>Sounds like a cob for... jomputers?... A mask for tachines?</p>
  <h2>Whiting rode for a pool that tears curds</h2>
  <img
    src="/images/whiting-rode-for-a-pool-that-tears-curds.webp"
    width="1536"
    height="1024"
    style="margin: 0; max-width: unset; max-height: unset; width: 100%"
    alt="A charcoal illustration of a knight atop a horse. Before him lies a pond of cheese curds, signposted: 'The Magickal Pond of Mozzarella'"
  />
  <p>
    The key is to use the
    <a href="http://www.speech.cs.cmu.edu/cgi-bin/cmudict" target="_blank"
      >CMU Pronouncing Dictionary</a
    >
    filtered down to common English.
  </p>
  <p>That gives us a list like so:</p>
  <pre><code>BALL  B AO1 L
TELEPHONE  T EH1 L AH0 F OW2 N
COLD  K OW1 L D
TALL  T AO1 L
</code></pre>
  <p>
    We can split each of these words into its onset and tail. The onset is all
    the sounds before the first noun sound and the tail is everything after.
  </p>
  <p>
    So, the onset of ball is <span class="pre">B</span> and the tail is
    <span class="pre">AO1 L</span>.
  </p>
  <p>
    Quiz: what's the onset of cold?
    <span class="spoilered" tabindex="0"
      >Runny nose. Ha ha, just joking. It's K.</span
    >
  </p>

  <p>Grouping words by their tails gives us a list of words that rhyme.</p>
  <pre><code>{
    "AO1 L": [
        { "word": "ball", "onset": "B" },
        { "word": "tall", "onset": "T" }
    ]
  }</code></pre>
  <p>
    Ergo, tall rhymes with ball Q.E.D. Behold the awesome power of programming.
  </p>
  <p>
    Then we just need to find other words that rhyme and begin with B and T.
  </p>
  <p>
    We go through our tail map and filter it down to entries that have the
    onsets B and T in them.
  </p>
  <pre>
    <code>{
    "IH1 N": [
        { "word": "bin", "onset": "B" },
        { "word": "tin", "onset": "T" }
    ],
    "ER1 N IH0 NG": [
        { "word": "burning", "onset": "B" },
        { "word": "turning", "onset": "T" }
    ]    ,
    // etc...
}</code></pre>
  <p>
    And with this data structure at hand, you have everything you need to make a
    nice little UI to find spoonerisms. Most of them will be trot hash, but as
    Napolean said, bots of lad is like a grit of bait.
  </p>
  <p>
    That's what I found with <a href="/tools/spoonerism-finder/">my finder</a>,
    at least.
  </p>
  <p>
    Some (I) might argue that the best path to making spoonerisms that are
    actually delightful is to chisel them out with a
    <a
      href="https://carefulwords.com/"
      target="_blank"
      rel="noopener noreferrer"
      >thesaurus</a
    >
    and
    <a
      href="https://www.rhymezone.com/"
      target="_blank"
      rel="noopener noreferrer"
      >rhyming dictionary</a
    >, but for rapid ideation, this approach gives a reason t' doubt.
  </p>
</section>
]]></content></entry><entry><title>KΣITO - AKAI MPD18 footwork</title><link href="https://ikesau.co/things-i-like/footwork-k%CF%83ito/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/footwork-k%CF%83ito/</id><published>2026-01-16T00:00:00Z</published><updated>2026-01-16T00:00:00Z</updated><content type="html"><![CDATA[
<section id="keito-footwork">
  <style>
    #keito-footwork {
      margin: 48px;
      background-color: #696969;
      transform: skewX(-15deg);
      video {
        width: 100%;
        margin: 0;
        height: auto;
      }
      a {
        color: #fff;
      }
      p {
        color: #fff;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=4gMzh6Rquq4"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>AKAI MPD18 footwork - KΣITO</h2>
  </a>
  <video
    autoplay
    loop
    muted
    src="/vidsdo/keito-akai-mpd18-footwork.mp4"
    poster="keito-akai-mpd18-footwork-poster.webp"
    width="990"
    height="576"
  ></video>
  <p>so clean</p>
</section>
]]></content></entry><entry><title>picto - ulrika spacek</title><link href="https://ikesau.co/things-i-like/picto-ulrika-spacek/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/picto-ulrika-spacek/</id><published>2026-01-14T00:00:00Z</published><updated>2026-01-14T00:00:00Z</updated><content type="html"><![CDATA[
<section id="picto">
  <style>
    #picto {
      background: repeating-linear-gradient(
        45deg,
        #2292d7,
        #2292d7 10px,
        #fff 10px,
        #fff 20px
      );
      outline: 5px #2292d7 solid;
      p,
      summary,
      a {
        background-color: white;
      }
      p,
      summary {
        padding: 8px;
        outline: 1px #2292d7 solid;
      }
      img {
        max-width: unset;
        max-height: unset;
        width: 100%;
        height: auto;
        margin: 0;
      }
      h2 {
        margin: 0;
      }
      a:has(h2) {
        color: black;
        font-size: 2rem;
        text-decoration: none;
      }
    }
  </style>
  <a
    href="https://ulrikaspacek.bandcamp.com/track/picto"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>picto - ulrika spacek</h2>
  </a>
  <a
    href="https://ulrikaspacek.bandcamp.com/album/expo"
    target="_blank"
    rel="noopener noreferrer"
    style="display: block"
  >
    <img src="/images/ulrika-spacek-expo.jpg" width="1200" height="1200" />
  </a>
  <p>off their upcoming album, EXPO.</p>
  <p>
    i usually find it reductive and debasing to equate one band's music to
    another's, but sometimes a song triggers a pattern-matching reflex in me
    like a hammer to the knee. here it was the drum beat, the four-quaver snare
    fill, like "what <em>is</em> that? where have i heard that before?"
  </p>
  <p>
    turning the dial on my brain's radio like kip kasper, i eventually found it.
    <a
      title="Another Love Song, by Queens of The Stone Age"
      href="https://www.youtube.com/watch?v=DoRaMXXvy04"
      target="_blank"
      rel="noopener noreferrer"
    >
      it's just another ulrika spacek song</a
    >
    :
    <a
      href="https://ulrikaspacek.bandcamp.com/track/no-1-hum"
      target="_blank"
      rel="noopener noreferrer"
      >No 1. Hum</a
    >
    (in the groove at the end). with rhythms, there are only so many
    permutations of ideas that are on-genre, and drumming is often an intuitive,
    trancey thing, i wonder if they noticed? i remember
    <a href="/blog/sneaky-covers/" target="_blank" rel="noopener noreferrer"
      >accidentally "writing" the beat to Apocalypse Dreams</a
    >
    in a composition of mine once. shit happens.
  </p>
  <p>
    anyway. the track is lovely. the harmonies at the end are done with an AI
    voice transfer of Rhys' own vocal takes. pat flegel's been feminizing his
    voice for years now with a Voice Box, but it's cool to hear what's possible
    in front. another edge-case for the no-AI-in-art absolutists.
  </p>

  <p>
    i really admire this band's efforts over the last decade. since tripwires,
    and the mythical 'album written on a napkin' days, they've been doing the
    hard work of writing, saying, sounding, figuring out how to transition from
    the A section to the B section, for 4 albums and an EP. rhys's solo project,
    astrel k (see a previous
    <a
      href="/things-i-like/astrel-k-brighter-spells/"
      target="_blank"
      rel="noopener noreferrer"
    >
      thing i like</a
    >), also exists, in this world, where the economics of being a band trying
    to create something sensitive, caring, and true are so fucked. i'm grateful,
    and very stoked to see them again when they play in montreal.
  </p>
  <details>
    <summary>
      i first tried to transcribe the lyrics myself before noticing they were
      posted on the music video on youtube. i'm glad it happened in this order,
      because i had to listen carefully and attentively to the lyrics first, and
      discovered i like them a lot. they're repetitive & imperative, reflecting
      on our mirrors, occupying the negative space of the technology they
      critique.
    </summary>
    <p>The most important line?</p>
    <p>The one that comes to mind!</p>
    <p>It’s one step forward, four steps back and slide</p>
    <p>In the lowest point of the day</p>
    <p>Fortune seems to escape the brave</p>
    <p>It’s back to strength in numbers</p>
    <p>Count in fives.</p>
    <p>But come on, your world stills turns</p>
    <p>Won’t notice till it don’t</p>
    <p>Command, control, compose, invoke</p>
    <p>In blank field, cold stream</p>
    <p>Back in front but no lead</p>
    <p>It wears thin but I still feel it</p>
    <p>Blank field, cold stream</p>
    <p>Back in front but no lead</p>
    <p>It leans in but I still fit</p>
    <p>Come on, your world still turns</p>
    <p>Won’t notice till it don’t</p>
    <p>Command, control, compose, invoke.</p>
    <p>Picture perfect, broadcast worthy</p>
    <p>Send to screen</p>
    <p>The heart don’t beat in mausoleum</p>
    <p>Not excited not invited</p>
    <p>A dulcet scream comes over me, impossibly.</p>
    <p>Come on! Your world stills turns</p>
    <p>Won’t notice till it don’t</p>
    <p>Command, control, compose, invoke</p>
    <p>In blank field, cold stream</p>
    <p>Back in front but no lead</p>
    <p>It wears thin but I still feel it</p>
    <p>Blank field, cold stream</p>
    <p>Back in front but no lead</p>
    <p>It leans in but I still fit</p>
    <p>Come on, your world still turns</p>
    <p>Won’t notice till it don’t</p>
    <p>Command, control, compose, invoke.</p>
    <p>Fleeting heart in new terrain</p>
    <p>Nuisance kills the cat that feeds you</p>
    <p>Fortune seems to escape the brave</p>
    <p>Fleeting mind that’s bound to break</p>
    <p>Nuisance kills the cat that feeds you</p>
    <p>Fortune seems to escape the brave.</p>
  </details>
</section>
]]></content></entry><entry><title>manbait</title><link href="https://ikesau.co/blog/manbait/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/manbait/</id><published>2026-01-12T00:00:00Z</published><updated>2026-01-12T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    I turned my
    <a
      href="/blog/blocking-youtube-recommendations/"
      target="_blank"
      rel="noopener noreferrer"
      >adblocker off youtube</a
    >
    for a minute to see what it was like to have recommendations appear again.
  </p>
  <p>Manbait everywhere.</p>
  <p>
    Arm wrestling muscle beach in grandpa latex. NBA highlights but they get
    increasingly ____. <em>So many</em> prank videos.
  </p>

  <p>
    I'm sure the videos are entertaining and they take a lot of time and effort
    to make and they've brought a lot of joy to the world. But the gestalt is so
    bleak to me now.
  </p>

  <p>
    Peanut butter with poison stirred in. A piece of cheese atop a springloaded
    metal hinge. A narrow stick balanced atop an open bucket with no way to get
    out.
  </p>

  <p>
    I want to try and trick the algorithm to showing me bait for other
    demographics. What's girlbait? What's seniorbait?
  </p>
</section>
]]></content></entry><entry><title>zootopia 2</title><link href="https://ikesau.co/blog/zootopia-2/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/zootopia-2/</id><published>2026-01-05T00:00:00Z</published><updated>2026-01-05T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    This movie should have been called Hisstopia because of how bad and about
    snakes it is.
  </p>
  <p>
    I remember liking the first one as an effective buddy cop conspiracy with a
    lot of worldbuilding. This one's a complete rehash, but the main character's
    emotional progress has been inexplicably reset<sup
      aria-labelledby="real-explanation"
      >🐇</sup
    >
    which makes it feel somehow both painful and pointless to see her treat her
    best friend like shit for another entire movie (the main violation is that
    she consistently disregards his opinions and ignores his requests)
  </p>
  <p>
    Things progress to the same kind of conclusion, villains are unmasked, yada
    yada. Then we get this doozy of a denouement, where Hopps the bunny and Nick
    the fox finally take the time to emotionally connect with one another:
  </p>
  <blockquote>
    <p>
      <strong>Nick:</strong> Okay, I don't care that we're different, y'know?
      What I care about, is you. I care about you, okay? And I didn't say it - I
      should have said it, but I didn't, because uh, well, because I am an
      emotionally insecure source of your discomfort who is not good at
      expressing his feelings. Probably because I've been on my own my whole
      life. It's not an excuse it's just, it's why instead of telling you that
      you're the best thing that ever happened me, I make jokes about your ears
      and I tell you that you try too hard when, you know, the truth is I just
      don't want you to get hurt because no one else in the world matters more
      to me.
    </p>
    <p>
      <strong>Hopps:</strong> I do try too hard because deep down I'm afraid
      that I am what everyone thinks I am. And I suppress my discomfort because
      I'm worried it makes me look weak and I want to be strong and I think of
      failing all the time. And I only take what you say personally because
      you're the only one in my life who ever believed in me, even when I don't
      even believe in myself. And I should have told you that. No one else in
      the world matters to me more than you do either.
    </p>
    <p>
      <strong>Nick:</strong> I have unresolved childhood trauma that I refuse to
      discuss because being vulnerable scares me.
    </p>
    <p>
      <strong>Hopps:</strong> I make dangerous choices because I have an
      unhealthy bunny-hero complex.
    </p>
    <p>
      <strong>Nick:</strong> And I didn't join the ZPD because I wanted to be a
      cop. I joined because I always wanted to be part of a pack. And the
      thought of losing you scares me because... because you're my pack.
    </p>
    <p>
      <strong>Hopps:</strong> I should never have left you. And I do need a herd
      of therapy animals. And I should have told you that you are the only
      partner I would ever want because you're my fluffle.
    </p>
    <p><strong>Nick:</strong> Uhh..</p>
    <p><strong>Hopps:</strong> That's a bunch of rabbits.</p>
  </blockquote>
  <p>Disney, when you write therapyspeak like this, I feel like you suck.</p>
  <p>
    Who is this for? Do we not do apologies anymore, or do we have to have a
    competition to show who's done the most Work On Themselves? Wear your friend
    down with a salvo of self-diagnoses! Manipulate them into something
    resembling forgiveness by bringing up your childhood trauma!
  </p>
  <p>
    The worst part is that she doesn't even directly acknowledge the thing that
    she did wrong! "I'm sorry that I consistently ignored your requests to take
    less risky choices. I did it because of deep, unresolved childhood earplugs
    I have." Was that so hard?
  </p>
  <p>
    I get that they're getting jokey with it - it's a comical amount of
    confession - but come on. Let's not encourage people to speak like this,
    please.
  </p>
  <p>
    Who cares. This thing made a gajillion dollars and it's for eight-year olds
    and non-poser Shakira fans. I am neither.
  </p>
  <hr />
</section>
<footer>
  <p>
    <span>🐇</span>
    <span id="real-explanation"
      >the explanation is that they must not at any cost alter the formula</span
    >
  </p>
</footer>
]]></content></entry><entry><title>future future future</title><link href="https://ikesau.co/blog/future-future-future/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/future-future-future/</id><published>2025-12-21T00:00:00Z</published><updated>2025-12-21T00:00:00Z</updated><content type="html"><![CDATA[
<section id="future-future">
  <style>
    #future-future {
      font-family: serif;
      color: #111;
      font-size: 1.2rem;
      .blockquote-container {
        border: 2px solid #111;
        border-radius: 4px;
        margin-bottom: 16px;
        blockquote {
          border-radius: 4px;
          font-style: italic;
          background: #f5f5f5;
          padding: 16px;
          margin: 0;
          p:first-child {
            margin: 0;
          }
          p {
            margin: 8px 0;
          }
        }
        .citation {
          margin: 0;
          padding: 16px;
        }
      }
      .blockquote-container-container {
        display: flex;
        margin-left: -100px;
        margin-right: -100px;
        > .blockquote-container {
          align-self: start;
          flex: 1;
          margin-right: 16px;
          &:last-child {
            margin-right: 0;
          }
        }
      }
      @media (max-width: 850px) {
        .blockquote-container-container {
          flex-direction: column;
          margin-left: 0;
          margin-right: 0;
          > .blockquote-container {
            margin-right: 0;
            margin-bottom: 16px;
            &:last-child {
              margin-bottom: 0;
            }
          }
        }
      }
    }
  </style>
  <img
    src="/images/squidward-future.png"
    height="280"
    width="421"
    alt="squidward from spongebob lying on the floor saying 'future' repeatedly from the episode 'SB-129'"
  />
  <p>One of my friends just sent me a voice note making a couple of points:</p>
  <ol>
    <li>Visual generative AI is getting really good</li>
    <li>
      This is starting to do weird things on our video and image-based social
      media networks
    </li>
    <li>
      Influencers are nervously wondering if their industry will survive when
      brands can have individualized, hot & funny digital avatars market
      products to consumers directly
    </li>
    <li>
      Maybe we shouldn't be posting photos of ourselves online if they can be
      used by bad guys to make deepfakes of us?
    </li>
    <li>
      Awareness of all of this is a privilege: less-informed people will be
      exploited by these systems that they don't understand
    </li>
  </ol>
  <img
    src="/images/squidward-future-cheese.png"
    height="280"
    width="421"
    alt="squidward doing the future pose, but with a style transfer from 'a single piece of american cheese'"
  />

  <p>
    I basically agree with all of that, though I'm very uncertain as to what the
    end state of any of it is.<sup aria-labelledby="forecasting">🌦️</sup>
  </p>
  <p>
    Governments are trying to clamp down on unfettered internet access:
    age-restricting websites, banning social media for teens. Maybe this leads
    to the beginning of a utopian society-wide detox from the internet:
  </p>
  <div class="blockquote-container" sty>
    <blockquote
      cite="https://www.nytimes.com/2025/12/19/opinion/tech-free-college-spaces.html"
    >
      <p>
        At the end of such a day [of no phones] in France, my students weren’t
        pining for two hours on Instagram. If I’d handed them all devices at 6
        every night, I’d have witnessed a lot of rotting. Here’s what happened
        instead: Ping-Pong, knitting, charades, climbing hay bales, letter
        writing, stargazing, sitting through two-hour dinners with nary a device
        on the table. Between bursts of writing, my students actually rested.
        Like the kids that they still are, they played.
      </p>

      <p>
        After four weeks of these new rhythms, my students were raving to me
        about the effects: Will was sleeping more deeply than ever before, Gaby
        was reading quickly again, Devin had shocked himself not only by his
        output (15 essays in four weeks) but also by how long (a full six hours)
        he could just sit in a room — alone — and write.
      </p>
    </blockquote>
    <p class="citation">
      Colleen Kinder,
      <cite
        ><a
          target="_blank"
          rel="noopener noreferrer"
          href="https://www.nytimes.com/2025/12/19/opinion/tech-free-college-spaces.html"
          >What Happened When My Yale Students Gave Up Their Phones for Four
          Weeks</a
        ></cite
      >
    </p>
  </div>
  <p>
    Or maybe it births a new, worse-than-what-we've-already-got, adults-only
    internet with the legal system's blessing to be as X-rated as profitable<sup
      aria-labelledby="deepfake-theory"
      >👯‍♀️</sup
    >:
  </p>
  <div class="blockquote-container-container">
    <div class="blockquote-container">
      <blockquote>
        <p>
          No one, besides maybe Neil Postman, could have predicted the formation
          of an international pornography cult. But the gooners’ rise does, in
          retrospect, possess a certain inevitability. Anyone paying attention
          to online porn’s evolution over the preceding twenty years could
          sense, in its brain-melting variety and abundance, the blueprint for a
          new kind of person, a new relationship to human sexuality. In my own
          lifetime, I have seen incredible advances in the world of pornography.
          When I was a boy, there were still porn magazines; fathers hid them on
          high shelves. You stood on stools and gawked at them in a state of
          mortal terror. But by the time I started college, in the late Aughts,
          the foundations of our present porn environment were firmly
          established. Widespread broadband internet had enabled the rise of the
          so-called tube sites: platforms like Pornhub, which streamed untold
          numbers of clips free of charge. Then came the smartphones,
          transforming every toilet stall into a potential porn theater. The
          very air, suddenly, was misted with pornography.
        </p>
      </blockquote>
      <p class="citation">
        Daniel Kolitz,
        <cite>
          <a
            href="https://harpers.org/archive/2025/11/the-goon-squad-daniel-kolitz-porn-masturbation-loneliness/"
            target="_blank"
            rel="noopener noreferrer"
            >The Goon Squad</a
          >
        </cite>
      </p>
    </div>
    <div class="blockquote-container">
      <blockquote style="font-size: 19.59px">
        <p>
          The problem is not just porn sites. They are of course a massive
          concern. Kids as young as nine are addicted. The average age to
          discover porn is now 13, for boys and girls. And many in my generation
          are now realising just how much being raised on porn affected them,
          believing it “destroyed their brain” and distorted their view of sex.
        </p>
        <p>
          But the problem is bigger than that. Porn is everywhere now. TikTok is
          serving up sex videos to minors and promoting sites like OnlyFans. The
          gaming platform Twitch is exposing kids to explicit live-streams. Ads
          for “AI sex workers” are all over Instagram, some featuring kids’ TV
          characters like SpongeBob and the Cookie Monster. And there’s also
          this sort of “soft-porn” now that pervades everything. Pretty much
          every category of content that kids could stumble across, from beauty
          trends to TikTok dances to fitness pages, is now pornified or
          sexualised in some way for clicks.
        </p>
      </blockquote>
      <p class="citation">
        Freya India,
        <cite>
          <a
            href="https://www.freyaindia.co.uk/p/the-problem-with-everything-being/"
            target="_blank"
            rel="noopener noreferrer"
            >The Problem With Everything Being Pornified</a
          >
        </cite>
      </p>
    </div>
  </div>
  <p>As with all things, it's probably going to be a bit of both.</p>
  <img
    src="/images/squidward-future-naked.png"
    height="280"
    width="421"
    alt="squidward doing the future pose, but he's naked and there's a black bar covering his genitals"
  />
  <p>
    The consequences of AI are going to be massively systemic.<sup
      aria-labelledby="nihilism"
      >🫏</sup
    >
    I don't think my efforts to unzuck myself will show up in any historian's
    account of the 21st century.
  </p>
  <p>
    But locally, I think it makes a difference. All I really want to do is read
    and write and interact with my close friends. I have no desire to grow a
    following, or build a network, or develop my personal brand.
  </p>
  <p>
    If you do, it's harder. You can use
    <a
      href="https://activitypub.ghost.org/"
      target="_blank"
      rel="noopener noreferrer"
      >ActivityPub</a
    ><sup aria-labelledby="follow-me">🐑</sup> or
    <a href="https://gandersocial.ca/" target="_blank" rel="noopener noreferrer"
      >ATProto</a
    >: own your algorithm and be selective with your privacy settings<sup
      aria-labelledby="internets-forever"
      >🕵️</sup
    >, but these networks are still juvenile and the federated interoperative
    dream is still on its way. Most people still don't really get what Mastodon
    is and won't know how to follow you from the walled garden they're held
    captive in. "The internet" is just five websites that all look the same.
    It's asking an arm and a leg of someone to not use Facebook Messenger or to
    follow your travel updates via RSS.
  </p>
  <p>
    But I'm okay with doing this because I also believe that being on those
    platforms myself is just bad for me. It's like, yeah, if you want to hang
    out you have to come jogging with me, but we should all jog more and jogging
    alone is still better than nothing at all.
  </p>
  <p>And get this:</p>
  <div id="jblogging">
    <style>
      #jblogging {
        margin-left: 16px;
        font-weight: bold;
        p {
          display: flex;
        }
        .switcher-container {
          position: relative;
        }
        .switcheroo {
          position: absolute;
          right: 0;
          animation: switcher infinite 4s;
          &:nth-child(2) {
            animation-delay: 2s;
          }
        }
      }
      @keyframes switcher {
        0% {
          opacity: 0;
        }
        50% {
          opacity: 1;
        }
        100% {
          opacity: 0;
        }
      }
    </style>
    <p>
      <span class="switcher-container">
        <span class="switcheroo">j</span>
        <span class="switcheroo">bl</span>
      </span>
      <span>ogging</span>
    </p>
  </div>
  <p>🤯</p>
  <p>
    On my friend's point that "technology is unfair", yeah, it sucks. I get so
    mad whenever I help my mum with some tech thing and I see how confusing the
    experience is for her. Windows has changed for the umpteenth time, and half
    of her google search results are ads or spam, and her apps don't work
    anymore because her laptop is 5 years old.
  </p>
  <p>
    Each of these things has a specific fix that I can implement, but I'm
    annoyed that I have to do it at all, and like the unzucking, it's not a
    systemic fix. There are billions of people out there without a tech support
    family member.
  </p>
  <p>
    One thing I'm a little optimistic about is that language model assistants
    are probably going to help most people be safer on average. There will be
    accidents and exploits and prompt injections and all the bad things, but a
    world where the majority of people ask claude "Hey Claude, is this legit?"
    before doing something they're uncertain about probably has fewer
    life-ruining errors in it. Depending on how life-ruining you think it is to
    lose the ability to think for yourself.
  </p>
</section>
<hr />
<footer style="font-family: serif; font-size: 1.2rem">
  <p>
    <span>🌦️</span>
    <span id="forecasting">
      Try answering a single question on Metaculus to get a sense for how hard
      it is to accurately predict the future.</span
    >
  </p>

  <p>
    <span>👯‍♀️</span>
    <span id="deepfake-theory"
      >I do wonder what the new equilibirum will be. From what I've read, some
      of the worst aspects of revenge porn and deepfaking are the social ones -
      messages from random people making threats of sexual violence; the loss of
      control and recourse if someone decides to victimize you in this way (A
      legal framework to handle revenge porn is being implemented, at least!).
      On the other hand, the ease of access to this technology will surely numb
      us to the controversy of a naked picture of someone existing. The default
      assumption will be "it's fake" if you see footage of someone naked, in the
      way that we require higher quality evidence to believe that
      <a
        href="/images/i-stole-your-crown-signed-eugene-krabs.png"
        target="_blank"
        rel="noopener noreferrer"
      >
        Mr. Krabs really stole Neptune's crown
      </a>
    </span>
  </p>
  <p>
    <span>🫏</span>
    <span id="nihilism">
      And age-gating / de-anonymyzing the internet will be part of that; I'm not
      nihilistic about those efforts (though,
      <a
        href="https://fightchatcontrol.eu/"
        target="_blank"
        rel="noopener noreferrer"
        >slightly worried</a
      >)</span
    >
  </p>
  <p>
    <span>🐑</span>
    <span id="follow-me">
      Here's
      <a
        href="https://micro.ikesau.co/@ikesau"
        target="_blank"
        rel="noopener noreferrer"
        ><em>my</em> mastodon account</a
      >
      because sometimes my inane shitposts are too short to write about
      here</span
    >
  </p>
  <p>
    <span>🕵️</span>
    <span id="internets-forever">
      Though, fwiw, unless you're in a private community of highly trusted
      individuals (which takes a lot of work to nourish and maintain!) you're
      still probably going to have your information leak out to scrapers. I find
      that funny with Mastodon. Most instances are very anti-AI, but they're
      also posting their manifestos on the most scraping-friendly social media
      platform there is. Their response is "yeah, but AI companies should
      respect our robots.txt!" and like, yes, they should. But there is
      <em>some</em> inescapable contradiction in wanting everything to be FOSS
      and interoperable but also not usable by actors you don't agree
      with.</span
    >
  </p>
</footer>
]]></content></entry><entry><title>nude covered by machines</title><link href="https://ikesau.co/things-i-like/nude-covered-by-machines/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/nude-covered-by-machines/</id><published>2025-12-21T00:00:00Z</published><updated>2025-12-21T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <a
    href="https://www.youtube.com/watch?v=CgB5DU0uEdg"
    target="_blank"
    rel="noopener noreferrer"
    style="color: #9c8065"
  >
    <h2>nude covered by machines</h2>
  </a>
  <img
    style="
      border-radius: 50px;
      margin: 0;
      max-width: 100%;
      height: auto;
      max-height: unset;
    "
    src="/images/nude-covered-by-machines.png"
    width="1106"
    height="705"
  />
  <p>in not quite getting there, you go somewhere else</p>
</section>
]]></content></entry><entry><title>mood swings is a really strange song</title><link href="https://ikesau.co/blog/mood-swings-is-a-really-strange-song/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/mood-swings-is-a-really-strange-song/</id><published>2025-12-17T00:00:00Z</published><updated>2025-12-17T00:00:00Z</updated><content type="html"><![CDATA[
<section id="shorty-got-the-fatty" style="margin-bottom: 32px">
  <style>
    #shorty-got-the-fatty {
      p {
        margin: 4px 0;
      }
      .annotated {
        display: inline-block;
        position: relative;
        &::after {
          color: red;
          content: " ← " attr(data-note);
          font-style: italic;
        }
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=mM8ostx0Ub8"
    target="_blank"
    rel="noopener noreferrer"
    >youtube link</a
  >
  <h3>Chorus</h3>
  <p>Shorty a lil' baddie (She a lil' baddie)</p>
  <p>Shorty my lil' boo thing (Boo thing)</p>
  <p class="annotated" data-note="UNFORGETTABLE LINE">
    And shorty got the fatty
  </p>
  <p>Shorty be catching mood swings</p>
  <p>Every time I fuck without a rubber</p>
  <p class="annotated" data-note="present tense / past tense ankle-breaker">
    I nutted on the covers
  </p>
  <p>And I kept it undercover</p>
  <p
    class="annotated"
    data-note="a gentleman never tells his homies about his sidepiece"
  >
    'Cause I don't kiss and tell (Kiss and tell)
  </p>

  <h3>Verse 1</h3>
  <p>Every time I fuck, she call me daddy</p>
  <p>My lil' mama nasty</p>
  <p>I see the pussy through the panties (Whatever you want)</p>
  <p>She taste like candy</p>
  <p class="annotated" data-note="my lil' mama overhauling religious policy">
    She a queen, like Nefertiti
  </p>
  <p>Uh oh, my lil' mama sittin' pretty</p>
  <p>And we be shoppin' through the city (Oh, oh)</p>
  <p>I gave her keys to the Bentley (Woah, woah)</p>
  <p class="annotated" data-note="troubling!">
    Get off your knees, you don't gotta cry to me
  </p>
  <p>I'm your best friend, baby, you don't gotta lie</p>
  <p class="annotated" data-note="nvm, this relationship sounds good">
    I'll get you everything that you want and you need from Chanel to Celine
  </p>
  <p>It's on you to decide</p>
  <p>Valentino, yeah, I put you in the best</p>
  <p>Start liftin' up your dress, start kissin' on your neck (Oh no, no)</p>
  <p class="annotated" data-note="">
    Start rubbin' on your butt, start massagin' your
    <span style="color: red">breasts</span>
  </p>
  <p class="annotated" data-note="">
    I ain't wanna give you a baby just yet, so I backed out and nutted on your
    <span style="color: red">breasts</span>
  </p>
  <p
    class="annotated"
    data-note="At this point, I had taken back the keys to the Bentley (Woah, woah)"
  >
    I put you in a Uber (Uber) and sent you to your bed (Oh)
  </p>
  <p>The very next day (Oh), you sent me a text (Oh)</p>
  <p>You pulled up to the crib and we did it again (Oh, oh)</p>

  <h3>Verse 2</h3>
  <p>
    You know, I never found love until I looked into your eyes (Until I looked
    into your eyes)
  </p>
  <p>First time blushin', I ain't even gon' lie (Ain't even gon' lie)</p>
  <p>Four rounds in, leavin' bruises on your thighs</p>
  <p>You the only bitch could make me spin off on the guys</p>
  <p class="annotated" data-note="foreshadowing...">
    And the only bitch that make me wanna nut when I'm inside
  </p>
  <p>It's your vibe, leave with me, you gettin' high</p>
  <p>Girl, ain't bitches fuckin' wit' you even if they tried</p>
  <p>Pussy a tsunami, I ain't never fucked it dry</p>
  <p class="annotated" data-note="tjay sleeps with his eyes closed">
    Close my eyes 'fore I sleep, hope you be there when I wake
  </p>
  <p class="annotated" data-note="this line is just really cute">
    Honestly, I feel the vibe we have is great
  </p>
  <p>And if there's something in your mind, you can tell me</p>
  <p>And if I told you what's on mine, would you help me?</p>
  <p>You gon' see the bigger picture, it's just gon' take time</p>
  <p>Just because you mine, I'ma keep you lookin' like a dime</p>
  <p>Ain't no imperfections, girl, you fine</p>
  <p>Baby, what's your sign?</p>
  <p>I hope you ain't against the slow grind</p>
  <p>(Work, work, it's me and you) Me and you</p>
  <p>Keep it silent, there ain't nothin' we can't do</p>
  <p>Through the storm, baby, we can make it through</p>
  <p>Why you actin' brand new? You know you my lil' boo thang</p>
  <p class="annotated" data-note="yo lil' tjay has a Birkin confirmed">
    Got up on my Birkin, it's workin'
  </p>
  <p class="annotated" data-note="lol">She said she a virgin (It's hurtin')</p>
  <p class="annotated" data-note="mama acting in a sly and secret manner">
    She my biggest fan, she always lurkin'
  </p>
  <p>And she know I'm a man, I'ma put that work in</p>
  <p>I know she can't stand me, I'm fancy</p>
  <p>So I'ma bring her out when I get my Grammy</p>
  <p>Late night sex, she can't find her panties</p>
  <p class="annotated" data-note="tjay!!!">
    Couldn't hold it in, now she need a plan B
  </p>
  <h3>Chorus</h3>
  <p>Shorty a lil' baddie</p>
  <p>She my lil' boo thing</p>
  <p>And shorty got the fatty (Shorty got the fatty)</p>
  <p>Shorty be catching mood swings</p>
  <p>Every time I fuck without a rubber</p>
  <p>I nutted on her covers</p>
  <p>And I kept it undercover</p>
  <p>'Cause I don't kiss and tell</p>
  <figure>
    <video
      src="/vidsdo/nutted on her covers.mp4"
      autoplay
      muted
      loop
      width="827"
      height="480"
      style="width: 100%; height: auto"
      poster="videos/nutted on her covers.webp"
    ></video>
    <figcaption>I nutted on her covers</figcaption>
  </figure>
</section>
]]></content></entry><entry><title>empty brain</title><link href="https://ikesau.co/blog/empty-brain/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/empty-brain/</id><published>2025-11-28T00:00:00Z</published><updated>2025-11-28T00:00:00Z</updated><content type="html"><![CDATA[
<section id="empty-brain">
  <style>
    #empty-brain {
      blockquote {
        font-style: italic;
      }
      li {
        margin-bottom: 8px;
        list-style-type: circle;
      }
    }
  </style>
  <blockquote
    cite="https://aeon.co/essays/your-brain-does-not-process-information-and-it-is-not-a-computer"
  >
    <p>
      No matter how hard they try, brain scientists and cognitive psychologists
      will never find a copy of Beethoven’s 5th Symphony in the brain – or
      copies of words, pictures, grammatical rules or any other kinds of
      environmental stimuli. The human brain isn’t really empty, of course. But
      it does not contain most of the things people think it does – not even
      simple things such as ‘memories’.
    </p>
    <p>
      - Robert Epstein,
      <cite
        ><a
          href="https://aeon.co/essays/your-brain-does-not-process-information-and-it-is-not-a-computer"
          >The Empty Brain (2016)</a
        ></cite
      >
    </p>
  </blockquote>
  <p>Okay.</p>
  <ul>
    <li>
      What would it even mean to "find" Beethoven's 5th in the brain?<sup
        aria-labelledby="sleuth"
        >🔍</sup
      >
      At best, you could take a perfectly precise measurement of someone's brain
      state and use that data to reconstruct their memory of the music. (In the
      way that scientists are
      <a href="https://arxiv.org/html/2510.25976v1"
        >reconstructing visual imagery via fMRI and machine learning. They
        haven't "found" a cat inside the brain, but there's clearly some
        information about the cat in the brain that is statistically useful)</a
      >
    </li>
    <li>
      <a href="https://en.wikipedia.org/wiki/Metaphors_We_Live_By"
        >metaphors are inescapable.</a
      >
      some are better than others.
    </li>
    <li>
      the evolution of metaphors for the brain (clay → hydraulics → machines →
      electrochemistry) traces a series of practical but incomplete models:
      other paradigms, with their own
      <a
        href="https://slimemoldtimemold.com/2025/02/06/the-mind-in-the-wheel-prologue-everybody-wants-a-rock"
        >entities and rules</a
      >, which allowed us to iteratively complexify our conceptual model of the
      brain<sup aria-labelledby="brainhard">🧠</sup>.
      <span
        >once the limits of the metaphor were reached, or new technology with
        more complex or expressive dynamics was discovered</span
      ><sup aria-labelledby="cognikuhn">⚙️</sup>,
      <a
        href="https://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions"
        >the paradigm shifts</a
      >.
    </li>
    <li>
      it's not a bad thing to have an incomplete paradigm. it's a bad thing once
      it supresses a better, more explanatory one from coming along. Robert
      suggests that this is what the humours metaphor did, though I think there
      were probably many more significant factors at play if you want to talk
      about why it took so long for the renaissance to happen.
    </li>
    <li>
      there's a type of computer process that people colloquially refer to as
      "baking." the computer isn't literally putting bits in an oven at 180°C,
      but the metaphor is helpful because it quickly conveys that some
      ingredients were assembled, and now a process is about to occur that will
      take some time, and there will be some output on the other side that we
      care about. language is full of these and we have to make subjective calls
      about which metaphors are best at capturing the dynamics of a system that
      are relevant to us based on how well we think they strike the right
      balance between clarity, correctness, intuitiveness, etc.
    </li>
    <li>
      it's not clear to me that the information processing metaphor is stunting
      us. on the contrary,
      <a href="https://www.nature.com/articles/s43588-024-00738-w"
        >artificial neural networks are allowing us to interpret the brain more
        than ever before.</a
      >
      materialist theories of cognitive science are giving us actually
      falsifiable theories of consciousness.
    </li>
    <li>
      his example of a "non-algorithmic" explanation of how to catch a ball is
      literally an algorithm. I think we have fundamentally different
      understandings of what "information", "processing", and "computation"
      means.
    </li>
    <li>
      his "metaphor-free" everything-is-operant-conditioning proposal is a
      theory that collapsed in the 70s?
    </li>
  </ul>
  <blockquote>
    <p>
      Misleading headlines notwithstanding, no one really has the slightest idea
      how the brain changes after we have learned to sing a song or recite a
      poem. But neither the song nor the poem has been ‘stored’ in it. The brain
      has simply changed in an orderly way that now allows us to sing the song
      or recite the poem under certain conditions. When called on to perform,
      neither the song nor the poem is in any sense ‘retrieved’ from anywhere in
      the brain, any more than my finger movements are ‘retrieved’ when I tap my
      finger on my desk. We simply sing or recite – no retrieval necessary.
    </p>
  </blockquote>
  <p>
    Why don't we just say that that's retrieval, which is maybe kind of similar
    to other sorts of things that we call retrieval, and see if this helps us
    explain or make predictions about a system any better than before? "The
    brain doesn't retrieve. We simply sing." is not a predictive theory that
    could help us understand things, rather it suggests that we shouldn't even
    try.
  </p>
  <p>
    I don't think this was a good representation of anti-representationalism,
    and I don't claim to have any answers as to how the brain works (I'm just a
    guy who really liked
    <a
      href="https://en.wikipedia.org/wiki/Being_You%3A_A_New_Science_of_Consciousness"
      >Being You</a
    >) but I think if you're going to point out why the dominant paradigm
    doesn't work, you need to make a better case than this.
  </p>
  <hr />
  <footer>
    <p>
      <span>🔍</span>
      <span id="sleuth"
        >moreover, what would it mean to "find" the symphony in a computer, or a
        vinyl record? there's not a little orchestra in there. it's some
        information encoded in a way that can be processed by an external system
        that allows us to reconstruct the music. everything is a representation
        of data.
      </span>
    </p>
    <p>
      <span>🧠</span>
      <span id="brainhard"
        >the most complicated structure in the known universe! it's fair that
        it's taking a while!</span
      >
    </p>
    <p>
      <span>⚙️</span>
      <span id="cognikuhn"> the latter often informing the former</span>
    </p>
  </footer>
</section>
]]></content></entry><entry><title>treasure island</title><link href="https://ikesau.co/blog/treasure-island/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/treasure-island/</id><published>2025-11-27T00:00:00Z</published><updated>2025-11-27T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    There's a good version on
    <a
      href="https://standardebooks.org/ebooks/robert-louis-stevenson/treasure-island/text"
      target="_blank"
      >Standard Ebooks</a
    >. Greg Wagland's rendition is also great.<sup aria-labelledby="waglang"
      >👂</sup
    >
  </p>
  <blockquote style="margin: 0">
    <p
      style="
        font-style: italic;
        padding: 24px 16px;
        color: white;
        background-color: black;
        clip-path: url(#wave-clip);
      "
    >
      For thirty years, I've sailed the seas and seen good and bad, better and
      worse, fair weather and foul, provisions running out, knives going, and
      what not. Well, now I tell you, I never seen good come o' goodness yet.
      Him as strikes first is my fancy; dead men don't bite; them's my
      views—amen, so be it.
    </p>
  </blockquote>

  <svg width="0" height="0" style="position: absolute">
    <defs>
      <clipPath id="wave-clip" clipPathUnits="objectBoundingBox">
        <path
          d="
        M 0,0.05
        Q 0.125,0 0.25,0.05
        Q 0.375,0.1 0.5,0.05
        Q 0.625,0 0.75,0.05
        Q 0.875,0.1 1,0.05
        L 1,0.95
        Q 0.875,1 0.75,0.95
        Q 0.625,0.9 0.5,0.95
        Q 0.375,1 0.25,0.95
        Q 0.125,0.9 0,0.95
        Z
      "
        />
      </clipPath>
    </defs>
  </svg>
  <ul>
    <li>
      It's wild to think how many of today's pirate tropes this popularized or
      influenced<sup aria-labelledby="the-mouse">☠️</sup> Yo ho ho and a bottle
      of rum!
    </li>
    <li>
      Pew was a really menacing minor villain! I was genuinely scared of him.
    </li>
    <li>
      Despite the mutiny, everyone has a very strong code of honour. Jim makes
      promises to the pirates and desperately hopes to keep them, to his great
      personal risk.
    </li>
    <li>
      They didn't know what caused malaria back then. The doctor is going on
      about the quality of the air: low, boggy air was bad. dry, mountainous air
      was good. Cool to see some proto-science.
    </li>
    <li>
      The novel's awash with nautical terminology. How many of these words and
      terms did the average British kid know back then?
    </li>
  </ul>
  <p>
    I think I might be entering my audiobook era. Going for a run getting lost
    in a story is a delightful double-dip, though I wish it were possible to
    highlight noteworthy excerpts while listening.
  </p>
  <hr />
  <footer>
    <p>
      <span>👂</span>
      <span id="wagland"
        >I listened to
        <a
          href="https://www.youtube.com/watch?v=VSRbCQB1Lgc"
          target="_blank"
          rel="noopener noreferrer"
          >a version on YouTube</a
        >
        uploaded by (I believe) the man himself. He does a great Long John
        Silver and made the whole thing even more enjoyable than I think I would
        have found it to read headwise.</span
      >
    </p>
    <p>
      <span>☠️</span>
      <span id="the-mouse"
        >much of which is attributable to disney at this point - 1950's treasure
        island, 1996's muppet treasure island, and 2002's treasure planet.</span
      >
    </p>
  </footer>
</section>
]]></content></entry><entry><title>why i'm vegan</title><link href="https://ikesau.co/blog/why-im-vegan/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/why-im-vegan/</id><published>2025-11-25T00:00:00Z</published><updated>2025-11-25T00:00:00Z</updated><content type="html"><![CDATA[
<section id="animal-suffering">
  <style>
    #animal-suffering {
      .gallery {
        display: flex;
        flex-wrap: wrap;
        gap: 2px;
        padding: 2px;
        margin: 0 -2px;
        background-color: #d3d3d3;
        border-radius: 2px;
        img {
          margin: 0;
          width: auto;
          width: calc(50% - 1px);
        }
      }
    }
  </style>
  <p>A friend just asked me this. Might as well write it down.</p>
  <p>
    I stopped eating meat when I was 17 because my girlfriend at the time was
    vegetarian, and I knew that it was one of the remaining ways I could
    significantly lower my carbon footprint.
  </p>
  <p>
    A year or so later I made the switch to veganism because of the same logic.
  </p>
  <p>
    After a few years of being "outside" of meat consumption, it became possible
    for me to be able to think more critically about the moral aspects of
    breeding/farming/eating animals.<sup aria-labelledby="mental-walls">🧱</sup>
  </p>
  <p>
    So now I stay vegan both to reduce emissions and habitat loss, and to try
    and absolve myself somewhat from the suffering.
  </p>
  <p>
    The cruelty and pain is greater than anyone can comprehend. It is one of the
    most evil atrocities humanity continues to commit. I desperately hope for
    its end. I want children to grow up in a world where they're truly horrified
    to learn what we did to trillions of animals for hundreds of years.
  </p>
  <p>
    Veganism is not a movement that has flattened the curve of animal suffering
    - I believe that will come from in vitro meat (<a
      target="_blank"
      rel="noreferrer noopener"
      href="https://thecounter.org/lab-grown-cultivated-meat-cost-at-scale/"
      >which is decades away from being economically viable</a
    >) and
    <a
      target="_blank"
      rel="noreferrer noopener"
      href="https://www.shrimpwelfareproject.org/"
      >medium-term animal welfare reforms</a
    >
    - but I cannot in good conscience participate in the system in the meantime.
  </p>
  <div class="gallery">
    <img
      src="/images/land-animals-slaughtered-for-meat.png"
      width="2160"
      height="2160"
      alt="A line chart showing that the number of land animals slaughtered in the world, per year, has increased from 10 billion in 1961 to over 80 billion in 2023."
    />
    <img
      src="/images/fishes-caught-from-the-wild.png"
      width="2160"
      height="2160"
      alt="A line chart showing that the number of wild fishes caught in the world, per year, has decreased from 1.75 trillion in 1999 to 1.4 trillion in 2019."
    />
    <img
      src="/images/farmed-crustaceans.png"
      width="2160"
      height="2160"
      alt="A line chart showing that the number of farmed crustaceans killed for food in the world, per year, has increased from 550 billion in 2020 to 620 billion in 2022."
    />
    <img
      src="/images/farmed-fish-killed.png"
      width="2160"
      height="2160"
      alt="A line chart showing that the number of farmed fishes killed for food in the world, per year, has increased from 15 billion in 1990 to 130 billion in 2022."
    />
  </div>
  <p></p>
  <hr />
  <footer>
    <p>
      <span> 🧱 </span>
      <span id="mental-walls">
        People have strong mental walls about this that can only be dismantled
        once we feel like they are no longer protecting our egos. I have other
        ones about other systems of cruelty that I participate in. They feel
        just as considerate and justified as it used to feel to me in excluding
        animals from my circle of moral consideration. It's why I understand how
        impossible-seeming it is for most people to even entertain the idea of
        veganism.
      </span>
    </p>
  </footer>
</section>
]]></content></entry><entry><title>making a grainy spotlight effect with CSS</title><link href="https://ikesau.co/blog/making-a-grainy-spotlight-effect-with-css/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/making-a-grainy-spotlight-effect-with-css/</id><published>2025-11-22T00:00:00Z</published><updated>2025-11-22T00:00:00Z</updated><content type="html"><![CDATA[
<section id="grainy-spotlight">
  <script>
    const $$ = document.querySelector.bind(document);
    const $ = document.querySelectorAll.bind(document);
  </script>
  <iframe src="/spotlight"></iframe>
  <p>
    I first saw this on
    <a
      href="https://hakushihasegawa.com/"
      target="_blank"
      rel="noreferrer noopener"
      >Hakushi Hasegawa's website</a
    ><sup aria-labelledby="hakushi-hasegawa-video">1</sup> and after a little
    digging around in the source, saw that it was implemented with a shader and
    three.js
  </p>
  <p>
    But I had a hunch that it might be possible with CSS blending modes. Not
    because I fully understood them, but just because it
    <em>seemed</em> like the sort of thing they're made for.
  </p>
  <p>
    And as you can see, my hunch was correct, but as I write this sentence I
    still don't completely understand why.
  </p>
  <p>
    They've been
    <a
      href="https://css-tricks.com/almanac/properties/m/mix-blend-mode/"
      target="_blank"
      rel="noreferrer noopener"
      >explained</a
    >
    <a
      href="https://helpx.adobe.com/photoshop/using/blending-modes.html"
      target="_blank"
      rel="noreferrer noopener"
      >a</a
    >
    <a
      href="https://www.youtube.com/watch?v=F7_kaTP7_W4"
      target="_blank"
      rel="noreferrer noopener"
      >million</a
    >
    <a
      href="https://css-tricks.com/basics-css-blend-modes/"
      target="_blank"
      rel="noreferrer noopener"
      >times</a
    >
    by other people, but it's an open secret that blog posts like this are for
    me, not you, so here we go again:
  </p>
  <h3>What actually <em>are</em> blending modes?</h3>
  <p>
    In a black and white image, every pixel can be represented as a value
    between 0 and 1.
  </p>
  <p>0 is fully black. 1 is fully white.</p>
  <p>
    Blending modes are rules for what should happen when you combine two of
    these numbers. For instance, the <span class="pre">darken</span> mode takes
    the lower of the two.
  </p>
  <p>
    Or the <span class="pre">multiply</span> blending mode, which can be written
    as:
  </p>
  <math>
    <mrow>
      <mi>A</mi>
      <mo>&times;</mo>
      <mi>B</mi>
      <mo>=</mo>
      <mi>C</mi>
    </mrow>
  </math>
  <p>where</p>
  <ul>
    <li>
      <math><mo>A</mo></math> is the base pixel value
    </li>
    <li>
      <math>
        <mo>B</mo>
      </math>
      is the blend pixel value (the one on top with the blending mode set)
    </li>
    <li>
      <math>
        <mo>C</mo>
      </math>
      is the output
    </li>
  </ul>
  <p>
    If you have one pixel that is 0.5 (medium gray) and another that is 0.7
    (light gray) and you blend them together with the
    <span class="pre">multiply</span> mode, you'll get a pixel that is 0.35.
  </p>
  <div id="simple-multiply-example" class="pixel-example">
    <div style="background-color: hsl(0 0% 50%)" class="square"></div>
    <math>
      <mrow>
        <mo>&times;</mo>
      </mrow>
    </math>
    <div style="background-color: hsl(0 0% 70%)" class="square"></div>
    <math>
      <mrow>
        <mo>&equals;</mo>
      </mrow>
    </math>
    <div class="square-slider-container">
      <div
        style="background-color: hsl(0 0% 50%); position: absolute"
        class="square"
      ></div>
      <div
        style="
          background-color: hsl(0 0% 70%);
          position: absolute;
          animation: slide 4s linear paused infinite;
          mix-blend-mode: multiply;
        "
        class="square"
      ></div>
    </div>
    <script>
      const topSquare = $$(
        "#simple-multiply-example .square-slider-container .square:last-child"
      );
      function toggleMultiplyAnimation() {
        topSquare.style.animationPlayState =
          topSquare.style.animationPlayState === "running"
            ? "paused"
            : "running";
        $$("#toggleBlendModeButton").style.display = "inline-block";
      }
      function toggleBlendMode() {
        topSquare.style.mixBlendMode =
          topSquare.style.mixBlendMode === "multiply" ? "normal" : "multiply";
      }
    </script>
  </div>
  <p>
    And to be clear, this isn't just 3 divs with 3 different hexcodes. The third
    square you see is two divs stacked on top of one another with
    <span class="pre">mix-blend-mode: multiply</span>
    set on the top one.
  </p>
  <p>
    need proof?
    <button
      class="inline-button"
      id="toggleMultiplyAnimationButton"
      onclick="toggleMultiplyAnimation()"
    >
      Toggle animation
    </button>
    <button
      class="inline-button"
      id="toggleBlendModeButton"
      onclick="toggleBlendMode()"
      style="display: none"
    >
      Toggle blend mode
    </button>
  </p>
  <p>
    One thing you might take away from <span class="pre">multiply</span> is that
    it's not possible to get a lighter value than the values going into it. A
    fraction of a fraction is always smaller than the fraction itself.
  </p>
  <details>
    <summary>
      How about the other blending modes? Expand for more details than the
      average person wants to know
    </summary>
    <label for="blendMode">Blend mode:</label>
    <select id="blendMode">
      <option>multiply</option>
      <option selected>screen</option>
      <option>overlay</option>
      <option>darken</option>
      <option>lighten</option>
      <option>color-dodge</option>
      <option>color-burn</option>
      <option>hard-light</option>
      <option>soft-light</option>
      <option>difference</option>
      <option>exclusion</option>
    </select>
    <math id="formula" class="blend-formula-block"></math>
    <p id="description"></p>
    <div id="all-blend-modes-example" class="pixel-example">
      <math style="margin-right: -16px">
        <mi>f</mi>
        <mo>(</mo>
      </math>
      <div>
        <div
          class="square"
          id="square-a"
          style="background-color: hsl(0 0% 50%)"
        ></div>
        <label for="slider-a" class="visually-hidden"
          >Base layer brightness (A)</label
        >
        <input
          type="range"
          id="slider-a"
          min="0"
          max="255"
          value="128"
          aria-label="Base layer brightness (A)"
        />
      </div>
      <math style="top: 10px">
        <mo>,</mo>
      </math>
      <div>
        <div
          class="square"
          id="square-b"
          style="background-color: hsl(0 0% 50%)"
        ></div>
        <label for="slider-b" class="visually-hidden"
          >Blend layer brightness (B)</label
        >
        <input
          type="range"
          id="slider-b"
          min="0"
          max="255"
          value="128"
          aria-label="Blend layer brightness (B)"
        />
      </div>
      <math>
        <mo>)</mo>
        <mo>=</mo>
      </math>
      <div
        class="square-slider-container"
        style="margin-left: -32px; align-self: start"
      >
        <div
          id="square-a-blend"
          style="background-color: hsl(0 0% 50%); position: absolute"
          class="square"
        ></div>
        <div
          id="square-b-blend"
          style="background-color: hsl(0 0% 50%); mix-blend-mode: multiply"
          class="square"
        ></div>
      </div>
    </div>

    <script>
      // prettier-ignore
      const blendModes = {
      "multiply": {
        formula: "<math><mi>A</mi><mo>×</mo><mi>B</mi></math>",
        description: "Multiplies the values of both layers together. Commonly used for creating natural-looking shadows and darkening effects."
      },
      "darken": {
        formula: "<math><mi>min</mi><mo>(</mo><mi>A</mi><mo>,</mo><mi>B</mi><mo>)</mo></math>",
        description: "Retains the darkest pixels of both layers by comparing values and keeping the minimum. Useful for preserving shadows or selectively darkening an image without affecting areas that are already dark."
      },
      "color-burn": {
        formula: "<math><mn>1</mn><mo>−</mo><mfrac><mrow><mn>1</mn><mo>−</mo><mi>A</mi></mrow><mi>B</mi></mfrac></math>",
        description: "Divides the inverted bottom layer by the top layer, then inverts the result. Creates dramatic, high-contrast darkening with intensified shadows and can result in pure black more easily than multiply."
      },
      "linear-burn": {
        formula: "<math><mi>A</mi><mo>+</mo><mi>B</mi><mo>−</mo><mn>1</mn></math>",
        description: "Adds the values of both layers and subtracts 1. Results in darker tones than multiply — produces black whenever the sum of both layers is less than or equal to 1."
      },
      "lighten": {
        formula: "<math><mi>max</mi><mo>(</mo><mi>A</mi><mo>,</mo><mi>B</mi><mo>)</mo></math>",
        description: "Retains the lightest pixels of both layers by comparing values and keeping the maximum. Useful for preserving highlights or selectively lightening an image without affecting areas that are already light."
      },
      "screen": {
        formula: "<math><mn>1</mn><mo>−</mo><mo>(</mo><mn>1</mn><mo>−</mo><mi>A</mi><mo>)</mo><mo>×</mo><mo>(</mo><mn>1</mn><mo>−</mo><mi>B</mi><mo>)</mo></math>",
        description: "The pixels are inverted, multiplied, and inverted again. The result is always lighter than both inputs (opposite of multiply.) Screening with black (0) leaves the value unchanged, while screening with anything lighter brightens it."
      },
      "color-dodge": {
        formula: "<math><mfrac><mi>A</mi><mrow><mn>1</mn><mo>−</mo><mi>B</mi></mrow></mfrac></math>",
        description: "Divides the bottom layer by the inverted top layer. Creates dramatic brightening with blown-out highlights."
      },
      "overlay": {
        formula: "<math><mrow><mo>{</mo><mtable><mtr><mtd><mn>1</mn><mo>−</mo><mo>(</mo><mn>1</mn><mo>−</mo><mn>2</mn><mo>(</mo><mi>A</mi><mo>−</mo><mn>0.5</mn><mo>)</mo><mo>)</mo><mo>×</mo><mo>(</mo><mn>1</mn><mo>−</mo><mi>B</mi><mo>)</mo></mtd><mtd><mtext>if</mtext><mi>A</mi><mo>&gt;</mo><mn>0.5</mn></mtd></mtr><mtr><mtd><mn>2</mn><mo>×</mo><mi>A</mi><mo>×</mo><mi>B</mi></mtd><mtd><mtext>if</mtext><mi>A</mi><mo>≤</mo><mn>0.5</mn></mtd></mtr></mtable></mrow></math>",
        description: "Combines multiply and screen based on the base layer's brightness. Dark areas become darker and light areas become lighter, increasing overall contrast. Preserves the base layer's tonal range while adding the blend layer's contrast."
      },
      "soft-light": {
        formula: "<math><mrow><mo>{</mo><mtable><mtr><mtd><mn>1</mn><mo>−</mo><mo>(</mo><mn>1</mn><mo>−</mo><mi>A</mi><mo>)</mo><mo>×</mo><mo>(</mo><mn>1</mn><mo>−</mo><mo>(</mo><mi>B</mi><mo>−</mo><mn>0.5</mn><mo>)</mo><mo>)</mo></mtd><mtd><mtext>if</mtext><mi>B</mi><mo>&gt;</mo><mn>0.5</mn></mtd></mtr><mtr><mtd><mi>A</mi><mo>×</mo><mo>(</mo><mi>B</mi><mo>+</mo><mn>0.5</mn><mo>)</mo></mtd><mtd><mtext>if</mtext><mi>B</mi><mo>≤</mo><mn>0.5</mn></mtd></mtr></mtable></mrow></math>",
        description: "Applies a subtle lighting effect based on the blend layer's brightness. Values above 0.5 gently lighten, while values below 0.5 gently darken."
      },
      "hard-light": {
        formula: "<math><mrow><mo>{</mo><mtable><mtr><mtd><mn>1</mn><mo>−</mo><mo>(</mo><mn>1</mn><mo>−</mo><mi>A</mi><mo>)</mo><mo>×</mo><mo>(</mo><mn>1</mn><mo>−</mo><mn>2</mn><mo>×</mo><mo>(</mo><mi>B</mi><mo>−</mo><mn>0.5</mn><mo>)</mo><mo>)</mo></mtd><mtd><mtext>if</mtext><mi>B</mi><mo>&gt;</mo><mn>0.5</mn></mtd></mtr><mtr><mtd><mi>A</mi><mo>×</mo><mn>2</mn><mo>×</mo><mi>B</mi></mtd><mtd><mtext>if</mtext><mi>B</mi><mo>≤</mo><mn>0.5</mn></mtd></mtr></mtable></mrow></math>",
        description: "Similar to overlay but with the roles reversed. It combines multiply and screen based on the blend layer's brightness instead of the base layer's. Creates strong lighting effects with more intense contrast than overlay."
      },
      "difference": {
        formula: "<math><mo>|</mo><mi>A</mi><mo>−</mo><mi>B</mi><mo>|</mo></math>",
        description: "Subtracts one layer from the other and takes the absolute value, always producing a positive result. Identical pixels become black (0), while maximum difference produces white (1)."
      },
      "exclusion": {
        formula: "<math><mn>0.5</mn><mo>−</mo><mn>2</mn><mo>×</mo><mo>(</mo><mi>A</mi><mo>−</mo><mn>0.5</mn><mo>)</mo><mo>×</mo><mo>(</mo><mi>B</mi><mo>−</mo><mn>0.5</mn><mo>)</mo></math>",
        description: "Creates an effect similar to difference but with reduced contrast and a softer appearance. The formula is centered around 0.5, so identical mid-gray values (0.5) remain unchanged, while differences produce lighter or darker results without the harsh extremes of difference mode."
      }
    }

      const blendModeSelect = $$("#blendMode");
      const description = $$("#description");
      const formula = $$("#formula");
      const allBlendModeExample = $$("#all-blend-modes-example");
      const inputs = allBlendModeExample.querySelectorAll("input");
      const squareA = $$("#square-a");
      const squareB = $$("#square-b");
      const squareABlend = $$("#square-a-blend");
      const squareBBlend = $$("#square-b-blend");

      function setFormulaAndDescription() {
        const mode = blendModeSelect.value;
        description.innerHTML = blendModes[mode].description;
        formula.innerHTML = blendModes[mode].formula;
      }

      function updateBlendMode() {
        const mode = blendModeSelect.value;
        squareBBlend.style.mixBlendMode = mode;
      }

      blendModeSelect.addEventListener("change", () => {
        updateBlendMode();
        setFormulaAndDescription();
      });

      function updateColors() {
        const aValue = parseInt(inputs[0].value, 10);
        const bValue = parseInt(inputs[1].value, 10);
        const aPercent = (aValue / 255) * 100;
        const bPercent = (bValue / 255) * 100;
        squareA.style.backgroundColor = `hsl(0 0% ${aPercent}%)`;
        squareB.style.backgroundColor = `hsl(0 0% ${bPercent}%)`;
        squareABlend.style.backgroundColor = `hsl(0 0% ${aPercent}%)`;
        squareBBlend.style.backgroundColor = `hsl(0 0% ${bPercent}%)`;
      }

      inputs.forEach((input) => {
        input.addEventListener("input", () => {
          updateColors();
        });
      });

      // Initialize
      updateBlendMode();
      updateColors();
      setFormulaAndDescription();
    </script>
    <p>
      I also plotted
      <a
        href="https://www.desmos.com/calculator/8zb9ovwsoc"
        target="_blank"
        rel="noreferrer noopener"
      >
        each of the non-conditional modes in desmos.</a
      >
      It looks a bit like a modernist painting, but might also help you if you
      take the time to understand it.
    </p>
  </details>

  <h3>Using blending modes as masks</h3>
  <p>
    So how do we use these tools to make the spotlight? The key is understanding
    that the abrupt edges of the
    <span class="pre">color-dodge</span> mode can turn a gradient into a mask.
  </p>
  <math style="font-size: 2rem">
    <mo>C</mo>
    <mo>=</mo>
    <mfrac>
      <mi>A</mi><mrow><mn>1</mn><mo>−</mo><mi>B</mi></mrow>
    </mfrac>
  </math>
  <p>
    With <span class="pre">color-dodge</span>, as the blend pixel approaches 1,
    the denominator approaches zero and the output value increases abruptly.
  </p>
  <p>
    Here's a medium gray base layer and a black-to-white gradient blended over
    it using
    <span class="pre">color-dodge</span>
  </p>
  <img
    src="/images/solid-color-dodge-example.webp"
    width="1724"
    height="390"
    alt="Three squares side-by-side. The left square is gray. The middle square is a black-to-white gradient. The right square is the result of color-dodge blending the two: a square that is lighter gray on its left half and rapidly shifts to white at the midpoint."
  />
  <p>Think about what's happening here.</p>
  <p>A is 0.5</p>
  <p>B ranges from 0 to 1.</p>
  <p>
    On the left, B is 0, so we're dividing 0.5 by 1, which equals 0.5
    <sup aria-labelledby="color-dodge-noteworthiness">2</sup>
  </p>
  <p>
    As B approaches 1, we start to divide A by a smaller and smaller number.
    When B is 0.5, we divide 0.5 by 0.5, which equals 1: pure white. Any higher
    value of B makes no difference because 1 is the lightest value possible.
  </p>
  <p>
    As soon as the blend pixel becomes lighter than the base pixel, the output
    flips to white.
  </p>
  <p>What if we blended a gradient over a noise texture?</p>
  <img
    src="/images/noise-color-dodge-example.webp"
    width="1724"
    height="390"
    alt="Three squares side-by-side. The left square is a grid of pixels, each a different shade of gray. The middle square is a black-to-white gradient. The right square is the result of color-dodge blending the two: a square where the left side is mostly dark gray pixels, and as you move to the right, more and more pixels become white, until the right side is almost entirely white."
  />
  <p>
    Some of the noise pixels have slightly lightened, and many of them have
    turned fully white.
  </p>
  <p>
    Effectively, what's happening is the computer is sampling each pixel and
    comparing it to the gradient. If the gradient is lighter, it hides the
    pixel. The further along the gradient you go, the more pixels get hidden.
  </p>
  <p>
    Now all we need to do is make the remaining pixels black. Fortunately,
    there's another blend mode for that:
    <span class="pre">color-burn</span>
  </p>
  <math style="font-size: 2rem">
    <mo>C</mo>
    <mo>=</mo>
    <mn>1</mn><mo>−</mo>
    <mfrac
      ><mrow><mn>1</mn><mo>−</mo><mi>A</mi></mrow
      ><mi>B</mi></mfrac
    >
  </math>
  <p>
    <span class="pre">color-burn</span> takes the inverse of your base layer,
    divides it by the blend layer, and then takes the inverse of that.
  </p>
  <p>
    Let's <span class="pre">color-burn</span> a black layer over the
    <span class="pre">color-dodge</span> layer.
  </p>
  <img
    src="/images/noise-color-burn-example.webp"
    width="1724"
    height="390"
    alt="Three squares side-by-side. The left square is the result of the previous color-dodge example: gray pixels randomly scattered on the left. The middle square is black. The right square is the result of color-burn blending the two: a square where all the non-white pixels have turned black."
  />

  <p>
    We start by picking one of the remaining visible pixels. Say we pick one
    that's dark gray (0.3)
  </p>
  <ol>
    <li>The inverse of dark gray is a light gray (0.7)</li>
    <li>The blend layer is black (0)</li>
    <li>0.7 / 0 = Infinity</li>
    <li>1 - Infinity = -Infinity</li>
  </ol>
  <p>
    CSS can't display negative infinity: it clamps the value to 0. This is why
    all the gray pixels turn black: we're always going to be dividing them by
    zero.
  </p>
  <p>But there's a special case! What if the pixel we sample is white? (1)</p>
  <ol>
    <li>The inverse of white is black (0)</li>
    <li>The blend layer is black (0)</li>
    <li>0 / 0 = NaN</li>
    <li>1 - NaN = NaN</li>
  </ol>
  <p>
    NaN means "Not a Number", which is a special value used to represent
    undefined or unrepresentable numerical results. Fortunately for us, CSS
    renders these specific errors as white.<sup aria-labelledby="lucky-mode"
      >3</sup
    >
  </p>
  <p>
    And so there you have it. There's some artifacting going on due to tolerance
    for near-white values, but to recap:
  </p>
  <ol>
    <li>
      <span class="pre">color-dodge</span> "hides" pixels that are darker than
      the gradient.
    </li>
    <li><span class="pre">color-burn</span> blackens the remaining pixels</li>
  </ol>
  <p>
    This gives us a pixelated falloff based on the lightness of a gradient that
    we can overlay atop a noise layer.
  </p>
  <h3>Building the effect</h3>
  <p>Now that we understand the principle, let's build it step by step.</p>
  <p>First, we create a div and center some text in it:</p>
  <iframe src="/spotlight-steps/1"></iframe>
  <p>
    Then we place a new div above the text, with a noisy background image.
    Statically positioned elements' backgrounds paint first, which is why the
    absolutely positioned text is shown above it.
  </p>
  <iframe src="/spotlight-steps/2"></iframe>
  <p>
    Then we place a div inside the noise layer and give it a radial-gradient
    from white to black.
  </p>
  <iframe src="/spotlight-steps/3"></iframe>
  <p>
    Because the div is absolutely positioned, it's now painted above the text.
    We can set a <span class="pre">darken</span> blend on the darkness layer so
    that the darker black of the text shows through.
  </p>
  <iframe src="/spotlight-steps/4"></iframe>
  <p>
    Now we can add <span class="pre">mix-blend-mode: color-dodge</span> to the
    spotlight div.
  </p>
  <iframe src="/spotlight-steps/5"></iframe>
  <p>
    But wait, why doesn't the spotlight hide the text? Isn't white lighter than
    black?
  </p>
  <p>Here's our layer structure:</p>
  <pre style="background: #f5f5f5; border-radius: 4px; padding: 16px">
&lt;div class="container"&gt;
  &lt;div class="text"&gt; &lt;3 &lt;/div&gt;
  &lt;div class="darkness"&gt;
    &lt;div class="spotlight"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre
  >
  <p>
    Nesting spotlight inside the noise layer puts it in a new stacking context.
  </p>
  <p>
    When you set a blend mode on an element, it only blends with elements that
    are behind it in the same stacking context. To use a metaphor, the spotlight
    is inside a box (the noise layer). It can blend with the walls of its box,
    but it can't reach outside the box to blend with things sitting next to the
    box.
  </p>
  <p>
    This changes how the box looks, but the box (the noise layer) is still
    blending with the text in <em>its</em> stacking context using
    <span class="pre">darken</span>.<sup aria-labelledby="non-sense">4</sup>
  </p>
  <p>
    Finally, we add a new div over everything, with
    <span class="pre">mix-blend-mode: color-burn</span> and
    <span class="pre">background: #414141</span> to turn all the remaining
    non-white pixels black.<sup aria-labelledby="in-the-end">5</sup>
  </p>
  <iframe src="/spotlight-steps/6"></iframe>
  <p>
    A little JavaScript to make the circle follow the mouse and you've got a
    spotlight!
  </p>
  <p>
    If you'd asked me how blending modes worked before writing this, I would
    have said "by iterating through them until you find one that looks right."
  </p>
  <p>
    I think that's still kind of the case. Experienced photographers probably
    have a stronger intuition about when to use a particular mode for adjusting
    one of their photos, but I'd be surprised if most of them don't also just
    tap the down arrow on the selector to preview what each of the modes would
    do.
  </p>
  <p>
    And I could have implemented all of this with canvas and it would likely
    perform better, but I'd need to have learned the theory regardless, and it's
    cool to learn what's possible with regular CSS nowadays 🙂
  </p>
  <hr />
  <footer>
    <p>
      <span>1</span>
      <span id="hakushi-hasegawa-video"
        >If the website's down / changed, I recorded
        <a href="/assets/vidsdo/hakushi_hasegawa_website_spotlight_effect.mp4"
          >a video</a
        ></span
      >
    </p>
    <p>
      <span>2</span>
      <span id="color-dodge-noteworthiness">
        So <span class="pre">color-dodge</span> can't make a value darker than
        the base pixel. That's good to know.</span
      >
    </p>
    <p>
      <span>3</span>
      <span id="lucky-mode"
        >This is a happy coincidence and different graphical softwares handle
        this case differently. color-burning black over white in Affinity Photo
        turned everything black (though #010101 worked fine.)
      </span>
    </p>
    <p>
      <span>4</span>
      <span id="non-sense"
        >I hope this makes sense. At a certain point you just need to try and
        make something yourself so that it clicks.
      </span>
    </p>
    <p>
      <span>5</span>
      <span id="in-the-end"
        >For this particular noise texture, I found that a dark gray looked
        better than pure black.
      </span>
    </p>
  </footer>
</section>
]]></content></entry><entry><title>this house - man joke</title><link href="https://ikesau.co/things-i-like/this-house-man-joke/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/this-house-man-joke/</id><published>2025-11-21T00:00:00Z</published><updated>2025-11-21T00:00:00Z</updated><content type="html"><![CDATA[
<section id="man-joke">
  <style>
    #man-joke {
      container: man-joke;
      container-type: inline-size;
      a {
        color: black;
      }
      video {
        width: 100%;
        height: auto;
      }
      pre {
        margin: 0;
        padding: 0;
        font-size: 2.775cqw;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=TVs3DsTXoIg"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>this house - man joke</h2>
  </a>
  <video
    src="/vidsdo/man joke.mp4"
    poster="/vidsdo/man joke_poster.webp"
    width="857"
    height="480"
    autoplay
    loop
    muted
  ></video>
  <pre>
xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.xxxo.
x.x.xx.x.x..x.x.xx.x.x..x.x.xx.x.x..x.x.xx.x.x..x.x.xx.x.x..
......x...........x...........x...........x...........x.....</pre
  >
</section>
]]></content></entry><entry><title>boris - flood 3</title><link href="https://ikesau.co/things-i-like/boris-flood-3/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/boris-flood-3/</id><published>2025-11-08T00:00:00Z</published><updated>2025-11-08T00:00:00Z</updated><content type="html"><![CDATA[
<section id="flooded">
  <style>
    #flooded {
      outline: 4px solid blue;
      outline-offset: -4px;
      --time: 16s;

      svg {
        display: block;
        width: calc(100% + 8px);
        position: relative;
        left: -4px;
      }

      .wave1 {
        animation: move var(--time) linear infinite;
      }
      .wave2 {
        animation: move calc(var(--time) * 0.875) linear infinite;
      }

      svg + p {
        margin-top: 0;
      }

      a,
      p {
        color: blue;
      }
      h2 {
        margin-bottom: 0;
      }
    }

    @keyframes move {
      to {
        transform: translateX(-100px);
      }
    }
  </style>

  <a
    href="https://www.youtube.com/watch?v=8XpmjXxs6dc"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>boris - flood 3</h2>
  </a>
  <svg viewBox="0 0 400 100">
    <path
      class="wave1"
      d="M0,50 Q25,25 50,50 T100,50 T150,50 T200,50 T250,50 T300,50 T350,50 T400,50 T450,50 T500,50"
      stroke="blue"
      fill="none"
      stroke-width="2"
    />
    <path
      class="wave2"
      d="M0,50 Q25,25 50,50 T100,50 T150,50 T200,50 T250,50 T300,50 T350,50 T400,50 T450,50 T500,50"
      stroke="blue"
      fill="none"
      stroke-width="2"
    />
  </svg>
  <p>i love boris.</p>
  <p>
    when this track descends into sludgey perdition, they play a cool rhythmic
    trick. the guitar phrase is 14 beats long, but the drums play a 16 beat
    phrase and they cycle around, out of phase, until they unite again in
    unison.
  </p>
  <p>
    if you listen to the studio version with headphones, there's also a full
    stereo pan of the squealing lead guitar. ugggh i love it.
  </p>
</section>
]]></content></entry><entry><title>peter middleton &amp; james spinney - notes on blindness</title><link href="https://ikesau.co/things-i-like/notes-on-blindness/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/notes-on-blindness/</id><published>2025-10-30T00:00:00Z</published><updated>2025-10-30T00:00:00Z</updated><content type="html"><![CDATA[
<style>
  #hercules-and-the-love-affair {
    position: relative;
    background-color: #000;
    color: #000;
    padding: 40px 20px;
    min-height: 100vh;
    font-family: serif;
    *::selection {
      color: #000;
    }
    p,
    a {
      color: #000;
      position: relative;
      z-index: 2;
    }
  }

  #rain {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
    z-index: 1;
  }
</style>
<section id="hercules-and-the-love-affair">
  <canvas id="rain"></canvas>
  <a
    href="https://www.youtube.com/watch?v=0LoOWpWHMQw"
    target="_blank"
    rel="noopener noreferrer"
  >
    <h2>peter middleton & james spinney - notes on blindness</h2>
  </a>
  <p>
    <strong
      >john hull, blind at fourty-five, crests through the dark waves of grief
      to a love of rain. his notes on denial are very resonant to me in this
      moment.</strong
    >
  </p>
  <p>I somehow feel that if I were to accept</p>
  <p>this thing</p>
  <p>if I were to enter into acquiescence</p>
  <p>then I would die</p>
  <p>
    because it would be as if my ability to resist, my will to resist, were
    broken
  </p>
  <p>on the other hand, not to accept seems futile</p>
  <p>because what one is refusing to</p>
  <p>acquiesce <em>in</em> is a fact.</p>
  <p>and now what I have to face is the</p>
  <p>thought that there is no escape</p>
  <p>the thought that I shall now just go on</p>
  <p>with another 20, 30, or even more years</p>
  <p>of</p>
  <p>this</p>
</section>

<script>
  const canvas = document.getElementById("rain");
  const ctx = canvas.getContext("2d");
  const section = document.getElementById("hercules-and-the-love-affair");

  function resizeCanvas() {
    canvas.width = section.offsetWidth;
    canvas.height = section.offsetHeight;
  }

  resizeCanvas();
  window.addEventListener("resize", resizeCanvas);

  const raindrops = [];
  const numberOfDrops = 100;
  let isAnimating = false;
  let animationId = null;

  for (let i = 0; i < numberOfDrops; i++) {
    raindrops.push({
      x: Math.random() * canvas.width,
      y: Math.random() * canvas.height - canvas.height,
      speed: Math.random() * 3 + 4,
      length: Math.random() * 60 + 100,
    });
  }

  function drawRain() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    raindrops.forEach((drop) => {
      const gradient = ctx.createLinearGradient(
        drop.x,
        drop.y,
        drop.x,
        drop.y + drop.length
      );
      gradient.addColorStop(0, "rgba(255, 255, 255, 0)");
      gradient.addColorStop(1, "rgba(255, 255, 255, 1)");

      ctx.strokeStyle = gradient;
      ctx.lineWidth = 20;
      ctx.lineCap = "round";
      ctx.beginPath();
      ctx.moveTo(drop.x, drop.y);
      ctx.lineTo(drop.x, drop.y + drop.length);
      ctx.stroke();

      drop.y += drop.speed;

      if (drop.y > canvas.height) {
        drop.y = -drop.length;
        drop.x = Math.random() * canvas.width;
      }
    });

    if (isAnimating) {
      animationId = requestAnimationFrame(drawRain);
    }
  }

  drawRain();

  const observer = new IntersectionObserver(
    (entries) => {
      entries.forEach((entry) => {
        if (entry.isIntersecting) {
          isAnimating = true;
          drawRain();
        } else {
          isAnimating = false;
          if (animationId) {
            cancelAnimationFrame(animationId);
          }
        }
      });
    },
    { threshold: 0 }
  );

  observer.observe(section);

  if (section.getBoundingClientRect().top < window.innerHeight) {
    isAnimating = true;
    drawRain();
  }
</script>
]]></content></entry><entry><title>phones are about to get more useful</title><link href="https://ikesau.co/blog/our-phones-are-about-to-get-even-more-useful/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/our-phones-are-about-to-get-even-more-useful/</id><published>2025-10-25T00:00:00Z</published><updated>2025-10-25T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    Two years ago, a colleague asked me "concretely, what's a way in which you
    think AI is going to change the world?"
  </p>
  <p>
    I said: the way we relate to and use software. We will stop writing or
    installing it.<sup aria-labelledby="fumble-of-the-century">1</sup>
    We'll instead have an AIs that dynamically write our programs for us.
  </p>
  <p>
    Two years later, I'm feeling even more confident about this. Claude Code and
    Codex are the worst they'll ever be, and they're already one-shotting simple
    webapps.
  </p>
  <p>
    <a href="/tools/drunk-metronome"
      >Check out this <span style="font-family: monospace">~</span>special<span
        style="font-family: monospace"
        >~</span
      >
      metronome I asked Codex to make.</a
    ><sup aria-labelledby="wobble-time">2</sup>
  </p>
  <p>
    I wanted it for months, but never got around to making it myself, because to
    code it by hand would take more time than the idea was worth. But now I can
    get it made in 30 seconds, provided I have my laptop on me.
  </p>
  <p>
    The next step could be making it possible to create these apps by typing a
    prompt on my phone: "Write a program that does X, Y, and Z."
  </p>
  <p>
    The model writes it and stages it somewhere. I'd maybe ask for a few
    iterations, and once satisfied, deploy it on my site.<sup
      aria-labelledby="bitter-lesson"
      >3</sup
    >
  </p>
  <p>
    I think this kind of capability would be really useful, and I'm sure the
    ergonomics will improve rapidly (alongside their capabilities and possible
    complexity, incorporating our phones' cameras and gyroscopes and what have
    you.)
  </p>
  <p>
    For now, it remains a niche power among those who are somewhat technical or
    tool-making. But it seems kind of easy to commodify and market: what could
    be more useful than making it easy to make useful things?
  </p>
  <p>
    Interoperability will be important, and there will still likely need to be
    some organizational effort to design and spread standards so that my bespoke
    apps can interact with other people's bespoke apps.
  </p>
  <p>
    But, basically, we're all going to become Geordi Laforge, Chief Prompt
    Engineer, and everything will go great. There will be no problems.
  </p>
  <video
    controls
    style="width: 100%"
    src="/vidsdo/geordi-laforge-chief-prompt-engineer.mp4"
    poster="/vidsdo/geordi-laforge-chief-prompt-engineer_poster.webp"
  ></video>
</section>
<hr />
<footer>
  <p>
    <span>1</span>
    <span id="fumble-of-the-century"
      >Even more than we already have. Failed to realize the potential of
      personal computing ass generation.</span
    >
  </p>
  <p>
    <span>2</span>
    <span id="wobble-time"
      >You can make the beats per minute wobble around so that your playing will
      sound amateurish. This can add a certain charm to
      <a
        href="https://bigsupermarket.bandcamp.com/track/pro-gear"
        target="_blank"
        rel="noreferrer noopener"
        >some kinds of music</a
      >
      that is hard to imitate if you've spent most of your life developing good
      timing.</span
    >
  </p>
  <p>
    <span>3</span>
    <span id="bitter-lesson">
      I could already make a provisional version of this by writing an API on my
      homeserver, but I could also just wait 6 more months until all the AI
      companies release their own version.
    </span>
  </p>
</footer>
]]></content></entry><entry><title>pretentiousness</title><link href="https://ikesau.co/blog/pretentiousness/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/pretentiousness/</id><published>2025-10-04T00:00:00Z</published><updated>2025-10-04T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    this isn't merriam-webster, but i reckon it's when you're motivated by
    something other than what you should be.
  </p>
  <p>
    say you come out of the cinema with your friends and you start raving about
    how many of the shots were inspired by some french new wave guy.
  </p>

  <p>
    maybe you're authentically stoked about the cinematography (the pretense),
    but maybe you mostly just want to sound smart about movies because of how it
    affects your status in the group.
  </p>
  <p>
    someone who loves film for its own sake should be happy to talk about the
    film at any level with their friends. people aren't familiar with godard?
    that's okay, you could also talk about the acting or the story. if you're
    incapable of meeting people where they're at, i think people will be
    rightfully suspicious that you've got an ulterior motive.
  </p>
  <p>
    sometimes accusations of pretentiousness are just anti-intellectual. i've
    been called pretentious for referencing the history of a genre of music as
    part of my appreciation for a song. it felt genuine to me at the time, and i
    wish the person who said that had just said "i don't know enough about that
    to engage in the same way and i don't want to hear a lecture." or "yeah... i
    liked a different aspect of it." instead it was basically like "shut up,
    nerd."
  </p>
  <p>
    it takes two. one to notice that their passion is alienating their
    interlocutor and one to engage supportively if someone seems excited to talk
    about a subject they love.
  </p>
  <p>
    this stuff all gets worse if you're talking about disliking something. if
    someone's perfomatively liking something, it's easier to overlook that it's
    pretend. if they're being a hater, it's a bad deal: being persuaded to enjoy
    something <em>less</em> in order to feel insecure about my inferior
    taste.<sup aria-labelledby="enjoying-skill-issues">1</sup>
  </p>
  <p>
    pretentiousness doesn't have to be about taste or aesthetics. i was
    pretentious the other day when i got in a little back-and-forth with my
    driving theory instructor about whether or not he had explained something
    correctly. ostensibly i was speaking up to clarify for myself and my fellow
    students, but once he began to double-down on his confusing explanation and
    i started to try to explain to him why it was confusing, i could feel my
    motivation shift to something else: i wanted to outdo him and show that i
    was smart to the group.<sup aria-labelledby="winning">2</sup>
  </p>
  <p>
    it's hard to know what the exact mix of any of our motivations is. i like to
    flex my vocabulary in a way that is a little pretentious, but i also
    genuinely enjoy finding the word that feels like it perfectly conveys what
    i'm trying to say. having multiple motivations isn't necessarily
    pretentious, but you should try to reduce the amount you decieve yourself or
    others as to what they are.
  </p>
  <hr />
  <footer>
    <p>
      <span>1</span>
      <span id="enjoying-skill-issues"
        >negativity is a bad default. i think it's good to criticize things and
        be honest when you didn't enjoy something, but enjoying things is a
        skill and you should spend most of your time in the practice of
        it.</span
      >
    </p>
    <p>
      <span>2</span>
      <span></span>
      <span id="winning">
        the actually smart thing was to say "okay thanks i get it now"
      </span>
    </p>
  </footer>
</section>
]]></content></entry><entry><title>automation</title><link href="https://ikesau.co/blog/automation/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/automation/</id><published>2025-08-30T00:00:00Z</published><updated>2025-08-30T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    More Perfect Union released a
    <a
      href="https://www.youtube.com/watch?v=CQrQrOPmszE"
      rel="noopener noreferrer"
      target="_blank"
      >video on automated truck drivers</a
    >
    (which are now on the roads in Texas.)
  </p>

  <p>They argue:</p>
  <ol>
    <li>
      The "driver shortage" framing is industry spin on the fact that employers
      are deliberately underpaying workers to increase churn and keep the
      average pay grade low.
    </li>
    <li>
      Automation will lead to further degradation of the trucking career that
      has allowed many men to earn a decent wage and quality of life. The
      consequences of this will be dire.
    </li>
  </ol>
  <p>
    Is automation necessarily anti-labour? Is it possible to automate jobs while
    protecting the people who do them?
  </p>
  <img
    style="height: auto; outline: 1px solid gray"
    alt="A screenshot of a youtube comment: 'The society we live in keeps getting worst and worst. We need to stand against this crap'"
    src="/images/worst-and-worst.png"
    width="660"
    height="82"
    loading="lazy"
  />
  <p>
    My supermarket installed 12 self-checkouts several years ago. In the pen,
    there's now one worker who harriedly flits between the stations, swiping
    their lanyard to authorize alcohol purchases. Repetitive and thankless.
    Pretty bad, as far as jobs go.<sup aria-labelledby="trust-bummer">1</sup>
  </p>
  <p>
    I assume most of people doing this job don't love it, but that doing it is
    still one of the better options available to them. Maybe they don't have any
    skills, or the skills from a previous career aren't valued anymore. Maybe
    they like the flexibility of part-time work.<sup
      aria-labelledby="housing-jobs"
      >2</sup
    >
  </p>
  <p>
    All I know is that <em>I</em> wouldn't want that job, and that I'm grateful
    for the privileges of my life that mean it's not yet been an option I've had
    to consider - privileges that I wish were extended to everyone.
  </p>
  <img
    src="/images/typical-psychopath-corporation.png"
    width="626"
    height="60"
    loading="lazy"
    style="height: auto; outline: 1px solid gray"
    alt="A screenshot of a youtube comment: 'The problem is the typical corporation functions at the social level of a psychopath.'"
  />
  <p>
    It's all well and good for me to say that I wish for a world where everyone
    is so taken-care-of that we'd find it unconscionable to require labour that
    alienates<sup aria-labelledby="plane-flying-backwards">3</sup>, but steering
    our shambling society towards such a utopia is really hard to do. How can we
    identify and agree on <em>why</em> we have "bad jobs", align everyone's
    interests to the collective cause of reducing suffering, and correctly
    triage the opportunities we have?<sup aria-labelledby="budget-concrete"
      >4</sup
    >
  </p>
  <p></p>
  <img
    src="/images/olligarchies.png"
    width="768"
    height="86"
    loading="lazy"
    style="height: auto; outline: 1px solid gray"
    alt="A screenshot of a youtube comment: 'i'm convinced the oligarches want to end up with a world where all this things are automated and only they are the only living humans left on earth'"
  />
  <p>
    Maybe the answer is to read more Marx, but I don't think it's possible to
    get the Good Automation that reduces toil, without also fundamentally
    lowering the value of the equivalent human labour and therefore the power of
    those workers' strikes.
  </p>
  <p>i.e. the truckers are right to be concerned.</p>
  <p>
    But I <em>want</em> jobs to be automated. I want humans to do things other
    than scan barcodes and drive along the interstate for the majority of their
    lives. If we still have warehouses filled with humans in 15 years<sup
      aria-labelledby="piss-bottles"
      >5</sup
    >, I think that's because we've shambled wrong, even if it's because we've
    fought tooth and nail for labour.
  </p>
  <p>
    Maybe there's a more middle-ground Scandanavian model. Companies that
    automate must invest some additional amount in continual retraining such
    that automation remains complimentary rather than rivalrous. I'm not
    actually sure if that approach will be able to keep up with the rate at
    which human skill is outcompeted.
  </p>
  <p>
    In any case, I think it's going to be really hard to form a coherent story
    and set of policies to sell automation. Workers are proud of their worth,
    and are going to be skeptical that any self-sacrifice will contribute to a
    greater good, because the collectivist spirit is so dead in the West.
    Conversely, corporations will argue against paying redistributive taxes,
    because it's the profit incentive that drives the transition to full
    automation.
  </p>
  <p>
    Yet, ultimately, I think automation will win. It's going to be hard for
    labour to globally impede technological progress, whereas tech companies
    will be able to easily relocate and improve, until they're so cost-effective
    that even the most labour-sympathetic regions will be unable to resist
    interfacing with the automated economy.
  </p>
  <img
    src="/images/greedy-killer.png"
    width="973"
    height="62"
    loading="lazy"
    style="height: auto; outline: 1px solid gray"
    alt="A screenshot of a youtube comment: 'eventually they will automate their customer base into being too poor to afford their product. their own greed will kill them in the end.'"
  />
  <p>
    Whether or not that irreparably tears the social contract, idk. Hope not.
  </p>
  <hr />
  <footer>
    <p>
      <span>1</span>
      <span id="trust-bummer"
        >it's an additional bummer that, even without any further automation,
        the job wouldn't have to exist if we provided for those who otherwise
        have to shoplift. in new zealand there are honesty boxes: roadside
        stations where bags of produce are left unattended with a small box to
        put money in. if a society sufficiently trusts itself, it doesn't need
        to spend money on enforcement/deterrance.
      </span>
    </p>
    <p>
      <span>2</span>
      <span id="housing-jobs"
        >though with the cost of living being what it is, it's hard to imagine
        this as anything other than supplementary to a full-time job.</span
      >
    </p>
    <p>
      <span>2</span>
      <span id="many-jobs-suck"
        >and many jobs are like this, including the cashier job the
        self-checkout replaced.</span
      >
    </p>
    <p>
      <span>3</span>
      <span id="plane-flying-backwards"
        >Against arguments from thought experiments, Anil Seth:
        <span style="font-style: italic"
          >Can you imagine an A380 flying backwards? Of course you can. Just
          imagine a large plane in the air, moving backwards. Is such a scenario
          really conceivable? Well, the more you know about aerodynamics and
          aeronautical engineering, the less conceivable it becomes.</span
        ></span
      >
    </p>
    <p>
      <span>4</span>
      <span id="budget-concrete"
        >Concretely: starting from the current neoliberal democratic paradigm,
        how do you institute the conditions to correctly allocate between
        investments in education and welfare redistribution, such that your
        society is exactly correctly incentivized to do all the work that
        remains in smoothly bringing about a fully-automated luxury gay space
        society? The answer is that it's impossible to know, so instead we use
        underutilized humans like carpenters use shims.</span
      >
    </p>
    <p>
      <span>5</span>
      <span id="piss-bottles"
        >with or without
        <a
          href="https://www.theverge.com/2021/3/25/22350337/amazon-peeing-in-bottles-workers-exploitation-twitter-response-evidence"
          rel="noopener noreferrer"
          target="_blank"
          >piss bottles</a
        >.</span
      >
    </p>
  </footer>
</section>
]]></content></entry><entry><title>what happens to us</title><link href="https://ikesau.co/blog/what-happens-to-us/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/what-happens-to-us/</id><published>2025-08-29T00:00:00Z</published><updated>2025-08-29T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    When people say "the problem is education" they tend to mean "I want
    everyone to have the same beliefs as me, but persuading adults is too hard."
  </p>
  <p>
    I think it's naive to assume that agreeing on a national curriculum is any
    easier, but assuming that you could, it's even more naive to assume that
    students would internalize the lessons you want them to.
  </p>
  <p>
    For example: in high school, I didn't understand our English curriculum's
    emphasis on literary analysis essays. They seemed mysteriously tautological:
    fill in the essay template to demonstrate to the person marking you that you
    can fill in an essay template.<sup aria-labelledby="aghast-teacher">😱</sup>
  </p>
  <figure>
    <img
      src="/images/kindergarten-vocabulary-worksheet.webp"
      alt="a kindergarten worksheet with 10 basic words on the left and 10 pictures on the right that you have to match by connecting the lines"
      width="2550"
      height="3300"
      style="margin-top: 8px; max-width: 500px; max-height: unset; height: auto"
    />
    <figcaption>like this but with paragraphs instead of lines</figcaption>
  </figure>
  <p>
    I don't mean to insist that the subject of english "justify itself" in that
    stembro way. I just don't remember anyone ever telling me why it was
    worthwhile to learn how to analyze literature. I have since read some greek
    plays and can say with confidence that this was a tragedy.
  </p>
  <p>Here's an explanation that might have worked for me:</p>
  <p style="font-style: italic; padding: 8px">
    Stories are one of the main ways we make sense of the world. Writing is
    another. We write about stories to gain an ability to think about how
    they're written and what they mean. This allows to be more persuasive and
    less susceptable to bullshit. It also allows us to share our perspectives
    with one another, which is essential for democracy.
  </p>
  <p>
    I smashed that out in 2 minutes. It's arbitrary and a thousand alternate
    justifications exist, but the idea is that, for each student, there is a
    justification that could appeal to them.
  </p>
  <p>Why didn't we do this? Some ideas</p>
  <ul>
    <li>
      <strong>We did</strong>
      <ul>
        <li>
          but not often enough to remember 10 years later (wisdom has a
          luridness problem)
        </li>
        <li>
          but I didn't like the justifications ("<em>it'll be on the test</em>",
          "<em>it's needed for jobs that pay a lot of money</em>")
        </li>
        <li>
          but it doesn't work. Existentialism doesn't vibe with kids before they
          know their spelling, or, it doesn't make a measurable difference.
          (also, if every teacher was making the best case for their subject,
          wouldn't it all come out in the wash and students would drift towards
          their natural competencies as we currently do?)
        </li>
        <li>
          but in the wrong way. Teachers mistakenly believe they
          <em>are</em> teaching purpose, simply because the purpose is so
          obvious to them that they don't realize how much more explicit
          articulation it needs.
        </li>
      </ul>
    </li>
    <li>
      <strong>We can't</strong>
      <ul>
        <li>it's too politically contentious to agree on</li>
        <li>
          it's too expensive to personalize per student, teachers are too busy,
          etc
        </li>
        <li>
          teachers are lacking in real-life experience to know all the potential
          applications of what the kids are learning.
        </li>
      </ul>
    </li>
    <li>
      <strong>We shouldn't</strong>
      <ul>
        <li>
          this is something you can only figure out yourself, and it can only
          ever be an ongoing process.
        </li>
      </ul>
    </li>
  </ul>

  <p>
    I suspect the answer is some combination of the above and more.
    <sup aria-labelledby="what-schools-do">🏫</sup> It's clearly not "no one's
    ever thought of it before", but pretending that it is, what outcomes would I
    hope for?<sup aria-labelledby="philospher-king-hubris">🌏</sup>
  </p>
  <p>
    If I was motivated to write literary analysis because I cared about
    democracy, maybe my teacher or I would realize that it would then be good to
    actually try to engage with the substance of other students' arguments.
    Let's actually test if it's working! It's wild to me how little time we
    spent as a class, or in groups, debating what
    <em>V for Vendetta</em> actually meant.
  </p>
  <p>
    We never tried to persuade one another to adopt different beliefs about what
    a story was about, or whether it was good or bad. Our essays were written in
    a near vaccuum, graded more on their internal coherence than in relation to
    other people's arguments. It's astounding, really, how little dialogue there
    was. No opportunities to say "I don't think that makes sense" in response to
    someone's poorly constructed argument. No way to learn better ways of seeing
    things.<sup aria-labelledby="solipsism">🧠</sup>
  </p>
  <p>
    And now we're sleepwalking into education's purpose being entirely lost with
    language models. I see students at cafés copy-pasting to and from their
    moodles and can't help but think "Damn, if only you were a little better at
    questioning what any of this is for."
  </p>
  <p>It's so parallel to the alignment problem that I'd argue it's a comedy.</p>
  <hr />
  <footer>
    <p>
      <span>😱</span>
      <span id="aghast-teacher">
        my english teacher would be horrified to read this.</span
      >
    </p>
    <p>
      <span>🌏</span>
      <span id="philospher-king-hubris">
        it's hard to choose what to say here, because "outcomes for the world's
        education systems" is so enormous, anything I say feels like a narrow,
        arbitrary, and contingent projection of my personal values - the hubris
        of the philosopher king - nevertheless, I can think of one principle
        that feels somewhat politically agnostic: the more we can reconcile our
        desires with the actions available to us, the better. See Amartya Sen's
        <a
          href="https://en.wikipedia.org/wiki/Capability_approach"
          target="_blank"
          rel="noopener noreferrer"
        >
          Capabilities Approach</a
        >.
      </span>
    </p>
    <p>
      <span>🧠</span>
      <span id="solipsism">
        it worked okay for my mathematical education, where memorizing
        algorithms could be done solipsitically, but seems an enormous waste of
        potential motivation to lobotomize the social component from my class's
        english education.<sup aria-labelledby="and-now-look-at-me">🤺</sup>
      </span>
    </p>
    <p>
      <span>🤺</span>
      <span id="and-now-look-at-me"
        >and now look at me, writing an essay for no one</span
      >
    </p>
    <p>
      <span>🏫</span>
      <span id="what-schools-do"
        ><a
          href="https://www.astralcodexten.com/p/your-review-school"
          target="_blank"
          rel="noopener noreferrer"
          >what schools do</a
        >
      </span>
    </p>
  </footer>
</section>
]]></content></entry><entry><title>downbeat illusion</title><link href="https://ikesau.co/blog/downbeat-illusion/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/downbeat-illusion/</id><published>2025-08-19T00:00:00Z</published><updated>2025-08-19T00:00:00Z</updated><content type="html"><![CDATA[
<section id="downbeat-illusion">
  <style>
    #downbeat-illusion {
      .audios-amigo {
        display: flex;
        flex-wrap: wrap;
        gap: 16px;
        audio {
          flex-basis: 100%;
        }
      }
    }
  </style>
  <p>
    <a
      href="https://bigsupermarket.bandcamp.com/track/laura-c"
      target="_blank"
      rel="noopener noreferrer"
      >Laura C by Big Supermarket</a
    >
    is a song about Tomb Raider. I love it.
  </p>
  <p>
    Part of the reason why, is that I cannot reliably hear the downbeat in the
    right place. There is a clear "right" way to hear it that my mind can snap
    into if I try, but most of the time I hear it spasmodic style.
  </p>

  <div class="audios-amigo">
    <strong>wrong</strong>
    <audio loop controls>
      <source src="/audio/laura-c-downbeat-01.mp3" type="audio/mp3" />
    </audio>
    <strong>right</strong>
    <audio loop controls>
      <source src="/audio/laura-c-downbeat-02.mp3" type="audio/mp3" />
    </audio>
  </div>
  <p>
    In the "wrong" way of hearing it, the bass drum hits on the one, which is a
    ubiquitous convention of rock music, and something I am very biased towards
    hearing.
  </p>
  <p>
    But by that counting, the rest of the beat makes no sense: there's a snare
    hit on the first "and" and then on the "four" - a non-ubiquitous
    <em>unconvention.</em>
  </p>
  <p>
    By comparison, hearing it the "right" way (with the bass drum on the first
    "and") gives the song a natural, head-bumping groove. When my mind lurches
    over to hearing it this way, it immediately makes sense and I feel almost,
    like, relief?
  </p>
  <p>
    This doesn't seem to happen to other people as much. Some get a little
    confused in trying to count it, though I think it often has more to do with
    the song's timing being kind of imprecise and wobbly, not due to an
    ambiguous downbeat. In my surveying, most people only ever hear it the
    "right" way, and struggle to hear it my way at all - if they do, it's
    usually with effort and incredulity.
  </p>
  <p>
    It reminds me of the
    <a
      href="https://en.wikipedia.org/wiki/Spinning_dancer"
      target="_blank"
      rel="noopener noreferrer"
      >spinning dancer illusion.</a
    >
    I used to be scared that I would lose my ability to perceive it one way or
    the other, but so far, it seems like I'm always able to oscillate between
    the two, unlike
    <a
      href="/images/mysterious-illusion.webp"
      target="_blank"
      rel="noopener noreferrer"
      >another kind of illusion that is famously one way.</a
    >
  </p>
  <p>
    It's been highly enriching to have a song that highlights instability of my
    subjectivity so reliably... and it bumps, too!
  </p>
</section>
]]></content></entry><entry><title>talking heads - drugs</title><link href="https://ikesau.co/things-i-like/talking-heads-drugs/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/talking-heads-drugs/</id><published>2025-08-10T00:00:00Z</published><updated>2025-08-10T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <style>
    #talking-heads-drugs {
      background-color: black;
      color: white;
      padding: 20px;
      border-radius: 10px;
      position: relative;
      overflow: hidden;
      .dot {
        border-radius: 50%;
        &.flashing {
          animation: flashing infinite;
        }
        &.blurring {
          animation: blurring infinite;
        }
      }
    }
    @keyframes flashing {
      0% {
        opacity: 0;
      }
      50% {
        opacity: 1;
      }
      100% {
        opacity: 0;
      }
    }
    @keyframes blurring {
      0% {
        filter: blur(0);
      }
      50% {
        filter: blur(5px);
      }
      100% {
        filter: blur(0);
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=vlc0_GUdfIQ"
    target="_blank"
    rel="noopener noreferrer"
    style="color: red"
  >
    <h2>talking heads - drugs</h2>
  </a>
  <p>And all I see is little dots</p>
  <p>Some are smeared and some are spots</p>
  <p>Feel like murder but that's alright</p>
  <p>Somebody said there's too much light</p>
  <p>Pull down the shade and it's alright</p>
  <p>It'll be over in a minute or two</p>
  <p>I'm charged up, don't put me down</p>
  <p>Don't feel like talking, don't mess around</p>
  <p>I feel mean, I feel okay</p>
  <p>I'm charged up, electricity</p>
  <p>The boys are making a big mess</p>
  <p>This makes the girls start to laugh</p>
  <p>I don't know what they're talking about</p>
  <p>The boys are worried, the girls are shocked</p>
  <p>They pick the sound and let it drop</p>
  <p>Nobody knows what they're talking about</p>
  <p>I'm charged up, I'm kinda wooden</p>
  <p>I'm barely moving, I study motion</p>
  <p>I steady myself, I fooled myself</p>
  <p>I'm charged up, it's pretty intense</p>
  <p>I'm charged up, don't put me down</p>
  <p>Don't feel like talking, don't mess around</p>
  <p>I feel mean, but I feel okay</p>
  <p>I'm charged up, electricity</p>
  <p>That's what I call it</p>
  <p>Ah-hah</p>
  <script>
    const container = document.querySelector("#talking-heads-drugs");
    const containerWidth = container.offsetWidth;
    const containerHeight = container.offsetHeight;
    for (let i = 0; i <= 200; i++) {
      const dot = document.createElement("div");
      dot.classList.add("dot");
      const animationType = Math.random() < 0.5 ? "flashing" : "blurring";
      const animationDuration = Math.random() * 5 + 1;
      const backgroundColor = ["#ff008a", "#fff300", "#00ff73", "#000bff"][
        Math.floor(Math.random() * 4)
      ];
      dot.style.backgroundColor = backgroundColor;
      dot.classList.add(animationType);
      dot.style.animationDuration = `${animationDuration}s`;
      dot.style.width = `${Math.random() * 10}px`;
      dot.style.height = dot.style.width;
      dot.style.position = "absolute";
      dot.style.left = `${Math.random() * containerWidth}px`;
      dot.style.top = `${Math.random() * containerHeight}px`;
      container.appendChild(dot);
    }
  </script>
</section>
]]></content></entry><entry><title>bomfunk mc's freestyler feminism</title><link href="https://ikesau.co/blog/bomfunk-mcs-freestyler-feminism/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/bomfunk-mcs-freestyler-feminism/</id><published>2025-08-08T00:00:00Z</published><updated>2025-08-08T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    belgian ISP Telenet
    <a
      href="https://www.youtube.com/watch?v=KLH2zNdXsmA"
      target="_blank"
      rel="noopener noreferrer"
    >
      remade a music video</a
    >
    straight from the top of my childhood. it's cool/inspiring/funny to see how
    things have changed.
  </p>
  <video
    src="/vidsdo/freestyler-1999.mp4"
    poster="/vidsdo/freestyler-1999_poster.webp"
    autoplay
    muted
    loop
    height="576"
    width="1130"
    style="width: 100%; height: auto"
  ></video>
  <video
    src="/vidsdo/freestyler-2019.mp4"
    poster="/vidsdo/freestyler-2019_poster.webp"
    autoplay
    muted
    loop
    height="576"
    width="1130"
    style="width: 100%; height: auto"
  ></video>
</section>
]]></content></entry><entry><title>superman (2025)</title><link href="https://ikesau.co/blog/superman-2025/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/superman-2025/</id><published>2025-08-02T00:00:00Z</published><updated>2025-08-02T00:00:00Z</updated><content type="html"><![CDATA[
<section>
  <p>
    i saw superman yesterday. the plot is that
    <span class="spoilers" tabindex="0">lex luthor is up to no good.</span>
  </p>
  <p>(there will be uncensored spoilers throughout the rest of this thing.)</p>
  <p>
    the film has a lot of funny movie logic, but basically does what it needs to
    do. i liked how perfunctorily the monsters of the week were treated, the
    excessive number of times superman stops what he's doing to stop something
    from falling on someone<sup aria-labelledby="supershoutout">1</sup>, and lex
    luthor's technique of beating superman by micromanaging bizarro from a
    mission control center with a walkie talkie.
  </p>
  <p>
    the movie's g-rated and almost completely bloodless.<sup
      aria-labelledby="supershit"
      >2</sup
    ><span>
      every time superman bodies someone, there's an obligatory chaser shot of
      the goon writhing around alively. the themes and characterization are
      accordingly light.</span
    ><sup aria-labelledby="superzionism">3</sup>
  </p>
  <p>
    afterwards, i was like "well, that was kind of bad but i also enjoyed
    myself"
  </p>
  <p>
    but whence "that was kind of bad" ? were my expecations that this movie was
    going to be anything other than what it was? if i enjoyed myself, what's the
    actual problem?
  </p>
  <p>
    i think it's that i actually have a secret fascination with the idea of
    superman, and am really curious about how other people run the thought
    experiment of "what would happen if one person had the ultimate
    <a
      href="https://en.wikipedia.org/wiki/Monopoly_on_violence"
      target="_blank"
      rel="noopener noreferrer"
      >monopoly on violence</a
    >?" james gunn chose to write a dramatic story, not a polsci wargame, and so
    i was a little disappointed.
  </p>
  <p>
    the superman movie i want to see is
    <strong>
      utilitarian superman hellbent on creating the conditions for global
      liberal democracy utopia.</strong
    >
  </p>
  <p>some things he would do:</p>
  <ul>
    <li>throw all the nukes into the sun</li>
    <li>drop the worst guys into a volcano on live TV</li>
    <li>
      abduct all the world leaders and take them to an private island resort for
      6 months where they have to microdose LSD and do team building
      exercises<sup aria-labelledby="superhigh">4</sup>
    </li>
    <li>
      launch a global journalism fund that creates multinational newsrooms
      around the world with a rigourous commitment to truth-finding, calling out
      corruption, and fostering a cooperative consensus of reality
    </li>
    <li>
      instruct all governments to implement a plan that will end all factory
      farming in 2 years
    </li>
    <li>
      create united nations v2, staffed by the recently reprogrammed world
      leaders, mandated to create a constitution that sets the rules for how
      superman can be democratically controlled from there on
    </li>
  </ul>
  <p>
    and i think there are a tonne of ways you could complexify the plot for
    dramatic tension, if watching a rube goldberg machine isn't your thing:
  </p>
  <ul>
    <li>
      the slippery slope from superman smashing the killer drone factory in
      ukraine to intervening in light border skirmishes between india and
      pakistan to zipping around the philippine sea to search every fishing ship
      for weapons.
    </li>
    <li>
      the supermedia organization criticizing superman the most vocally, testing
      his commitment to the ideal of free speech
    </li>
    <li>
      arguments from citizens that authoritarianism is bad, no matter how
      benevolent it is (though this is a cliché found in every gritty comic
      book)
    </li>
    <li>
      moral leadership not filtering down into each country's institutions i.e.
      the CIA rejecting its proselyte president, and each tier of the state
      needing its own session at Camp PLUR
    </li>
    <li>
      phycisists and economists insisting he simply becomes a
      <a
        href="https://www.smbc-comics.com/comic/2011-07-13"
        target="_blank"
        rel="noopener noreferrer"
        >transitional power source</a
      >
    </li>
  </ul>
  <p>
    if you wanted to be extra cynical<sup aria-labelledby="superrepetitive"
      >5</sup
    >, you could have the movie show superman's transformation from ambitious
    idealist to the very veidt-style existential threat that humanity unites to
    defeat, but i think i'd prefer the version where, despite some bumps and
    unintended consequences along the way, things mostly work out, and the world
    reaches a stable form of peace and prosperity.
  </p>
  <p>
    i think that's the more subversive choice: taking superman's
    incorruptibility seriously and exploring what <em>world peace</em> might
    actually look like. to ask what if the real conflict isn't "will superman
    become evil" but "can humanity be forced to be free?"
  </p>
  <p>
    that would be the real punk rock thing to do.<sup
      aria-labelledby="superreference"
      >6</sup
    >
  </p>
</section>
<hr />
<footer>
  <p>
    <span>1</span>
    <span id="supershoutout"
      >shoutout to skyscrapers being monolithic rigid body structures that don't
      crumble around superman's hands.</span
    >
  </p>
  <p>
    <span>2</span>
    <span id="supershit"
      >though with a surprising number of "shit" utterances, lex luthor saying
      that superman's grooming earth and has a harem, and the last shot being of
      superman in a gooncave of familial love.</span
    >
  </p>
  <p>
    <span>3</span>
    <span id="superzionism"
      >people are arguing that it's specifically and intentionally an
      anti-israel film, which i find kind of far-fetched. the dictator of
      boravia (vaguely eastern european-coded nation) unjustly invades jarhanpur
      (nation of defenseless people with brown skin) but the resemblance
      basically stops there. i find it far more plausible that gunn needed a
      simplistic war of aggression for his kids movie and drew as much from the
      russian invasion of ukraine, or the iraqi invasion of kuwait, or the
      soviet invasion of afghanistan as anything. if you forcibly mapped it on
      to israel-palestine, israel is more like condemnable boravia yes, but
      sometimes a generic fictional war is just a generic fictional war.
    </span>
  </p>
  <p>
    <span>4</span>
    <span id="superhigh"
      >i would be especially interested in watching these scenes, ideally
      presented like a BBC wildlife documentary.
    </span>
  </p>
  <p>
    <span>5</span>
    <span id="superrepetitive"
      >or boringly insistent that "power corrupts" is the one axiom we must
      always repeat.</span
    >
  </p>
  <p>
    <span>6</span>
    <span id="superreference">iykyk.</span>
  </p>
</footer>
]]></content></entry><entry><title>rolling physical dice for no purpose is fun</title><link href="https://ikesau.co/blog/rolling-physical-dice-for-no-purpose-is-fun/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/rolling-physical-dice-for-no-purpose-is-fun/</id><published>2025-06-12T00:00:00Z</published><updated>2025-06-12T00:00:00Z</updated><content type="html"><![CDATA[
<style>
  #rolling-physical-dice-for-no-purpose-is-fun {
    .wobble-container {
      aspect-ratio: 2000 / 1089;
      max-width: 100%;
      overflow: hidden;
      border: 10px solid #111;
    }
    img {
      animation: zoom-out 300s linear;
      animation-iteration-count: 1;
      margin: unset;
      width: 100%;
      max-height: unset;
    }
  }
  @keyframes zoom-out {
    0% {
      transform: scale(20);
    }
    100% {
      transform: scale(1);
    }
  }
</style>
<p></p>
<div class="wobble-container">
  <img src="/images/dice.png" width="2000" height="1089" />
</div>
<p>i'm talking that toy block, developing sense of agency shit.</p>
<p>i challenge you to roll three sixes for no reason.</p>
]]></content></entry><entry><title>captain beefheart - dirty blue gene</title><link href="https://ikesau.co/things-i-like/captain-beefheart-dirty-blue-gene/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/captain-beefheart-dirty-blue-gene/</id><published>2025-05-26T00:00:00Z</published><updated>2025-05-26T00:00:00Z</updated><content type="html"><![CDATA[
<section style="position: relative; aspect-ratio: 1/1">
  <img
    src="/images/doc-at-the-radar-station.webp"
    width="800"
    height="800"
    style="
      margin: 0;
      width: 100%;
      max-height: unset;
      height: auto;
      opacity: 0.5;
      position: absolute;
      top: 0;
      left: 0;
      z-index: 1;
      object-fit: none;
    "
    alt="the back album art for doc at the radar station. a monochrome portrait of the band wearing white shirts and ties. black text on a solid white background with the title and tracklisting."
  />
  <div style="z-index: 2; position: relative; background-color: #ffffffaa">
    <a
      style="color: black"
      href="https://www.youtube.com/watch?v=okU-EBkQ-wM"
      target="_blank"
      rel="noopener noreferrer"
      ><h2>captain beefheart - dirty blue gene</h2></a
    >
    <p>
      i hadn't listened to this album before, but i've definitely listened to
      <a
        style="color: black; font-weight: bold"
        href="/thing-i-like/shop-regulars.html"
        >someone who has.</a
      >
    </p>
    <p>she's not bad.</p>
    <p>she's just ge-ne-tic-ally mean.</p>
    <p>dirty</p>
    <p>blue</p>
    <p>gene.</p>
  </div>
</section>
]]></content></entry><entry><title>tears for fears - head over heels</title><link href="https://ikesau.co/things-i-like/tears-for-fears-head-over-heels/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/tears-for-fears-head-over-heels/</id><published>2025-05-20T00:00:00Z</published><updated>2025-05-20T00:00:00Z</updated><content type="html"><![CDATA[
<style>
  #stars {
    background: black;
    color: white;
    position: relative;
    overflow: hidden;
    min-height: 200px;
    background: black;
    background-image: none;
    font-family: serif;
    font-size: 1.75rem;
    text-align: center;
    background-image: linear-gradient(
      oklch(0.452 0.313214 264.052 / 30%),
      oklch(0.628 0.2577 29.23 / 12.5%)
    );
  }

  .star {
    position: absolute;
    background-color: white;
    border-radius: 50%;
    animation-iteration-count: infinite;
  }

  @keyframes twinkle {
    0%,
    100% {
      opacity: 0.2;
      transform: scale(0.8);
    }
    50% {
      opacity: 1;
      transform: scale(1.2);
    }
  }

  @keyframes twinkle-fast {
    0%,
    100% {
      opacity: 0.4;
      transform: scale(0.9);
    }
    50% {
      opacity: 1;
      transform: scale(1.1);
    }
  }

  @keyframes twinkle-slow {
    0%,
    100% {
      opacity: 0.1;
      transform: scale(0.7);
    }
    50% {
      opacity: 0.8;
      transform: scale(1);
    }
  }
</style>
<script>
  function generateTwinklingStarsBackground() {
    const section = document.querySelector("#stars");
    if (!section) {
      console.error("Container with ID #stars not found.");
      return;
    }

    const NUMBER_OF_STARS = 150;
    const STAR_MIN_SIZE = 1;
    const STAR_MAX_SIZE = 3;
    const ANIMATION_NAMES = ["twinkle", "twinkle-fast", "twinkle-slow"];

    const existingStars = section.querySelectorAll(".star");
    existingStars.forEach((star) => star.remove());

    const containerRect = section.getBoundingClientRect();
    const containerWidth = containerRect.width;
    const containerHeight = containerRect.height;

    if (containerWidth === 0 || containerHeight === 0) {
      return;
    }

    for (let i = 0; i < NUMBER_OF_STARS; i++) {
      const star = document.createElement("div");
      star.classList.add("star");

      const size =
        Math.random() * (STAR_MAX_SIZE - STAR_MIN_SIZE) + STAR_MIN_SIZE;
      star.style.width = `${size}px`;
      star.style.height = `${size}px`;

      star.style.left = `${Math.random() * (containerWidth - size)}px`;
      star.style.top = `${Math.random() * (containerHeight - size)}px`;

      const animationName =
        ANIMATION_NAMES[Math.floor(Math.random() * ANIMATION_NAMES.length)];
      const animationDuration = Math.random() * 4 + 2;
      const animationDelay = Math.random() * 5;

      star.style.animationName = animationName;
      star.style.animationDuration = `${animationDuration}s`;
      star.style.animationDelay = `${animationDelay}s`;

      section.appendChild(star);
    }
  }

  document.addEventListener("DOMContentLoaded", () => {
    generateTwinklingStarsBackground();

    let resizeTimeout;
    window.addEventListener("resize", () => {
      clearTimeout(resizeTimeout);
      resizeTimeout = setTimeout(generateTwinklingStarsBackground, 250);
    });
  });
</script>
<section id="stars">
  <a
    style="color: white"
    href="https://www.youtube.com/watch?v=726IPv--fko"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>tears for fears - head over heels</h2></a
  >
  <p>one of the most loopable songs to have ever been written. unnnh</p>
</section>
]]></content></entry><entry><title>memory</title><link href="https://ikesau.co/blog/memory/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/memory/</id><published>2025-05-17T00:00:00Z</published><updated>2025-05-17T00:00:00Z</updated><content type="html"><![CDATA[

<p>
    In 2019, a large chandelier was installed underneath Granville Street
    Bridge, to <em>aesthetically enhance</em> the area. It was controversial
    at the time - a symbol of what's wrong with luxury condo development.<sup aria-labelledby="public-art-bylaw"">1</sup>
</p>
<p>
    I used to work near Granville Island, so when I visited Vancouver in
    early 2025, I wanted to walk around my old stomping grounds and pay the
    chandelier a visit.
</p>
<p>
    I walked to where I remembered it being installed, and discovered it had
    been removed, presumably for maintenance reasons. Disappointed, I went
    home and lamented to my sister.
</p>
<p>She replied, "Oh, it's not there anymore? By the north entrance?"</p>
<p>"By the south, you mean. And no, there's nothing."</p>
<p>
    "It was never at the south entrance. It was installed at the north
    entrance."
</p>
<p>"What are you talking about?"</p>
<p>
    I argued with my sister - who lives in Vancouver and has been to
    Granville Island countless times in the last 6 years - that she was
    wrong. I had seen that chandelier many times while working near the
    south entrance.
</p>
<p>
    After 10 minutes, she was unconvinced but sympathetic, and so we took to
    the internet, where every single article, blog, photo, or video we could
    find confirmed that the chandelier was installed and
    <em>had-only-ever-been-located</em> at the north entrance.
</p>
<p>
    I felt mad. Both ways. This was a conspiracy. I was
    <em>so</em> sure that I had seen the chandelier at the south entrance,
    and that this was all some horrible kind of gaslighting.
</p>
<p>
    But after scouring through every obscure source of evidence I could
    think of, I had nothing to back me up.
</p>
<p>Finally, reluctant and unhappy, I quietened.</p>
<p>
    I went to the north entrance a few days later. The chandelier was there.
    I looked around. I had no memory of this part of the island.
</p>
<p>
    Months have passed. I'm pretty sure what happened is that the ceiling of
    the bridge looks the same from both entrances, and I saw so many photos
    of the chandelier in the news with the familiar ceiling of the bridge
    behind it that I assumed they must have been taken from the place I knew
    where the ceiling looked like that.
</p>
<p>
    So now I have direct evidence to the contrary, and a plausible story as
    to how I got so confused in the first place. I no longer believe the
    chandelier was ever installed near the south entrance. And yet.
</p>
<p>
    I <em>still have the memory</em> of walking past it during my lunch
    break.
</p>

<hr />
<footer>
    <p><span >1</span> <span id="public-art-bylaw">vancouver is the most expensive city in canada and it's not because everyone is flocking there to look at the sculptures. <a target="_blank" rel="noopener noreferrer" href="https://vancouver.ca/parks-recreation-culture/create-and-place-public-art.aspx">this is a bad scheme.</a></span></p>
</footer>
<hr />
<p>related reading</p>
<ul>
    <li>
        <a
            href="https://theconversation.com/flashbulb-memories-of-dramatic-events-arent-as-accurate-as-believed-64838"
            target="_blank"
            rel="noopener noreferrer"
        >
            Flashbulb memories of dramatic events aren’t as accurate as
            believed
        </a>
        (or any of the writing on Flashbulb Memories and Challenger Rocket
        memory experiments)
    </li>
    <li>
        <a
            href="http://richardcolby.net/writ2000/wp-content/uploads/2019/10/Truth-of-Fact-Truth-of-Feeling.pdf"
            target="_blank"
            rel="noopener noreferrer"
            >The Truth of Fact, The Truth of Feeling</a
        >
        by Ted Chiang
    </li>
</ul>
]]></content></entry><entry><title>smerching</title><link href="https://ikesau.co/blog/smerching/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/smerching/</id><published>2025-05-16T00:00:00Z</published><updated>2025-05-16T00:00:00Z</updated><content type="html"><![CDATA[
<p>smerching is when you're looking for an emoji.</p>
<p>
  usually we smerch because we can't remember which drawer the emoji we're
  looking for is stored in (<em>is 💦 nature or human?</em>), but sometimes also
  because we're not quite sure which pictogram best conveys the tone of what
  we're trying to express, and even less frequently because the emoji picker
  we're using isn't on the latest unicode version and isn't showing 🫨 even
  though we swear we've looked everywhere.
</p>
]]></content></entry><entry><title>anyone ft. lolina - man made hill</title><link href="https://ikesau.co/things-i-like/anyone-featuring-lolina-man-made-hill/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/anyone-featuring-lolina-man-made-hill/</id><published>2025-05-16T00:00:00Z</published><updated>2025-05-16T00:00:00Z</updated><content type="html"><![CDATA[
<section style="background-color: #fffe9d">
  <a
    style="color: #4f5e2e; text-align: center; width: 100%"
    href="https://manmadehill.bandcamp.com/track/anyone-ft-lolina"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>anyone ft. lolina - man made hill</h2></a
  >
  <img
    width="512"
    height="517"
    src="/images/delicious-logo-man-made-hill.webp"
    alt="the album art for delicious logo by man made hill. a solid yellow background with the album title drawn in vibrant, varied lettering. a pencil sketch of a bearded dude with a mullet is the primary artwork."
  />
  <p>
    my favourite song from this telephone explosion release (<em
      >Delicious Logo</em
    >
    by Man Made Hill), which unfortunately for my ears, mostly sounds nothing
    like this.
  </p>
  <p>
    the album is interesting, though. i felt compelled to defend it when sharing
    it with someone, who found it annoying and unpleasant. it's not
    <em>not</em> those things, but isn't it also lovingly made? eliding
    distortion, or screaming, or atonality - which are the more typical ways of
    making music grate - the music is written with a deliberate & boorish
    unseriousness. but it also <em>cares</em>. it's attentive to the sonic
    details of the eighties pop music that it draws from.
  </p>
  <p>
    it's not tim & eric, nor some kung fury-type parody. it's something that
    makes you feel really weird if you fall asleep listening to it, overtired
    and alone at two in the morning. don't ask me how i know.
  </p>
</section>
]]></content></entry><entry><title>talking heads - animals</title><link href="https://ikesau.co/things-i-like/talking-heads-animals/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/talking-heads-animals/</id><published>2025-04-18T00:00:00Z</published><updated>2025-04-18T00:00:00Z</updated><content type="html"><![CDATA[
<section id="talking-animals-heads">
  <style>
    #talking-animals-heads {
      text-transform: uppercase;
      img {
        max-width: 25%;
        height: auto;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=96GCfykZ0qE"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>talking heads - animals</h2></a
  >
  <p>
    <a
      href="https://www.youtube.com/watch?v=eBiIFhg0Jnc"
      target="_blank"
      rel="noopener noreferrer"
    >
      or the studio version with the guitar in the vampout, good god.
    </a>
  </p>
  <p>
    the last
    <a
      href="https://thehecksdotcom.bandcamp.com/album/my-star"
      target="_blank"
      rel="noreferrer noopener"
      >hecks album</a
    >
    sounded like this
  </p>
  <div style="display: flex; flex-wrap: wrap">
    <img
      src="/images/animals/African_Elephant_Transparent.png"
      loading="lazy"
      height="300"
      width="300"
    />
    <img
      src="/images/animals/cutia_9.1.jpg"
      loading="lazy"
      height="250"
      width="206"
    />
    <img
      src="/images/animals/Duck_bends.gif"
      loading="lazy"
      height="126"
      width="120"
    />
    <img
      src="/images/animals/flamingo.gif"
      loading="lazy"
      height="127"
      width="183"
    />
    <img
      src="/images/animals/orange-frog-ani.gif"
      loading="lazy"
      height="111"
      width="86"
    />
    <img
      src="/images/animals/tumblr_m4fz2z6JQP1r5d0y2o1_100.gif"
      loading="lazy"
      height="83"
      width="79"
    />
    <img
      src="/images/animals/Very_big_cow.gif"
      loading="lazy"
      height="110"
      width="112"
    />
    <img
      src="/images/animals/yeller.gif"
      loading="lazy"
      height="297"
      width="235"
    />
  </div>
</section>
]]></content></entry><entry><title>business idea</title><link href="https://ikesau.co/blog/business-idea/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/business-idea/</id><published>2025-04-13T00:00:00Z</published><updated>2025-04-13T00:00:00Z</updated><content type="html"><![CDATA[
<p>"museum of thirst"</p>

<p>
  ostensibly an exhibit about the history of water and plumbing. it takes an
  hour to walk through. there are salted snacks at the start. heaters are turned
  up high. there are water fountains and vending machines throughout, but
  they're all out of order. there's a stationary bike that powers a water pump,
  but no matter how hard you pedal you're always just a bit short of getting
  water. thirst-generating pictures everywhere of sweating glasses of icy water,
  etc.
</p>

<p>
  FINALLY, when you get to the end after an hour of being thirstier than you've
  ever been in your life, there's a water bar that has every kind of water on
  tap. bliss. amazing. everyone gulps the water down feeling the most intense
  kind of relief they've ever felt...
</p>

<p>...so far. they look up and see the sign. "exhibit 2: museum of urgency"</p>
]]></content></entry><entry><title>let me level with ya</title><link href="https://ikesau.co/blog/let-me-level-with-ya/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/let-me-level-with-ya/</id><published>2025-02-20T00:00:00Z</published><updated>2025-02-20T00:00:00Z</updated><content type="html"><![CDATA[
<p>
  <em
    >Tul, the fearsome barbarian, pursues the duke down one of the castle’s
    corridors. Elsie, his gnomish wizard companion trails behind, holding her
    velvet hat in place with one hand and a crumpled scrollbook with the other.
    Slam! The duke locks the door behind him, and his footsteps disappear up the
    tower. Roaring, Tul crashes his shoulder into the door, but he rolled a 2,
    so the door doesn’t budge. When Elsie catches up, she rolls a 20, and the
    door bursts open. The duke can’t have gotten far!</em
  >
</p>

<p>
  This is an especially unflattering example of a kind of thing that can happen
  in D&amp;D.<sup aria-labelledby="creative-liberties">1</sup> The character who
  should be able to do the thing, can’t, and the character who shouldn’t, can.
  Ideally you come up with a narratively satisfying reason for this (Elsie
  actually noticed the door’s hinges were exposed, and unscrewed them) but in
  the moment, Tul fails at the thing he’s meant to be good at.
</p>

<p>
  <em
    >The duo sprint to the top of the tower, but it’s empty save for a clouded
    mirror with runes etched around its frame. Elsie scrutinizes them. She rolls
    a 7 and so recognizes that they’re written in an infernal script, but
    doesn’t know what it says. Tul gives it a go, and rolls an 18. He reckons
    it’s a portal device which the duke has used to escape from their clutches
    again.</em
  >
</p>

<p>
  How’d you figure that out, Tul? Oh, you saw an artifact like this when you
  were young? Okay, sure.
</p>

<p>
  It’s not implausible, but it sucks for Elsie. She has this whole backstory
  about how she studied for years at the Gnomish Academy, but because she’s only
  level 3, the rules say that she’ll only succeed at trying to investigate
  things 11/20ths of the time.
</p>

<p>
  It's in this way that D&amp;D is a <em>highly structured</em> fantasy
  roleplaying game. It gives its players rules to follow and a way to establish
  the probabilities of risky outcomes that make the story suspenseful.
</p>

<p>
  These rules are <em>simulationist</em>. The Player’s Handbook tells you how
  things work in the same way that the laws of physics and biology do: here’s
  how fast you can run; here’s how far a fireball can fly; here’s the number you
  need to roll higher than on a twenty-sided die to hit a far away target. If
  you don’t run to be within range of the goblin, you can’t hit them with your
  fireball, which means they’ll be able to get away. Just like real life.
</p>

<p>
  In this magical physics sandbox, memorable &amp; amazing adventures happen,
  purely through the power of your collective imaginations. It truly is amazing,
  and good D&amp;D rules.
</p>

<p>
  But bad D&amp;D can happen. Everyone has different views on what it
  constitutes, but mine are converging on the idea that a lot of it is baked
  into the fundamental design of the game.
</p>

<hr />

<p><strong>Level 1</strong></p>

<p>
  The first tabletop roleplaying game I ever played was Dungeons &amp; Dragons
  Fourth Edition. I was fourteen, playing over the internet with some guys from
  Texas that I knew through video games.
</p>

<p>
  Like all of our influences, Fourth Edition itself was very video gamey, but I
  fell in love with the agentic freedom it granted. Yes, we were spending most
  of the time fighting monsters and using our special abilities that did
  area-of-effect damage in tactically optimal ways, but I loved that I could
  interact with my fellow players in-character, and choose to pursue
  <em>any</em> way forward that I wanted. It was a dramatically blindered
  version of the game, but still kaleidoscopic compared to the 2-colour palette
  of any
  <a href="https://en.wikipedia.org/wiki/RAS_syndrome">video game RPG</a> I’d
  played till then.
</p>

<p><strong>Level 2</strong></p>

<p>
  Skip forward some years. That campaign had ended, a new version of D&amp;D had
  come out, and new genre of Entertainment Product had risen: Actual Play
  podcasts. These shows - <em>Critical Role</em>, <em>Harmonquest</em>,
  <em>Dimension 20</em> - brought Los Angeles creative talent to my nerdy hobby,
  and completely revolutionized what I understood the game to be. D&amp;D wasn’t
  just a way to play fractal Skyrim, but an actually-good vehicle for improvised
  comedy and story-telling.
</p>

<p>
  They did accents and voices. Their characters made choices that were
  self-sabotaging. Their instincts were informed by screenwriting, and they
  paced the game by cutting between scenes like a TV show script.<sup
    aria-labelledby="escapism-escapism"
    >2</sup
  >
</p>

<p>
  I began to realize that there was more to the game than the video
  game-mechanical success of finishing the quest and acquiring the loot. There
  was also a narrative success in discovering your character; having fun in the
  downtime scenes; Really Caring about your peers and the NPCs.
</p>

<p>
  The extent to which that had been happening to me before was incidental. A
  neat side effect of playing the real game. I’ve since realized it’s actuallly
  the principle reason I want to play, and the trouble is that a lot of
  D&amp;D’s design pulls in the opposite direction.
</p>

<hr />

<p>
  As it’s commonly played, D&amp;D requires the Dungeon Master to prepare a lot
  in advance. You want to have a lot of things ready for all the contingencies
  of your players’ actions. If you have a village, who’s in it? Your players
  should be free to talk to any of them, so what are they like? What are their
  motives? If you have roads leading out of your village, where do they go? If
  there’s danger, how can it be construed to the form of an exciting combat
  encounter that the players have fair odds of surviving?
</p>

<p>
  For people who aren’t good at improvising, figuring out all of this in advance
  feels like a good way to make sure you won’t get flustered in the moment, or
  fail to come up with anything interesting for your players to do. For years, I
  actually really enjoyed doing this. Every week, I’d spend a couple of hours
  worldbuilding, or designing dungeons, or creating puzzles. It was a great
  creative outlet.
</p>

<p>
  But I think it also had a pacifying effect on the players, especially the new
  ones. The complexity of the D&amp;D’s rules already put them in a position of
  recipiency, and from there, it wasn’t a large leap to infer that the story of
  this game was also to be recieved, to be <em>experienced</em>.
</p>

<p>
  This can work okay if they’re <em>liking that experience</em>, but when I
  started my last group that didn’t jibe with my ideas as much, it started to
  feel wasteful and unsatisfying. They didn’t like my locations or NPCs. They
  didn’t bite the plot hooks I set. I don’t think they felt like the game’s
  calls to action spoke to their characters. The group lost its momentum and I
  lost my spark.
</p>

<p>
  Now, this was first and foremost a communication problem. If we’d have some
  so-called Session Zeroes to talk about what kind of game we wanted to play,
  before any dice were rolled, a lot of this disappointment could have been
  avoided. If only I’d spent half as much time working with the players to
  develop their characters and prepare things that directly tied into their
  motives as I did thinking about the political factions of my made-up city
  state!
</p>

<p>Alas.</p>

<p>
  D&amp;D doesn’t <em>have</em> to be this way, but its design and luminaries
  encourage it, and I think that’s why I made that mistake. As popularly
  performed, the Dungeon Master is the god-referee of the game. They know
  everything that isn’t the character’s thoughts, and they reveal it to the
  players with authoritative power. The reason those Actual Play shows were so
  compelling was because of all the work their DMs did. They had so many ideas.
  Their characters were so thought-through. The world felt so alive.
</p>

<p>
  I still think that’s true (Brennan Lee-Mulligan, you’re a genius), but not the
  whole truth. The reason those Actual Play shows were so compelling was because
  everyone was <em>actually compelled</em> to enthusiastically engage with the
  game, and in the case of Dimension 20, this happened because of a lot of good,
  effective, and cooperative preparation.
</p>

<p>
  So imagine my surprise when I started listening to a
  <a href="https://www.spoutlore.com/">non-D&amp;D Actual Play podcast</a> that
  was just as compelling without any of that.
</p>

<hr />

<p><strong>[DUNGEON WORLD ENTERS]</strong></p>

<p>
  Where D&amp;D uses dice to determine whether or not characters succeed in
  their attempts to do things, Dungeon World (and all games of its pedigree,
  based on a system called Powered by the Apocalypse,) use dice to determine
  <em>what the <strong>narrative</strong> outcome of an action should be</em>.
  It’s not “here’s the number you need to do this thing.” It’s “here’s the
  number you need to do this thing <em>without anything else happening</em>”. If
  you roll low, you can still succeed at whatever you were trying to do, but
  some complicating stuff will happen too.
</p>

<p>Let’s imagine the scene from the beginning with this new system:</p>

<p>
  <em
    >Tul, the fearsome barbarian, pursues the duke down one of the castle’s
    corridors. Elsie, his gnomish wizard companion trails behind, holding her
    velvet hat in place with one hand and a crumpled scrollbook with the other.
    Slam! The duke locks the door behind him, and his footsteps disappear up the
    tower. Roaring, Tul crashes his shoulder into the door, rolling a 2,
    bursting through the door in an explosion of oak splinters. With a horrible
    crash, the stone frame collapses behind him, separating him from Elsie and
    alerting the whole castle’s guard to their location</em
  >
</p>

<p>
  Tul gets to be the big tough barbarian, and yet they’ve still got problems!
</p>

<p>
  <em
    >“Go on without me!” Elsie yells. She turns to face the advancing captain of
    the guard, a ball of violet magic forming in her hand. Tul races up the
    tower, but all he finds is a mirror, clouded as if by a sulfuric smoke. “Go
    away!” Elsie incants in the language of old magic, releasing the lightning
    from her hands. She rolls a 4. The blast flies towards the guard, slows,
    reverses, and rushes back into Elsie. A brilliant flash surges up the tower
    and she feels her presence get transported. Tul opens his eyes. He sees
    Elsie in the mirror, but she’s not in the room. Her reflection mouths
    something: “Get me out of here!”</em
  >
</p>

<p>
  Isn’t that cooler? Yeah, I took more creative liberties with how magic works
  in these second examples, but that’s because I can! There’s no rigid 100-page
  chapter that spells out the mechanics of magic in Dungeon World. Magic works
  in service of the fiction, in the way you want it to, and the way I wanted it
  to work is that it can sometimes activiate powerful magical artifacts if used
  in their presence.
</p>

<p>
  The way Powered by the Apocalypse games center “narrative advancement” as the
  unitary output of players’ actions means that the rules of the game are more
  abstract, and (as written) a lot simpler<sup
    aria-labelledby="dungeon-world-RULES"
    >3</sup
  >. There’s more hand-waving, trusting the whole group to use their own
  judgement to decide whether or not the goblin’s in range for fireballing. This
  blurs the dichotomy of authority:non-authority prevalent in D&amp;D and
  empowers new players to collaborate in adjudication from the beginning.
  Moreover, the game explicitly encourages all players to add details to the
  lore of the world that they want. The DM isn’t the sole expert of the universe
  from whom its details are revealed. They’re just the person who plays the NPCs
  and adds fuel when the fire begins to dwindle, the fire that doesn’t even need
  to be roaring from the get go, because the players all build it up together.
</p>

<hr />

<p>
  I really like this system. I really want to play it (specifically a more
  recent game called
  <a href="https://primarchthemage.itch.io/chasing-adventure"
    >Chasing Adventure</a
  >
  which further refines the rules).
</p>

<p>
  Will it go well? I hope so! But I can also imagine some ways it might not.
  Improvising is a skill, and I don’t have much practice at it. If all my
  players are similar, maybe we’ll have some really tepid scenes where not much
  happens. They might also not like the untethered floatiness of it. One of my
  friends likes the crunchy combat and meta-layer of D&amp;D where the players
  are trying to <em>beat</em> the DM through technically legal tactics that test
  the limits of D&amp;D’s rules. Many players enjoy min-maxing the rules and
  finding ways to be powerful, regardless of the narrative implications or
  consequences.
</p>

<p>
  On the other side, in the Spout Lore podcast, sometimes a character will ad
  lib a world detail that I don’t like. It might be kinda boorish, or in
  contradiction with some previously established lore. Presumably this happens
  even more often than the podcast implies, because they can edit out the parts
  they regret in hindsight. Nevertheless, I think this tension is a necessary
  part of the success of the game. The democratic ownership of the story means
  that concessions will be made, in service of a story that everyone cares about
  and feels a part of.
</p>

<p>
  I’m looking forward to running a one-shot with Chasing Adventure, and will
  possibly report back in the future.
</p>

<hr />

<p>
  I’m not trying to make a persuasion check with this essay, despite its framing
  of my development as some sort of ascension towards truth. Narrative RPG
  systems are the devil I don’t know, and all the things I’ve kvetched are
  intrinsic to D&amp;D are <strong>a)</strong> part of the fun for many players,
  and <strong>b)</strong> completely solvable with homebrew rules.
</p>

<p>
  But I, personally, just want to fight mental and physical (and slime) demons,
  not a rules system or stock price<sup aria-labelledby="hasbro-oh-no">4</sup>
</p>

<p>So uhhh, yeah. It's... time to... roll the dice.</p>

<hr />

<!-- prettier-ignore -->
<footer>
  <p>
    <span>1</span>
    <span id="creative-liberties">
      Normally the die rolls aren't functionally embedded into the narrative,
      but I did that here because it flowed better. Normally it goes like this:
      <span style="display: block; margin-left: 1em; margin-top: 8px">
        <span style="display: block; margin-bottom: 8px;"><strong>Dungeon Master:</strong> Tul, you hear the door slam.</span>
        <span style="display: block; margin-bottom: 8px;"><strong>Andrew:</strong> I try to smash through the door</span>
        <span style="display: block; margin-bottom: 8px;"><strong>Dungeon Master:</strong> Okay, make a strength check</span>
        <span style="display: block; margin-bottom: 8px;"><em>Andrew rolls a 20-sided die (a "D20") and adds a small bonus to the result</em></span>
        <span style="display: block; margin-bottom: 8px;"><strong>Andrew:</strong> Damn. I got a 2, plus...3, so 5? Is that enough?</span>
        <span style="display: block; margin-bottom: 8px;"><strong>Dungeon Master:</strong> You slam into the door but it doesn't budge.</span>
      </span>
      And so forth.
    </span>
  </p>
  <p>
    <span>2</span>
    <span id="escapism-escapism">
      In non-Tolkenien settings! it was genuinely revelatory to realize that you can transplant D&D into hogwarts, or a Toy Story Ocean's 11 heist
    </span>
  </p>
  <p>
    <span>3</span>
    <span id="dungeon-world-RULES">
      In a sense, the rules are predominantly embedded in all the literature
      we’ve consumed over our lifetimes. Every time you watch a movie, you learn
      a little more about how to play Dungeon World
    </span>
  </p>
  <p>
    <span>4</span>
    <span id="hasbro-oh-no"
      >Hasbro needs to continually monetize D&D, to the chagrin of its fans, which makes the open-source &
      indie world of PbtA even more liberating. It's multiple whole other
      essays.</span
    >
  </p>
</footer>
]]></content></entry><entry><title>i wish this existed</title><link href="https://ikesau.co/blog/i-wish-this-existed/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/i-wish-this-existed/</id><published>2025-02-10T00:00:00Z</published><updated>2025-02-10T00:00:00Z</updated><content type="html"><![CDATA[
<p>
  a magic the gathering engine + evolution algorithm to develop and playtest
  duel decks that were perfectly balanced, variable, and fun.
</p>
<p>
  i don't want to spend my time reading through all the cards and playtesting
  with myself before
  <a href="/blog/modern-five-colour-pirates.html"
    >printing some new decks to play with my friends</a
  >, and i don't want to use online decklists because they're typically too
  competitive (filled with 4x of the best cards) and repetitive to play.
</p>
<p>
  as i understand it, this would be very hard to make. writing an engine for mtg
  is very, very complicated, and writing an AI that could play it would possibly
  be even harder (especially if you wanted to adjust its intelligence to
  simulate professional versus kitchen table play)
</p>
<p>
  but assuming that the cost of programming R&D is going to fall off a cliff,
  maybe it will be possible in the future. i would love to see it (and more
  generally, auto-balancing in all games) happen!
</p>
]]></content></entry><entry><title>jazz on a summer's day cloche</title><link href="https://ikesau.co/things-i-like/jazz-on-a-summers-day-cloche/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/jazz-on-a-summers-day-cloche/</id><published>2025-01-25T00:00:00Z</published><updated>2025-01-25T00:00:00Z</updated><content type="html"><![CDATA[
<section
  style="
    background: #fffaf4;
    padding: 32px;
    border-radius: 20px;
    border: 1px solid #222;
  "
>
  <a
    title="anita o'day - tea for two at newport jazz festival"
    style="color: #222"
    href="https://www.youtube.com/watch?v=dbJxnc64Pq0"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>jazz on a summer's day cloche</h2></a
  >
  <video
    src="/vidsdo/cloche.mp4"
    poster="/images/cloche-poster.webp"
    width="584"
    height="796"
    loop
    muted
    autoplay
    style="width: 100%; height: auto"
  ></video>
  <p>the fashion throughout this whole production is dope</p>
</section>
]]></content></entry><entry><title>slone radio</title><link href="https://ikesau.co/things-i-like/slone-radio/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/slone-radio/</id><published>2025-01-09T00:00:00Z</published><updated>2025-01-09T00:00:00Z</updated><content type="html"><![CDATA[
<section style="background: #c625a7; color: white">
  <marquee behavior="alternate">
    <a
      style="color: white; text-transform: uppercase"
      href="https://www.youtube.com/watch?v=F8VMzXb7-xA"
      target="_blank"
      rel="noopener noreferrer"
      ><h2>slone radio slone radio slone radio slone radio slone radio</h2></a
    >
  </marquee>
  <video
    style="width: 100%; height: auto"
    src="/vidsdo/sxm.mp4"
    poster="/images/sxm-poster.webp"
    height="638"
    width="630"
    muted
    loop
    autoplay
  ></video>
  <p>
    these footwork/hardcore mixes from this nonchalant cigar-smoking MUSICIAN,
    PRODUCER, SOUND DESIGNER, SINGER, DJ, ARTIST rule utterly
  </p>
  <p>
    <a
      style="color: white"
      href="https://slomoenterprise.bandcamp.com"
      rel="noopener noreferrer"
      target="_blank"
      >check out her bandcamp!!</a
    >
  </p>
</section>
]]></content></entry><entry><title>trans upper egypt - errors</title><link href="https://ikesau.co/things-i-like/trans-upper-egypt-errors/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/trans-upper-egypt-errors/</id><published>2024-12-30T00:00:00Z</published><updated>2024-12-30T00:00:00Z</updated><content type="html"><![CDATA[
<section id="trans-upper-egypt">
  <style>
    #trans-upper-egypt {
      background: black;
      div {
        position: relative;
      }
      p,
      h2,
      a {
        z-index: 1;
        position: relative;
        color: #82b0cb;
        font-size: 1.5rem;
        margin: 0;
        text-transform: uppercase;
        font-weight: 800;
      }
    }
  </style>
  <div>
    <a
      href="https://mapledeathrecords.bandcamp.com/track/errors"
      target="_blank"
      rel="noopener noreferrer"
      ><p>trans upper egypt - errors</p></a
    >
  </div>
  <div><p>sloppy dub jamma</p></div>
  <div><p>fucks up the landing in that familiar, tragic way</p></div>
  <div><p>but still</p></div>
  <div>
    <p>
      i highly recommend
      <a
        href="https://mapledeathrecords.bandcamp.com/track/no-speaking"
        target="_blank"
        rel="noopener noreferrer"
        >holiday inn</a
      >
      too
    </p>
  </div>
  <script>
    const divs = document.querySelectorAll("#trans-upper-egypt div");
    const container = document.querySelector("#trans-upper-egypt");
    for (let i = 0; i < divs.length; i++) {
      const div = divs[i];
      const p = div.querySelector("p");
      staircaseP(div, p);
    }
    function staircaseP(container, p) {
      for (let i = 0; i < 10; i++) {
        const copy = document.createElement("p");
        copy.textContent = p.textContent;
        copy.style.position = "absolute";
        copy.style.top = `0`;
        copy.style.zIndex = 0;
        copy.style.transform = `translate(${i * 1.5}px, ${i * 1.5}px)`;
        copy.style.opacity = `${1 - i * 0.1}`;
        copy.inert = true;
        container.appendChild(copy);
      }
    }
  </script>
</section>
]]></content></entry><entry><title>jessica pratt - here in the pitch</title><link href="https://ikesau.co/things-i-like/jessica-pratt-here-in-the-pitch/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/jessica-pratt-here-in-the-pitch/</id><published>2024-12-28T00:00:00Z</published><updated>2024-12-28T00:00:00Z</updated><content type="html"><![CDATA[
<section id="jessica-pratt-bloodlusted" class="crosshatch">
  <style>
    .crosshatch {
      --pink: rgb(255, 218, 246);
      background-image: linear-gradient(
        45deg,
        var(--pink) 25%,
        transparent 25%,
        transparent 50%,
        var(--pink) 50%,
        var(--pink) 75%,
        transparent 75%,
        transparent
      );
      background-size: 5px 5px;
    }
    #jessica-pratt-bloodlusted {
      font-weight: bold;
      h2 {
        margin: 0;
      }
      * {
        background: white;
        color: red;
      }
    }
  </style>
  <a
    href="https://jessicapratt.bandcamp.com/album/here-in-the-pitch"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>jessica pratt - here in the pitch</h2></a
  >
  <p>
    found this through
    <a
      href="https://www.brooklynvegan.com/indie-basement-best-albums-of-2024/"
      target="_blank"
      rel="noopener noreferrer"
      >brooklyn vegan's best of 2024 list.</a
    >
  </p>
  <p>
    it's lovely. reminds me of
    <a
      href="https://www.youtube.com/watch?v=PN0RPWII7gY"
      target="_blank"
      rel="noopener noreferrer"
      title="andy shauf - the magician"
    >
      andy shauf
    </a>
    and that

    <a
      href="https://www.youtube.com/watch?v=wpVPLtT_J0g"
      target="_blank"
      rel="noopener noreferrer"
      title="annabelle (lee) - invisible barriers"
    >
      annabelle (lee) album.
    </a>
  </p>
</section>
]]></content></entry><entry><title>fixing a electron microscope</title><link href="https://ikesau.co/things-i-like/electron-microscope/" rel="alternate" type="text/html"/><id>https://ikesau.co/things-i-like/electron-microscope/</id><published>2024-12-06T00:00:00Z</published><updated>2024-12-06T00:00:00Z</updated><content type="html"><![CDATA[
<section id="electron-fly">
  <style>
    #electron-fly {
      font-family: monospace;
      background: #000;
      color: greenyellow;
      padding: 0;
      h2,
      p {
        padding: 8px;
      }
      a {
        color: greenyellow;
      }
      video {
        mix-blend-mode: hard-light;
        width: 100%;
      }
    }
  </style>
  <a
    href="https://www.youtube.com/watch?v=Kqx9blbYDB0"
    target="_blank"
    rel="noopener noreferrer"
    ><h2>fixing a electron microscope</h2></a
  >
  <video
    src="/vidsdo/fly.mp4"
    loop
    muted
    autoplay
    width="742"
    height="562"
    poster="/images/fly-poster.webp"
  ></video>
  <p>
    a tenacious and passionate microscopy enthusiast repairs a dumpstered
    electron microscope. the number of obstacles he overcomes and skills he
    develops is really inpsiring!
  </p>
</section>
]]></content></entry><entry><title>sneaky spiritual covers</title><link href="https://ikesau.co/blog/sneaky-covers/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/sneaky-covers/</id><published>2024-11-19T00:00:00Z</published><updated>2024-11-19T00:00:00Z</updated><content type="html"><![CDATA[
<p>
  <a
    href="https://www.plex.tv/en-ca/plexamp/"
    target="_blank"
    rel="noreferrer noopener"
    >my library</a
  >
  on shuffle has elicited some eye-widenings in me recently. tracks where the
  lineage is so obvious that it's&hellip; surprising they even changed the
  title. a sneaky spiritual cover.
</p>
<p>
  <a href="https://gretchen.bandcamp.com/track/kind-words-3"
    >KIND WORDS by Gretchen</a
  >
  is one, of
  <a href="https://www.youtube.com/watch?v=RFQJ79kuMKo"
    >Horizontal Hold by This Heat</a
  >. Everyone in that Calgary scene was <em>obviously, famously</em> inspired by
  This Heat but I hadn't heard these two songs back-to-back before to realize
  how direct it got. thanks shuffle.
</p>
<p>
  the other was
  <a href="https://www.youtube.com/watch?v=S365lLKYlf0"
    >Cadriopo by Stereolab</a
  >
  owing everything to
  <a href="https://www.youtube.com/watch?v=3IzT7qnFt1A"
    >Sun Ra's Love in Outer Space</a
  >. this one wasn't so sneaky (see also:
  <a href="https://www.youtube.com/watch?v=FppasPSyqo8">Mellotron</a> and
  <a href="https://www.youtube.com/watch?v=1Uq2VTfGbEE">Ruby by Silver Apples</a
  >). i just hadn't heard Cadriopo before.
</p>
<p>
  one time I wrote a drum part for a song and was really chuffed with it and
  then listened to it some time later and realized it was basically identical to
  <a href="https://www.youtube.com/watch?v=DmmvZrBnQ4M"
    >Apocalypse Dreams by Tame Impala</a
  >, so y'know, not throwing shade. inspiration is sneaky too.
</p>
]]></content></entry><entry><title>simulation fibrosis</title><link href="https://ikesau.co/blog/simulation-fibrosis/" rel="alternate" type="text/html"/><id>https://ikesau.co/blog/simulation-fibrosis/</id><published>2024-11-10T00:00:00Z</published><updated>2024-11-10T00:00:00Z</updated><content type="html"><![CDATA[
<p>
  I was listening to a podcast the other night where one of the hosts
  complimented Tim Urban on his knack for defining conceptual structures that
  help clarify a confused subject. Unfortunately, the given example was Tim
  adding Up-Down to the Left-Right political spectrum, where "up" is being
  educated and rational, and "down" is being primitive and emotional.
</p>
<p>
  As far as poltical compass memes go... pretty bad.<sup
    aria-labelledby="factor-analysis"
    >1</sup
  >
</p>
<p>Still. Love a good model.</p>
<p>
  Here's one I've been thinking about recently: in fiction, there's a tension
  between maintaining the consistency of the universe's rules, and having the
  flexibility to create suspenseful drama. Call it the Simulation-Drama axis.
</p>
<p>
  <strong style="font-weight: 500">
    A fictional work high in Simulation is Band of Brothers - a TV series about
    World War II.</strong
  >
</p>
<p>
  <strong style="font-weight: 500"
    >A fictional work high in Drama is Dragon Ball Z - an anime about alien
    warriors battling one another with magic.</strong
  >
</p>
<p>
  Band of Brothers is tightly constrained by its commitment to historical
  accuracy. It's based on real events, which were highly documented, and highly
  familiar to its audience of war history buffs. Dragon Ball Z has its own
  constraints, but there's no objective truth like the laws of physics or
  diaries of soldiers forcing the writers to keep any of their promises. If the
  plot needs it, a character can come back from the dead, or do a special move
  that previously only one of the other characters could do. You could argue
  this dynamic is even the central promise of the show: watch DBZ to see our
  characters do unbelievable things and defy expectations over and over!<sup
    aria-labelledby="plot-nihilism"
    >4</sup
  >
</p>
<p>
  Dragon Ball Z gets away with it because people aren't watching it to see an
  accurate portrayal of a Saiyan invasion of earth. They watch it to see good
  guy Goku triumph over evil, understanding that it unambiguously occupies the
  Drama end of the axis.
</p>
<p>Shows get into trouble when they exist more fluidly in the middle.</p>
<p>Take Star Trek.</p>
<p>
  Is Star Trek a speculative stab at humanity's best future? A stage on which to
  perform 21st century morality plays? Trick question, <em>petaQ</em>! It's
  both, but its writers over the last 60 years have all had different ideas on
  what the exact split is.
</p>
<p>
  This is hard to swallow if you're into the show for the Simulation: shown in
  one episode that a technology works one way (which is why the episode's
  obstacle is difficult to deal with) then shown in the next that it works
  differently, because it would otherwise be inconvenient to the story that the
  writers want to tell.<sup aria-labelledby="geordi-one-off">5</sup>
</p>
<p>
  Shields are the worst for this. Sometimes a ship can withstand multiple ships'
  attacks, giving the crew time to formulate a plan and cleverly escape danger.
  Sometimes they take a single shot and need to immediately surrender. There's
  no consistent and satisfying explanation for why this is, leaving the audience
  to invent their own reasons. In severe cases, this can stretch the imagination
  so much that it rips: fans admit that it happened because the writers needed
  it to, and simulation fibrosis sets in. The characters become a little less
  relatable, the lessons a little less legitimate.
</p>
<p>
  Because how imitable are the crew's decisions if their risk calculus is
  completely random? Is it even possible to strive to be like someone who is
  only alive because of plot armour? If Star Trek says we should have
  principles, then I think the right way to argue this is by showing characters
  who exhibit these ideals navigating difficult situations and succeeding
  because of them. The self-defeating way is by showing us that these ideals are
  only viable in a world that doesn't have real consequences.
</p>
<p>
  Maybe this axis isn't useful. You could argue there are dozens of other,
  better binaries to grade our fiction on. You could <em>definitely</em> argue
  that nitpicking dumb plot holes in Star Trek is as much a part of the
  tradition as techno-babble, and that I'm taking this way too seriously. And,
  yeah, sure, but I really, <em>really</em> like Star Trek and it disappoints me
  when an episode fell short of greatness because the writers couldn't manage to
  tell a story without cheating themselves.
</p>
<p>
  I don't think it's easy to fix this, but one not-actually-practicable idea I
  had would be to create a computer game that simulated a galaxy with Star
  Trekkish rules, play it for a while, and then write your show based on
  developments that actually happened in the game. That way you're pre-committed
  to a consistent, high level set of rules, but you've still got a lot of
  freedom to work out the details.<sup aria-labelledby="kruggsmash">7</sup>
</p>
<p>
  I say not-actually-practicable because I don't think any high budget TV
  production would want to bind itself so tightly to such a gimmick, but maybe
  it's the sort of thing that we'll be able to experiment with more as
  generative AI brings the costs of animation down.
  <a
    href="https://en.wikipedia.org/wiki/Nothing,_Forever"
    target="_blank"
    rel="noopener noreferrer"
    >Nothing, Forever</a
  >
  but earnest and with warp drive. Or maybe we'll be able to bend existing
  scripts with our own events and reanimate them to tell ourselves the stories
  we want to be told.
</p>
<p>There's a poetic kind of irony to that. It'll probably happen.</p>
<hr />
<footer>
  <p>
    <span>1</span>
    <span id="factor-analysis"
      >Factor analysis is a useful tool to identify the essence of what makes
      things different. When someone is described as "interested in other
      people; softhearted; good at reassurring others" - are three different
      things being described? Or are these just facets of the same One Thing?
      Hans Eysenck would argue, having analyzed the correlations between
      thousands of such statements, that they are describing one thing:
      agreeableness.<sup aria-labelledby="big-five">2</sup>
      <span>He would also argue</span
      ><sup aria-labelledby="eysenck-is-my-hostage">3</sup> that the actually
      salient dimensions of political attitude are Radical-Conservative and
      Authoritarian-Democratic. That seems much more profound to me than
      pointing out that some people are intellectuals and some aren't, like, no
      shit?</span
    >
  </p>
  <p>
    <span>2</span>
    <span id="big-five"
      >there are four other things and together they comprise the Big Five
      personality model</span
    >
  </p>
  <p>
    <span>3</span>
    <span id="eysenck-is-my-hostage"
      >I have brought him back to life and am holding him hostage at a luncheon
      to espouse his summa</span
    >
  </p>
  <p>
    <span>4</span>
    <span id="plot-nihilism"
      >to its eventual detriment - i think power creep creates a kind of plot
      nihilism. but do note that the axis isn't about "follows rules" versus
      "doesn't follow rules" - it's about what kinds of rules the fiction
      follows</span
    >
  </p>
  <p>
    <span>5</span>
    <span id="geordi-one-off"
      >one time geordi la forge figures out how to send the video feed from his
      visor back to the bridge during an away mission and it blows everyone's
      minds. picard's like
      <em>"whoa! what's that! geordi look over there!"</em> and then they never
      do it again. so goddamn nineties.
    </span>
  </p>
  <p>
    <span>6</span>
    <span id="star-trek-zoom-calls">
      I feel obligated to point out that this is different to making your
      Realistic Universe television compatible. e.g. the fact that Star Trek's
      zoom calls are hilariously unreliable. I've lost count of the number of
      distress beacons I've witnessed where critical information wasn't
      transmitted because the video and audio feeds are cutting out like a TV
      with a dodgy antenna. Janeway never suggets "hold on, you're frozen. can
      you just email it to me?" even though, given how frequently this problem
      occurs, spacefaring societies would almost certainly develop backup
      systems for such cases. It is necessary, for the plot, for the crew to
      have imperfect information. A garbled SOS is an easy way to set this up,
      and so functionally you'd be in the exact same predicament if you instead
      garbled the text, except the audience would have to read. Yuck!</span
    >
  </p>
  <p>
    <span>7</span>
    <span id="kruggsmash">
      In a way, this is what Kruggsmash does with his
      <a
        href="https://www.youtube.com/@kruggsmash/videos"
        target="_blank"
        rel="noopener noreferrer"
        >Dwarf Fortress narrations</a
      ></span
    >
  </p>
</footer>
]]></content></entry></feed>