<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
  <author>
    <name>benjamin wil</name>
  </author>
  <id>https://benjaminwil.info/antisocial/feed.xml/</id>
  <link href="https://benjaminwil.info/antisocial/feed.xml/"/>
  <subtitle>Software developer, technical writer</subtitle>
  <title>benjamin wil</title>
  <updated>2026-07-13T11:32:32-07:00</updated>
  <entry>
    <content>&lt;p&gt;From my phone, I noticed that my website was displaying footnote backlink
glyphs as emoji in my RSS reader. It had not always been this way. I opened the
same page from a desktop browser and saw what I expected to see: a text-like
pictograph, in my article body’s font face. No emoji to be found. I checked
the HTML document source:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&amp;gt;
  &amp;amp;#8617;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The RSS feed XML contained the same. So, that can be presented as either
text or an emoji?  &lt;code&gt;&amp;amp;x8617;&lt;/code&gt; is an HTML representation of the Unicode
codepoint &lt;code&gt;U+21A9&lt;/code&gt;, &lt;a href=&quot;https://codepoints.net/U+21A9&quot;&gt;&lt;cite class=&quot;small-caps&quot;&gt;Leftwards Arrow with
Hook&lt;/cite&gt;&lt;/a&gt;. This led me to many relevant threads, pastes, and
blog posts&lt;sup id=&quot;fnref:0&quot;&gt;&lt;a href=&quot;#fn:0&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; in which others had observed similar issues with &lt;cite class=&quot;small-caps&quot;&gt;Leftwards Arrow with Hook&lt;/cite&gt; and other, similar
navigation-decoration characters.  We were all reacting to &lt;code&gt;U+21A9&lt;/code&gt; as rendered
without a Unicode &lt;a href=&quot;http://www.unicode.org/versions/Unicode17.0.0/core-spec/chapter-23/#G19053&quot;&gt;standardized variation sequence specified&lt;/a&gt;. So
it’s up to whatever program is rendering &lt;code&gt;U+21A9&lt;/code&gt; to decide what to do. &lt;em&gt;Which&lt;/em&gt;
version, the text or the emoji, should &lt;code&gt;U+21A9&lt;/code&gt; render.&lt;/p&gt;

&lt;p&gt;I found the correct solution and some less correct solutions to this
issue. Before I describe them, I want to explore a slightly larger problem
introduced by variation selectors.&lt;/p&gt;

&lt;h2 id=&quot;the-downstream-effects&quot;&gt;The downstream effects&lt;/h2&gt;

&lt;p&gt;For meta-ish content characters like backlink glyphs, the way forward is
clear for people who are technical: fix and/or configure the thing that
builds your web pages.  Or complain in the direction of the people who can
fix and/or configure the thing.&lt;/p&gt;

&lt;p&gt;For many of the other characters, it’s more complicated. Many of
these characters are used in body content to be expressive. Rendering
the text presentation instead of the emoji presentation, at worst,
could be a &lt;em&gt;mistranslation&lt;/em&gt;. &lt;a href=&quot;http://www.unicode.org/reports/tr51/&quot;&gt;The technical standard&lt;/a&gt;
(see the &lt;a href=&quot;http://www.unicode.org/reports/tr51/#emoji_data&quot;&gt;&lt;code&gt;emoji-data&lt;/code&gt;&lt;/a&gt; links, and specifically
&lt;a href=&quot;https://www.unicode.org/Public/17.0.0/ucd/emoji/emoji-data.txt&quot;&gt;&lt;code&gt;emoji-data.txt&lt;/code&gt;&lt;/a&gt;) lists over 1,000 Unicode codepoints that
have both text and emoji presentations.&lt;/p&gt;

&lt;figure id=&quot;table-1&quot;&gt;
  &lt;table class=&quot;table-content-centered&quot; style=&quot;text-align: center; table-layout: fixed;&quot;&gt;
    &lt;colgroup&gt;
      &lt;col style=&quot;min-width: 8rem; width: 40%&quot; /&gt;
      &lt;col style=&quot;width: 20%&quot; /&gt;
      &lt;col style=&quot;width: 20%&quot; /&gt;
      &lt;col style=&quot;width: 20%&quot; /&gt;
    &lt;/colgroup&gt;

    &lt;thead&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Glyph&lt;/th&gt;
      &lt;th&gt;&lt;small&gt;As text&lt;/small&gt;&lt;br /&gt;(+&lt;code&gt;U+FE0E&lt;/code&gt;)&lt;/th&gt;
      &lt;th&gt;&lt;small&gt;As emoji&lt;/small&gt;&lt;br /&gt;(+&lt;code&gt;U+FE0F&lt;/code&gt;)&lt;/th&gt;
    &lt;/thead&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+00A9&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x00A9;&lt;/td&gt;
      &lt;td&gt;&amp;#x00A9;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x00A9;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+00AE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x00AE;&lt;/td&gt;
      &lt;td&gt;&amp;#x00AE;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x00AE;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+2328&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x2328;&lt;/td&gt;
      &lt;td&gt;&amp;#x2328;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x2328;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+25B6&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x25B6;&lt;/td&gt;
      &lt;td&gt;&amp;#x25B6;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x25B6;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+2603&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x2603;&lt;/td&gt;
      &lt;td&gt;&amp;#x2603;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x2603;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+2620&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x2620;&lt;/td&gt;
      &lt;td&gt;&amp;#x2620;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x2620;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+267B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x267B;&lt;/td&gt;
      &lt;td&gt;&amp;#x267B;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x267B;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F310&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F310;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F310;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F310;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F312&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F312;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F312;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F312;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F37C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F37C;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F37C;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F37C;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F441&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F441;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F441;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F441;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F509&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F509;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F509;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F509;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F590&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F590;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F590;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F590;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F635&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F635;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F635;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F635;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+1F636&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F636;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F636;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x1F636;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      &lt;strong&gt;Table 1&lt;/strong&gt; A small sampling of the 1,000+ Unicode codepoints
      that have both text and emoji presentations. The &lt;em&gt;Glyph&lt;/em&gt; column
      may look different to you, depending on the application you&#39;re using to
      read this article. I would hope the the &lt;em&gt;+&lt;code&gt;U+FE0E&lt;/code&gt;&lt;/em&gt;
      and &lt;em&gt;+&lt;code&gt;U+FE0F&lt;/code&gt;&lt;/em&gt; columns &lt;em&gt;do&lt;/em&gt; render the same
      way for everyone.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;There is no obvious, cut-and-dry user experience for writers here. Pictographs
and emoji are &lt;em&gt;regular text&lt;/em&gt; as far as most programs are concerned, and
variation selectors remain invisible unless you go looking.  Did the author
mean to present an umbrella ⛱︎ or an umbrella ⛱️
? We don’t know what their writing tool presented to them during editing. They
don’t know that we don’t see what they think we see when we’re reading
the thing. In a perfect world, all software knows about and inserts variation
selectors for the user. In reality, we know that software is bad.&lt;/p&gt;

&lt;p&gt;I found documentation that indicates that the Unicode Technical Committee
is aware that variation selectors are complicated,&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and maybe weren’t the
best strategy.&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; But what’s done is done and can’t be undone when it comes
to the Unicode Standard.&lt;/p&gt;

&lt;h2 id=&quot;the-most-correct-solution&quot;&gt;The most correct solution&lt;/h2&gt;

&lt;p&gt;You can specify, in your source document, which version you want rendered.
You do this by combining the variation selector codepoint with the preceding
codepoint you want to render. In my case, that’s &lt;code&gt;U+FE0E&lt;/code&gt;, &lt;a href=&quot;https://codepoints.net/U+FE0E&quot;&gt;&lt;cite class=&quot;small-caps&quot;&gt;Variation Selector-15&lt;/cite&gt;&lt;/a&gt;. Using my source document’s
backlink HTML markup as an example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&amp;gt;
  &amp;amp;#8617;&amp;amp;#xFE0E;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And, if I wanted, I could do the opposite: force the emoji presentation,
using &lt;code&gt;U+FE0F&lt;/code&gt;, &lt;a href=&quot;https://codepoints.net/U+FE0F&quot;&gt;&lt;cite class=&quot;small-caps&quot;&gt;Variation Selector-16&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;figure id=&quot;figure-1&quot;&gt;
  &lt;p style=&quot;font-size: 4rem;&quot;&gt;
    &amp;#x21A9;&amp;#xFE0E;
  &lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      &lt;strong&gt;Fig. 1&lt;/strong&gt;
      The pictogram via &lt;code&gt;U+21A9 U+FE0E&lt;/code&gt;.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure id=&quot;figure-2&quot;&gt;
  &lt;p style=&quot;font-size: 4rem;&quot;&gt;
    &lt;span&gt;&amp;#x21A9;&lt;/span&gt;
    &lt;span&gt;&amp;#x21A9;&amp;#xFE0F;&lt;/span&gt;
  &lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      &lt;strong&gt;Fig. 2&lt;/strong&gt;
      The emoji via &lt;code&gt;U+21A9&lt;/code&gt; alone, next to the emoji rendered
      via &lt;code&gt;U+21A9 U+FE0F&lt;/code&gt;, where &lt;code&gt;U-FE0F&lt;/code&gt;, &lt;cite class=&quot;small-caps&quot;&gt;Variation Selector-16&lt;/cite&gt; coerces the glyph to
      use its full-colour emoji variant.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure id=&quot;figure-3&quot;&gt;
  &lt;div&gt;
    &lt;img alt=&quot;The Deja Vu Mono pictogram for Leftwards Arrow with Hook&quot; src=&quot;/weblog/assets/no-emoji/leftwards-arrow-with-hook-pictogram-deja-vu-mono.png&quot; style=&quot;background-color: var(--color-background-light); border-radius: 2rem; width: 4rem;&quot; /&gt;
    &lt;img alt=&quot;The iOS emoji for Leftwards Arrow with Hook&quot; src=&quot;/weblog/assets/no-emoji/leftwards-arrow-with-hook-emoji-ios.png&quot; style=&quot;width: 4rem;&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      &lt;strong&gt;Fig. 3&lt;/strong&gt;
      Here&#39;s the image of the pictogram version and the iOS
      emoji version as rendered via &lt;code&gt;U+21A9&lt;/code&gt; alone. As I&#39;ve
      already mentioned, which variant you see sans-selector can differ
      per application.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So, I can fix this issue for myself. I’m fortunate that I build &lt;a href=&quot;https://github.com/benjaminwil/lifer&quot;&gt;the software
that generates this website&lt;/a&gt;; and I’m fortunate that the library I
use to generate HTML from my Markdown source documents (&lt;a href=&quot;https://kramdown.gettalong.org&quot;&gt;Kramdown&lt;/a&gt;)
has a configurable footnote backlink glyph. There are authors using the
Mistune library (for example, via the &lt;a href=&quot;https://bearblog.dev&quot;&gt;Bear&lt;/a&gt; blogging platform),&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;
or perhaps some other niche content rendering library, that don’t have the
same luxury as of this writing.&lt;/p&gt;

&lt;h2 id=&quot;some-less-reliable-solutions&quot;&gt;Some less reliable solutions&lt;/h2&gt;

&lt;p&gt;If you’re in a position where you &lt;em&gt;don’t&lt;/em&gt; control the software that builds
HTML from your source documents, and, for some reason, it’s not possible to
insert a variation selector character where you want it, there are some other
things you can try. (At least for applications that use CSS for document
presentation, like web browsers.)&lt;/p&gt;

&lt;h3 id=&quot;font-variant-emoji&quot;&gt;font-variant-emoji&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/font-variant-emoji&quot;&gt;&lt;code&gt;font-variant-emoji&lt;/code&gt; CSS property&lt;/a&gt; is not currently supported
in Safari. Hopefully it will be soon. It allows you to specify the preferred
presentation of unicode characters for which ever DOM elements you like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;article style=&quot;font-variant-emoji: text;&quot;&amp;gt;
  &amp;lt;span&amp;gt;Umbrella &amp;amp;#x26F1;&amp;lt;/span&amp;gt;, or
  &amp;lt;span style=&quot;font-variant-emoji: emoji;&quot;&amp;gt;umbrella &amp;amp;#x26F1;&amp;lt;/span&amp;gt;.
&amp;lt;/article&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But I don’t think this can ever be a foolproof solution. Even wide web
browser support doesn’t fully account for web content being presented by
non–web browser applications like feed readers, and so on.&lt;/p&gt;

&lt;h3 id=&quot;font-family-monospace&quot;&gt;font-family: monospace&lt;/h3&gt;

&lt;p&gt;If you want an even less reliable solution, setting the &lt;code&gt;font-family&lt;/code&gt; CSS
property to the value &lt;code&gt;monospace&lt;/code&gt; &lt;a href=&quot;https://css-tricks.com/text-that-sometimes-turns-to-emojis/&quot;&gt;sometimes works&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;article&amp;gt;
  &amp;lt;span style=&quot;font-family: monospace;&quot;&amp;gt;Umbrella &amp;amp;#x26F1;&amp;lt;/span&amp;gt;, or
  &amp;lt;span&amp;gt;umbrella &amp;amp;#x26F1;&amp;lt;/span&amp;gt;.
&amp;lt;/article&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But this only forces emoji-presented characters to be text-presented
characters. And &lt;code&gt;monospace&lt;/code&gt; is a generic font specifier that may look
different from device to device.&lt;/p&gt;

&lt;figure id=&quot;table-2&quot;&gt;
  &lt;table class=&quot;table-content-centered&quot; style=&quot;width: 100%; table-layout: fixed;&quot;&gt;
    &lt;colgroup&gt;
      &lt;col style=&quot;width: 20%;&quot; /&gt;
      &lt;col style=&quot;min-width: 15rem; width: 50%;&quot; /&gt;
      &lt;col style=&quot;width: 10%;&quot; /&gt;
      &lt;col style=&quot;width: 10%;&quot; /&gt;
      &lt;col style=&quot;width: 10%;&quot; /&gt;
    &lt;/colgroup&gt;
    &lt;thead&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th class=&quot;text-left&quot;&gt;Solution&lt;/th&gt;
      &lt;th&gt;Glyph&lt;/th&gt;
      &lt;th&gt;+&lt;code&gt;U+FE0E&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;+&lt;code&gt;U+FE0F&lt;/code&gt;&lt;/th&gt;
    &lt;/thead&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+26F1&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;none&lt;/td&gt;
      &lt;td&gt;&amp;#x26F1;&lt;/td&gt;
      &lt;td&gt;&amp;#x26F1;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#x26F1;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+21A9&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;none&lt;/td&gt;
      &lt;td&gt;&amp;#8617;&lt;/td&gt;
      &lt;td&gt;&amp;#8617;&amp;#xFE0E;&lt;/td&gt;
      &lt;td&gt;&amp;#8617;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+26F1&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-variant-emoji: text&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#x26F1;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#x26F1;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#x26F1;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+21A9&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-variant-emoji: text&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#8617;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: text&quot;&gt;&amp;#8617;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+26F1&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-variant-emoji: emoji&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#x26F1;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#x26F1;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#x26F1;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+21A9&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-variant-emoji: emoji&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#8617;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-variant-emoji: emoji&quot;&gt;&amp;#8617;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+26F1&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-family: monospace&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#x26F1;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#x26F1;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#x26F1;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;U+21A9&lt;/code&gt;&lt;/td&gt;
      &lt;td class=&quot;text-left&quot;&gt;&lt;code&gt;font-family: monospace&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#8617;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/td&gt;
      &lt;td style=&quot;font-family: monospace&quot;&gt;&amp;#8617;&amp;#xFE0F;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      &lt;strong&gt;Table 2&lt;/strong&gt;
      A table demonstrating the less reliable solutions.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:0&quot;&gt;
      &lt;p&gt;Here’s a short list of the most interesting links I found while looking into this:&lt;/p&gt;

      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=31221794&quot;&gt;A Hacker News thread&lt;/a&gt; somewhere on &lt;a href=&quot;https://news.ycombinator.com/item?id=31218434&quot;&gt;the post about Google’s Noto Emoji font&lt;/a&gt;.&lt;/li&gt;
        &lt;li&gt;“&lt;a href=&quot;https://www.xjavascript.com/blog/how-to-prevent-unicode-characters-from-rendering-as-emoji-in-html-from-javascript/&quot;&gt;How to Prevent Unicode Characters from Rendering as Emojis in HTML with JavaScript: Force Classic Glyphs&lt;/a&gt;” on &lt;em&gt;XJavascript.com&lt;/em&gt;.&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://meta.stackexchange.com/questions/261074/prev-next-triangles-rendered-as-emojis-on-ios-devices&quot;&gt;A question about “previous” and “next” arrows as rendered on iOS devices&lt;/a&gt; on &lt;em&gt;Meta Stack Exchange&lt;/em&gt;.&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://github.com/gettalong/kramdown/issues/247&quot;&gt;An issue on the Kramdown Markdown library&lt;/a&gt; from April 2015, still getting pings as late as May 2026.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;&lt;a href=&quot;#fnref:0&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Holbrook, Ned: “Emoji Subcommittee Report for UTC #171 (2022Q2),” 22 April 2022 [&lt;a href=&quot;https://www.unicode.org/L2/L2022/22066r-esc-report-q2.pdf&quot;&gt;&lt;span class=&quot;small-caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt;]:&lt;/p&gt;

      &lt;p&gt;&lt;q cite=&quot;https://www.unicode.org/L2/L2022/22066r-esc-report-q2.pdf&quot;&gt;A
  suggestion was made to emojify an existing character rather than
  add a new one. Regarding the proposed &lt;code&gt;U+1FAAF&lt;/code&gt; &lt;cite class=&quot;small-caps&quot;&gt;KHANDA&lt;/cite&gt;,
  Chris Hennick suggested the existing &lt;code&gt;U+262C&lt;/code&gt; &lt;cite class=&quot;small-caps&quot;&gt;ADI SHAKTI&lt;/cite&gt;
  be emojified instead. The ESC notes that doing so could affect the
  rendering of documents using &lt;cite class=&quot;small-caps&quot;&gt;ADI SHAKTI&lt;/cite&gt; and that &lt;em&gt;the UTC
  prefers distinct characters for new emoji for this reason&lt;/em&gt; [emphasis added].&lt;/q&gt; &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;Bettencourt, Rebecca; Ewell, Doug: “Proposal to disunify Symbols for Legacy Computing from emoji,” 14 October 2023 [&lt;a href=&quot;https://www.unicode.org/L2/L2023/23252-legacy-disunification.pdf&quot;&gt;&lt;span class=&quot;small-caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt;]:&lt;/p&gt;

      &lt;p&gt;&lt;q cite=&quot;https://www.unicode.org/L2/L2023/23252-legacy-disunification.pdf&quot;&gt;The
  UTC has determined that unifying text and emoji characters was a mistake,
  and that attempts will be made to prevent further such unifications. The
  Emoji Subcommittee even has a standing agreement with the UTC to only
  propose new characters rather than adding the emoji property to existing
  characters, and to avoid creating new presentation sequences. The Symbols
  for Legacy Computing proposals have resulted in the opposite case of
  needing to use existing emoji characters as non-emoji; regardless, the
  requirement to prevent emoji unification still applies. Upon reviewing
  Buff’s proposal, the Script Ad-Hoc (including the members most opposed
  to the Symbols for Legacy Computing proposals) came to the consensus
  that the best approach is to propose these as separate characters.&lt;/q&gt; &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;As evidence, here’s &lt;a href=&quot;https://web.archive.org/web/20260104184035/https://herman.bearblog.dev/cities-need-more-trees/&quot;&gt;a link to an archived version of “Cities need more
  trees”&lt;/a&gt;
  on the Bear blogging platform by the creator of Bear, Herman Martinus,
  which uses Mistune to render HTML from Markdown.  Currently, when I
  visit the webpage on iOS I see the full-colour emoji version of &lt;cite class=&quot;small-caps&quot;&gt;Leftwards Arrow with Hook &lt;/cite&gt; instead of the
  pictogram. But in Firefox on my Linux distribution I see the pictogram. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/variation-selector-15</id>
    <link href="https://benjaminwil.info/weblog/variation-selector-15"/>
    <published>2026-07-13T11:32:26-07:00</published>
    <summary>From my phone, I noticed that my website was displaying footnote backlink glyphs as emoji in my RSS reader.</summary>
    <title>Unicode Variation Selector-15 and some of my tears</title>
    <updated>2026-07-13T11:32:26-07:00</updated>
    <dc:date>2026-07-13T11:32:26-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;so my website has two main feed sources: the main weblog, and this antisocial
feed that came into existence via &lt;a href=&quot;https://daverupert.com/2018/01/welcome-to-rss-club/&quot;&gt;rss club&lt;/a&gt;. until now they’ve been
fully separate things, but i noticed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;other rss clubbers generally have a single unified feed.&lt;/li&gt;
  &lt;li&gt;based on some emails i’ve received, it seems like some readers here just
don’t know about the main weblog feed.&lt;/li&gt;
  &lt;li&gt;from the feed reader’s experience, it could be a bit much to subscribe to
me twice; i am not very important (positive).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;so i decided to update this antisocial feed to also include posts from my
main feed. i apologize if this update caused you any displeasure due to
your feed reader marking some old-ish posts as unread or something. (the
main feed will continue to exclude these all-lowercase antisocial entries.)&lt;/p&gt;

&lt;p&gt;if you’d prefer, the classic antisocial-only posts atom and json feeds
continue to live on at new urls:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://benjaminwil.info/antisocial/antisocial.xml&quot;&gt;https://benjaminwil.info/antisocial/antisocial.xml&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://benjaminwil.info/antisocial/antisocial.json&quot;&gt;https://benjaminwil.info/antisocial/antisocial.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all of this is actually helping me make the design of &lt;a href=&quot;https://github.com/benjaminwil/lifer&quot;&gt;my static site
generator&lt;/a&gt; better. in making this change i uncovered a bug. my rss
feed builder supports building both atom and rss feeds. when i created this
new &lt;em&gt;selection&lt;/em&gt; of weblog and antisocial entries, i failed to ensure both
canonical entry collections were set to use the &lt;code&gt;atom&lt;/code&gt; format. this caused
some entries to be missing encoded html in the built feed. excellent win for
me, since my current development focus is making arbitrary entry selections,
and feeds for those selections, a better experience.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/antisocial/14</id>
    <link href="https://benjaminwil.info/antisocial/14"/>
    <published>2026-07-03T12:17:34-07:00</published>
    <summary>so my website has two main feed sources: the main weblog, and this antisocial feed that came into existence via rss club....</summary>
    <title>feed backfilling</title>
    <updated>2026-07-03T12:17:34-07:00</updated>
    <dc:date>2026-07-03T12:17:34-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Developers and nerds have seemed satisfied with Markdown as a plain text
format for a long time. Now, I see Markdown approaching the edges of the
mainstream. I casually mentioned Markdown in conversation with some of
my schoolteacher friends and one of them nodded with recognition. That’s
new. Maybe it’s because &lt;a href=&quot;https://workspaceupdates.googleblog.com/2022/03/compose-with-markdown-in-google-docs-on.html&quot;&gt;Google Docs enabled Markdown editing&lt;/a&gt; back
in 2022. Or because, in 2026, &lt;a href=&quot;https://www.macrumors.com/how-to/ios-import-export-markdown-apple-notes/&quot;&gt;Apple Notes enabled the import and export of
Markdown-formatted documents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Markdown’s creator, John Gruber, wrote that the surge in Markdown’s
popularity &lt;a href=&quot;https://daringfireball.net/linked/2026/06/17/vergecast-epic-story-of-markdown&quot;&gt;could be attributed to widespread LLM usage&lt;/a&gt;. And yeah, I’ve
definitely seen LLM output filled with Markdown. Maybe the schoolteachers
see that, too.&lt;/p&gt;

&lt;p&gt;Whether I’m speaking with software developers, technical writers, or
schoolteachers, though, I see many of them misunderstanding what I think
is &lt;em&gt;the&lt;/em&gt; innovation of Markdown. Compared to the other historical plain text
markup formats like &lt;a href=&quot;https://en.wikipedia.org/wiki/Setext&quot;&gt;Setext&lt;/a&gt; and &lt;a href=&quot;https://www.phpbb.com/community/help/bbcode&quot;&gt;BBCode&lt;/a&gt;, reading and writing
full documents in plain text is easy and not syntactically perilous. Yes,
Markdown does lend itself to rendering simple rich text and HTML documents. But
it’s even more useful as a way to increase the information density of
plain text files pre-render. Gruber summarizes it well in the same post:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Markdown isn’t really a “syntax”. It’s a set of conventions for
formatting plain text. If everyone agrees to the same basic conventions,
plain text can be significantly more expressive than a string of unformatted
characters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the end, I’m grateful for projects like &lt;a href=&quot;https://commonmark.org&quot;&gt;CommonMark&lt;/a&gt; working towards
a complete syntax specification of Markdown.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; But I worry that some of their
decisions lean in the direction of Markdown that’s harder for humans to read.
I already see Markdown documents written by authors who think of Markdown as
a feature-complete markup language (it’s not) used to render richer documents.
Maybe you, too, have seen an order list defined in this way:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1. The first list item.
1. The second list item.
1. The third list item.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Because GitHub Flavored Markdown, CommonMark, and a bunch of other
implementations “correctly” interpret the intention of this as rendering a
normal ordered list in HTML:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;The first list item.&lt;/li&gt;
    &lt;li&gt;The second list item.&lt;/li&gt;
    &lt;li&gt;The third list item.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s my opinion that if you’re writing a list long enough, or complex enough,
to benefit from using &lt;code&gt;1.&lt;/code&gt; as an auto-incrementer, you shouldn’t be using
Markdown. Similarly, if you need to do some of the stuff that &lt;a href=&quot;https://spec.commonmark.org/0.31.2/#lists&quot;&gt;CommonMark
implements for complex lists&lt;/a&gt; (see: &lt;a href=&quot;https://spec.commonmark.org/0.31.2/#example-306&quot;&gt;“There can be any number of
blank lines between items”&lt;/a&gt;
and &lt;a href=&quot;https://spec.commonmark.org/0.31.2/#example-314&quot;&gt;“loose lists”&lt;/a&gt;;
&lt;a href=&quot;https://spec.commonmark.org/0.31.2/#example-308&quot;&gt;insert blank HTML comments to generate two consecutive
lists&lt;/a&gt;; &lt;a href=&quot;https://spec.commonmark.org/0.31.2/#example-310&quot;&gt;consecutive list
items with sub-indentation&lt;/a&gt;),
consider other tools. CommonMark’s rules and tests are helpful, but they’re
ultimately best for the machines and precarious for humans.&lt;/p&gt;

&lt;p&gt;On the other hand, CommonMark and other Markdown specifications include some
really great ideas that make Markdown-as-plain-text even better.
I like Extended Markdown’s simple &lt;a href=&quot;https://www.markdownguide.org/extended-syntax/#definition-lists&quot;&gt;definition lists&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Lugger
: A small sailing vessel having two or three masts and a running bowsprit,
   carrying lugsails.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And I like task lists as &lt;a href=&quot;https://github.blog/news-insights/product-news/task-lists-in-gfm-issues-pulls-comments/&quot;&gt;popularized by GitHub Flavored Markdown&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;- [x] Watch *Peter Hujar&#39;s Day* (2026).
- [ ] Watch *Cemetery of Splendor* (2015).
- [x] Watch *Rose of Nevada* (2025).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notion, Discord, Slack, GitHub, and so on, have cemented Markdown as &lt;em&gt;the&lt;/em&gt;
way to jot down richly-formatted messages and draft simple documents. Markdown
specification, implementation, and interoperability do matter and will likely
matter more in the future. I just write this as a reminder that Markdown is for
humans. My newlines should be for &lt;em&gt;me&lt;/em&gt; primarily, the machine secondarily. And
the fewer &lt;code&gt;[]{#unique-header-identifier}&lt;/code&gt;s I need to insert in my document
source, the better.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;An historical aside: CommonMark was originally dubbed &lt;a href=&quot;https://blog.codinghorror.com/standard-flavored-markdown/&quot;&gt;Standard
  Markdown&lt;/a&gt;,
  but &lt;a href=&quot;https://blog.codinghorror.com/standard-markdown-is-now-common-markdown/&quot;&gt;changed immediately to Common
  Markdown&lt;/a&gt;
  when Gruber objected. And then to CommonMark when Gruber objected
  again.  If you read the Standard Markdown introductory post linked,
  you can see all of the reasons that led to a specification “needing”
  to exist. Gruber had been invited to collaborate on the project,
  but he left the CommonMark team on read. It’s clear now that CommonMark
  would inevitably clash with the one stated goal on Gruber’s &lt;a href=&quot;https://daringfireball.net/projects/markdown/&quot;&gt;Markdown
  project page&lt;/a&gt;: “The
  overriding design goal for Markdown’s formatting syntax is to make
  it as readable as possible.” &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/markdown-is-for-humans</id>
    <link href="https://benjaminwil.info/weblog/markdown-is-for-humans"/>
    <published>2026-06-25T12:21:51-07:00</published>
    <summary>Developers and nerds have seemed satisfied with Markdown as a plain text format for a long time.</summary>
    <title>Markdown is for humans</title>
    <updated>2026-06-25T12:21:51-07:00</updated>
    <dc:date>2026-06-25T12:21:51-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Recently, I implemented &lt;a href=&quot;https://www.jsonfeed.org/&quot;&gt;JSON Feed&lt;/a&gt; support for
my static site generator, &lt;a href=&quot;https://github.com/benjaminwil/lifer&quot;&gt;Lifer&lt;/a&gt;. My
impression is that, in 2026, JSON Feed is still not widely used, while people
continue to rediscover RSS&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; thanks to the indie web resurgence
and an appetite for re-decentralization. &lt;a href=&quot;https://openrss.org/blog/bluesky-has-launched-rss-feeds&quot;&gt;Bluesky supports RSS&lt;/a&gt;;
&lt;a href=&quot;https://www.rssboard.org/news/211/every-mastodon-user-has-rss-feed&quot;&gt;Mastodon supports RSS&lt;/a&gt;; &lt;a href=&quot;https://support.substack.com/hc/en-us/articles/360038239391-Is-there-an-RSS-feed-for-my-publication&quot;&gt;Substack supports RSS&lt;/a&gt;; even Reddit
supports RSS&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;—but none of them support JSON Feed.&lt;/p&gt;

&lt;p&gt;It makes sense for JSON Feed to be less popular than RSS: it’s not
nearly as old or entrenched; it was created at a time, pre-Twitter implosion,
in which feed reading had been subsumed by Twitter; and it doesn’t
offer much &lt;em&gt;new&lt;/em&gt; or &lt;em&gt;different&lt;/em&gt; over RSS, so why bother. That said, after
looking at my implementations of RSS 2.0 and Atom versus my implementation
of JSON Feed, I found lots to like about JSON Feed.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.jsonfeed.org/2017/05/17/announcing-json-feed.html&quot;&gt;The rationale provided&lt;/a&gt; by the authors of the spec isn’t written
in a persuasive way:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We—Manton Reece and Brent Simmons—have noticed that JSON has become
the developers’ choice for APIs, and that developers will often go out of
their way to avoid XML. JSON is simpler to read and write, and it’s less
prone to bugs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me reframe this to be more compelling.&lt;/p&gt;

&lt;h2 id=&quot;json-is-better-than-xml-at-storing-html-as-data&quot;&gt;JSON is better than XML at storing HTML as data&lt;/h2&gt;

&lt;p&gt;In an Atom feed, you must encode HTML nodes inside of the &lt;code&gt;&amp;lt;content&amp;gt;&lt;/code&gt;
XML node so that they don’t look like the next XML node in the feed. This
means, if you’re publishing HTML in your feeds, that the XML is even less
human-readable than usual. See this excerpt from my blog’s feed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &amp;lt;entry&amp;gt;
    &amp;lt;content&amp;gt;
      &amp;amp;lt;p&amp;amp;gt;Here’s another blog post vouching for writing Ruby blocks
      using the semantic rule. Sometimes called “the Weirich rule”
      because of &amp;amp;lt;a href=&amp;amp;quot;
      https://en.wikipedia.org/wiki/Jim_Weirich&amp;amp;quot;&amp;amp;gt;
      Jim Weirich&amp;amp;lt;/a&amp;amp;gt;’s “Braces vs. Do/End” article&amp;amp;lt;
      sup id=&amp;amp;quot;fnref:weirich&amp;amp;quot;&amp;amp;gt;&amp;amp;lt; a href=&amp;amp;quot;#fn:weirich&amp;amp;quot;
      class=&amp;amp;quot;footnote&amp;amp;quot; rel=&amp;amp;quot;footnote&amp;amp;quot;
      role=&amp;amp;quot;doc-noteref&amp;amp;quot;&amp;amp;gt;1&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/sup&amp;amp;gt; and an issue
      he filed against &amp;amp;lt;
      a href=&amp;amp;quot;https://github.com/rubocop/ruby-style-guide/issues/162&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;rubocop/ruby-style-guide&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/a&amp;amp;gt;.
      The rule unambiguously answers the question posed by Weirich: “When
      should you use &amp;amp;lt;code&amp;amp;gt;{}&amp;amp;lt;/code&amp;amp;gt; for blocks and when
      should you use &amp;amp;lt;code&amp;amp;gt;do&amp;amp;lt;/code&amp;amp;gt;/&amp;amp;lt;code&amp;amp;gt;end&amp;amp;lt;/code&amp;amp;gt;?”
      His answer:&amp;amp;lt;/p&amp;amp;gt; &amp;lt;!--…--&amp;gt;
    &amp;lt;/content&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I know you’re thinking that these feeds aren’t meant to be read by humans
in the raw, so who cares. As a developer, though, wouldn’t you rather deal
with simpler raw data? Here’s the same excerpt in JSON Feed (unminified):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;content_html&quot;:
  &quot;&amp;lt;p&amp;gt;Here’s another blog post vouching for writing Ruby blocks using
  the semantic\nrule. Sometimes called “the Weirich rule” because
  of &amp;lt;a href=\&quot;https://en.wikipedia.org/wiki/Jim_Weirich\&quot;&amp;gt;Jim
  Weirich&amp;lt;/a&amp;gt;’s\n“Braces vs. Do/End”
  article&amp;lt;sup id=\&quot;fnref:weirich\&quot;&amp;gt;&amp;lt;a
  href=\&quot;#fn:weirich\&quot; class=\&quot;footnote\&quot; rel=\&quot;footnote\&quot;
  role=\&quot;doc-noteref\&quot;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/sup&amp;gt; and an issue he filed against\n&amp;lt;a
  href=\&quot;https://github.com/rubocop/ruby-style-guide/issues/162\&quot;&amp;gt;&amp;lt;code&amp;gt;rubocop/ruby-style-guide&amp;lt;/code&amp;gt;&amp;lt;/a&amp;gt;.
  The rule unambiguously answers the\nquestion posed by Weirich:
  “When should you use &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; for blocks and when\nshould
  you use &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;?” His answer:&amp;lt;/p&amp;gt; ...&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;json-is-more-accessible-than-xml&quot;&gt;JSON is more accessible than XML&lt;/h2&gt;

&lt;p&gt;JavaScript is one of the most widely-used programming languages in the world,
and JavaScript Object Notation is a first-class feature of the language. In
a JavaScript context, it’s easy to both generate and parse valid JSON.&lt;/p&gt;

&lt;p&gt;Since parsing JSON takes no effort, even client-side in a web browser, I
feel there are opportunities for us to go beyond feed reading and aggregation
with JSON Feeds. The cost of parsing is so low, and the specified structure
is simple. Desktop web browsers can even autoformat JSON to be nicely
human readable&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;New programmers and non-programmers can make sense of JSON, and JSON parsing
tools, pretty quickly. Feel free to pair this with my “HTML doesn’t need to
be escaped in JSON Feed” argument above. RSS is just more abstract to read
and slightly more error-prone to write. Given this, I think JSON Feed has
the accessibility edge over RSS.&lt;/p&gt;

&lt;h2 id=&quot;the-standard-exchange-format-is-json&quot;&gt;The standard exchange format is JSON&lt;/h2&gt;

&lt;p&gt;Many popular programming languages besides JavaScript also have first-class
support for JSON. For example, I implemented JSON Feed generation support in
Ruby using &lt;a href=&quot;https://docs.ruby-lang.org/en/master/JSON.html&quot;&gt;Ruby’s standard JSON library&lt;/a&gt;. Writing the implementation
in Ruby felt no different than doing it in JavaScript.&lt;/p&gt;

&lt;p&gt;The reason you’ll find JSON libraries built into so many languages is because
it’s normal for API services respond to clients in JSON these days. In my
experience, XML-based APIs have been eclipsed by JSON-based ones. Even as
far back as 2011, a blog post by Dmitriy Samovskiy, &lt;a href=&quot;http://www.somic.org/2011/06/08/json-vs-xml-in-api/&quot;&gt;“JSON vs. XML in
API,”&lt;/a&gt; indicates that developers were realizing that designing JSON-based
APIs resulted in a less complex system:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;There is no easy and universal way how to represent nested hashes and arrays
using XML (if there is, I hope to hear from you about it—I need stable
libraries that can convert arrays and hashes to XML and back that could
interop among each other for all major programming languages). Of course it’s
possible and not terribly difficult, but it’s something that one must do.&lt;/p&gt;

  &lt;p&gt;Contrast this situation with JSON—you don’t need to worry about this,
it’s already taken care of for you. The only limitation of JSON that we
faced was that JSON doesn’t like integers as hash keys, it wants you to
convert them to strings or use an array instead of a hash.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would guess most of the software developers I’ve met and worked with, my
age or younger, have never had to consume an API that responds in XML. (Even
more of them may not know what &lt;a href=&quot;https://en.wikipedia.org/wiki/SOAP&quot;&gt;SOAP&lt;/a&gt; is.)&lt;/p&gt;

&lt;p&gt;If JSON is the standard exchange format, it makes sense that websites
would benefit from providing content in that format so that content can be
read… standardly. The longevity and resilience of RSS has made it &lt;em&gt;the
standard&lt;/em&gt; for website feeds, but we have watched the rest of the Web move
on to JSON for good enough reasons. I’d say “why not JSON Feed?” since it
already exists and is well specified.&lt;/p&gt;

&lt;h2 id=&quot;software-developers-are-good-at-working-with-json&quot;&gt;Software developers are good at working with JSON&lt;/h2&gt;

&lt;p&gt;Implementing JSON Feed was a breeze. I compared my implementations of Atom,
RSS, and JSON Feed generation side by side. They’re all shaped the same way,
and there are only a few more lines of code to required to handle some RSS
specification things. What made it a breeze was the simplicity of the JSON
library API I was using: the public interface is minimal; the method names
match my mental model for working with all kinds of (non-JSON Feed) JSON data.&lt;/p&gt;

&lt;p&gt;My comparison revealed to me that the standard Ruby library for RSS is &lt;em&gt;pretty&lt;/em&gt;
bespoke and hasn’t been used by nearly as many people over the years. It’s
not a bad library, but there’s so much friction that simply doesn’t exist
when slinging JSON. It’s no contest.&lt;/p&gt;

&lt;p&gt;Anyway, this website &lt;a href=&quot;/feed.json&quot;&gt;now has a JSON Feed&lt;/a&gt; if you’d like
to subscribe to my posts that way.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;By “RSS,” I really mean “Atom and RSS,” throughout this article. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;I couldn’t find official documentation for
  this. Just take the URL to any subreddit and add &lt;code&gt;/.rss&lt;/code&gt; to the
  path, i.e. &lt;code&gt;https://www.reddit.com/r/TVTooHigh/.rss&lt;/code&gt;. I’ll say, though, that
  in the past, the few subreddit feeds I subscribed would stop working… for
  months at a time. It may be more reliable to use a third-party subreddit
  RSS feed generator, if reliability matters to you. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;I often use &lt;a href=&quot;https://firefox-source-docs.mozilla.org/devtools-user/json_viewer/index.html&quot;&gt;Firefox’s JSON viewer&lt;/a&gt;.
  It’s good. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/i-like-json-feed</id>
    <link href="https://benjaminwil.info/weblog/i-like-json-feed"/>
    <published>2026-06-17T15:24:15-07:00</published>
    <summary>Recently, I implemented JSON Feed support for my static site generator, Lifer.</summary>
    <title>I like JSON Feed</title>
    <updated>2026-06-17T15:24:15-07:00</updated>
    <dc:date>2026-06-17T15:24:15-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;after deliberating for a while and doing some budget-math, i decided to take
the summer off of work and attempt to recover from burnout. maybe i’ll write
about that more over the next few months.&lt;/p&gt;

&lt;p&gt;this is the first time since i was fourteen that i haven’t either been
doing school or doing work (or doing both). as much as i know this break
is necessary, i’m not looking forward to it yet.&lt;/p&gt;

&lt;p&gt;as an adult, i have been risk averse when it comes to employment and
money. i’ll be living leaner this summer, but i’ll be okay.&lt;/p&gt;

&lt;p&gt;my intention this week is to create a calendar. i want to ensure that i’m not
just rotting away in my apartment full-time. i’ll plan out things i want to
go out and do; milestones for personal projects i want to make progress on;
and well-defined &lt;em&gt;chore goals&lt;/em&gt; (i’ve been putting off some things).&lt;/p&gt;

&lt;p&gt;if you’re reading this and have experienced burnout, or are getting close,
hello there. feel free to send me a message. :-)&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/13</id>
    <link href="https://benjaminwil.info/antisocial/13"/>
    <published>2026-06-16T13:29:28-07:00</published>
    <summary>after deliberating for a while and doing some budget-math, i decided to take the summer off of work and attempt to recove...</summary>
    <title>taking the summer off work</title>
    <updated>2026-06-16T13:29:28-07:00</updated>
    <dc:date>2026-06-16T13:29:28-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;You probably already know: there’s no excuse to not be using a password
manager in 2026. If you read my blog regularly, you may even be a person
actually using a password manager. It’s possible, though, that you don’t
use said password manager to manage your SSH keys.&lt;/p&gt;

&lt;p&gt;If you didn’t already know &lt;a href=&quot;https://developer.1password.com/docs/ssh/manage-keys/&quot;&gt;you can manage your SSH credentials seamlessly in
1Password&lt;/a&gt;. You can
do it &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/blob/52318f4d22c3707dfe1743502d89d6bbc785b2cb/docs/topics/SSHAgent.adoc&quot;&gt;with KeePassXC, too&lt;/a&gt;. I’m not going to mention the other
big password managers by name, but at least one of them also already has
built-in SSH agent support. Yes, the managers implement an SSH agent (see
&lt;a href=&quot;https://man.openbsd.org/ssh-agent&quot;&gt;&lt;code&gt;ssh-agent&lt;/code&gt;&lt;/a&gt;) and make authenticating
via SSH feel kinda like authenticating to Netflix via a web browser.&lt;/p&gt;

&lt;p&gt;More than ever, it’s a good idea to &lt;em&gt;not&lt;/em&gt; store any credentials (or sensitive
data in general) unencrypted on your disks. &lt;em&gt;More than ever&lt;/em&gt; because there
have been many notable instances of open-source software having recently been
compromised via supply-chain attacks and backdoors. Group-IB characterizes
supply-chain attacks as &lt;a href=&quot;https://www.group-ib.com/blog/supply-chain-attack-groups-2026/&quot;&gt;being hyped&lt;/a&gt; right now, which is funny and
horrifying.&lt;/p&gt;

&lt;p&gt;Between all the free-ish tools you use everyday and the LLM-related software
your boss pays for, your computer is more an open wound, ready to be infected,
than ever. You likely know this, I’m only here to remind you.&lt;/p&gt;

&lt;p&gt;If, like me, you manage an environment or two where you don’t want to install
a password manager, and you simply want to avoid leaving SSH private keys in
plaintext, you can use GPG and a simple shell script to keep your credentials
safe from prying mal-processes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env sh
#
# ssh-enc
#
# Usage:
#   ssh-enc &amp;lt;path to GPG-encrypted SSH private key&amp;gt; [SSH arguments]
# Example:
#   $ ssh-enc &quot;$HOME/.ssh/vps.gpg&quot; benjaminwil@example.com -vvv

encrypted_ssh_private_key_path=&quot;$1&quot;
shift

ssh_arguments=&quot;$@&quot;

eval &quot;$(ssh-agent -s)&quot;
ssh-add &amp;lt;(gpg --decrypt &quot;$encrypted_ssh_private_key_path&quot;)

ssh &quot;$ssh_arguments&quot;
&lt;/code&gt;&lt;/pre&gt;

</content>
    <id>https://benjaminwil.info/weblog/ssh-key-agent-management</id>
    <link href="https://benjaminwil.info/weblog/ssh-key-agent-management"/>
    <published>2026-05-08T16:24:10-07:00</published>
    <summary>You probably already know: there’s no excuse to not be using a password manager in 2026.</summary>
    <title>SSH agent–managed SSH keys</title>
    <updated>2026-05-08T16:24:10-07:00</updated>
    <dc:date>2026-05-08T16:24:10-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;for over a month i’ve spent a weird amount of my free time trying to set
up an android development environment (via &lt;a href=&quot;https://reactnative.dev/&quot;&gt;react native&lt;/a&gt;, and then
&lt;a href=&quot;https://nativescript.org/&quot;&gt;nativescript&lt;/a&gt;) on my laptop running the &lt;a href=&quot;https://guix.gnu.org/&quot;&gt;guix&lt;/a&gt; linux distribution.
i even had a bit of help thanks to some writing about this topic done by
&lt;a href=&quot;https://gofranz.com&quot;&gt;franz geffke&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gofranz.com/blog/react-native-on-guix/&quot;&gt;react native (and android development) on guix [with docker]&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gofranz.com/blog/react-native-android-on-guix-without-docker/&quot;&gt;build react native android apps on guix in 5 minutes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;unfortunately, i couldn’t take franz’s configuration verbatim and make it
work. and beyond that, i also got nerd-sniped trying to make his setups more
ergonomic for me. (i am slightly allergic to having to remember to manually
open 2-5 shells, source a bunch of stuff, and then start a bunch of processes
manually.)&lt;/p&gt;

&lt;p&gt;on my own, i went down some rabbit holes, asked some questions in the
&lt;em&gt;#nonguix&lt;/em&gt; channel on libera, and attempted setting up my own bespoke
environments via guix fhs containers, docker, and even a qemu virtual
machine. the closest working environment was the qemu machine. that one at
least did not require a bunch of harnessing to appease guix’s declarative,
immutable nature. if even allowed me to connect to my physical android device
without too much ritual. i abandoned that strategy, though, because it became
a guix-related time-sink to learn how to set up a non-virtio filesystem so i
could continue to run a code editor, etc. on my irl, non-virtual host machine.&lt;/p&gt;

&lt;p&gt;could i get any of these strategies to work? with enough time, i think
yes. but the personal-enjoyment accounting is already starting to be fucked up.
this blog post is me surrendering and trying to not feel horrible about all
of the time i have just admitted to losing.&lt;/p&gt;

&lt;p&gt;no hate directed at guix here. i appreciate it the more i learn it. but
i’m bummed out i couldn’t get the &lt;a href=&quot;https://guix.gnu.org/en/blog/2023/the-filesystem-hierarchy-standard-comes-to-guix-containers/&quot;&gt;guix container with fhs emulation&lt;/a&gt;
working with my physical android device. the core of the issue was that the
adb server required for communication with a physical android device could
not be run from within the container no matter what environment shit i told
the container it could have access to. and running adb on the host didn’t
“just work” with the processes inside of the container. with enough time, maybe
i could get there. but at this point, i also just don’t know enough about the
android sdk tooling to really be effective at creating the developer-harness.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/antisocial/12</id>
    <link href="https://benjaminwil.info/antisocial/12"/>
    <published>2026-04-26T13:26:28-07:00</published>
    <summary>for over a month i’ve spent a weird amount of my free time trying to set up an android development environment (via react...</summary>
    <title>admitting defeat (re: android development environments on guix)</title>
    <updated>2026-04-26T13:26:28-07:00</updated>
    <dc:date>2026-04-26T13:26:28-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;it’s a bit weird: yellows and blues and reds. what do you think?&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/11</id>
    <link href="https://benjaminwil.info/antisocial/11"/>
    <published>2026-04-05T15:10:38-07:00</published>
    <summary>it’s a bit weird: yellows and blues and reds. what do you think?</summary>
    <title>new light colourscheme</title>
    <updated>2026-04-05T15:10:38-07:00</updated>
    <dc:date>2026-04-05T15:10:38-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;the process is still evolving, but i’m going to describe my notetaking
system as of right now. i started from zero in novemberish last year and am
getting happy with the cadence and quality of my notes as of starting this
new system.&lt;/p&gt;

&lt;p&gt;the biggest change that comes with the new system is that i’m now &lt;em&gt;paper
first&lt;/em&gt;, even if i’m sitting in front of a computer. the procedure for taking
and processing paper notes is on a weekly cadence:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;at the beginning of a week, start a new page with the date as a header.&lt;/li&gt;
  &lt;li&gt;create two sections on this page: &lt;em&gt;consumption&lt;/em&gt; and &lt;em&gt;todos&lt;/em&gt;. (usually
&lt;em&gt;consumption&lt;/em&gt; takes up two-thirds of the page, and &lt;em&gt;todos&lt;/em&gt; one-third.)&lt;/li&gt;
  &lt;li&gt;create a third section starting on the next page: &lt;em&gt;notes&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;write down the titles of media consumed over the week in the &lt;em&gt;consumption&lt;/em&gt;
section. if i have additional thoughts or context to add for a piece of
media, then an endnote indicator (a superscript number like &lt;sup&gt;2&lt;/sup&gt;)
is added. then, the additional notes can be added to the &lt;em&gt;notes&lt;/em&gt; section.&lt;/li&gt;
  &lt;li&gt;write down tasks to be completed for the week under &lt;em&gt;todos&lt;/em&gt;.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; if
additional context for a task needs to be written down, the task gets an
endnote, just like &lt;em&gt;consumption&lt;/em&gt; media items. if/when i complete tasks,
they get an X.&lt;/li&gt;
  &lt;li&gt;and then the &lt;em&gt;notes&lt;/em&gt; section is pretty freeform, where each distinct note
has a heading and/or references the endnote indicator from its antecedent
&lt;em&gt;consumption&lt;/em&gt; log or &lt;em&gt;todos&lt;/em&gt; task.&lt;/li&gt;
  &lt;li&gt;at the end of the week, digitize all of the notes and save them to my
personal wiki, where notes may get incorporated into blog post drafts, longer
private articles about things i’m learning about, or emails i intend to
send. by “digitizing” i mostly mean “type out”.&lt;/li&gt;
  &lt;li&gt;if i think an uncompleted &lt;em&gt;todo&lt;/em&gt; items are important enough to carry
forward, they get added to the next week’s &lt;em&gt;todos&lt;/em&gt; section.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;that’s kind of it for now. it’s a very lightweight process i don’t have
to think about. i think the next refinements to occur will be on the
processing/digitizing side of things.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;because i tend not to live by task lists, i only write down aspirational
  tasks that i’d like to complete for the week, not every boring thing
  i need to complete to continue living. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/antisocial/10</id>
    <link href="https://benjaminwil.info/antisocial/10"/>
    <published>2026-04-05T14:37:58-07:00</published>
    <summary>the process is still evolving, but i’m going to describe my notetaking system as of right now.</summary>
    <title>my notetaking system, early 2026</title>
    <updated>2026-04-05T14:37:58-07:00</updated>
    <dc:date>2026-04-05T14:37:58-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;i’ve published two (small) non-antisocial blog posts this month, which is
about one more than usual:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://benjaminwil.info/weblog/ruby-semantic-blocks&quot;&gt;semantic style ruby blocks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://benjaminwil.info/weblog/portable-feature-flags-in-ruby&quot;&gt;portable feature flags in ten-ish lines of ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the topics probably aren’t interesting to most people, let alone most rubyists.
but lately, i’ve been inspired by some authors and creators (rss club
members included), and the edges of wikipedia, that are pleased to publish
“the boring” information. i’m not trying to denigrate anyone by saying
this. writing what you know, for yourself, to clarify your own thinking,
and to present information clearly to &lt;em&gt;the maybe one someone somewhere&lt;/em&gt;
who needs to absorb it, is a good instinct.&lt;/p&gt;

&lt;p&gt;said another way: i have relearned that we don’t have to write something
that’s interesting to a giant venn diagram of people. most of us aren’t &lt;em&gt;the
new yorker&lt;/em&gt; and don’t need to be.&lt;/p&gt;

&lt;p&gt;i know many of you reading this who write already know this. maybe one of you,
like me, needs to be reminded.&lt;/p&gt;

&lt;p&gt;one of the creators i’ve been inspired by is the biblical scholar &lt;a href=&quot;https://danielomcclellan.com/&quot;&gt;dan
mcclellan&lt;/a&gt;. to quote his bio:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;his research focuses on the languages and history of the bible, as well as
on the conceptualization of deity, of scripture, and of religious identity
through the methodological lenses of cognitive linguistics and the cognitive
science of religion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;he has made over three thousand videos now. he isn’t afraid to repeat
himself. he says lots of boring stuff that scholars in his field know quite
well. as someone with no credentials in this field, i appreciate that one
of his goals is to better communicate what the consensus view of scholars
is when in comes to controversial social and/or theological issues with
regard to christianity in the west. he also is skilled at “stitching” videos
that spread misinformation about christian shit and dunking on the content
creators. sometimes he can get pretty mean.&lt;/p&gt;

&lt;p&gt;i am not interested in many of the videos he publishes, and i definitely
don’t watch them all, but seeing how consistent he is in form, content, and
message, and how he bravely repeats himself in such a tireless way, gives
me hope that i can continue to be at least as prolific as i’ve been this month.&lt;/p&gt;

&lt;p&gt;cheers to us boring people.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/09</id>
    <link href="https://benjaminwil.info/antisocial/09"/>
    <published>2026-03-21T10:43:12-07:00</published>
    <summary>i’ve published two (small) non-antisocial blog posts this month, which is about one more than usual:</summary>
    <title>you&#39;re allowed to be uninsightful</title>
    <updated>2026-03-21T10:43:12-07:00</updated>
    <dc:date>2026-03-21T10:43:12-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;It may make sense to use a mature feature flag library or pay for feature
flags as a service in your complex application. That said, you can build
pretty robust feature flags in just a few lines of Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require &quot;json&quot;

module Features
  class &amp;lt;&amp;lt; self
    def as_json
      flags = self.public_methods - Object.public_methods - [:as_json]
      flags
        .to_h { |method|
          [method.to_s.sub(&quot;?&quot;, &quot;&quot;), self.public_send(method)]
        }
        .to_json
    end

     def éric_rohmer_mode_enabled? = enabled?(&quot;ERIC_ROHMER_MODE&quot;)

     private def enabled?(env_string)
       return false if (value = ENV[env_string]).nil?
       value != &quot;false&quot; &amp;amp;&amp;amp; value.length != 0
     end
   end
 end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this example, we track environment variables for each of our feature flags
(just one, for now: &lt;code&gt;ERIC_ROHMER_MODE&lt;/code&gt;). The interface returns a boolean
value when we ask whether the given flag is enabled. Because we’re managing
the flags within a single module, we can do nice things such as introduce
the &lt;code&gt;Features.as_json&lt;/code&gt; method to the current enabled status of all of our
feature flags, meaning we can send this data to other systems and to web
clients more easily:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Features.as_json
=&amp;gt; &quot;{\&quot;éric_rohmer_mode_enabled\&quot;:false}&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you don’t need the portability of JSON, you can
write even fewer lines of Ruby to get the same functionality by relying on
truthy and falsey outputs instead of booleans.&lt;/p&gt;

&lt;p&gt;As long as you keep higher-complexity methods like &lt;code&gt;Features.as_json&lt;/code&gt; to
a minimum, this module can easily grow with you as your need for weirder
feature flags increases. If some features should only be available to users
with a beta tester role, or you want to expose some functionality when a
certain URL parameter is present, it’s just a matter of injecting your user
object and your request parameters object:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require &quot;date&quot;
require &quot;json&quot;

module Features
  ÉRIC_ROHMER_LAUNCH_DAY = Date.new(1920, 03, 21)

  NULL_SCOPE = {
    url_params: {},
    user: nil
  }

  class &amp;lt;&amp;lt; self
    def as_json(scope = NULL_SCOPE)
      flags = self.public_methods - Object.public_methods - [:as_json]
      flags
        .to_h { |method|
          [method.to_s.sub(&quot;?&quot;, &quot;&quot;), self.public_send(method, **scope)]
        }
        .to_json
    end

     def éric_rohmer_mode_enabled?(_)
       enabled?(&quot;ERIC_ROHMER_MODE&quot;) &amp;amp;&amp;amp;
         Time.now.to_date &amp;gt;= ÉRIC_ROHMER_LAUNCH_DAY
     end

     def infinite_money_enabled?(user:, **)
       enabled?(&quot;INFINITE_MONEY&quot;) &amp;amp;&amp;amp; !user.nil? &amp;amp;&amp;amp; user.beta_tester?
     end

     def preview_mode_enabled?(url_params:, **)
       enabled?(&quot;PREVIEW_MODE&quot;) &amp;amp;&amp;amp; url_params[:preview] == &quot;yes&quot;
     end

     private def enabled?(env_string)
       return false if (value = ENV[env_string]).nil?
       value != &quot;false&quot; &amp;amp;&amp;amp; value.length != 0
     end
   end
 end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As long as you’re keeping track of potential dependencies (&lt;code&gt;NULL_SCOPE&lt;/code&gt; in
this example) and passing in reasonable default values, &lt;code&gt;Features.as_json&lt;/code&gt;
still works sans arguments, and each flag check can independently be as
complex as you’d like it to be.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;JSON.parse Features.as_json
=&amp;gt;
{&quot;éric_rohmer_mode_enabled&quot;=&amp;gt;false,
 &quot;preview_mode_enabled&quot;=&amp;gt;false,
 &quot;infinite_money_enabled&quot;=&amp;gt;false}

JSON.parse Features.as_json(user: beta_tester, url_params: {})
=&amp;gt;
{&quot;éric_rohmer_mode_enabled&quot;=&amp;gt;false,
 &quot;preview_mode_enabled&quot;=&amp;gt;false,
 &quot;infinite_money_enabled&quot;=&amp;gt;true}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I’ve used keyword arguments in my interface because I prefer them to positional
arguments. This ensures the flag method arguments remain legible
in your application code and are easy comprehend by other readers. But as
you can see, keyword arguments make flags a bit more annoying to write once
you’ve introduced dependencies.&lt;/p&gt;

&lt;p&gt;The most awkward thing here is that even feature flags methods that
don’t require dependency injection must define an argument (&lt;code&gt;_&lt;/code&gt; or
&lt;code&gt;_unused&lt;/code&gt;). The second most awkward thing is that, only because we’re
using keyword arguments, we need to pass a double-splat argument (&lt;code&gt;**&lt;/code&gt;)
to ensure, when &lt;code&gt;Features.as_json&lt;/code&gt; is computing the given dependencies for
each flag dynamically, irrelevant arguments are ignored without raising an
&lt;code&gt;ArgumentError&lt;/code&gt;. Luckily, the relevant dependencies remain very, very visible
to anyone else reading.&lt;/p&gt;

&lt;p&gt;Every codebase I’ve worked on deals with feature flags a little bit
differently. I’d love to hear about what’s different in your
application’s. (Send me a message!)&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/portable-feature-flags-in-ruby</id>
    <link href="https://benjaminwil.info/weblog/portable-feature-flags-in-ruby"/>
    <published>2026-03-21T10:18:36-07:00</published>
    <summary>It may make sense to use a mature feature flag library or pay for feature flags as a service in your complex application....</summary>
    <title>Portable feature flags in ten-ish lines of Ruby</title>
    <updated>2026-03-21T10:18:36-07:00</updated>
    <dc:date>2026-03-21T10:18:36-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;these are not the things that i necessarily would want to win, but what i
think will happen. (i’ve got nothing better to do.)&lt;/p&gt;

&lt;p&gt;best picture: &lt;em&gt;Hamnet&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best actress: Jessie Buckley, &lt;em&gt;Hamnet&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best actor: Timothée Chalamet, &lt;em&gt;Marty Supreme&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best supporting actress: Elle Fanning, &lt;em&gt;Sentimental Value&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best supporting actor: Benicio del Toro, &lt;em&gt;One Battle After Another&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best director: Paul Thomas Anderson, &lt;em&gt;One Battle After Another&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best original song: “Golden” from &lt;em&gt;Kpop Demon Hunters&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best original score:  &lt;em&gt;Hamnet,&lt;/em&gt; Max Richter&lt;/p&gt;

&lt;p&gt;best animated film:  &lt;em&gt;KPop Demon Hunters&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best international film: &lt;em&gt;Sentimental Value&lt;/em&gt;, Norway&lt;/p&gt;

&lt;p&gt;best documentary feature: &lt;em&gt;Mr. Nobody Against Putin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best casting: &lt;em&gt;Marty Supreme&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best sound: &lt;em&gt;F1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best cinematography: &lt;em&gt;Train Dreams&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best original screenplay: &lt;em&gt;Sinners,&lt;/em&gt; Ryan Coogler&lt;/p&gt;

&lt;p&gt;best adapted screenplay: &lt;em&gt;Bugonia&lt;/em&gt;, Will Tracy&lt;/p&gt;

&lt;p&gt;best live action short film: &lt;em&gt;Butcher’s Stain&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best animated short film: &lt;em&gt;The Girl Who Cried Pearls&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best documentary short film: &lt;em&gt;Children No More: Were and Are Gone&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best visual effects: &lt;em&gt;Jurassic World Rebirth&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best production design: &lt;em&gt;Sinners&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best film editing: &lt;em&gt;F1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best makeup and hairstyling: &lt;em&gt;Frankenstein&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;best costume design: &lt;em&gt;Frankenstein&lt;/em&gt;&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/08</id>
    <link href="https://benjaminwil.info/antisocial/08"/>
    <published>2026-03-13T21:14:30-07:00</published>
    <summary>these are not the things that i necessarily would want to win, but what i think will happen.</summary>
    <title>oscar predictions 2026</title>
    <updated>2026-03-13T21:14:30-07:00</updated>
    <dc:date>2026-03-13T21:14:30-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Here’s another blog post vouching for writing Ruby blocks using the semantic
rule. Sometimes called “the Weirich rule” because of &lt;a href=&quot;https://en.wikipedia.org/wiki/Jim_Weirich&quot;&gt;Jim Weirich&lt;/a&gt;’s
“Braces vs. Do/End” article&lt;sup id=&quot;fnref:weirich&quot;&gt;&lt;a href=&quot;#fn:weirich&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and an issue he filed against
&lt;a href=&quot;https://github.com/rubocop/ruby-style-guide/issues/162&quot;&gt;&lt;code&gt;rubocop/ruby-style-guide&lt;/code&gt;&lt;/a&gt;. The rule unambiguously answers the
question posed by Weirich: “When should you use &lt;code&gt;{}&lt;/code&gt; for blocks and when
should you use &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt;?” His answer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Use braces (&lt;code&gt;{}&lt;/code&gt;) for blocks that return values.&lt;/li&gt;
  &lt;li&gt;Use keywords (&lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt;) for blocks executed for side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;an-explanation&quot;&gt;An explanation&lt;/h2&gt;

&lt;p&gt;Let’s say we were iterating over some movies in order to print out their titles:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films = [
  &quot;A Tale of Springtime&quot;,
  &quot;A Tale of Winter&quot;,
  &quot;A Summer&#39;s Tale&quot;,
  &quot;A Tale of Autumn&quot;
]

films.each do |title|
  puts title
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;An &lt;code&gt;#each&lt;/code&gt; block only ever executes for side effects and never returns a
value we can do stuff with. If we wanted to pre-format our list
of films, we would need to iterate in such a way that mutates our film list
(or creates a new list) before printing the films out:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films.map! { |title|
  title.upcase
}

films.each do |title|
  puts title
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At a glance, a reader can see two different types of blocks performing two
different functions: one mutates data; the other is executed for side effects
(printing out a list of films). An author not using the semantic rule might
have written this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films.map! { |title| title.upcase }
films.each { |title| puts title }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films.map! do |title|
  title.upcase
end

films.each do |title|
  puts title
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Both of these are readable but do not communicate intent as clearly as the
semantic style blocks. My primary goal when authoring code is to communicate
my intent to other readers, so I appreciate the ability to be as precise
in as few characters as possible.&lt;/p&gt;

&lt;h2 id=&quot;criticisms-of-the-style&quot;&gt;Criticisms of the style&lt;/h2&gt;

&lt;p&gt;To me, there are two compelling reasons to be critical of semantic style
blocks: the readability of &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt; one-liners; and the inability of
automated tools to format Ruby code consistently based on the semantic
rule. I can agree that, sometimes, one-liners meant to execute side effects
would make reading code more difficult:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films.each do |title| puts title end
# is less readable than:
films.each { |title| puts title }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But Ruby is so expressive that, in the off-chance you need to write a
&lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt; one-liner, I’m confident there are other ways of achieving better
readability without ditching the rule:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;films.each do |title| puts(title) end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As for auto-formatting Ruby code while abiding by the semantic rule, this seems
like a solvable problem in the long term. The “problem” is that Ruby is
“too” expressive, and the tooling would have to understand a lot about the
program and the author’s intent to reformat to braces or &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt; correctly.&lt;/p&gt;

&lt;p&gt;There is &lt;a href=&quot;https://github.com/standardrb/standard/issues/109&quot;&gt;an interesting issue filed against
&lt;code&gt;standardrb&lt;/code&gt;&lt;/a&gt; discussing
this. And, as of 1.0.0, &lt;code&gt;standardrb&lt;/code&gt; has a relaxed, &lt;a href=&quot;https://github.com/standardrb/standard/pull/263&quot;&gt;“let the author
choose”&lt;/a&gt; approach to this
block syntax. If you’re developing an application and your Ruby code is
auto-formatted, I hope you will still choose to be intentional whenever
you’re writing not-auto-formattable code.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:weirich&quot;&gt;
      &lt;p&gt;Weirich’s blog is no longer online but is &lt;a href=&quot;https://web.archive.org/web/20140117145536/http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc&quot;&gt;archived by the Wayback
        Machine&lt;/a&gt;. &lt;a href=&quot;#fnref:weirich&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/ruby-semantic-blocks</id>
    <link href="https://benjaminwil.info/weblog/ruby-semantic-blocks"/>
    <published>2026-03-08T16:06:46-07:00</published>
    <summary>Here’s another blog post vouching for writing Ruby blocks using the semantic rule.</summary>
    <title>Semantic style Ruby blocks</title>
    <updated>2026-03-08T16:06:46-07:00</updated>
    <dc:date>2026-03-08T16:06:46-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;hi. &lt;a href=&quot;https://www.carolinecrampton.com/the-view-from-rss/&quot;&gt;rss club showed up in my feeds
today&lt;/a&gt;, and then
i remembered that &lt;em&gt;this feed is linked there&lt;/em&gt; and i haven’t used it in a
while. and then i clicked on the feed and realized that nginx was rendering
the feed with a mime type of &lt;code&gt;text/xml&lt;/code&gt; rather than &lt;code&gt;application/rss+xml&lt;/code&gt;. so
i fixed that.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text/xml&lt;/code&gt; will likely tell your browser to render the feed as an xml in the
browser. whereas &lt;code&gt;application/rss+xml&lt;/code&gt;, &lt;code&gt;application/atom+xml&lt;/code&gt;, and so on,
will tell your browser to use whatever application is configured to be your
feedreader. on my ios device, for example, clicking a link to this feed now
results in a dialog modal. “open this feed in reeder?” it asks. this is much
nicer than the browser rendering a fucking unstyled text file.&lt;/p&gt;

&lt;p&gt;i noticed some other rss club feeds have similar issues, so if you’re reading
this and you’re a clubber, do consider checking out your feeds.&lt;/p&gt;

&lt;p&gt;on my main feed (&lt;a href=&quot;https://benjaminwil.info/weblog&quot;&gt;html&lt;/a&gt;,
&lt;a href=&quot;https://benjaminwil.info/feed.xml&quot;&gt;rss&lt;/a&gt;) i succeeded in my informal goal
of posting one-ish thing per month in 2025. i intend to keep it up, and
maybe i’ll even throw some more stuff in this antisocial feed this year, too.&lt;/p&gt;

&lt;p&gt;bye.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/07</id>
    <link href="https://benjaminwil.info/antisocial/07"/>
    <published>2026-03-04T23:21:54-08:00</published>
    <summary>hi.</summary>
    <title>your mime type is showing</title>
    <updated>2026-03-04T23:21:54-08:00</updated>
    <dc:date>2026-03-04T23:21:54-08:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;This month was the &lt;span style=&quot;font-variant: small-caps;&quot;&gt;32&lt;sup&gt;nd&lt;/sup&gt;
&lt;/span&gt; occurrence of the &lt;a href=&quot;https://www.victoriafilmfestival.com&quot;&gt;Victoria Film
Festival&lt;/a&gt; here in Victoria,
British Columbia. It is likely &lt;a href=&quot;https://cheknews.ca/packed-theatres-mark-record-breaking-victoria-film-festival-1305971/&quot;&gt;the best-selling VFF in the history of the
festival&lt;/a&gt; and featured ninety-one feature-length films from twenty-five
countries. For a small city-like region like Greater Victoria, the festival
operates at a higher level than we really deserve, despite the criticism
that it’s “just” a “greatest hits” of other, larger 2025 film fests. It’s
the best VFF that I’ve personally attended, and I think next year is probably
gonna be even better.&lt;/p&gt;

&lt;p&gt;Since I live and work in Victoria and was just living my normal life, I could
only attend a handful of (ten) shows in the evenings, but I overheard others
bragging about seeing twenty—and even thirty—movies over the course of
the ten-day event. Do what you will with it: this article is just a rundown
of the films I saw and how much I’d recommend them. We’re doing nebulous
star ratings from between one and four stars
(i.e. &lt;span aria-label=&quot;4 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★★&lt;/span&gt;)
that take into account my enjoyment of the work and my enjoyment of the
festival screening.&lt;/p&gt;

&lt;h2 id=&quot;sunset&quot;&gt;100 Sunset&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Kunsang Kyirong, 2025, Canada&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A Canadian immigrant story that I personally haven’t seen before, &lt;em&gt;100
Sunset&lt;/em&gt; is focused on the Tibetan diaspora in Parkdale, Toronto. Kyirong’s
quiet directorial debut is bolstered by veteran (as far as I’m concerned)
cinematographer &lt;a href=&quot;https://www.nikolaymichaylov.com/&quot;&gt;Nikolay Michaylov&lt;/a&gt;’s
effortless ability to make you feel like you’re in the subject’s head.  It is
full of challenging asshole characters and interesting story-decisions.
&lt;span aria-label=&quot;2.5 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★½&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;nirvanna-the-band-the-show-the-movie&quot;&gt;Nirvanna the Band the Show the Movie&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Matt Johnson, 2025, Canada&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I went in not having consumed any of &lt;a href=&quot;https://nirvannathebandthe.show/episodes/#webseries&quot;&gt;the original web
series&lt;/a&gt; or &lt;a href=&quot;https://nirvannathebandthe.show/episodes/#tv_show&quot;&gt;the television show&lt;/a&gt;. I was
appeased, as were my friends who &lt;em&gt;love&lt;/em&gt; the antecedent content. I really hope
that the distributed cut of the movie will also include actual &lt;em&gt;Back to the
Future&lt;/em&gt; score samples.  If you’re a sucker for time travel, gonzo filmmaking,
or buddy comedies, you will have a good time.
&lt;span aria-label=&quot;3.5 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★½&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;beautiful-and-neat-room&quot;&gt;Beautiful and Neat Room&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Maria Petschnig, 2025, United States&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An unhinged tale about a working artist who can’t afford her Brooklyn
apartment without short-term renting out her spare room to other people who
can’t afford their own Brooklyn apartments. The principal actress, Charlotte
Aubin, makes this work despite some of the dialogue (with a venti-sized
cast of supporting actors) smelling slightly undercooked. You &lt;em&gt;will&lt;/em&gt; leave
hating every roommate you’ve ever had.  This was the first, and only, film I
saw at the makeshift thirtyish-seater cinema-venue Toaster Rocket located
at &lt;a href=&quot;https://www.printhole.ca/&quot;&gt;Print Hole&lt;/a&gt;. I gotta say, this was a good
venue. Maybe even better than the &lt;em&gt;real cinema&lt;/em&gt; Screen 5 at the Capitol 6
where &lt;em&gt;100 Sunset&lt;/em&gt; screened.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;span aria-label=&quot;2.5 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★½&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;pillion&quot;&gt;Pillion&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Harry Lighton, 2025, United Kingdom &amp;amp; Ireland&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The crowd loved it, and it was heartwarming. This is incredible considering the
movie focuses on a BDSM relationship, which is an intense subculture that I’m
positive ninety percent of the audience, including myself, know nothing about.
A feat. Experiencing the narrative through the narrow, naive point of view
of our protagonist, Harry, will remain burned into my long-term memory.
&lt;span aria-label=&quot;3 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;blue-heron&quot;&gt;Blue Heron&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Sophy Romvari, 2025, Canada &amp;amp; Hungary&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Like &lt;em&gt;100 Sunset&lt;/em&gt;, this one is another feature-length debut by a Canadian
woman-filmmaker. It amazingly, deservedly, has already been acquired for
distribution by Janus Films. It’s a semi-autobiographical story about
a Hungarian-Canadian family whose oldest child is struggling with mental
illness. It brings a sharp, fresh perspective to the banal family tragedy
movie we’ve seen many times over, and it incorporates both narrative and
documentary elements in a surprisingly uncomplicated way. Despite the things
I really didn’t like about it (millenial needle drops; [spoiler redacted]),
it is probably my number one pick from the festival.
&lt;span aria-label=&quot;4 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;levers&quot;&gt;Levers&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Rhayne Vermette, 2025, Canada&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was excited and primed for this, having seen Vermette’s debut feature
&lt;a href=&quot;https://en.wikipedia.org/wiki/Ste._Anne_(film)&quot;&gt;&lt;em&gt;Ste. Anne&lt;/em&gt;&lt;/a&gt;
a couple of years ago. This screening was in collaboration
with local events promoter and zine-maker &lt;a href=&quot;https://destroyedcinema.neocities.org/&quot;&gt;&lt;em&gt;Destroyed
Cinema&lt;/em&gt;&lt;/a&gt;. &lt;em&gt;Destroyed&lt;/em&gt; programmed this
screening to be followed by live music, which rocks. I think this complemented
the film a lot. &lt;em&gt;Levers&lt;/em&gt; kinda gives you a Guy Madden-high as you follow
dozens of (almost a hundred?) extras in rural Manitoba during a mysterious
pseudo-apocolyptic solar eclipse, leaving the town in darkness for seemingly a
&lt;em&gt;very&lt;/em&gt; long time. It was purportedly filmed &lt;a href=&quot;https://www.thestar.com/entertainment/tiff/tiff-2025-this-surreal-canadian-film-was-shot-on-broken-cameras-and-based-on-tarot/article_74f4f2dd-3835-4217-ad16-82665d84a7fe.html&quot;&gt;on broken cameras&lt;/a&gt;, though
I don’t think that stands out as much as it just having a bedroom-filmmaker,
no-lighting, 1980s made-for-television look. There are also tarot cards
involved.
&lt;span aria-label=&quot;4 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;rose-of-nevada&quot;&gt;Rose of Nevada&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Mark Jenkin, 2025, United Kingdom&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A perfect follow-up to &lt;em&gt;Levers&lt;/em&gt;, &lt;em&gt;Rose of Nevada&lt;/em&gt; also looks like a cursed
1980s television show episode, albeit a bit more crackerjack. The gentility
of the fishing village setting and warm, vintage look  makes you forget that
this is a hard &lt;em&gt;The Twilight Zone&lt;/em&gt; episode. By “hard,” I mean good.
&lt;span aria-label=&quot;4 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-blue-trail&quot;&gt;The Blue Trail&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Gabriel Mascaro, 2025, Brazil&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A dystopian-future movie that’s more character than genre, and I appreciate
that the character also happens to be a seventy-five year old woman. This
premise alone gets at something we deserve more of in a time when nearly all of
our genre movies are about rich people who are played by actors who are rich people
who, at some point, have been in a Marvel movie.
&lt;span class=&quot;star-rating&quot;&gt;★★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;a-useful-ghost&quot;&gt;A Useful Ghost&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Ratchapoom Boonbunchachoke; 2025; Thailand, France, Singapore &amp;amp; Germany&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Another directorial debut. I look forward to seeing more films from
Boonbunchachoke, but unfortunately I gotta be mean about this one. It’s
a black comedy that isn’t very funny and is probably an hour too long. It
seems to me that there were too many cooks in the production-kitchen, which
led to a lot of independently interesting story-ingredients being forced into
an ambitious, professional, but ultimately unseasoned and conventional stew.
&lt;span aria-label=&quot;2 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;a-poet&quot;&gt;A Poet&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Simón Mesa Soto; 2025; Colombia, Germany &amp;amp; Sweden&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To me, this feels like a 2000s indie comedy revival movie. It was revitalizing
to see a two-hour movie about such a pathetic and misguided person with &lt;em&gt;no
jokes&lt;/em&gt; in it, but formally this movie has almost nothing going on.
&lt;span aria-label=&quot;2 out of 4 stars&quot; class=&quot;star-rating&quot;&gt;★★&lt;/span&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Not a huge compliment, but still. Screen 5, unfortunately, is &lt;em&gt;the
  worst&lt;/em&gt;, smallest, dimly-lit cinema experience you’ll have in the city. You
  can see and hear the blood orange &lt;em&gt;EXIT&lt;/em&gt; signs more easily than you can the
  movie you’re there to see. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/vff-2026</id>
    <link href="https://benjaminwil.info/weblog/vff-2026"/>
    <published>2026-02-20T18:47:33-08:00</published>
    <summary>This month was the 32nd occurrence of the Victoria Film Festival here in Victoria, British Columbia.</summary>
    <title>Victoria Film Festival 2026</title>
    <updated>2026-02-20T18:47:33-08:00</updated>
    <dc:date>2026-02-20T18:47:33-08:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Today I’m launching my website redesign. I hope that you like it. Comparing
the new design to the old one&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, my design seems to accidentally commemorate
the soft ending of my career as a techincal writer. (I continue to search for
and take software development roles.) We’ve gone from “bold and friendly” to
“brutal and web-traditional” as I transformed from curious observer of software
to grisled maintainer of software. The purple accent is gone and has been
replaced with blues and blacks (in light mode) and yellows (in dark mode),
and the IBM Plex Sans typeface has been replaced by your browser’s default
serif typeface. For most of you, that’s probably Times New Roman, bread
null butter. “Times New Roman,” &lt;a href=&quot;https://practicaltypography.com/a-brief-history-of-times-new-roman.html&quot;&gt;writes typographer Matthew Butterick&lt;/a&gt;,
“connotes apathy.” While I’d often agree, I wanna ask him if all stoicism is
apathy, then? I hope my redesign broadcasts to readers my pragmaticism and
connects me to the ancestral proto-social web where hobbyists and developers
shared knowledge and experience for free, openly, via HTTP and RSS.&lt;/p&gt;

&lt;p&gt;With the redesign comes new pages, as well: &lt;a href=&quot;/colophon&quot;&gt;the colophon&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Here’s &lt;a href=&quot;https://web.archive.org/web/20230528122559/https://benjaminwil.info/weblog/providence-rhode-island/&quot;&gt;an example webpage archived by Archive.org&lt;/a&gt;. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/new-website</id>
    <link href="https://benjaminwil.info/weblog/new-website"/>
    <published>2026-01-26T08:20:59-08:00</published>
    <summary>Today I’m launching my website redesign. I hope that you like it.</summary>
    <title>New website</title>
    <updated>2026-01-26T08:20:59-08:00</updated>
    <dc:date>2026-01-26T08:20:59-08:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;As always, in an unranked order, here are the thirty best movies I was able
to watch in 2025. This list was also &lt;a href=&quot;https://letterboxd.com/benjaminwil/list/top-thirty-2025/&quot;&gt;published on Letterboxd&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I don’t think this year’s list is particularly interesting, except in that
Hong Sang-soo has three entries and there are a couple (&lt;em&gt;Aftersun&lt;/em&gt;,
&lt;em&gt;Sexy Beast&lt;/em&gt;) directorial debuts in here. If I had to throw these all out
and pick out only one it’d be Haneke’s &lt;em&gt;Benny’s Video&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here are links to previous lists: &lt;a href=&quot;/weblog/2024-film&quot;&gt;2024&lt;/a&gt;,
&lt;a href=&quot;/weblog/2023-film&quot;&gt;2023&lt;/a&gt;, &lt;a href=&quot;/weblog/2022-film&quot;&gt;2022&lt;/a&gt;, &lt;a href=&quot;/weblog/2021-film&quot;&gt;2021&lt;/a&gt;,
&lt;a href=&quot;/weblog/2020-film&quot;&gt;2020&lt;/a&gt;, &lt;a href=&quot;/weblog/2019-film&quot;&gt;2019&lt;/a&gt;,
&lt;a href=&quot;/weblog/2018-film&quot;&gt;2018&lt;/a&gt;, &lt;a href=&quot;/weblog/2017-film&quot;&gt;2017&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Charlotte Wells: &lt;em&gt;Aftersun&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Larry Clark: &lt;em&gt;Another Day in Paradise&lt;/em&gt;, 1998&lt;/li&gt;
  &lt;li&gt;Michael Haneke: &lt;em&gt;Benny’s Video&lt;/em&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Jack Dunphy: &lt;em&gt;Bob’s Funeral&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;By the Stream&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Adam Curtis: &lt;em&gt;Can’t Get You Out of My Head&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Agnès Varda: &lt;em&gt;Cléo from 5 to 7&lt;/em&gt;, 1962&lt;/li&gt;
  &lt;li&gt;Bill Duke: &lt;em&gt;Deep Cover&lt;/em&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Sidney Lumet: &lt;em&gt;Dog Day Afternoon&lt;/em&gt;, 1975&lt;/li&gt;
  &lt;li&gt;Stanley Kwan Kam-Pang: &lt;em&gt;Full Moon in New York&lt;/em&gt;, 1989&lt;/li&gt;
  &lt;li&gt;Tracey Todd: &lt;em&gt;The Flavor of Cassava Leaf Over Rice&lt;/em&gt;, 2025&lt;/li&gt;
  &lt;li&gt;Sam Crane, Pinny Grylls: &lt;em&gt;Grand Theft Hamlet&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;In Another Country&lt;/em&gt;, 2012&lt;/li&gt;
  &lt;li&gt;Leos Carax: &lt;em&gt;It’s Not Me&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Clint Eastwood: &lt;em&gt;Juror #2&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Werner Herzog: &lt;a href=&quot;https://en.wikipedia.org/wiki/Lessons_of_Darkness&quot;&gt;&lt;em&gt;Lessons of Darkness&lt;/em&gt;&lt;/a&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Alain Guiraudie: &lt;em&gt;Misericordia&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Kelly Reichardt: &lt;em&gt;The Mastermind&lt;/em&gt;, 2025&lt;/li&gt;
  &lt;li&gt;Norman Jewison: &lt;em&gt;Moonstruck&lt;/em&gt;, 1987&lt;/li&gt;
  &lt;li&gt;Richard Linklater: &lt;em&gt;Nouvelle Vague&lt;/em&gt;, 2025&lt;/li&gt;
  &lt;li&gt;Wim Wenders: &lt;a href=&quot;http://www.cineoutsider.com/reviews/dvd/r/room_666.html&quot;&gt;&lt;em&gt;Room 666&lt;/em&gt;&lt;/a&gt;, 1982&lt;/li&gt;
  &lt;li&gt;Jonathan Glazer: &lt;em&gt;Sexy Beast&lt;/em&gt;, 2000&lt;/li&gt;
  &lt;li&gt;Adam Curtis: &lt;a href=&quot;https://jacobin.com/2025/07/adam-curtis-y2k-blair-mcqueen&quot;&gt;&lt;em&gt;Shifty&lt;/em&gt;&lt;/a&gt;, 2025&lt;/li&gt;
  &lt;li&gt;David Cronenberg: &lt;em&gt;The Shrouds&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Kristoffer Borgli: &lt;em&gt;Sick of Myself&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Ryan Coogler: &lt;em&gt;Sinners&lt;/em&gt;, 2025&lt;/li&gt;
  &lt;li&gt;Boris Lojkine: &lt;em&gt;Souleymane’s Story&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Johan Grimonprez: &lt;em&gt;Soundtrack to a Coup d’Etat&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;a href=&quot;https://thetake-up.com/a-travelers-needs/&quot;&gt;&lt;em&gt;A Traveler’s Needs&lt;/em&gt;&lt;/a&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Tsai Ming-laing: &lt;em&gt;The Wayward Cloud&lt;/em&gt;, 2005&lt;/li&gt;
&lt;/ul&gt;
</content>
    <id>https://benjaminwil.info/weblog/2025-film</id>
    <link href="https://benjaminwil.info/weblog/2025-film"/>
    <published>2025-12-31T12:00:00-07:00</published>
    <summary>As always, in an unranked order, here are the thirty best movies I was able to watch in 2025.</summary>
    <title>The best films I saw: 2025 edition</title>
    <updated>2025-12-31T12:00:00-07:00</updated>
    <dc:date>2025-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;After &lt;a href=&quot;https://2025.euruko.org&quot;&gt;EuRuKo&lt;/a&gt; in &lt;a href=&quot;/weblog/viana-do-castelo&quot;&gt;Viana do
Castelo&lt;/a&gt;, I spent some time in Porto. In Viana do
Costelo, some locals said that Porto is not as tourism-oriented as Lisbon.
If that’s true, I &lt;em&gt;can’t imagine&lt;/em&gt; how tourist-friendly Lisbon must be. I stayed
near the historic centre of Porto, and it was quite touristic. The Wikipedia
article about Porto has &lt;a href=&quot;https://en.wikipedia.org/wiki/Porto#Tourism&quot;&gt;a little tourism
section&lt;/a&gt; with links to articles and
studies that indiciate that Porto has been fundamentally changed by an increase
to tourism over the last twenty years. As a tourist-foreigner there, I can’t
complain: it was an easy place to be a tourist.&lt;/p&gt;

&lt;p&gt;Even on the outside of mainstream tourism destinations, Porto caters well to
foreigners. For example, all of &lt;a href=&quot;https://cinematrindade.pt&quot;&gt;Cinema Trindade&lt;/a&gt;’s
promotional and advertising materials were crystal clear about which films were
being shown in English or had English subtitles available. Across the street
from Cinema Trindade was a wine bar (&lt;strong&gt;FUNQ&lt;/strong&gt;) operated by and filled with Porto
expatriates. &lt;a href=&quot;https://www.batalhacentrodecinema.pt&quot;&gt;Batalha Centro de Cinema&lt;/a&gt;, a
slightly more tourist-oriented cinema and cultural centre, seemed to have one
Anglo-friendly showing every night of the week.&lt;/p&gt;

&lt;p&gt;So Porto was a hospitable, pretty unique, and a very laid back place
to take a vacation. If you’re going to Porto, I have a few recommendations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I already mentioned &lt;strong&gt;The Batalha Centro de Cinema&lt;/strong&gt;, which is not only a
two-screen cinema but a cinema bookstore, bar, and gallery. There were posters
all over the city  for their David Bowie film series which was happening over
the course of three or four months. Only having visited here twice, I don’t
know the true health of this organization, but it gives me hope that the
cinema isn’t actually dying. The book shop was special, as I don’t usually see
so much literature dedicated to film in a single place.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;Guindalense Futebol Clube&lt;/strong&gt; is a mostly outdoor pub on the edge of a
cliff that looks out over the historic Dom Luís I Bridge and Vila Nova de Gaia
and serves traditional Portuguese hotdogs and sandwiches. It’s a great view
and a nice, cool place to sit.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.serralves.pt/en/&quot;&gt;Serralves&lt;/a&gt;&lt;/strong&gt; is a great contemporary art museum.
The programming that was on during my visit featured artists from all over the
world, but to me the most interesting features were both Portuguese
filmmakers. First, the permanant &lt;a href=&quot;https://www.serralves.pt/en/ciclo-serralves/manoel-de-oliveira-exposicao-permanente/&quot;&gt;Casa do Cinema Manoel de
Oliveira&lt;/a&gt;
room and theatre, which celebrates the late Porto director and writer. In
addition to bits of the filmmaker’s personal art collection and a synchronized
projection of selected works, there is a video-library wall where visitors can
watch entire films and browse information about Oliveira’s filmography.
Second, &lt;em&gt;&lt;a href=&quot;https://www.serralves.pt/en/ciclo-serralves/0606-uma-coisa-do-outro-mundo/&quot;&gt;Uma Coisa do Outro
Mundo&lt;/a&gt;
[A Thing From Another World]&lt;/em&gt;, a video installation by Jorge Jácome featuring
faux-documentary loops featuring disturbing (but funny) military personnel
encounters with aliens.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.torto-porto.com/&quot;&gt;Torto&lt;/a&gt;&lt;/strong&gt; is an excellent cocktail bar. If you
only go to one, make it this one.&lt;/li&gt;
  &lt;li&gt;If you’re looking for some gentle breakfast or lunch near Cedofeita, go to
&lt;strong&gt;Hakko&lt;/strong&gt;, a tiny lunch place with exceptional specialty coffee, a great plate
of Turkish eggs, and a great record collection, or &lt;strong&gt;Bicho&lt;/strong&gt;, a bright bakery
and cafḗ just a block away.&lt;/li&gt;
  &lt;li&gt;If you’re still in Cedofeita, go to the &lt;strong&gt;Catraio&lt;/strong&gt; beer garden for a huge
selection of craft beer or &lt;strong&gt;Genuíno&lt;/strong&gt; for an effortless family-style dinner
paired with natural wines.&lt;/li&gt;
  &lt;li&gt;Also in the Cedofeita neighbourhood, &lt;strong&gt;&lt;a href=&quot;https://www.materiaprima.pt/&quot;&gt;Materia
Prima&lt;/a&gt;&lt;/strong&gt; is my favourite type of book and record
shop. From their website: “Our interests are broadband, and not focused on any
particular aesthetics. We operate with the most expansive and inclusive
definition of culture, and work to make accessible to a widest public, the most
adventurous, experimental, innovative and sometimes exotic artists, musicians,
independent labels and publishers.”&lt;/li&gt;
  &lt;li&gt;Pastel de nata is a pastry that is literally everywhere in Portugal, it seems.
&lt;strong&gt;Manteigaria&lt;/strong&gt; is a chain of bakeries that made the best ones I tried. But
honestly, each and every one I had was pretty good.&lt;/li&gt;
&lt;/ul&gt;
</content>
    <id>https://benjaminwil.info/weblog/porto</id>
    <link href="https://benjaminwil.info/weblog/porto"/>
    <published>2025-10-29T18:06:14-07:00</published>
    <summary>After EuRuKo in Viana do Castelo, I spent some time in Porto.</summary>
    <title>Porto, Portugal</title>
    <updated>2025-10-29T18:06:14-07:00</updated>
    <dc:date>2025-10-29T18:06:14-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I was at &lt;a href=&quot;https://2025.euruko.org&quot;&gt;EuRuKo&lt;/a&gt; last month, held in a small city in
the Norte Region of Portugal called Viana do Castelo. The conference was held in
the Centro Cultural de Viana do Castelo, which is a really open, really
impressive events venue and cultural centre built close to mouth of the River
Lima into the Atlantic Ocean.&lt;/p&gt;

&lt;p&gt;The word “castelo” translates to “castles,” and, yes, there are many historic
castles and castle-like buildings throughout the city and larger Viana do
Castelo district. If EuRuKo hadn’t been scheduled here, it’s unlikely that I
would have ever known to come here, but I’m glad I did.&lt;/p&gt;

&lt;p&gt;The fact that everyone front-of-house in the restaurants spoke English
confidently also tells me that this &lt;em&gt;is&lt;/em&gt; a destination for tourists, especially
considering that this was less true in the other smaller municipalities I visited
throughout the Norte Region of Portugal. This is probably also because it’s a
destination on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Camino_de_Santiago&quot;&gt;Camino de
Santiago&lt;/a&gt;. So what I’m trying
to say is that it was an exceptional place for a foreigner like me to visit for
a couple of days.  If you’re going to visit Viana do Castelo, I can offer a few
recommendations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Sanctuarium&lt;/strong&gt; is a bar and café at the top of the mountain of Santa Luzia, a
short walk up from the towering Sanctuary of the Sacred Heart of Jesus.
There’s a both a steep staircase and a funicular operated by the Church that
can be used to get to the summit. Go to Sanctuarium on a clear day so you can
see the city and the water down below. The garden seating here is enviable,
and many locals had drove up to the top of the mountain to picnic.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pacóvio&lt;/strong&gt; is a tiny wine and tapas bar not far from the Centro Cultural. I
found no better place to try the regional wine and low-key local food. I think
it’s owner-operated, with just a single couple running the front-of-house and
back-of-house by themselves.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Peloton Coffee and Cycling&lt;/strong&gt; is a chill, slow coffee place if you’re in need
of specialty coffee.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ribeiro’s Brewers&lt;/strong&gt; is a craft beer bar with an always-fresh tap list. When
I visited, there were plenty small-batch Portuguese, Spanish, and German beers
on the menu, and the staff was pretty excited to talk beer.&lt;/li&gt;
&lt;/ul&gt;
</content>
    <id>https://benjaminwil.info/weblog/viana-do-castelo</id>
    <link href="https://benjaminwil.info/weblog/viana-do-castelo"/>
    <published>2025-10-01T14:02:53-07:00</published>
    <summary>I was at EuRuKo last month, held in a small city in the Norte Region of Portugal called Viana do Castelo.</summary>
    <title>Viana do Castelo, Portugal</title>
    <updated>2025-10-01T14:02:53-07:00</updated>
    <dc:date>2025-10-01T14:02:53-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I’ve worked with more than one Ruby on Rails application that has a catch-all
&lt;code&gt;GET&lt;/code&gt; route at the end of its &lt;code&gt;config/routes.rb&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Rails.application.routes.draw do
  resources :posts
  resources :users

  # This route is defined after all other routes as a catch-all.
  get &quot;/*path&quot;, to: &quot;fallbacks#show&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What this means is that there is a &lt;code&gt;FallbacksController&lt;/code&gt; that handles any
routing that isn’t already handled by previously-defined routes. In this simple
example, a path like &lt;code&gt;/posts/123&lt;/code&gt;, &lt;code&gt;/posts/doesnt-exist&lt;/code&gt;, or &lt;code&gt;/users/brock&lt;/code&gt; would
be rightly handled by the resource routes that have been defined, but some other
path like &lt;code&gt;/about&lt;/code&gt; or &lt;code&gt;/contact&lt;/code&gt; would be routed through
&lt;code&gt;FallbacksController#show&lt;/code&gt;. If the fallbacks controller becomes responsible for
figuring out what content the user wants to view &lt;em&gt;or&lt;/em&gt; rendering some other page
like a 404 page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FallbacksController &amp;lt; ApplicationController
  rescue_from ActiveRecord::RecordNotFound, with: :render_404

  def show
    # If a page with the given path cannot be found, `#find_by!`
    # raises an `ActiveRecord::RecordNotFound` exception.
    @page = Page.find_by!(path: params[:path])
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This simple controller action looks the same way many other simple controller
actions look, where the main difference is that we’re handling requests for any
path not already handled by other routes. &lt;code&gt;/about&lt;/code&gt; would route to our static
page with a &lt;code&gt;#path&lt;/code&gt; attribute of &lt;code&gt;/about&lt;/code&gt;. &lt;code&gt;/page-that-doesnt-exist&lt;/code&gt; would route
to a 404.&lt;/p&gt;

&lt;h2 id=&quot;when-a-catch-all-route-accumulates-complexity&quot;&gt;When a catch-all route accumulates complexity&lt;/h2&gt;

&lt;p&gt;But the applications I’ve worked on that have implemented a catch-all route like
this don’t intend to just serve content for &lt;code&gt;/about&lt;/code&gt; or &lt;code&gt;/contact&lt;/code&gt; pages. They
all have implemented the catch-all so that they can present connected groups of
pages that have a tree-like structure, like a taxon tree:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/unisex
└── /unisex/jeans
    └── /unisex/jeans/raw
└── /unisex/tops
    └── /unisex/tops/oversized
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And using this taxon tree, they often want to present increasingly filtered-down
groups of products for a product listing page.&lt;/p&gt;

&lt;p&gt;The Rails applications I’ve worked on that provide this catch-all route have all
stuffed a lot of complexity into their &lt;code&gt;FallbacksController#show&lt;/code&gt; action.&lt;/p&gt;

&lt;p&gt;For example, if we decide that some subset of pages should be rendered in some
other way:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FallbacksController &amp;lt; ApplicationController
  JEANS_SECTION = &quot;/unisex/jeans&quot;
  TOPS_SECTION = /unisex/tops&quot;

  rescue_from ActiveRecord::RecordNotFound, with: :render_404

  def show
    path = params[:path]

    # If a page with the given path cannot be found, `#find_by!`
    # raises an `ActiveRecord::RecordNotFound` exception.
    @page = Page.find_by!(path: params[:path])

    if path.starts_with? JEANS_SECTION
      render &quot;jeans_listing&quot;
    elsif path.starts_with? TOPS_SECTION
      render &quot;tops_listing&quot;
    else
      render &quot;show&quot;
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, even though we are rendering three different templates, our only dependency
is a &lt;code&gt;@page&lt;/code&gt; record. In this example controller action, the code indicates that
our pages are basically all the same but can now be presented in three different
ways. In my opinion that’s an acceptable amount of complexity.&lt;/p&gt;

&lt;p&gt;But this can get out of hand fast if we want other variations of the product
listing pages, or tack on other pages that require a top-level route like
&lt;code&gt;/about&lt;/code&gt; or &lt;code&gt;/contact&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FallbacksController &amp;lt; ApplicationController
  GRAVEYARD_CATEGORY = &quot;graveyard&quot;

  JEANS_SECTION = &quot;/unisex/jeans&quot;
  TOPS_SECTION = /unisex/tops&quot;

  STATIC_PAGES = [&quot;/about&quot;, &quot;/contact&quot;]

  rescue_from ActiveRecord::RecordNotFound, with: :render_404

  def show
    path = params[:path]

    # If a page with the given path cannot be found, `#find_by!`
    # raises an `ActiveRecord::RecordNotFound` exception.
    @page = Page.find_by!(path: params[:path])

    # Only include products that have been discontinued.
    @products =
      if path.includes?(GRAVEYARD_CATEGORY)
        Product.where(discontinued_at: ..Time.now, taxons: @page.taxons)
      else
        Product.where(taxons: @page.taxons)
      end

    render_404 and return if (@products.none? &amp;amp;&amp;amp; !STATIC_PAGES.include?(path))

    if STATIC_PAGES.include?(path)
      render &quot;static_page&quot;
    elsif path.starts_with? JEANS_SECTION
      render &quot;jeans_listing&quot;
    elsif path.starts_with? TOPS_SECTION
      render &quot;tops_listing&quot;
    else
      render &quot;show&quot;
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So here we’ve added a lot of functionality to &lt;code&gt;FallbacksController#show&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the rendering of static pages&lt;/li&gt;
  &lt;li&gt;the rendering of a “product graveyard” for collections of discontinued products&lt;/li&gt;
  &lt;li&gt;the rendering of a 404 page if a collection of &lt;code&gt;@products&lt;/code&gt; happens to be empty
and we’re not trying to render a static page like &lt;code&gt;/about&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously this is a bit contrived; if we actually needed to render all of these
pages from a single controller action, we might restructure it a bit. But
hopefully this highlights the fact that… this should have always been served
by many controllers.&lt;/p&gt;

&lt;p&gt;Using typical Rails routes, undoing this technical debt could be a considerable
amount of work, though, if we don’t want to break the existing routing. And, of
course, maybe we do have requirements for static pages like the about page: that
they are served via &lt;code&gt;/about&lt;/code&gt; rather than &lt;code&gt;/some-controller-prefix/about&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;reducing-complexity-using-routing-constraints&quot;&gt;Reducing complexity using routing constraints&lt;/h2&gt;

&lt;p&gt;The least-effort way around the controller action stuffing would be use &lt;a href=&quot;https://guides.rubyonrails.org/routing.html#advanced-constraints&quot;&gt;routing
contraints&lt;/a&gt;, which allows us to stop stuffing
all of this complexity into a single controller action. You can express this
either as a lamdba or as a class that adheres to &lt;a href=&quot;https://github.com/rails/rails/blob/v8.0.0/actionpack/lib/action_dispatch/routing/mapper.rb#L29&quot;&gt;Rails’s contraints API&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class PageConstraints
  # Matches page paths. To be really nice, we&#39;ll optionally account for a
  # slash at the beginning and/or end of the request path. i.e. `about`,
  # `/about`, `about/`, or `/about/`.
  PAGE_PATH_REGEXP = %r{\A/?[^/]*/?\z}

  def matches?(request) = request.path.match?(PAGE_PATH_REGEXP)
end

class GraveyardCategoryConstraints
  GRAVEYARD_CATEGORY_KEYWORD = &quot;graveyard&quot;

  def matches?(request)
    request.path.match? %r{.+#{GRAVEYARD_CATEGORY_KEYWORD}.*}
  end
end

Rails.application.routes.draw do
  resources :posts
  resources :users

  # Example using a custom constraints lambda.
  get &quot;/*path&quot;,
    contraints: -&amp;gt;(request) {
      request.path.match?(Product.known_category_prefixes)
    },
    to: &quot;products#show&quot;

  # Example using a custom constraints class.
  constraints GraveyardCategoryConstraints.new do
    get &quot;/*path&quot;, to: &quot;graveyard_products#show&quot;
  end

  # Example using a custom constraints class.
  contraints PageConstraints.new do
    get &quot;/*path&quot;, to: &quot;pages#show&quot;
  end

  # Aaaaaannd the old fallback route.
  get &quot;/*path&quot;, to: &quot;fallbacks#show&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I won’t include example code for all of the individual controllers, but I hope
you can see how splitting the single, monolithic &lt;code&gt;FallbacksController#show&lt;/code&gt;
action into four separate controllers would make each of the actions much more
maintainable.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/rails-routing-constraints</id>
    <link href="https://benjaminwil.info/weblog/rails-routing-constraints"/>
    <published>2025-09-19T08:48:50+01:00</published>
    <summary>I’ve worked with more than one Ruby on Rails application that has a catch-all GET route at the end of its config/routes.r...</summary>
    <title>Catch-all routes and routing constraints in Rails applications</title>
    <updated>2025-09-19T08:48:50+01:00</updated>
    <dc:date>2025-09-19T08:48:50+01:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I’ll be at &lt;a href=&quot;https://2025.euruko.org/&quot;&gt;EuRuKo&lt;/a&gt;, the European Ruby conference, in
Viana do Castelo, Portugal, this month. Maybe I’ll see you there? We could grab
a coffee.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/see-you-at-euruko-2025</id>
    <link href="https://benjaminwil.info/weblog/see-you-at-euruko-2025"/>
    <published>2025-09-09T12:15:46-07:00</published>
    <summary>I’ll be at EuRuKo, the European Ruby conference, in Viana do Castelo, Portugal, this month.</summary>
    <title>See you at EuRuKo 2025</title>
    <updated>2025-09-09T12:15:46-07:00</updated>
    <dc:date>2025-09-09T12:15:46-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Recently I’ve had two occasions to think about how to typeset musical artist
names when next to their album release names. I couldn’t find a very
authoritative source on the subject, so I’ll offer up my own findings.&lt;/p&gt;

&lt;p&gt;For music-related documents and user interfaces, you may sometimes need display
an artist and album title next to each other. What are reasonable choices for
separators? Publications like Pitchfork and applications like Bandcamp, Spotify,
and Tidal try to side-step this issue by avoiding interface components where
these two elements are displayed next to each other.  They instead prefer to put
one above the other on separate lines. That’s a reasonable solution, but let’s
pretend it’s a luxury we don’t have.&lt;/p&gt;

&lt;p&gt;Maybe the simplest solution would be to use different font styles for the artist
and album:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;
    &lt;strong aria-label=&quot;Artist name&quot;&gt;Lizzy Mercier Desclaux&lt;/strong&gt;
    &lt;span aria-label=&quot;Album name&quot;&gt;Mambo Nassau&lt;/span&gt;
  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s pretend we don’t have this luxury and that we must reach for typesetting
separator-characters.&lt;/p&gt;

&lt;p&gt;If we want to optimize for easy authorship, we could use colons:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Lizzy Mercier Desclaux: Mambo Nassau&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, colons sometimes appear in album titles. Especially if you’re attempting
to present artist and album titles across many or all musical genres, this might
not be the best choice. For some genres, like classical and contemporary art
music recordings, colons might even create ambiguity (or readability issues)
about which part is the album and which part is the artist:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chen Pi-Hsien: Messiaen: 20 Regards sur l’Enfant-Jésus, I-27&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are other simple separators like commas and slashes that share this
ambiguity problem. So we want to optimize for disambiguation, using an en- or
em-dash seems to be safer, at least for now, in 2025:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Lizzy Mercier Desclaux – Mambo Nassau&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chen Pi-Hsien – Messiaen: 20 Regards sur l’Enfant-Jésus, I-27&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using dashes is also good enough for NME, iTunes, Apple Music, and Discogs to
separate artist names from album titles, if that means anything to you. It does
to me. Except in situations where sub-pixel real estate matters, dashes look
good, are good disambiguators, and should be renderable by any font that’s any
good.&lt;/p&gt;

&lt;p&gt;If you’re considering using a hyphen instead of a dash: please don’t. Hyphens
frequently appear in human names and album titles, and would not be a good
separator or a smart disambiguator. I’ll admit that even dashes are an unusual
separator character. But since they appear so infrequently in this context,
they’re a shoo-in. For more information about the difference between hyphens,
en-dashes, and em-dashes, I recommend &lt;a href=&quot;https://practicaltypography.com/hyphens-and-dashes.html&quot;&gt;the Butterick’s Practical Typography
article about hyphens and
dashes&lt;/a&gt;.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/typesetting-album-artist-separation</id>
    <link href="https://benjaminwil.info/weblog/typesetting-album-artist-separation"/>
    <published>2025-07-30T11:54:45-07:00</published>
    <summary>Recently I’ve had two occasions to think about how to typeset musical artist names when next to their album release names...</summary>
    <title>Typesetting artist name–album title separation</title>
    <updated>2025-07-30T11:54:45-07:00</updated>
    <dc:date>2025-07-30T11:54:45-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;&lt;em&gt;Note that this article criticizes GitHub’s Discussions feature (originally
launched in 2017) as it exists now, in July 2025.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In case you don’t know, &lt;a href=&quot;https://docs.github.com/discussions&quot;&gt;Discussions&lt;/a&gt; is
GitHub’s answer to forums and &lt;a href=&quot;https://stackoverflow.com/questions&quot;&gt;Stack
Overflow&lt;/a&gt;-style Q&amp;amp;As. Users can reply to an
initial message in a discussion and upvote, downvote, or comment on any response.
In addition to announcement threads and polls, discussions can either be
&lt;strong&gt;open-ended discussions&lt;/strong&gt; or &lt;strong&gt;question/answer discussions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Question/answer discussions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;can be viewed in one of a few sort orders (top voted first; newest first; oldest first) and&lt;/li&gt;
  &lt;li&gt;can have a single response marked as “the answer” to the discussion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-ended discussions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;can also be viewed in one of a few sort orders (top voted first; newest first; oldest first) and&lt;/li&gt;
  &lt;li&gt;do not have any response marked as “the answer.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Q&amp;amp;A discussions improve upon the Stack Overflow model in an important way:
the project itself is the owner of the discussion board. That means that project
administrators are hypothetically present, moderating conversations and
correcting potential mis/disinformation.&lt;/p&gt;

&lt;h2 id=&quot;user-interface-deficiencies&quot;&gt;User interface deficiencies&lt;/h2&gt;

&lt;p&gt;Unfortunately, unlike the Q&amp;amp;A discussions, the open-ended discussions feature is
an afterthought in comparison.  Even visually, responses to open-ended
discussions look disconnected from one another. Each response is an island,
with borders, primed for its own disparate comments thread.&lt;/p&gt;

&lt;figure&gt;
  &lt;a target=&quot;_blank&quot; href=&quot;/weblog/assets/github-discussions-suck/thread-comparisons-discourse-discussions-issues.png&quot;&gt;
    &lt;img src=&quot;/weblog/assets/github-discussions-suck/thread-comparisons-discourse-discussions-issues@0.5.png&quot; alt=&quot;Side by side, comments on a Discourse thread, comments on a GitHub discussion, and comments on a GitHub issue, showcasing the user interface of each document.&quot; /&gt;
  &lt;/a&gt;
  &lt;figcaption&gt;
    &lt;p&gt;
      From left to right: comments on Discourse conversation, a GitHub discussion,
      and a GitHub issue. Of the three, the GitHub discussion stands out as having
      a visible textarea with placeholder text &quot;Write a reply&quot; between two
      messages meant to be read as replies to each other. It also stands out as
      visually separating the messages from each other. This design
      indicates that this isn&#39;t a discussion: it&#39;s meant to be listing of
      threads.
    &lt;/p&gt;

    &lt;p&gt;
      You might have noticed that the Discourse thread I captured actually contains a
      reply to an earlier message in the thread not shown here. This is a bit
      complicated, but regardless, the thread is still displayed in chronological
      message order.
    &lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;While Discourse threads and GitHub issues both have their own user interface
challenges and deficiencies, issues are displayed more like I would personally
expect open-ended discussions to be displayed: a single conversation, without
nested comments, and visually each message in the issue is linked to indicate a
chronology. Interestingly, issues can be converted into discussions by project
administrators–but not the other way around (for reasonable complexity-related
reasons, I’m sure), though admins can create an issue &lt;em&gt;from&lt;/em&gt; a discussion.&lt;/p&gt;

&lt;p&gt;As a GitHub repository administrator, you must configure Discussions and the
project’s enabled discussion categories. Each category will allow for
discussions of one type (announcements; polls; Q&amp;amp;As; open-ended discussions).
When creating a new discussion category, the default selected mode is
&lt;strong&gt;question/answer&lt;/strong&gt;. In my experience, this really shows.  For example, see
&lt;a href=&quot;https://github.com/laravel/framework/discussions/categories/show-and-tell&quot;&gt;Laravel’s “Show and Tell” discussion
category&lt;/a&gt;,
which contains hundreds of “unanswered” links and plugs that members of the
Laravel community may find relevant. No offence to anyone (I’m not a member
of the Laravel community), but calling these “unanswered” feels like a
mistake. Given this example, and the visual design of the discussion page, it
seems clear that GitHub’s designers prioritized the functionality
of the Q&amp;amp;A-style discussions.&lt;/p&gt;

&lt;p&gt;All four discussion types have the exact same threading system, well-suited to
Stack Overflow-like Q&amp;amp;As, and less well-suited for announcements made by project
maintainers and open-ended discussions.  For all four discussion types,
responses can be upvoted individually and have their own nested comments
threads. This specifically makes having an open-ended discussion quite complex:
open-ended discussions are now not just open-ended, but also achronological,
non-linear, or single-threaded, depending on how nested comments are (ab)used.&lt;/p&gt;

&lt;h2 id=&quot;de-linearizing-conversations&quot;&gt;De-linearizing conversations&lt;/h2&gt;

&lt;p&gt;Years ago, I started &lt;a href=&quot;https://github.com/orgs/solidusio/discussions/4634&quot;&gt;a discussion on the Solidus
project&lt;/a&gt; to have an
open-ended discussion about how to handle a particular issue I was facing
integrating with the Solidus framework’s provided frontend templates. There was
no need for upvotes (or downvotes, thankfully), but all responders ended up
commenting on a single response to the thread. The shape of this discussion
would have been better suited to a single, flat thread, i.e.:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# original post -&amp;gt; [responses]

Original Poster   &quot;Hi, this is a question or comment about The Project.&quot;
Responder 1       └── &quot;Hi, this is a response to the question or comment.&quot;
Responder 2       └── &quot;Hi, this is also a response to the question or comment, but I&#39;m also in conversation with Responder 1, who responded before me.&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;rather than the tree structure it ended up as due to the GitHub Discussion’s design
choices:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# original post -&amp;gt; [response -&amp;gt; [comments]]

Original Poster   &quot;Hi, this is a question or comment about The Project.&quot;
Responder 1       └── &quot;Hi, this is a response to the question or comment.&quot;
Responder 2           └── &quot;Hi, this is also a response to the question or comment, but I&#39;m also in conversation with Responder 1, who responded before me.&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The tree structure makes the otherwise-linear conversation full of potential for
non-linearity and complexity. After all, this is purportedly a single discussion.
Imagine what this simple, linear conversation would look like with ten, or
fifty, more participants.&lt;/p&gt;

&lt;p&gt;Perhaps my discussion should have actually been a &lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues&quot;&gt;GitHub
issue&lt;/a&gt;
to begin with. Or, maybe, a message from the discussion should have been used as
the source for a new issue. Well, it doesn’t matter. This discussion has long
been abandoned and no action has been directly taken as the result of it. It’s
meaningful that issues imply actionability and discussions do not, but I find it
troubling that issues prioritize the chronology and linearity of a conversation
while GitHub’s open-ended discussions don’t.&lt;/p&gt;

&lt;p&gt;GitHub’s &lt;a href=&quot;https://github.blog/open-source/maintainers/create-a-home-for-your-community-with-github-discussions/&quot;&gt;announcement blog post for Discussions&lt;/a&gt; describes the feature as
“dedicated space for conversations,” and now, years later, that still feels
untrue as I attempt to use these features or read past discussions.
It also describes the feature as a way to “create a home for your community,”
despite most discussion boards I’ve seen more closely resembling a community
support, Stack Overflow-like Q&amp;amp;A feed.&lt;/p&gt;

&lt;h2 id=&quot;just-using-it-wrong&quot;&gt;“Just using it wrong”&lt;/h2&gt;

&lt;p&gt;There is a place for nested conversations. I don’t think the GitHub discussion I
started is one of them. The nested response-comments makes the conversation look
like the first responder’s comment is &lt;em&gt;more important&lt;/em&gt; than the following
comments. The structure and styles of the HTML document tell that story, too.
Any discussion-readers not participating or reading closely might not understand
that all of these messages are in response to the original discussion message
equally.&lt;/p&gt;

&lt;p&gt;You could minimize this by saying discussion participants are not using
Discussions “properly.” Hm, but should a responder have to think that hard about
whether to respond or comment on a response? Should they have to make this worse
by accepting a previous commenter or responder’s decision to “use the feature
wrong”? In the world of Stack Overflow-like Q&amp;amp;As, this complexity makes sense.
For an “open-ended discussion” it does not.&lt;/p&gt;

&lt;p&gt;GitHub’s own documentation about &lt;a href=&quot;https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#about-participation-in-a-discussion&quot;&gt;how to participate in a
discussion&lt;/a&gt;
is quite complex:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;Comment in response to the original comment from the author of the discussion&lt;/li&gt;
    &lt;li&gt;Create a comment thread by replying to an individual comment that another
community member made within the discussion
&lt;br /&gt;…&lt;/li&gt;
    &lt;li&gt;Upvote discussions and top-level comments to give them more visibility&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;As a way to describe the critical functionality of a message board, these
participation instructions seem complex.  Unfortunately, you can’t just say
“reply to a thread,” or “contribute a message to the conversation,” because
these things aren’t really conversations.&lt;/p&gt;

&lt;p&gt;I don’t have much more to say about this other than I don’t think Discussions
is a good form factor for most real, meaningful discussions, and they
definitely aren’t good at being the primary forum for conversations being had by
serious free and/or open-source software projects.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/github-discussions-suck</id>
    <link href="https://benjaminwil.info/weblog/github-discussions-suck"/>
    <published>2025-07-22T20:12:56-07:00</published>
    <summary>Note that this article criticizes GitHub’s Discussions feature (originally launched in 2017) as it exists now, in July 20...</summary>
    <title>GitHub Discussions is modelled poorly for open-ended conversations</title>
    <updated>2025-07-22T20:12:56-07:00</updated>
    <dc:date>2025-07-22T20:12:56-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;If you want me to read some text, use your computer’s text-copy commands to
provide me with the data rather than taking a screenshot. There are a lot of
good reasons to do this.&lt;/p&gt;

&lt;h2 id=&quot;screen-size-variability&quot;&gt;Screen size variability&lt;/h2&gt;

&lt;p&gt;The sender won’t always know how to format a screenshot so the receiver can read
it easily. I’m sure that you, too, have pinch-zoomed your way across a wide
image on a narrow touchscreen. Pinch-zooming your way across a wide image filled
with text can make reading a slow and error-prone process.&lt;/p&gt;

&lt;h2 id=&quot;reliability-and-rediscoverability&quot;&gt;Reliability and rediscoverability&lt;/h2&gt;

&lt;p&gt;Raw text content will always be more searchable than images. This allows you and
others to rediscover the text when it is useful again later on.&lt;/p&gt;

&lt;p&gt;I know that OCR exists and text can be extracted from images and videos in an
automated way now. Unfortunately, I know too well that OCR is lossy and can even
produce text with comprehensive typos. So, searching for text content from OCRed
images cannot be as reliable as raw text content. Yes, even if you throw an LLM
in at the end to help normalize the OCRed text.&lt;/p&gt;

&lt;h2 id=&quot;text-can-be-translated&quot;&gt;Text can be translated&lt;/h2&gt;

&lt;p&gt;It’s true that raw text and OCRed text can both be translated into other
languages. But I’d always feel more confident throwing the raw text into
translation software for the reasons given in my previous point.&lt;/p&gt;

&lt;h2 id=&quot;text-can-be-transformed&quot;&gt;Text can be transformed&lt;/h2&gt;

&lt;p&gt;If you want me to read some text, you may also want me to decode, decant, or
edit the raw text.&lt;/p&gt;

&lt;p&gt;Without any specialized software, our computers are still good at text
editing. Being able to copy text from one application and paste it in another
is beyond convenient. Not only can you transform the text content, you
can transform its display to better see or make sense of it.&lt;/p&gt;

&lt;p&gt;Without any specialized software, our computers are not great at duping, editing,
or processing image content. Having to manually re-copy text from an image or
video is less efficient.&lt;/p&gt;

&lt;h2 id=&quot;text-is-portable&quot;&gt;Text is portable&lt;/h2&gt;

&lt;p&gt;Going a bit deeper on that last point: text is more portable than an image. Text
takes up less disk space, can be trivially opened by many softwares on many
systems. Text can be printed out on even the most rudimentary of printers.&lt;/p&gt;

&lt;h2 id=&quot;why&quot;&gt;Why?&lt;/h2&gt;

&lt;p&gt;As a software developer, I often participate in message threads in which someone
wants to discuss a piece of code or documentation, or a shapeless stack of log
messages. Some senders would post a screenshot containing a representation of
the text rather than the raw text. I never enjoy this, especially when I’m
reading from my phone.&lt;/p&gt;

&lt;p&gt;There may be real reasons they did this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The software being used makes it too difficult to reliably select text
(cheers, iOS).&lt;/li&gt;
  &lt;li&gt;The software being used makes it too difficult to copy text (cheers, Tmux).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anyone with these reasons, I recommend finding other software that allows
you to more easily select and copy text. Or, I recommend learning the
difficult-to-use software’s select- and copy-commands. Or, as a last resort, I
recommend recopying manually the text content you wish to send me.&lt;/p&gt;

&lt;p&gt;You may be the sender and the text’s secondary reader for now, but in the future
you may be the text’s primary reader. Make reading the text easier for yourself.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/no-screenshots</id>
    <link href="https://benjaminwil.info/weblog/no-screenshots"/>
    <published>2025-05-07T21:02:46-07:00</published>
    <summary>If you want me to read some text, use your computer’s text-copy commands to provide me with the data rather than taking a...</summary>
    <title>Prefer text over screenshots</title>
    <updated>2025-05-07T21:02:46-07:00</updated>
    <dc:date>2025-05-07T21:02:46-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;In one of the first scenes, Karsh explains to a date that the GraveTech
cemetery he built, where Becca, his Jewish wife, is buried, is a
“non-denominational” grounds. This isn’t quite the right word considering the
inter-faith inhabitants of the cemetery. Karsh, a gentile, says that in the
end he’ll be buried there, next to Becca. This is not the last time in &lt;em&gt;The
Shrouds&lt;/em&gt; that Karsh will use an exact, but incorrect, word. As a tech founder,
it’d be normal for Karsh to misfield words. Many people with CEO-brain are
naive to a fault and put boundless trust in the specialists around them. Karsh
delegates to his dead wife’s sister’s specialist ex-husband Maury so that
he can sleep, drive around in his Tesla, and emote.&lt;/p&gt;

&lt;p&gt;It’d also be normal for the specialists and executive-types around him to use
the wrong words. And they do, unless in this near-future Canada it’s accurate
to call one’s AI personal assistant their “avatar.” An avatar is meant to be a
representation of one’s self. Karsh has no avatar in the film. Although Karsh’s
personal assistant Hunny represents him in video calls, she is importantly
not Karsh, but a Memoji-esque representation of his late wife created by Maury.&lt;/p&gt;

&lt;p&gt;I’m inclined to attribute the wrongful usage of the word “avatar” to
the writer-director, who has an immaculate history of making the holiest
vibes-based cinema. He need not care whether he gets things a little wrong,
and his work is often more interesting because of what he gets wrong. Then,
maybe he also means to say that after death, the manifestation of our loved
ones say more about us than anyone else. We have Cronenberg on record saying
that &lt;em&gt;The Shrouds&lt;/em&gt; is “autobiographical,” inspired by the loss of his wife
Carolyn. So Karsh is the avatar, a Cronenberg stand-in, and the Director-Artist
who keeps the distorted love-memories alive through his own flawed creations.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/the-shrouds-2024</id>
    <link href="https://benjaminwil.info/weblog/the-shrouds-2024"/>
    <published>2025-04-30T00:00:00+00:00</published>
    <summary>In one of the first scenes, Karsh explains to a date that the GraveTech cemetery he built, where Becca, his Jewish wife, ...</summary>
    <title>The Shrouds (2024)</title>
    <updated>2025-04-30T00:00:00+00:00</updated>
    <dc:date>2025-04-30T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;While working on my static site generator,
&lt;a href=&quot;https://github.com/benjaminwil/lifer&quot;&gt;Lifer&lt;/a&gt;, I was occasionally annoyed by how
my test feeds were being read by RSS feed readers. And I was occasionally
annoyed at the &lt;code&gt;rss&lt;/code&gt; Ruby gem source code for generating XML tags in my feeds
that I wasn’t explicitly specifying. Chris Wellons’s &lt;a href=&quot;https://nullprogram.com/blog/2013/09/23/&quot;&gt;Atom vs. RSS&lt;/a&gt; blog
post expresses the same feelings of surprise I felt when digging deeper into the
ancient history that is the Atom and RSS 2.0 specifications.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/atom-vs-rss</id>
    <link href="https://benjaminwil.info/weblog/atom-vs-rss"/>
    <published>2025-04-05T10:41:32-07:00</published>
    <summary>While working on my static site generator, Lifer, I was occasionally annoyed by how my test feeds were being read by RSS ...</summary>
    <title>Atom vs. RSS</title>
    <updated>2025-04-05T10:41:32-07:00</updated>
    <dc:date>2025-04-05T10:41:32-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Since releasing &lt;a href=&quot;/weblog/lifer-0-3/&quot;&gt;Lifer 0.3 in January&lt;/a&gt; I’ve released six
more minor versions to get the project stable enough to start using. &lt;a href=&quot;https://github.com/benjaminwil/lifer/blob/v0.9.0/CHANGELOG.md&quot;&gt;The
changelog entries&lt;/a&gt; don’t make the releases sound that interesting,
but as an end user I’m much happier with the build performance, the tag support,
and Lifer’s awareness of original publication &lt;em&gt;and&lt;/em&gt; last updated dates.&lt;/p&gt;

&lt;div class=&quot;feed-only&quot;&gt;
  &lt;small&gt; Note to readers subscribed via a newsfeed: sorry if the feed has
  spammed you with new entries spanning the many years of this blog&#39;s existence.
  My Jekyll feed&#39;s settings were bad, and it seemed not worth it to me to make
  the feed&#39;s transition any more graceful. &lt;/small&gt;
&lt;/div&gt;

&lt;p&gt;benjaminwil.info looks and feels the same way it always did, but it’s no longer
being generated by &lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;–but by Lifer. There’s still
plenty to do before I could cut a v1.&lt;/p&gt;

&lt;p&gt;Lifer definitely has swerved out of the &lt;em&gt;Jekyll clone&lt;/em&gt; lane into the &lt;em&gt;could be a
good and unique site generator someday&lt;/em&gt; lane, and I’m excited about some upcoming
features that make it even more flexible for people who are willing to commit
a bit of Ruby to their site repository.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/ported-to-lifer</id>
    <link href="https://benjaminwil.info/weblog/ported-to-lifer"/>
    <published>2025-04-05T10:03:19-07:00</published>
    <summary>Since releasing Lifer 0.3 in January I’ve released six more minor versions to get the project stable enough to start usin...</summary>
    <title>This website has been ported to Lifer 0.9</title>
    <updated>2025-04-05T10:03:19-07:00</updated>
    <dc:date>2025-04-05T10:03:19-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;In 2023, I wrote &lt;a href=&quot;https://supergood.software/from-developer-to-rails-developer-and-then-some/&quot;&gt;this guide to getting familiar with Ruby and Rails&lt;/a&gt; for my
employer, &lt;a href=&quot;https://super.gd&quot;&gt;Super Good Software&lt;/a&gt;. In 2025, I wouldn’t change
much too much about this article, which, I think, is a testiment to how mature
and &lt;em&gt;developer experience-focused&lt;/em&gt; the Ruby and Rails ecosystems are.&lt;/p&gt;

&lt;p&gt;But I would stop recommending &lt;a href=&quot;https://pry.github.io/&quot;&gt;the Pry REPL&lt;/a&gt; now. In
2025, even the oldest supported version of Ruby now includes an enhanced IRB
that provides many of the features I used to depend on Pry for. One can simply
install &lt;a href=&quot;https://github.com/ruby/debug&quot;&gt;the &lt;code&gt;debug&lt;/code&gt; gem&lt;/a&gt; to get even more
Pry-like behaviours from IRB.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/for-rails-newbies</id>
    <link href="https://benjaminwil.info/weblog/for-rails-newbies"/>
    <published>2025-02-11T09:00:00-07:00</published>
    <summary>In 2023, I wrote this guide to getting familiar with Ruby and Rails for my employer, Super Good Software.</summary>
    <title>From developer to Rails developer</title>
    <updated>2025-02-11T09:00:00-07:00</updated>
    <dc:date>2025-02-11T09:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I recently released 0.3.0 of my static site generator project
&lt;a href=&quot;https://github.com/benjaminwil/lifer&quot;&gt;Lifer&lt;/a&gt;, which I intend to use to build
this website in the (near) future. Right now, I build this website using
&lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;, the “simple, blog-aware” static site generator.&lt;/p&gt;

&lt;p&gt;Lifer and Jekyll have some things in common. For example, they’re both written
in Ruby, and they both output HTML documents and RSS feeds to an output
directory. They both read frontmatter metadata from Markdown files to help you
maintain collections of pages and blog posts that belong to a small- or
medium-sized website.&lt;/p&gt;

&lt;p&gt;Jekyll has done me no wrong, but there are things about Jekyll I have found
opinionated or hard to work around: Jekyll requires you to use Liquid templates
for generating posts and pages; &lt;code&gt;_posts&lt;/code&gt; is a bit too magic a collection of
articles; its built-in asset pipeline is not very flexible.&lt;/p&gt;

&lt;p&gt;It seemed like a good opportunity for me to try designing my own site generator,
to see how simple I could make something I could use for myself, and to learn
first-hand where all of the hidden complexity lies.&lt;/p&gt;

&lt;p&gt;Now, 150-ish commits in, the shape of the site generator I want is coming
together. I started this project, casually, over two years ago. So, at this
rate, it’ll be a long time before anyone else can actually use Lifer. Testing
the generator in production, though, will be quite a milestone. Stay tuned.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/lifer-0-3</id>
    <link href="https://benjaminwil.info/weblog/lifer-0-3"/>
    <published>2025-01-05T13:14:00-07:00</published>
    <summary>I recently released 0.3.0 of my static site generator project Lifer, which I intend to use to build this website in the (...</summary>
    <title>Lifer 0.3</title>
    <updated>2025-01-05T13:14:00-07:00</updated>
    <dc:date>2025-01-05T13:14:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;In no particular order, here’s my annual list of the movies I loved that I saw
for the first time in 2024. This year, I included two limited series as entries,
which is a bit unusual of me. This list is also &lt;a href=&quot;https://letterboxd.com/benjaminwil/list/top-thirty-2024/&quot;&gt;published on
Letterboxd&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s links to my previous years’s lists: &lt;a href=&quot;/weblog/2023-film&quot;&gt;2023&lt;/a&gt;,
&lt;a href=&quot;/weblog/2022-film&quot;&gt;2022&lt;/a&gt;, &lt;a href=&quot;/weblog/2021-film&quot;&gt;2021&lt;/a&gt;, &lt;a href=&quot;/weblog/2020-film&quot;&gt;2020&lt;/a&gt;,
&lt;a href=&quot;/weblog/2019-film&quot;&gt;2019&lt;/a&gt;, &lt;a href=&quot;/weblog/2018-film&quot;&gt;2018&lt;/a&gt;, &lt;a href=&quot;/weblog/2017-film&quot;&gt;2017&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This year’s list:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;The Woman Who Ran&lt;/em&gt;, 2020&lt;/li&gt;
  &lt;li&gt;William Friedkin: &lt;em&gt;The Caine Mutiny Court-Martial&lt;/em&gt;, 2023&lt;/li&gt;
  &lt;li&gt;Théo Jollet: &lt;em&gt;Meet Doug&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;Nobody’s Daughter Haewon&lt;/em&gt;, 2013&lt;/li&gt;
  &lt;li&gt;Tsai Ming-liang: &lt;em&gt;&lt;a href=&quot;https://www.filmcomment.com/blog/film-of-the-week-rebels-of-the-neon-god/&quot;&gt;Rebels of the Neon God&lt;/a&gt;&lt;/em&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Ryûsuke Hamaguchi: &lt;em&gt;&lt;a href=&quot;https://www.newyorker.com/culture/the-current-cinema/the-beautifully-unnerving-gaze-of-evil-does-not-exist&quot;&gt;Evil Does Not Exist&lt;/a&gt;&lt;/em&gt;, 2023&lt;/li&gt;
  &lt;li&gt;Robert Altman: &lt;em&gt;The Player&lt;/em&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Paul Schrader: &lt;em&gt;Hardcore&lt;/em&gt;, 1979&lt;/li&gt;
  &lt;li&gt;Luca Guadagnino: &lt;em&gt;Challengers&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Harris Mayersohn: &lt;em&gt;Stand Up Solutions&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Bernard Rose: &lt;em&gt;&lt;a href=&quot;https://www.rogerebert.com/reviews/ivans-xtc-2002&quot;&gt;ivans xtc.&lt;/a&gt;&lt;/em&gt;, 2000&lt;/li&gt;
  &lt;li&gt;Albert Serra: &lt;em&gt;Pacifiction&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Léa Mysius: &lt;em&gt;The Five Devils&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Bill Ross IV &amp;amp; Turner Ross: &lt;em&gt;&lt;a href=&quot;https://www.voxmagazine.com/arts/45365-true-false-2020/article_a02b0d76-5f33-11ea-ace0-937f6e7a9225.html&quot;&gt;45365&lt;/a&gt;&lt;/em&gt;, 2009&lt;/li&gt;
  &lt;li&gt;Bill Ross IV &amp;amp; Turner Ross: &lt;em&gt;Tchoupitoulas&lt;/em&gt;, 2012&lt;/li&gt;
  &lt;li&gt;Abbas Kiarostami: &lt;em&gt;Where Is the Friend’s House?&lt;/em&gt;, 1987&lt;/li&gt;
  &lt;li&gt;Paolo Sorrentino: &lt;em&gt;The New Pope&lt;/em&gt;, 2020&lt;/li&gt;
  &lt;li&gt;Elaine May: &lt;em&gt;&lt;a href=&quot;https://www.newyorker.com/goings-on-about-town/movies/mikey-and-nicky-2&quot;&gt;Mikey and Nicky&lt;/a&gt;&lt;/em&gt;, 1976&lt;/li&gt;
  &lt;li&gt;Krzysztof Kieślowski: &lt;em&gt;Three Colours: Blue&lt;/em&gt;, 1993&lt;/li&gt;
  &lt;li&gt;Éric Rohmer: &lt;em&gt;A Tale of Springtime&lt;/em&gt;, 1990&lt;/li&gt;
  &lt;li&gt;Matthew Rankin: &lt;em&gt;&lt;a href=&quot;https://www.bfi.org.uk/sight-and-sound/reviews/universal-language-beautifully-absurd-crosscultural-odyssey&quot;&gt;Universal Language&lt;/a&gt;&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Miguel Gomes : &lt;em&gt;&lt;a href=&quot;https://mubi.com/en/notebook/posts/all-is-full-of-grace-miguel-gomes-on-grand-tour&quot;&gt;Grand Tour&lt;/a&gt;&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Sean Baker: &lt;em&gt;Anora&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Francis Ford Coppola: &lt;em&gt;Megalopolis&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Ira Sachs: &lt;em&gt;Forty Shades of Blue&lt;/em&gt;, 2005&lt;/li&gt;
  &lt;li&gt;Payal Kapadia: &lt;em&gt;&lt;a href=&quot;https://roughcutfilm.com/2024/08/21/review-all-we-imagine-as-light-is-a-stunning-tale-of-intimacy-as-dissent/&quot;&gt;All We Imagine as Light&lt;/a&gt;&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Steven Zaillian: &lt;em&gt;Ripley&lt;/em&gt;, 2024&lt;/li&gt;
  &lt;li&gt;Krzysztof Kieślowski: &lt;em&gt;Three Colours: White&lt;/em&gt;, 1994&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;&lt;a href=&quot;https://www.criterion.com/current/posts/7406-hong-sangsoo-s-tale-of-cinema&quot;&gt;Tale of Cinema&lt;/a&gt;&lt;/em&gt;, 2005&lt;/li&gt;
  &lt;li&gt;Wim Wenders: &lt;em&gt;Perfect Days&lt;/em&gt;, 2023&lt;/li&gt;
&lt;/ul&gt;
</content>
    <id>https://benjaminwil.info/weblog/2024-film</id>
    <link href="https://benjaminwil.info/weblog/2024-film"/>
    <published>2024-12-31T12:00:00-07:00</published>
    <summary>In no particular order, here’s my annual list of the movies I loved that I saw for the first time in 2024.</summary>
    <title>The best films I saw: 2024 edition</title>
    <updated>2024-12-31T12:00:00-07:00</updated>
    <dc:date>2024-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;As usual: here’s my annual list of the thirty best movies I watched for the
first time this year. In no particular order. I also publish it &lt;a href=&quot;https://letterboxd.com/benjaminwil/list/top-thirty-2023/&quot;&gt;on
Letterboxd&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been doing this for a while now, so here are some convenience links to
previous lists: &lt;a href=&quot;/weblog/2022-film&quot;&gt;2022&lt;/a&gt;, &lt;a href=&quot;/weblog/2021-film&quot;&gt;2021&lt;/a&gt;,
&lt;a href=&quot;/weblog/2020-film&quot;&gt;2020&lt;/a&gt;, &lt;a href=&quot;/weblog/2019-film&quot;&gt;2019&lt;/a&gt;, &lt;a href=&quot;/weblog/2018-film&quot;&gt;2018&lt;/a&gt;,
&lt;a href=&quot;/weblog/2017-film&quot;&gt;2017&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now, the list:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ryûsuke Hamaguchi: &lt;em&gt;&lt;a href=&quot;https://cinema-scope.com/features/brief-encounters-hamaguchi-ryusukes-wheel-of-fortune-and-fantasy/&quot;&gt;Wheel of Fortune and Fantasy&lt;/a&gt;&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Abel Ferrara: &lt;em&gt;Bad Lieutenant&lt;/em&gt;, 1992&lt;/li&gt;
  &lt;li&gt;Sofia Coppola: &lt;em&gt;Priscilla&lt;/em&gt;, 2023&lt;/li&gt;
  &lt;li&gt;Hal Hartley: &lt;em&gt;The Unbelievable Truth&lt;/em&gt;, 1989&lt;/li&gt;
  &lt;li&gt;William Peter Blatty: &lt;em&gt;The Exorcist III&lt;/em&gt;, 1990&lt;/li&gt;
  &lt;li&gt;Dustin Guy Defa: &lt;a href=&quot;https://www.highonfilms.com/editing-2021-short-film-review-mubi/&quot;&gt;&lt;em&gt;Editing&lt;/em&gt;&lt;/a&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Hal Hartley: &lt;a href=&quot;https://variety.com/2001/film/reviews/no-such-thing-1200468350/&quot;&gt;&lt;em&gt;No Such Thing&lt;/em&gt;&lt;/a&gt;, 2001&lt;/li&gt;
  &lt;li&gt;Michael Haneke: &lt;em&gt;Funny Games&lt;/em&gt;, 1997&lt;/li&gt;
  &lt;li&gt;George Miller: &lt;em&gt;Three Thousand Years of Longing&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Olivier Assayas: &lt;em&gt;Clouds of Sils Maria&lt;/em&gt;, 2014&lt;/li&gt;
  &lt;li&gt;Abel Ferrara: &lt;em&gt;The Blackout&lt;/em&gt;, 1997&lt;/li&gt;
  &lt;li&gt;Hong Sang-soo: &lt;em&gt;Claire’s Camera&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Abel Ferrara: &lt;em&gt;King of New York&lt;/em&gt;, 1990&lt;/li&gt;
  &lt;li&gt;Jim Jarmusch: &lt;em&gt;Paterson&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Eugene Kotlyarenko: &lt;em&gt;A Wonderful Cloud&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Michael Haneke: &lt;a href=&quot;https://deepfocusreview.com/definitives/cache/&quot;&gt;&lt;em&gt;Caché&lt;/em&gt;&lt;/a&gt;, 2005&lt;/li&gt;
  &lt;li&gt;Kelly Reichardt: &lt;em&gt;First Cow&lt;/em&gt;, 2019&lt;/li&gt;
  &lt;li&gt;Stanley Kubrick: &lt;em&gt;Barry Lyndon&lt;/em&gt;, 1975&lt;/li&gt;
  &lt;li&gt;Ridley Scott: &lt;em&gt;The Last Duel&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Tsai Ming-liang: &lt;em&gt;The Skywalk Is Gone&lt;/em&gt;, 2002&lt;/li&gt;
  &lt;li&gt;Larry Clark: &lt;a href=&quot;https://i-d.vice.com/en/article/7kv7n9/bully-larry-clark-cast-interview&quot;&gt;&lt;em&gt;Bully&lt;/em&gt;&lt;/a&gt;, 2001&lt;/li&gt;
  &lt;li&gt;Kelly Reichardt: &lt;em&gt;Showing Up&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Sebastián Silva: &lt;a href=&quot;https://www.bfi.org.uk/sight-and-sound/reviews/rotting-sun-this-shapeshifting-queer-comedy-unsparing-its-barbs&quot;&gt;&lt;em&gt;Rotting in the Sun&lt;/em&gt;&lt;/a&gt;, 2023&lt;/li&gt;
  &lt;li&gt;Michael Mann: &lt;em&gt;Thief&lt;/em&gt;, 1981&lt;/li&gt;
  &lt;li&gt;George Sluizer: &lt;em&gt;&lt;a href=&quot;https://www.theringer.com/movies/2018/9/5/17819076/the-vanishing-streaming-movie-influence&quot;&gt;The Vanishing&lt;/a&gt;&lt;/em&gt;, 1988&lt;/li&gt;
  &lt;li&gt;Tom Noonan: &lt;em&gt;What Happened Was…&lt;/em&gt;, 1994&lt;/li&gt;
  &lt;li&gt;Janicza Bravo: &lt;em&gt;House Comes with a Bird&lt;/em&gt;, 2022 &lt;a href=&quot;https://www.miumiu.com/us/en/miumiu-club/womens-tales/womens-tales-23.html&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;George Armitage: &lt;em&gt;Miami Blues&lt;/em&gt;, 1990&lt;/li&gt;
  &lt;li&gt;Robert Altman: &lt;em&gt;3 Women&lt;/em&gt;, 1977&lt;/li&gt;
  &lt;li&gt;John Patton Ford: &lt;em&gt;Emily the Criminal&lt;/em&gt;, 2022&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2023-film</id>
    <link href="https://benjaminwil.info/weblog/2023-film"/>
    <published>2023-12-31T12:00:00-07:00</published>
    <summary>As usual: here’s my annual list of the thirty best movies I watched for the first time this year.</summary>
    <title>The best films I saw: 2023 edition</title>
    <updated>2023-12-31T12:00:00-07:00</updated>
    <dc:date>2023-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;In 2022 I watched some movies for the first time, as I do every year. And these
are the thirty&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; that were the best, most interesting, etc.:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tsai Ming-liang: &lt;em&gt;Vive L’Amour&lt;/em&gt;, 1994&lt;/li&gt;
  &lt;li&gt;Amalia Ulman: &lt;em&gt;El Planeta&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Pier Paolo Pasolini: &lt;em&gt;Teorema&lt;/em&gt;, 1968&lt;/li&gt;
  &lt;li&gt;Spike Lee: &lt;em&gt;Jungle Fever&lt;/em&gt;, 1991&lt;/li&gt;
  &lt;li&gt;Pier Paolo Pasolini, Vittorio De Sica, Luchino Visconti, Franco Rossi, Mauro Bolognini: &lt;em&gt;The Witches&lt;/em&gt;, 1967&lt;/li&gt;
  &lt;li&gt;Mariano Llinás: &lt;a href=&quot;https://en.wikipedia.org/wiki/La_Flor&quot;&gt;&lt;em&gt;La Flor&lt;/em&gt;&lt;/a&gt;, 2018&lt;/li&gt;
  &lt;li&gt;David Cronenberg: &lt;em&gt;Crimes of the Future&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Radu Jude: &lt;em&gt;Bad Luck Banging or Loony Porn&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Akira Kurosawa: &lt;em&gt;Seven Samurai&lt;/em&gt;, 1954&lt;/li&gt;
  &lt;li&gt;Sophy Romvari: &lt;em&gt;Grandma’s House&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Paul Thomas Anderson: &lt;em&gt;Licorice Pizza&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;William Friedkin: &lt;em&gt;The French Connection&lt;/em&gt;, 1971&lt;/li&gt;
  &lt;li&gt;S. S. Rajamouli: &lt;em&gt;RRR&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Shirley Clarke: &lt;em&gt;Portrait of Jason&lt;/em&gt;, 1967&lt;/li&gt;
  &lt;li&gt;Joachim Trier: &lt;em&gt;The Worst Person in the World&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Rhayne Vermette: &lt;a href=&quot;https://mubi.com/notebook/posts/an-impossible-being-rhayne-vermette-discusses-ste-anne&quot;&gt;&lt;em&gt;Ste. Anne&lt;/em&gt;&lt;/a&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Sofia Bohdanowicz: &lt;em&gt;Never Eat Alone&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Edgar Morin, Jean Rouch: &lt;em&gt;Chronicle of a Summer&lt;/em&gt;, 1961&lt;/li&gt;
  &lt;li&gt;Jane Schoenbrun: &lt;em&gt;We’re All Going to the World’s Fair&lt;/em&gt;, 2021&lt;/li&gt;
  &lt;li&gt;Steven Soderbergh: &lt;em&gt;Schizopolis&lt;/em&gt;, 1996&lt;/li&gt;
  &lt;li&gt;Wendell B. Harris, Jr.: &lt;a href=&quot;https://en.wikipedia.org/wiki/Chameleon_Street&quot;&gt;&lt;em&gt;Chameleon Street&lt;/em&gt;&lt;/a&gt;, 1989&lt;/li&gt;
  &lt;li&gt;J. Lee Thompson: &lt;em&gt;Conquest of the Planet of the Apes&lt;/em&gt;, 1972&lt;/li&gt;
  &lt;li&gt;Ti West: &lt;em&gt;Pearl&lt;/em&gt;, 2022&lt;/li&gt;
  &lt;li&gt;Derek Jarman: &lt;em&gt;Blue&lt;/em&gt;, 1993&lt;/li&gt;
  &lt;li&gt;Sofia Bohdanowicz: &lt;a href=&quot;https://en.wikipedia.org/wiki/Maison_du_Bonheur&quot;&gt;&lt;em&gt;Maison du Bonheur&lt;/em&gt;&lt;/a&gt;, 2017&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;I’m counting &lt;a href=&quot;https://en.wikipedia.org/wiki/La_Flor&quot;&gt;&lt;em&gt;La Flor&lt;/em&gt;&lt;/a&gt; as five movies because it’s 808 minutes long.
  Each year I try to get to a list of thirty, and some years it’s hard to. And
  this is one of those years. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/2022-film</id>
    <link href="https://benjaminwil.info/weblog/2022-film"/>
    <published>2023-01-01T12:00:00-07:00</published>
    <summary>In 2022 I watched some movies for the first time, as I do every year.</summary>
    <title>The best films I saw: 2022 edition</title>
    <updated>2023-01-01T12:00:00-07:00</updated>
    <dc:date>2023-01-01T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I was in Providence, Rhode Island, for &lt;a href=&quot;/weblog/rubyconf-mini&quot;&gt;RubyConf Mini&lt;/a&gt; and had the
opportunity to eat and drink at some amazing places. If you’re going to
visit Providence, I can give you the following recommendations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://oberlinrestaurant.com/&quot;&gt;Oberlin&lt;/a&gt;: Well-executed (!!) restaurant and bar. Try the raw bar. Try
the pasta. Try the toast. Walk in early, or make a reservation.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.fortnightpvd.com/&quot;&gt;Fortnight&lt;/a&gt;: Workers’s cooperative wine bar. Unpretentious. Cared
for. Excellent wine and amaros menu (especially for someone coming from the
west coast of Canada).&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://havenbrothersmobile.com/&quot;&gt;Haven Brothers&lt;/a&gt;: A long-time institution. Go inside to see how to
fit a full kitchen inside a horse trailer, stay for a stupid hot dog.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.marcelinosboutiquebar.com/&quot;&gt;Marcelino’s&lt;/a&gt;: An unusual hotel bar. Great mediterranean-inspired
cocktail menu.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.eddybar.com/&quot;&gt;eddy&lt;/a&gt;: Thoughtful collection of wine, spirits, cocktails, and
charcuterie. Definitely worth going here more than once.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://as220.org/&quot;&gt;AS220&lt;/a&gt;: A non-profit arts centre with a bar and live events, with
lots of history. &lt;a href=&quot;https://en.wikipedia.org/wiki/AS220&quot;&gt;It’s got a Wikipedia page&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://pckrl.com/&quot;&gt;Pickerel&lt;/a&gt;: A tiny ramen bar. Interesting appetizers, drinks, and
desserts. It seems like the people working there enjoy working there. While
you’re in the neighbourhood: explore Luongo Square. If you’re waiting for
a seat at the bar, go across the square to &lt;a href=&quot;https://averyprovidence.com/&quot;&gt;The Avery&lt;/a&gt; while you wait.&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/providence-rhode-island</id>
    <link href="https://benjaminwil.info/weblog/providence-rhode-island"/>
    <published>2022-12-02T11:40:00-07:00</published>
    <summary>I was in Providence, Rhode Island, for RubyConf Mini and had the opportunity to eat and drink at some amazing places.</summary>
    <title>Providence, RI</title>
    <updated>2022-12-02T11:40:00-07:00</updated>
    <dc:date>2022-12-02T11:40:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I attended &lt;a href=&quot;https://rubyconfmini.com&quot;&gt;RubyConf Mini&lt;/a&gt; in Providence, Rhode Island. If I
met you there: it was a pleasure to have met you. This conference was a
planned-last-minute conference, relative to its partner conference,  RubyConf,
in Austin. Their plan was to create much smaller, two-track conference for
anyone unwilling or unable to go to Austin.&lt;/p&gt;

&lt;p&gt;If the conference happens again next year, and you’re at all interested in
the Ruby programming language, I would recommend attending.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/rubyconf-mini</id>
    <link href="https://benjaminwil.info/weblog/rubyconf-mini"/>
    <published>2022-11-26T12:54:53-07:00</published>
    <summary>I attended RubyConf Mini in Providence, Rhode Island. If I met you there: it was a pleasure to have met you.</summary>
    <title>RubyConf Mini</title>
    <updated>2022-11-26T12:54:53-07:00</updated>
    <dc:date>2022-11-26T12:54:53-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Recently I released an EP &lt;em&gt;777&lt;/em&gt;. You can stream it or purchase it &lt;a href=&quot;https://bwbw.bandcamp.com/album/777&quot;&gt;on
Bandcamp&lt;/a&gt;.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/777</id>
    <link href="https://benjaminwil.info/weblog/777"/>
    <published>2022-06-01T11:37:53-07:00</published>
    <summary>Recently I released an EP 777. You can stream it or purchase it on Bandcamp.</summary>
    <title>777</title>
    <updated>2022-06-01T11:37:53-07:00</updated>
    <dc:date>2022-06-01T11:37:53-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;As usual: here are thirty films, that I liked or thought were good, that I
watched for the first time this year. In no particular order.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Éric Rohmer: &lt;em&gt;Six in Paris&lt;/em&gt;,                            1965&lt;/li&gt;
  &lt;li&gt;Angela Schanelec: &lt;em&gt;I Was at Home, But…&lt;/em&gt;,                2019&lt;/li&gt;
  &lt;li&gt;Geneviève Dulude-De Celles: &lt;em&gt;A Colony&lt;/em&gt;,                 2018&lt;/li&gt;
  &lt;li&gt;Pedro Costa: &lt;em&gt;Vitalina Varela&lt;/em&gt;,                         2019&lt;/li&gt;
  &lt;li&gt;Jackie Chan: &lt;em&gt;Police Story&lt;/em&gt;,                            1985&lt;/li&gt;
  &lt;li&gt;Sean Baker: &lt;em&gt;Starlet&lt;/em&gt;,                                  2012&lt;/li&gt;
  &lt;li&gt;Robert Altman: &lt;em&gt;California Split&lt;/em&gt;,                      1974&lt;/li&gt;
  &lt;li&gt;Éric Rohmer: &lt;em&gt;Rendezvous in Paris&lt;/em&gt;,                     1995&lt;/li&gt;
  &lt;li&gt;Spike Lee: &lt;em&gt;Bamboozled&lt;/em&gt;,                                2000&lt;/li&gt;
  &lt;li&gt;Thomas Vinterberg: &lt;em&gt;Another Round&lt;/em&gt;,                     2020&lt;/li&gt;
  &lt;li&gt;Éric Rohmer: &lt;em&gt;Sign of the Lion&lt;/em&gt;,                        1962&lt;/li&gt;
  &lt;li&gt;Juzo Itami: &lt;em&gt;Tampopo&lt;/em&gt;,                                  1985&lt;/li&gt;
  &lt;li&gt;Stanley Kubrick: &lt;em&gt;Eyes Wide Shut&lt;/em&gt;,                      1999&lt;/li&gt;
  &lt;li&gt;Pietro Marcello: &lt;em&gt;Martin Eden&lt;/em&gt;,                         2019&lt;/li&gt;
  &lt;li&gt;Nicolas Winding Refn: &lt;em&gt;Fear X&lt;/em&gt;,                         2003&lt;/li&gt;
  &lt;li&gt;Solange Knowles: &lt;em&gt;When I Get Home&lt;/em&gt;,                     2019&lt;/li&gt;
  &lt;li&gt;Kevin Jerome Everson: &lt;em&gt;Park Lanes&lt;/em&gt;,                     2015&lt;/li&gt;
  &lt;li&gt;The Wachowskis: &lt;em&gt;Bound&lt;/em&gt;,                                1996&lt;/li&gt;
  &lt;li&gt;Wes Craven: &lt;em&gt;Scream&lt;/em&gt;,                                   1996&lt;/li&gt;
  &lt;li&gt;Spike Lee: &lt;em&gt;Da 5 Bloods&lt;/em&gt;,                               2020&lt;/li&gt;
  &lt;li&gt;Apichatpong Weerasethakul: &lt;a href=&quot;https://www.youtube.com/watch?v=8Hk4zepxyoE&quot;&gt;&lt;em&gt;Blue&lt;/em&gt;&lt;/a&gt;,              2017&lt;/li&gt;
  &lt;li&gt;Tony Kaye: &lt;em&gt;American History X&lt;/em&gt;,                        1998&lt;/li&gt;
  &lt;li&gt;Tsai Ming-liang: &lt;a href=&quot;https://www.filmcomment.com/blog/film-week-afternoon-tsai-ming-liang/&quot;&gt;&lt;em&gt;Afternoon&lt;/em&gt;&lt;/a&gt;,                   2015&lt;/li&gt;
  &lt;li&gt;Robin Hardy: &lt;em&gt;The Wicker Man&lt;/em&gt;,                          1973&lt;/li&gt;
  &lt;li&gt;Leos Carax: &lt;em&gt;Annette&lt;/em&gt;,                                  2021&lt;/li&gt;
  &lt;li&gt;James Wan: &lt;em&gt;Malignant&lt;/em&gt;,                                 2021&lt;/li&gt;
  &lt;li&gt;Jean-Luc Godard: &lt;em&gt;First Name: Carmen&lt;/em&gt;,                  1983&lt;/li&gt;
  &lt;li&gt;Corneliu Porumboiu: &lt;em&gt;Infinite Football&lt;/em&gt;,                2018&lt;/li&gt;
  &lt;li&gt;John Maringouin: &lt;em&gt;Ghostbox Cowboy&lt;/em&gt;,                     2018&lt;/li&gt;
  &lt;li&gt;Dasha Nekrasova: &lt;em&gt;The Scary of Sixty-First&lt;/em&gt;,            2021&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2021-film</id>
    <link href="https://benjaminwil.info/weblog/2021-film"/>
    <published>2021-12-31T12:00:00-07:00</published>
    <summary>As usual: here are thirty films, that I liked or thought were good, that I watched for the first time this year.</summary>
    <title>The best films I saw: 2021 edition</title>
    <updated>2021-12-31T12:00:00-07:00</updated>
    <dc:date>2021-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Earlier this year, I was invited to join the &lt;a href=&quot;https://github.com/gollum&quot;&gt;Gollum organization&lt;/a&gt; after
making some contributions to the &lt;a href=&quot;https://github.com/gollum/gollum&quot;&gt;main Gollum repository&lt;/a&gt;. I’ve been
participating by triaging incoming issues and bug reports, reviewing pull
requests, and contributing changes to improve the Gollum user experience for
mobile users.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/now-a-gollum-organization-member</id>
    <link href="https://benjaminwil.info/weblog/now-a-gollum-organization-member"/>
    <published>2021-11-02T19:04:00-07:00</published>
    <summary>Earlier this year, I was invited to join the Gollum organization after making some contributions to the main Gollum repos...</summary>
    <title>Now a Gollum organization member</title>
    <updated>2021-11-02T19:04:00-07:00</updated>
    <dc:date>2021-11-02T19:04:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I released an EP called &lt;em&gt;No longer there&lt;/em&gt;. You can stream it or purchase it &lt;a href=&quot;https://bwbw.bandcamp.com/album/no-longer-there&quot;&gt;on
Bandcamp&lt;/a&gt;.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/no-longer-there</id>
    <link href="https://benjaminwil.info/weblog/no-longer-there"/>
    <published>2021-07-07T09:00:00-07:00</published>
    <summary>I released an EP called No longer there. You can stream it or purchase it on Bandcamp.</summary>
    <title>No longer there</title>
    <updated>2021-07-07T09:00:00-07:00</updated>
    <dc:date>2021-07-07T09:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Mark Francis Johnson’s &lt;a href=&quot;https://www.gauss-pdf.com/post/162628927505/gpdf238gpdfe027-mark-francis-johnson-treatise&quot;&gt;&lt;em&gt;Treatise on Luck&lt;/em&gt;&lt;/a&gt; is a book of poems that
investigates luck: where it comes from, where it goes, and where it isn’t. It’s
a book from &lt;a href=&quot;https://gauss-pdf.com&quot;&gt;Gauss PDF&lt;/a&gt;, a digital publisher I am interested in.&lt;/p&gt;

&lt;p&gt;From the book:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The grooming staple I’m never without is&lt;br /&gt;
XD’s Eau Sauvage. It was the first fragrance&lt;br /&gt;
I drank when I was young. In a way, it was&lt;br /&gt;
my first love. I am not sure if I’d still drink it&lt;br /&gt;
for the love I felt for it back then or the&lt;br /&gt;
fragrance itself, or for luck. It’s nostalgic.&lt;/p&gt;
&lt;/blockquote&gt;

</content>
    <id>https://benjaminwil.info/weblog/treatise-on-luck</id>
    <link href="https://benjaminwil.info/weblog/treatise-on-luck"/>
    <published>2021-01-31T12:00:00-07:00</published>
    <summary>Mark Francis Johnson’s Treatise on Luck is a book of poems that investigates luck: where it comes from, where it goes, an...</summary>
    <title>Treatise on Luck</title>
    <updated>2021-01-31T12:00:00-07:00</updated>
    <dc:date>2021-01-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;A marked improvement in my film consumption since 2019. The following list is
thirty films long. All films I saw for the first time in 2020.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alejandro Landes:          &lt;em&gt;Monos&lt;/em&gt;,                   2019&lt;/li&gt;
  &lt;li&gt;Marcell Iványi:            &lt;em&gt;Wind&lt;/em&gt;,                    1996&lt;/li&gt;
  &lt;li&gt;Éric Rohmer:               &lt;em&gt;My Night at Maud’s&lt;/em&gt;,      1969&lt;/li&gt;
  &lt;li&gt;Sofia Bohdanowicz:         &lt;a href=&quot;https://cinema-scope.com/cinema-scope-online/tiff-2020-point-and-line-to-plane-sofia-bohdanowicz-canada/&quot;&gt;&lt;em&gt;Point and Line to Plane&lt;/em&gt;&lt;/a&gt;, 2020&lt;/li&gt;
  &lt;li&gt;Federico Fellini:          &lt;em&gt;I Vitelloni&lt;/em&gt;,             1953&lt;/li&gt;
  &lt;li&gt;Jean-Luc Godard:           &lt;em&gt;Tout Va Bien&lt;/em&gt;,            1972&lt;/li&gt;
  &lt;li&gt;Louis Malle:               &lt;em&gt;My Dinner with Andre&lt;/em&gt;,    1981&lt;/li&gt;
  &lt;li&gt;Jim Jarmusch:              &lt;em&gt;Night on Earth&lt;/em&gt;,          1991&lt;/li&gt;
  &lt;li&gt;Jodie Mack:                &lt;a href=&quot;https://mubi.com/notebook/posts/jodie-mack-introduces-her-film-the-grand-bizarre&quot;&gt;&lt;em&gt;The Grand Bizarre&lt;/em&gt;&lt;/a&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Pablo Larraín:             &lt;em&gt;Ema&lt;/em&gt;,                     2019&lt;/li&gt;
  &lt;li&gt;Olivier Assayas:           &lt;em&gt;Carlos&lt;/em&gt;,                  2010&lt;/li&gt;
  &lt;li&gt;Crystal Moselle:           &lt;em&gt;Skate Kitchen&lt;/em&gt;,           2018&lt;/li&gt;
  &lt;li&gt;Kazik Radwanski:           &lt;em&gt;Anne at 13,000 ft&lt;/em&gt;,       2019&lt;/li&gt;
  &lt;li&gt;Raoul Peck:                &lt;em&gt;I Am Not Your Negro&lt;/em&gt;,     2016&lt;/li&gt;
  &lt;li&gt;Nicolas Winding Refn:      &lt;em&gt;Pusher&lt;/em&gt;,                  1996&lt;/li&gt;
  &lt;li&gt;Terrence Malick:           &lt;em&gt;Days of Heaven&lt;/em&gt;,          1978&lt;/li&gt;
  &lt;li&gt;Spike Lee:                 &lt;em&gt;Malcolm X&lt;/em&gt;,               1992&lt;/li&gt;
  &lt;li&gt;François Truffaut:         &lt;em&gt;Antoine and Colette&lt;/em&gt;,     1962&lt;/li&gt;
  &lt;li&gt;Dash Shaw: &lt;em&gt;&lt;a href=&quot;https://brieftake.com/interview-my-entire-high-school-s-dash-shaw/&quot;&gt;My Entire High School Sinking Into the Sea&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Paul Harrill:              &lt;em&gt;Light from Light&lt;/em&gt;,        2019&lt;/li&gt;
  &lt;li&gt;Peter Bogdanovich:         &lt;em&gt;Targets&lt;/em&gt;,                 1968&lt;/li&gt;
  &lt;li&gt;Ladj Ly:                   &lt;em&gt;Les Misérables&lt;/em&gt;,          2019&lt;/li&gt;
  &lt;li&gt;Spencer Williams:         &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Blood_of_Jesus&quot;&gt;&lt;em&gt;The Blood of Jesus&lt;/em&gt;&lt;/a&gt;, 1941&lt;/li&gt;
  &lt;li&gt;François Truffaut:         &lt;em&gt;Jules and Jim&lt;/em&gt;,           1962&lt;/li&gt;
  &lt;li&gt;Guy Maddin:                &lt;em&gt;Brand Upon the Brain!&lt;/em&gt;,   2006&lt;/li&gt;
  &lt;li&gt;Philippe Lesage:           &lt;em&gt;Genesis&lt;/em&gt;,                 2018&lt;/li&gt;
  &lt;li&gt;Tsai Ming-liang:           &lt;em&gt;Walker&lt;/em&gt;,                  2012&lt;/li&gt;
  &lt;li&gt;Scott Cummings:            &lt;a href=&quot;https://buffalojuggalosfilm.tumblr.com&quot;&gt;&lt;em&gt;Buffalo Juggalos&lt;/em&gt;&lt;/a&gt;,  2014&lt;/li&gt;
  &lt;li&gt;Éric Rohmer:            &lt;em&gt;The Bakery Girl on Monceau&lt;/em&gt;, 1963&lt;/li&gt;
  &lt;li&gt;Lev Kalman, Whitney Horn:  &lt;em&gt;Two Plains &amp;amp; a Fancy&lt;/em&gt;, 2018&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2020-film</id>
    <link href="https://benjaminwil.info/weblog/2020-film"/>
    <published>2020-12-31T12:00:00-07:00</published>
    <summary>A marked improvement in my film consumption since 2019. The following list is thirty films long.</summary>
    <title>The best films I saw: 2020 edition</title>
    <updated>2020-12-31T12:00:00-07:00</updated>
    <dc:date>2020-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I just released a new &lt;a href=&quot;https://www.obdev.at/products/launchbar/index.html&quot;&gt;LaunchBar 6&lt;/a&gt; theme called Assimilated.&lt;/p&gt;

&lt;p&gt;I am kind of shocked that I still use LaunchBar, but as long as I use macOS for
work I guess I’ll be using LaunchBar, too. Like &lt;a href=&quot;https://github.com/benjaminwil/bijou&quot;&gt;Bijou&lt;/a&gt;, my five-year-old
theme, I wanted a LaunchBar theme that would blend in with the macOS window
chrome. With the release of Big Sur, I needed to create a completely new theme.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/benjaminwil/assimilated&quot;&gt;See the GitHub repo&lt;/a&gt; for more information and installation instructions.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/assimilated</id>
    <link href="https://benjaminwil.info/weblog/assimilated"/>
    <published>2020-12-25T12:00:00-07:00</published>
    <summary>I just released a new LaunchBar 6 theme called Assimilated.</summary>
    <title>Assimilated</title>
    <updated>2020-12-25T12:00:00-07:00</updated>
    <dc:date>2020-12-25T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I released some music last week. It’s a short album called &lt;em&gt;Letter for
you&lt;/em&gt;. You can stream it or purchase it &lt;a href=&quot;https://bwbw.bandcamp.com/album/letter-for-you&quot;&gt;on Bandcamp&lt;/a&gt;. Bandcamp is also a
great place to read the lyrics for each song.&lt;/p&gt;

&lt;p&gt;I hope you enjoy the release.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/letter-for-you</id>
    <link href="https://benjaminwil.info/weblog/letter-for-you"/>
    <published>2020-12-21T09:00:00-07:00</published>
    <summary>I released some music last week. It’s a short album called Letter for you. You can stream it or purchase it on Bandcamp.</summary>
    <title>Letter for you</title>
    <updated>2020-12-21T09:00:00-07:00</updated>
    <dc:date>2020-12-21T09:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;i decided it was time to make a dark colour scheme for this website. i haven’t
touched the styles on here in a while, and it was weird to go through them and
see how my brain had decided to organize them.&lt;/p&gt;

&lt;p&gt;i didn’t do a bad job. but, i dunno, definitely a younger version of me did it.&lt;/p&gt;

&lt;p&gt;there’s no way to “toggle” the colour schemes on the website itself. it depends
on you telling your browser (or in some cases your OS) which colour scheme you
prefer: either light or dark.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/06</id>
    <link href="https://benjaminwil.info/antisocial/06"/>
    <published>2020-09-16T12:00:00-07:00</published>
    <summary>i decided it was time to make a dark colour scheme for this website.</summary>
    <title>prefers-color-scheme: dark</title>
    <updated>2020-09-16T12:00:00-07:00</updated>
    <dc:date>2020-09-16T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;&lt;em&gt;Please also read &lt;a href=&quot;https://mubi.com/notebook/posts/jennifer-west-introduces-her-film-film-title-poem&quot; target=&quot;_blank&quot;&gt;Jennifer West’s introduction to the film&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Of the many shorts I’ve seen that appropriate and then collage movie stills or
sequences, I interpret Film Title Poem as one of the more appreciative ones. In
it, Jennifer West shines a flashlight on many of the films in the western
canon, the ones that either have weird staying power (&lt;em&gt;Men in Black&lt;/em&gt;)
or are held up as cult classics to the cinephiles (&lt;em&gt;L’Avventura&lt;/em&gt;)
or are the more obscure works of particular filmmakers who are considered
canonical (Gus Van Sant’s &lt;em&gt;Paranoid Park&lt;/em&gt;). There are even shout-outs
to some very revered experimental titles (go &lt;em&gt;T,O,U,C,H,I,N,G&lt;/em&gt;,
&lt;em&gt;Moth Light&lt;/em&gt;). I should also mention the expertly stolen soundtrack,
featuring scores from &lt;em&gt;Solaris&lt;/em&gt; among other movies I’m blanking on,
even though the music is still as clear as can be in my memory.&lt;/p&gt;

&lt;p&gt;When I say, “shines a flashlight,” I mean exactly that. As someone with
warm feelings for the majority of these movies, I was happy to see them
being rediscovered on this wall of film titles somewhere. The titles are
presented in half-alphabetical order, half-some sort of order. In some
moments I looked for meaning in the order: hidden sequences in the blinking,
the repetition of some titles. I didn’t get very far reading the film like
this, but didn’t mind either way. I was more focused on the Brakhagian
scratches in the celluloid, highlighting movie-crushes and crossing out the
(?) trash. Whether you can enjoy following along on this late-night tour
or not, I think there’s value in flipping through these film titles with
very little other context, re-evaluating them on the spot, re-evaluating my
memories of them, and pitting them against the other film titles on the wall.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/film-title-poem-2016</id>
    <link href="https://benjaminwil.info/weblog/film-title-poem-2016"/>
    <published>2020-07-30T11:00:00-07:00</published>
    <summary>Please also read Jennifer West’s introduction to the film.</summary>
    <title>Film Title Poem (2016)</title>
    <updated>2020-07-30T11:00:00-07:00</updated>
    <dc:date>2020-07-30T11:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;There are plenty of full-featured git forges out there. If you’re a software
developer, you’ve probably used GitHub, Bitbucket, and GitLab at some point –
and you’re maybe familiar with &lt;a href=&quot;https://gitea.io&quot;&gt;Gitea&lt;/a&gt;,
&lt;a href=&quot;https://gogs.io&quot;&gt;Gogs&lt;/a&gt;, or &lt;a href=&quot;https://sr.ht&quot;&gt;SourceHut&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of this software is great, and each git forge has valuable features that save
users time and effort when working on projects.&lt;/p&gt;

&lt;p&gt;Sometimes, though, all I need is a simple &lt;a href=&quot;https://git-scm.com/docs/git-remote&quot;&gt;git remote&lt;/a&gt; to sync
a simple project. I don’t need issue trackers, wikis, continuous integration,
or a way to manage patches coming from multiple contributors.&lt;/p&gt;

&lt;p&gt;For these use cases, I have set up a tiny git remote that only I can access.&lt;/p&gt;

&lt;h2 id=&quot;create-a-synced-directory&quot;&gt;Create a synced directory&lt;/h2&gt;

&lt;p&gt;The first problem that needs solving: where should the remote live? I have
chosen to use a simple synced directory.&lt;/p&gt;

&lt;p&gt;There is nothing special about this directory. It is just another directory I
intend to sync using some Dropbox-like file syncing software. (Don’t worry: I do
not ever sync working directories. I’ll discuss this later.)&lt;/p&gt;

&lt;p&gt;We have many ways to sync directories in 2020: whether you use a hosted service
like Google Drive or use a self-hosted solution like
&lt;a href=&quot;https://owncloud.org/&quot;&gt;ownCloud&lt;/a&gt;. I personally use
&lt;a href=&quot;https://syncthing.net/&quot;&gt;Syncthing&lt;/a&gt;, which runs 24/7 on a media server in my
living room – and then syncs to all my other devices whenever they’re connected
to a network.&lt;/p&gt;

&lt;p&gt;The directory I sync is simply called &lt;code&gt;Git&lt;/code&gt;. It lives in my user’s &lt;code&gt;$HOME&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;If you’re asking yourself, “why not just use SSH?” right now, I suggest skipping
to the &lt;a href=&quot;#why-not-just-use-ssh&quot;&gt;Why not just use SSH?&lt;/a&gt; section of this article.&lt;/p&gt;

&lt;h2 id=&quot;add-new-repositories&quot;&gt;Add new repositories&lt;/h2&gt;

&lt;p&gt;The next problem is: how to get &lt;code&gt;project-directory&lt;/code&gt; from &lt;em&gt;Computer A&lt;/em&gt; to
&lt;em&gt;Computer B&lt;/em&gt;. The short answer would be, “use the synced directory” – but I want
to do this the right way.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;In my &lt;code&gt;Git&lt;/code&gt; directory, I can start to &lt;a href=&quot;https://git-scm.com/docs/git-init&quot;&gt;initialize git
repositories&lt;/a&gt; with the &lt;code&gt;--bare&lt;/code&gt; flag:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git init --bare ~/Git/my-project.git
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--bare&lt;/code&gt; flag means that the git repository being initialized (or cloned,
actually) is &lt;em&gt;not&lt;/em&gt; going to be a working directory.&lt;/p&gt;

&lt;p&gt;If I try to change directory to my new repo, git even warns me about this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
cd ~/Git/my-project.git
fatal: this operation must be run in a work tree
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can read more about using bare git repositories this way in the &lt;em&gt;Pro Git&lt;/em&gt;
book. Specifically, see &lt;a href=&quot;https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server&quot;&gt;4.2 Git on the Server – Getting Git on a
Server&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;push-to-repositories&quot;&gt;Push to repositories&lt;/h2&gt;

&lt;p&gt;I’m about ready to push work. So far, I’ve:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Built a home for git repositories I want to sync: &lt;code&gt;~/Git&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Made my first bare git repository at &lt;code&gt;~/Git/my-project.git&lt;/code&gt;.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, I can take any working directory and add my bare repository as a remote:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git remote add syncthing ~/Git/my-project.git
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And when I’m ready to push my work from my branch (in this case &lt;code&gt;my-branch&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git push syncthing my-branch
&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;clone-repositories&quot;&gt;Clone repositories&lt;/h2&gt;

&lt;p&gt;When I’m ready to clone the project from another workstation, I just need
to make sure my synced directory is available and fully synced. The messiest
part of this is that (with Syncthing, at least) the synced directory &lt;em&gt;may&lt;/em&gt; use a
different path on my different workstations.&lt;/p&gt;

&lt;p&gt;When I clone, it’s nice to manually set the &lt;code&gt;--origin&lt;/code&gt; so I’m mindful that I’m
pushing to and pulling from my tiny git remote:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git clone --origin syncthing ~/Git/my-project.git
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And if I forget (like I often do), I can always change the name of the remote
later using &lt;code&gt;git remote rename&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git clone ~/Git/my-project.git my-project
cd my-project
git remote rename origin syncthing
&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;/h2&gt;

&lt;p&gt;My tiny git remote works great for small projects I don’t intend to share with
anyone. But I think it’s important to highlight the caveats:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If my syncing software fails (on the server &lt;em&gt;or&lt;/em&gt; a client), I risk losing work.&lt;/li&gt;
  &lt;li&gt;If this is my only git remote, I risk losing work. I must use multiple git
remotes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If my syncing software does fail, but I’ve already cloned my project on
multiple workstations, I &lt;em&gt;may&lt;/em&gt; be able to recover. That said, I do need to
be conscious of the state of my syncing software if I want to successfully
use my tiny remote.&lt;/p&gt;

&lt;h2 id=&quot;why-not-just-use-ssh&quot;&gt;Why not just use SSH?&lt;/h2&gt;

&lt;p&gt;Some readers have rightly pointed out that this setup is more complex and has
more caveats than just pulling from your other workstations via SSH:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
git remote add workstation_2 benjaminwil@111.111.11.11:/home/benjaminwil/my-project
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If I’m lucky: &lt;code&gt;111.111.11.11&lt;/code&gt; is a static IP address that I already know. And if
I’m really lucky: it’s just a domain name, like &lt;code&gt;benjaminwil.info&lt;/code&gt;. Luck has
nothing to do with it, but you know what I mean.&lt;/p&gt;

&lt;p&gt;The reasons that I prefer using a synced directory, as described in this
article, are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;There is built-in redundancy. Syncthing makes local copies of my latest
changes whenever a workstation running Syncthing is on a network.&lt;/li&gt;
  &lt;li&gt;I am lazy. I am too often wiping my secondary devices and not setting up SSH
keys to my primary devices.&lt;/li&gt;
  &lt;li&gt;I don’t personally have a static IP address at home. While there are ways to
take care of that problem, I haven’t ventured down that path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All that said, I also have a remote set up that I only access via SSH. It’s my
“always off-site” backup, and it is very valuable to me.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;I could technically work out of a project directory that’s actively being
  synced. But there are lots of files I don’t want to or need to sync.&lt;/p&gt;

      &lt;p&gt;Syncing would occur more slowly if I had to sync 200MB of NodeJS modules
  between workstations. And if I accidentally leave a process running on
  &lt;em&gt;Workstation A&lt;/em&gt; and then start work from &lt;em&gt;Workstation B&lt;/em&gt;, I could cause
  some weird problems for myself. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;I don’t have to add &lt;code&gt;.git&lt;/code&gt; to the end of a bare git repo, but it’s a
  nice convention. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/self-hosted-git-remote</id>
    <link href="https://benjaminwil.info/weblog/self-hosted-git-remote"/>
    <published>2020-03-22T12:00:00-07:00</published>
    <summary>There are plenty of full-featured git forges out there.</summary>
    <title>Self-hosting a tiny git remote</title>
    <updated>2020-03-22T12:00:00-07:00</updated>
    <dc:date>2020-03-22T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I watched a lot of mediocre and objectively-pretty-bad movies this year. So much
so that I don’t think I can get to a list that’s thirty items’ long (as I did in
&lt;a href=&quot;/weblog/2018-film&quot;&gt;2018&lt;/a&gt; and &lt;a href=&quot;/weblog/2017-film&quot;&gt;2017&lt;/a&gt;). That said, I watched some pretty wonderful
things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;James Benning: &lt;em&gt;&lt;a href=&quot;http://rarefilm.net/american-dreams-lost-and-found-1984-james-benning-documentary/&quot;&gt;American Dreams (Lost and Found)&lt;/a&gt;&lt;/em&gt;, 1984&lt;/li&gt;
  &lt;li&gt;Sofia Bohdanowicz, Deragh Campbell: &lt;em&gt;&lt;a href=&quot;https://cinema-scope.com/features/audrey-ii-sofia-bohdanowicz-and-deragh-campbells-ms-slavic-7/&quot;&gt;MS Slavic 7&lt;/a&gt;&lt;/em&gt;, 2019&lt;/li&gt;
  &lt;li&gt;Virgil Vernier: &lt;em&gt;&lt;a href=&quot;https://www.filmcomment.com/article/mercuriales-virgil-vernier/&quot;&gt;Mercuriales&lt;/a&gt;&lt;/em&gt;, 2014&lt;/li&gt;
  &lt;li&gt;Bong Joon-Ho: &lt;em&gt;Memories of Murder&lt;/em&gt;, 2003&lt;/li&gt;
  &lt;li&gt;Paweł Pawlikowski: &lt;em&gt;Cold War&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Kazuhiro Sôda: &lt;em&gt;&lt;a href=&quot;https://www.nytimes.com/2008/04/07/movies/07camp.html?_r=0&quot;&gt;Campaign&lt;/a&gt;&lt;/em&gt;, 2007&lt;/li&gt;
  &lt;li&gt;Apichatpong Weerasethakul: &lt;a href=&quot;https://en.wikipedia.org/wiki/Uncle_Boonmee_Who_Can_Recall_His_Past_Lives&quot;&gt;Uncle Boonmee Who Can Recall His Past
Lives&lt;/a&gt;, 2010&lt;/li&gt;
  &lt;li&gt;Ricky D’Ambrose: &lt;em&gt;&lt;a href=&quot;https://www.villagevoice.com/2018/08/14/ricky-dambroses-minimalist-notes-on-an-appearance-is-obsessed-with-absence/&quot;&gt;Notes on an Appearance&lt;/a&gt;&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Agnès Varda: &lt;em&gt;Le Bonheur&lt;/em&gt;, 1965&lt;/li&gt;
  &lt;li&gt;Lucien Castaing-Taylor, Véréna Paravel: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Leviathan_(2012_film)&quot;&gt;Leviathan&lt;/a&gt;&lt;/em&gt;, 2012&lt;/li&gt;
  &lt;li&gt;Nathan Silver: &lt;em&gt;&lt;a href=&quot;https://www.rogerebert.com/reviews/stinking-heaven-2015&quot;&gt;Stinking Heaven&lt;/a&gt;&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Sofia Bohdanowicz: &lt;em&gt;Veslemoy’s Song&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Manbiki Kazoku: &lt;em&gt;Shoplifters&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Toshio Matsumoto: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Funeral_Parade_of_Roses&quot;&gt;Funeral Parade of Roses&lt;/a&gt;&lt;/em&gt;, 1969&lt;/li&gt;
  &lt;li&gt;Robert Hamilton: &lt;em&gt;The Five Finger Splash&lt;/em&gt;, 2019 &lt;a href=&quot;https://vimeo.com/315744145&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Rodrigo Sorogoyen: &lt;em&gt;The Realm&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Ethan Coen, Joel Coen: &lt;em&gt;The Ballad of Buster Scruggs&lt;/em&gt;, 2019&lt;/li&gt;
  &lt;li&gt;Noah Baumbach: &lt;em&gt;Marriage Story&lt;/em&gt;, 2019&lt;/li&gt;
  &lt;li&gt;Bong Joon-Ho: &lt;em&gt;Parasite&lt;/em&gt;, 2019&lt;/li&gt;
  &lt;li&gt;Ryan Ermacora, Jessica Johnson: &lt;em&gt;&lt;a href=&quot;https://jessicajohnson.ca/labour%2Fleisure&quot;&gt;Labour/Leisure&lt;/a&gt;&lt;/em&gt;, 2019&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Due to this feeling incomplete to me, here are some non-movie things that might
have made this list in the parallel universe:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Mindhunter&lt;/em&gt; (season two)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Watchmen&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Jane Campion, Gerard Lee, and Garth Davis’ &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Top_of_the_Lake&quot;&gt;Top of the Lake&lt;/a&gt;&lt;/em&gt; (season
one)&lt;/li&gt;
  &lt;li&gt;Nicholas Winding Refn’s &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Too_Old_to_Die_Young&quot;&gt;Too Old to Die Young&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2019-film</id>
    <link href="https://benjaminwil.info/weblog/2019-film"/>
    <published>2019-12-31T12:00:00-07:00</published>
    <summary>I watched a lot of mediocre and objectively-pretty-bad movies this year.</summary>
    <title>The best films I saw: 2019 edition</title>
    <updated>2019-12-31T12:00:00-07:00</updated>
    <dc:date>2019-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;over the last year i’ve become increasingly conscious of how my life and work
intersects with free and proprietary software. notably:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;i spent the better part of a year enabling midsize companies’ ability to “make
money” using an open source ecommerce framework.&lt;/li&gt;
  &lt;li&gt;i went from working a contract at a small consultancy – who invested a
substantial amount of money into that ecommerce framework – to joining the
consultancy and being acquired by… a very large company using the framework.&lt;/li&gt;
  &lt;li&gt;i became increasingly wary of people who make money via the internet.&lt;/li&gt;
  &lt;li&gt;i started thinking about other potential career tracks?&lt;/li&gt;
  &lt;li&gt;i switched from using arch linux full-time at work to using macos.&lt;/li&gt;
  &lt;li&gt;i saw some silly news stories about dicey open source software licenses.&lt;/li&gt;
  &lt;li&gt;i joined &lt;a href=&quot;http://tilde.town&quot;&gt;tilde.town&lt;/a&gt; and witnessed many people learning about and
experimenting with free software – and it’s worth noting that there is a wider
(still expanding) tilde subculture.&lt;/li&gt;
  &lt;li&gt;i’ve relied on amazon to provide me with many of my basic needs and
convenience purchases, and i haven’t felt incredibly bad about it even though
i think their existence is a net-negative for the world and the open web.&lt;/li&gt;
  &lt;li&gt;i reduced my reliance on google services – specifically g suite for email,
calendar, and file storage, but i also started using duckduckgo as the default
search engine in all of my browsers.&lt;/li&gt;
  &lt;li&gt;i started managing my own private git remote/server. it’s not impressive, but
i’m always learning something.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this list is rambly, and it’s not clear what i (let alone &lt;em&gt;you&lt;/em&gt;) should be
taking from these experiences. today, this list is telling me &lt;em&gt;my role in
software freedom advocacy is too small&lt;/em&gt;. i say this as someone who isn’t
interested in being a professional advocate of any kind, but as someone who
loves computers, software, and the &lt;em&gt;potential&lt;/em&gt; of the internet (which becomes
undermined a bit more each day).&lt;/p&gt;

&lt;p&gt;i can make my role larger by contributing to free software projects more and
more often; by choosing to use free and open source alternatives to proprietary
software (&lt;a href=&quot;https://wiki.gnome.org/Apps/Dia&quot;&gt;ahem, lucidchart&lt;/a&gt;); and by advocating for diy solutions to
problems that big companies solve if you’re willing to throw money at them. most
importantly, i can socialize the idea of software freedom when i speak to people
inside and outside of the tech industry: i can write about it more, i can write
about why i feel it’s important, and so on.&lt;/p&gt;

&lt;p&gt;recently, i was introduced to the oggcast/podcast &lt;a href=&quot;http://faif.us&quot;&gt;free as in
freedom&lt;/a&gt; – which relaunched at the end of 2018 after a two-year
hiatus. it’s hosted by &lt;a href=&quot;http://ebb.org/bkuhn/&quot;&gt;bradley m. kuhn&lt;/a&gt; and &lt;a href=&quot;https://blogs.gnome.org/gnomg/&quot;&gt;karen
sandler&lt;/a&gt; who &lt;em&gt;are&lt;/em&gt; professional free sofware
advocates. if you found my rambly thoughts on this topic semi-interesting, i’d
recommend listening to the following (recent) episodes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://faif.us/cast/2018/dec/31/0x5f/&quot;&gt;0x5f: was 2018 the year of non-foss licensing?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://faif.us/cast/2019/jan/13/0x60/&quot;&gt;0x60: can anyone live in full software freedom today? (part i)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://faif.us/cast/2019/feb/19/0x61/&quot;&gt;0x61: can anyone live in full software freedom today? (part ii)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/antisocial/04</id>
    <link href="https://benjaminwil.info/antisocial/04"/>
    <published>2019-02-24T19:11:02-07:00</published>
    <summary>over the last year i’ve become increasingly conscious of how my life and work intersects with free and proprietary softwa...</summary>
    <title>assessing my role in software freedom advocacy</title>
    <updated>2019-02-24T19:11:02-07:00</updated>
    <dc:date>2019-02-24T19:11:02-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;i’m moving this month, and so far it’s going smoothly.&lt;/p&gt;

&lt;p&gt;in the last nine years, i’ve moved ten times. most of the time, i only had to
worry about my own things – but on one occasion i moved with two other people. i
can’t yet call myself a moving expert, but i’ve become increasingly efficient at
moving. i want to offer you, readers, some tips.&lt;/p&gt;

&lt;p&gt;some of these are uninsightful, common sense tips – but things to hold close to
your heart. when you’re moving: things get stressful, and common sense
becomes… uncommon.&lt;/p&gt;

&lt;p&gt;without further adieu:&lt;/p&gt;

&lt;h2 id=&quot;dont-procrastinate&quot;&gt;don’t procrastinate&lt;/h2&gt;

&lt;p&gt;spend at least a week thinking about the move. and prepare to spend at least two
days moving (if you’re able to take two days).&lt;/p&gt;

&lt;h2 id=&quot;write-out-an-inventory&quot;&gt;write out an inventory&lt;/h2&gt;

&lt;p&gt;and don’t inventory by room – rooms are too big. create &lt;em&gt;zones&lt;/em&gt; that you need
to pack, and use this to better plan your moving-tetris.&lt;/p&gt;

&lt;p&gt;i super-recommend &lt;em&gt;writing&lt;/em&gt; the inventory down, on paper or using a to-do list
app on your phone.&lt;/p&gt;

&lt;h2 id=&quot;plan-to-get-rid-of-things&quot;&gt;plan to get rid of things&lt;/h2&gt;

&lt;p&gt;while you’re inventory-ing, make a list of things you no longer need – or need
to replace. you could go the extra kilometre and make a list of things you
&lt;em&gt;don’t&lt;/em&gt; have but would like to.&lt;/p&gt;

&lt;p&gt;again: write this plan down somewhere. it’s no good to you if you forget half of
the plan.&lt;/p&gt;

&lt;h2 id=&quot;plan-to-move-the-large-things-last&quot;&gt;plan to move the large things last&lt;/h2&gt;

&lt;p&gt;your small objects (books, records, kitchen objects, etc.) are the heaviest and
most time consuming things to pack. get them packed and out of the way. these
are also the easiest things to tetris and put into a moving vehicle.&lt;/p&gt;

&lt;h2 id=&quot;overcommit&quot;&gt;overcommit&lt;/h2&gt;

&lt;p&gt;this can apply to your moving experience in a number of ways. for me:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;i make sure more than enough family members/friends are available to help move
(and that none of them would have to do too much work)&lt;/li&gt;
  &lt;li&gt;i make sure i have lots of time to deal with the move, and lots of time with
moving vehicles, elevator keys, and what have you.&lt;/li&gt;
  &lt;li&gt;nothing is held together with paperclips. my boxes and bins &lt;em&gt;work&lt;/em&gt;, and won’t
fall apart.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;alright, so these are my initial moving tips. as i continue this next moving
process, i may need to amend them.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/03</id>
    <link href="https://benjaminwil.info/antisocial/03"/>
    <published>2019-02-06T18:04:22-07:00</published>
    <summary>i’m moving this month, and so far it’s going smoothly.</summary>
    <title>how to move into a new place</title>
    <updated>2019-02-06T18:04:22-07:00</updated>
    <dc:date>2019-02-06T18:04:22-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;this post outlines how i’m generating this feed as a separate, secondary feed
using &lt;a href=&quot;https://jekyllrb.com/docs/collections/&quot;&gt;jekyll collections&lt;/a&gt;. this is completely possible using the
current version (as of this post: &lt;a href=&quot;https://github.com/jekyll/jekyll-feed/releases/tag/v0.11.0&quot;&gt;0.11.0&lt;/a&gt;) of the
&lt;a href=&quot;https://github.com/jekyll/jekyll-feed&quot;&gt;&lt;code&gt;jekyll-feed&lt;/code&gt;&lt;/a&gt; plugin. this plugin is included in all new jekyll
projects that have been generated with the &lt;code&gt;jekyll new&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;the main blog feed for this site is at the default location:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
https://benjaminwil.info/feed.xml
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and the feed you’re reading from now is at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
https://benjaminwil.into/antisocial/feed.xml
&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;collection-names&quot;&gt;collection names&lt;/h2&gt;

&lt;p&gt;there is one caveat: &lt;code&gt;jekyll-feed&lt;/code&gt; doesn’t provide a way to set a custom name
for your secondary feed. any other feeds you make use basic site metadata:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;your &lt;code&gt;site.title&lt;/code&gt; or &lt;code&gt;site.name&lt;/code&gt; variable’s value&lt;/li&gt;
  &lt;li&gt;a pipe character with some spaces around it (&lt;code&gt; | &lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;and your collection name – with the first letter capitalized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this can look a little bit stupid if you aren’t careful:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Cool Website | My-new-collection
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;yeah, that’s the feed name that would show up in your friends’ rss readers.&lt;/p&gt;

&lt;p&gt;i have &lt;a href=&quot;https://github.com/jekyll/jekyll-feed/pull/261&quot;&gt;a pull request open&lt;/a&gt; on the &lt;code&gt;jekyll-feed&lt;/code&gt; repository that fixes
this. but if you want custom names right now, you’ll have to use my fork of the
&lt;code&gt;jekyll-feed&lt;/code&gt; gem.&lt;/p&gt;

&lt;h2 id=&quot;step-one-update-the-jekyll-feed-gem&quot;&gt;step one: update the jekyll-feed gem&lt;/h2&gt;

&lt;p&gt;when you create a new jekyll site using the &lt;code&gt;jekyll new&lt;/code&gt; command, the version of
the &lt;code&gt;jekyll-feed&lt;/code&gt; plugin included is &lt;code&gt;~&amp;gt; 0.6&lt;/code&gt;. to create a secondary feed, you
need to manually update your &lt;code&gt;Gemfile&lt;/code&gt; to use &lt;code&gt;jekyll-feed&lt;/code&gt; &lt;code&gt;~&amp;gt; 0.11&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ruby
# Gemfile ...
group :jekyll_plugins do
  gem &quot;jekyll-feed&quot;, &quot;~&amp;gt; 0.11&quot;
end
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and add this &lt;code&gt;git&lt;/code&gt; argument if you’re comfortable using my fork of the plugin
(until my – or another similar – pull request has been merged):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ruby
# Gemfile ...
group :jekyll_plugins do
  gem &quot;jekyll-feed&quot;, &quot;~&amp;gt; 0.11&quot;, git: https://github.com/benjaminwil/jf
end
&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;step-two-create-a-new-collection&quot;&gt;step two: create a new collection&lt;/h2&gt;

&lt;p&gt;in your site’s &lt;code&gt;_config.yml&lt;/code&gt; file, you need to add the name and metadata for the
collection you intend to use for the feed. in my case:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yml
# _config.yml ...
collections:
  antisocial:
    output: true
    permalink: /antisocial/:name
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;output: true&lt;/code&gt; ensures a separate file is generated for each item in the
collection (the permalink page), and the &lt;code&gt;permalink:&lt;/code&gt; setting is probably
familiar to you: use it to set your collection post’s uris.&lt;/p&gt;

&lt;p&gt;the jekyll permalinks docs include a list of &lt;a href=&quot;https://jekyllrb.com/docs/permalinks/#collections&quot;&gt;available collections permalinks
variables&lt;/a&gt;. the variable i’m using (&lt;code&gt;:name&lt;/code&gt;) just attaches the
filename to the uri.&lt;/p&gt;

&lt;p&gt;your new collection can be created in the directory &lt;code&gt;_collection_name&lt;/code&gt; (unless
you’ve set a custom &lt;code&gt;collections_dir:&lt;/code&gt; in your &lt;code&gt;_config.yml&lt;/code&gt;). in my case:
&lt;code&gt;_antisocial&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-three-pick-a-layout&quot;&gt;step three: pick a layout&lt;/h2&gt;

&lt;p&gt;you can either use your standard &lt;code&gt;post&lt;/code&gt; layout or make a new one. if you’re a
jekyll user, you likely know all about layouts: so i won’t go into any more
detail here.&lt;/p&gt;

&lt;p&gt;you can either set a &lt;code&gt;layout:&lt;/code&gt; value in the frontmatter for every collection
item, or you can set each collection item’s layout globally from your
&lt;code&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yml
# _config.yml ...
defaults:
  -
    scope:
      path: &quot;&quot; # an empty string here means all files in the project
      type: &quot;antisocial&quot;
    values:
      layout: &quot;your_preferred_layout&quot;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;this is some ugly yaml, but that’s what is has to be &lt;a href=&quot;https://jekyllrb.com/docs/configuration/front-matter-defaults/&quot;&gt;according to the front
matter defaults docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-four-configure-the-feed&quot;&gt;step four: configure the feed&lt;/h2&gt;

&lt;p&gt;we’re pretty much done now. we just have to configure the secondary feed
information using the provided &lt;code&gt;jekyll-feed&lt;/code&gt; &lt;a href=&quot;https://github.com/jekyll/jekyll-feed#collections&quot;&gt;configuration
settings&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;again, in your &lt;code&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yml
# _config.yml ...
feed:
  collections:
    antisocial:
      path: &quot;/antisocial/feed.xml&quot;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;where &lt;code&gt;antisocial:&lt;/code&gt; is the name of your collection and the &lt;code&gt;path:&lt;/code&gt; value is a
string with your preferred feed location.&lt;/p&gt;

&lt;p&gt;now that you’ve configured the feed, you can start to add new posts to your
collection directory.&lt;/p&gt;

&lt;p&gt;note that if you’re keeping a blog you still need to use &lt;code&gt;date:&lt;/code&gt; front matter to
ensure your posts get to the feed.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/antisocial/02</id>
    <link href="https://benjaminwil.info/antisocial/02"/>
    <published>2019-01-21T23:17:12-07:00</published>
    <summary>this post outlines how i’m generating this feed as a separate, secondary feed using jekyll collections.</summary>
    <title>using jekyll collections for a secondary, rss-only feed</title>
    <updated>2019-01-21T23:17:12-07:00</updated>
    <dc:date>2019-01-21T23:17:12-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;test.&lt;/p&gt;

&lt;p&gt;i’ve been made aware of a thing called rss club and i am interested in it. not
just because i’m a feed junky, but because i’m nostalgic (even whimsical) for
the web as i experienced it as a kid.&lt;/p&gt;

&lt;p&gt;so, i’m calling this &lt;em&gt;antisocial feed&lt;/em&gt; not to be antisocial towards you, reader.
and not to be reactively anti–social media.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;i’m calling it &lt;em&gt;antisocial feed&lt;/em&gt; because of me: if you knew me, before we hit
201x, you’d know that i used to be social: i used to have curiousity, attention,
and so on. i used to (think i had been) thoughtful about my (multitude of)
interactions with strangers online.&lt;/p&gt;

&lt;p&gt;i participated in forums: about video games, japanese rock music. i wrote
collaborative poems with my friend staxu. these are not things i feel up to
doing anymore, probably because i feel anxious about them: it’s vulnerable,
or unprofessional, or exposing; i worry that i’d be misunderstood.&lt;/p&gt;

&lt;p&gt;are there like-minded people out there? willing to communicate with me, even
in passing? sometimes other people seem inaccessible to me. sometimes i am
worried that the only people left are trolls or deluded alpha-male wannabes.&lt;/p&gt;

&lt;p&gt;sorry – what an intro. i haven’t really made it clear what &lt;em&gt;antisocial feed&lt;/em&gt; is
going to be. for now, expect posts about the following topics:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;how to (and how not to) communicate with others.&lt;/li&gt;
  &lt;li&gt;a ruby on rails-based personal journal platform i’m building: &lt;a href=&quot;https://github.com/maeku/maeku&quot;&gt;maeku&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;irc, gopher, and free software in 2019. &amp;lt;3&lt;/li&gt;
  &lt;li&gt;movies that are okay. (i’m yet another rss club person &lt;a href=&quot;https://letterboxd.com/benjaminwil&quot;&gt;on letterboxd&lt;/a&gt; – nice!)&lt;/li&gt;
  &lt;li&gt;why i’m not writing poetry for a living, even though that’s what i went to
school for.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;postscript&quot;&gt;postscript&lt;/h2&gt;

&lt;p&gt;yeah, thanks for reading this far. i’m writing this on a static site generated
by jekyll, and there’s &lt;em&gt;no&lt;/em&gt; html view for this yet. it’s also separate from &lt;a href=&quot;https://benjaminwil.info/weblog&quot;&gt;my
main feed&lt;/a&gt;. more about this later.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;reprise to self: all literature and media is inherently a little social. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/antisocial/01</id>
    <link href="https://benjaminwil.info/antisocial/01"/>
    <published>2019-01-17T17:01:34-07:00</published>
    <summary>test.</summary>
    <title>intro to antisocial feed</title>
    <updated>2019-01-17T17:01:34-07:00</updated>
    <dc:date>2019-01-17T17:01:34-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;For film-watching, 2018 wasn’t as good to me as 2017. But I did see a handful of
movies worth remembering. The following list is thirty films long – all films that
I saw for the first time this year.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Eric Baudelaire: &lt;em&gt;&lt;a href=&quot;http://cinema-scope.com/spotlight/letters-max-eric-baudelaire-france/&quot;&gt;Letters to Max&lt;/a&gt;&lt;/em&gt;, 2014&lt;/li&gt;
  &lt;li&gt;Spike Lee: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Crooklyn&quot;&gt;Crooklyn&lt;/a&gt;&lt;/em&gt;, 1994&lt;/li&gt;
  &lt;li&gt;John Cassavetes: &lt;em&gt;&lt;a href=&quot;https://film.avclub.com/john-cassavetes-final-major-work-love-streams-is-an-1798181120&quot;&gt;Love Streams&lt;/a&gt;&lt;/em&gt;, 1984&lt;/li&gt;
  &lt;li&gt;Alexander Sokurov: &lt;em&gt;&lt;a href=&quot;https://mubi.com/notebook/posts/god-and-man-aleksandr-sokurovs-the-sun&quot;&gt;The Sun&lt;/a&gt;&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Pedro Costa: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Colossal_Youth_(film)&quot;&gt;Collosal Youth&lt;/a&gt;&lt;/em&gt;, 2006&lt;/li&gt;
  &lt;li&gt;Bingham Bryant &amp;amp; Kyle Molzan: &lt;em&gt;&lt;a href=&quot;https://variety.com/2016/film/reviews/for-the-plasma-review-1201808672/&quot;&gt;For the Plasma&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Jacques Audiard: &lt;em&gt;&lt;a href=&quot;https://www.tiff.net/tiff/the-sisters-brothers/&quot;&gt;The Sisters Brothers&lt;/a&gt;&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Jonas Mekas: &lt;em&gt;&lt;a href=&quot;https://www.nga.gov/features/experimental-cinema-in-eastern-europe/historys-shadow/reminiscences-of-a-journey-to-lithuania.html&quot;&gt;Reminiscences of a Trip to Lithuania&lt;/a&gt;&lt;/em&gt;, 1972&lt;/li&gt;
  &lt;li&gt;Sean Baker: &lt;em&gt;The Florida Project&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Luca Guadagnino: &lt;em&gt;Call Me by Your Name&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Steven Soderbergh: &lt;em&gt;Unsane&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Agnès Varda: &lt;em&gt;Kung-fu master!&lt;/em&gt;, 1988&lt;/li&gt;
  &lt;li&gt;Steve James: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Hoop_Dreams&quot;&gt;Hoop Dreams&lt;/a&gt;&lt;/em&gt;, 1994&lt;/li&gt;
  &lt;li&gt;Tom DeCillo: &lt;em&gt;&lt;a href=&quot;http://www.tomdicillo.com/portfolio/down-in-shadowland/&quot;&gt;Down in Shadowland&lt;/a&gt;&lt;/em&gt;, 2014&lt;/li&gt;
  &lt;li&gt;Boots Riley: &lt;em&gt;Sorry to Bother You&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Renata Gąsiorowska: &lt;em&gt;Pussy&lt;/em&gt;, 2016 &lt;a href=&quot;https://vimeo.com/308707509&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ruben Östlund: &lt;em&gt;The Square&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Lynne Ramsay: &lt;em&gt;You Were Never Really Here&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Jacques Rivette: &lt;em&gt;Wuthering Heights&lt;/em&gt;, 1985&lt;/li&gt;
  &lt;li&gt;Angela Schanelec: &lt;em&gt;&lt;a href=&quot;http://worldscinema.org/2015/01/angela-schanelec-mein-langsames-leben-aka-passing-summer-2001/&quot;&gt;Passing Summer&lt;/a&gt;&lt;/em&gt;, 2001&lt;/li&gt;
  &lt;li&gt;Kevin Jerome Everson: &lt;em&gt;Three Quarters&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Benoît Forgeard: &lt;em&gt;Respect&lt;/em&gt;, 2011&lt;/li&gt;
  &lt;li&gt;Paul Thomas Anderson: &lt;em&gt;Phantom Thread&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Denis Côté: &lt;em&gt;Curling&lt;/em&gt;, 2010&lt;/li&gt;
  &lt;li&gt;Gastón Solnicki: &lt;em&gt;&lt;a href=&quot;http://cinema-scope.com/spotlight/kekszakallu-gaston-solnicki-argentina/&quot;&gt;Kékszakállú&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Greta Gerwig: &lt;em&gt;Lady Bird&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Alex Ross Perry: &lt;em&gt;Golden Exits&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Éric Rohmer: &lt;em&gt;&lt;a href=&quot;http://sensesofcinema.com/2017/1967/la-collectionneuse/&quot;&gt;La Collectionneuse&lt;/a&gt;&lt;/em&gt;, 1967&lt;/li&gt;
  &lt;li&gt;Yorgos Lanthimos: &lt;em&gt;The Favourite&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Wes Anderson: &lt;em&gt;Isle of Dogs&lt;/em&gt;, 2018&lt;/li&gt;
  &lt;li&gt;Hugh Gibson: &lt;em&gt;&lt;a href=&quot;https://www.theglobeandmail.com/arts/film/film-reviews/no-happy-endings-in-hugh-gibsons-the-stairs/article32228963/&quot;&gt;The Stairs&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2018-film</id>
    <link href="https://benjaminwil.info/weblog/2018-film"/>
    <published>2018-12-31T12:00:00-07:00</published>
    <summary>For film-watching, 2018 wasn’t as good to me as 2017. But I did see a handful of movies worth remembering.</summary>
    <title>The best films I saw: 2018 edition</title>
    <updated>2018-12-31T12:00:00-07:00</updated>
    <dc:date>2018-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I updated my &lt;a href=&quot;https://www.obdev.at/products/launchbar/index.html&quot;&gt;LaunchBar 6&lt;/a&gt; theme Bijou (previously called &lt;a href=&quot;/weblog/el-capitan-small&quot;&gt;El Capitan
Small&lt;/a&gt;). Now, the theme has a dark variant to match macOS Mojave’s new dark
mode. It also got its new name and features some small tweaks that make
it more visually consistent.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/benjaminwil/bijou&quot;&gt;See the GitHub repo&lt;/a&gt; for more information and installation instructions.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/bijou</id>
    <link href="https://benjaminwil.info/weblog/bijou"/>
    <published>2018-09-30T12:00:00-07:00</published>
    <summary>I updated my LaunchBar 6 theme Bijou (previously called El Capitan Small).</summary>
    <title>Bijou</title>
    <updated>2018-09-30T12:00:00-07:00</updated>
    <dc:date>2018-09-30T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;A public access Unix (or Unix-like) server is just a computer. What makes it
special is that anybody can sign up for a user account and use the computer.&lt;/p&gt;

&lt;p&gt;I would consider these servers proto-social networks: no matter what activities
you participate in on the server (message boards, chat, blogging, personal
projects, shared application development), you’re contributing to the server
community.&lt;/p&gt;

&lt;p&gt;The most famous public access server is &lt;a href=&quot;https://en.wikipedia.org/wiki/SDF_Public_Access_Unix_System&quot;&gt;SDF&lt;/a&gt;. It has existed
since 1987 and still has a growing user base. From 1987-era &lt;a href=&quot;https://en.wikipedia.org/wiki/Gopher_%28protocol%29&quot;&gt;Gopher sites&lt;/a&gt;,
to traditional web forums, to multi-user Minecraft, SDF hosts a wide-range of
services for—and by—its users.&lt;/p&gt;

&lt;p&gt;Currently, on the homepage of this site, I call myself a “public access Unix
server enthusiast.” I began my journey with public access servers as a member of
&lt;a href=&quot;http://tilde.club&quot;&gt;tilde.club&lt;/a&gt;&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; (unfortunately inactive these days), and I now contribute to
&lt;a href=&quot;http://tilde.town&quot;&gt;tilde.town&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I understand that intentionally accessing a server via the command line, and
knowing how to do that, is not something that every person can do or would want
to do. However, I hope you consider the ways that these servers can offer
spaces for social experimentation that can pave the way for future, more refined
networks and online spaces:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;These servers are fundamentally non-commercial. They operate on personal
trust.&lt;/li&gt;
  &lt;li&gt;These servers promote technical literacy and offer the potential of education
and mentorship.&lt;/li&gt;
  &lt;li&gt;Server information infrastructure is flexible and “designed” by active users.
Users are the primary stakeholders, investors, and feature-implementers in
their community.&lt;/li&gt;
  &lt;li&gt;Users intentionally create and have control over their own data.&lt;/li&gt;
  &lt;li&gt;These servers provide the opportunity for users to host their own
unconventional websites, blogs, and web apps, for free (or some reasonable
membership fee).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also talk of federating some tilde-named servers. You can see the
beginnings of this at &lt;a href=&quot;https://tilde.chat&quot;&gt;tilde.chat&lt;/a&gt;. Currently, tilde.chat connects four
tilde-named servers via IRC.&lt;/p&gt;

&lt;p&gt;For me, these are just a few reasons that make public access servers compelling.
And seeing &lt;a href=&quot;https://medium.com/@NotBrunoAgain/mastodon-the-obligatory-explainer-3c8a63467828&quot;&gt;the recent success of Mastodon&lt;/a&gt;, and how it seemingly shares
some of the same values, specifically around ownership, identity, and privacy.
It validates my belief that these servers are forerunners in an emerging web
culture, not just hobby spots for outsider tech nerds.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;See Paul Ford’s article &lt;a href=&quot;https://medium.com/message/tilde-club-i-had-a-couple-drinks-and-woke-up-with-1-000-nerds-a8904f0a2ebf&quot;&gt;Tilde.Club: I had a couple drinks and woke up with 1,000 nerds&lt;/a&gt; for more information about tilde.club. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/public-access-unix-servers-as-a-service</id>
    <link href="https://benjaminwil.info/weblog/public-access-unix-servers-as-a-service"/>
    <published>2018-07-21T12:07:00-07:00</published>
    <summary>A public access Unix (or Unix-like) server is just a computer.</summary>
    <title>Public access Unix servers as a service</title>
    <updated>2018-07-21T12:07:00-07:00</updated>
    <dc:date>2018-07-21T12:07:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I just updated &lt;a href=&quot;https://benjaminwil.info&quot;&gt;benjaminwil.info&lt;/a&gt; to use a new layout. It’s still built with
&lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;, and it’s still hosted on &lt;a href=&quot;https://m.do.co/c/4b641d12a82b&quot;&gt;a DigitalOcean droplet&lt;/a&gt;—but I cut
out fifty percent of the CSS and made site maintenance &lt;em&gt;much&lt;/em&gt; easier for myself.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/site-update</id>
    <link href="https://benjaminwil.info/weblog/site-update"/>
    <published>2018-07-08T12:00:00-07:00</published>
    <summary>I just updated benjaminwil.info to use a new layout.</summary>
    <title>Site update</title>
    <updated>2018-07-08T12:00:00-07:00</updated>
    <dc:date>2018-07-08T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I am sharing with you thirty films that I saw this year, that I liked. They
definitely did not all come out this year, or even recently. They are listed
below in a definite order.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Maren Ade: &lt;em&gt;&lt;a href=&quot;https://www.bfi.org.uk/news-opinion/sight-sound-magazine/reviews-recommendations/toni-erdmann-maren-ade-shaggy-dad-comedy&quot;&gt;Toni Erdmann&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Nanni Moretti: &lt;em&gt;Sweet Dreams&lt;/em&gt;, 1981&lt;/li&gt;
  &lt;li&gt;Huang Ya-Li: &lt;em&gt;&lt;a href=&quot;https://www.cinema.ucla.edu/events/2017/11/05/moulin&quot;&gt;Le Moulin&lt;/a&gt;&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Jordan Peele: &lt;em&gt;Get Out&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;James N. Kienitz Wilkins: &lt;em&gt;Public Hearing&lt;/em&gt;, 2012 &lt;a href=&quot;https://vimeo.com/ondemand/publichearing&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Jay Rosenblatt: &lt;em&gt;Restricted&lt;/em&gt;, 1999&lt;/li&gt;
  &lt;li&gt;Ai Weiwei: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Human_Flow&quot;&gt;Human Flow&lt;/a&gt;&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mubi.com/notebook/posts/ghosts-of-time-and-light-the-experimental-cinema-of-ito-takashi&quot;&gt;Takashi Ito&lt;/a&gt;: &lt;em&gt;Double&lt;/em&gt;, 2001&lt;/li&gt;
  &lt;li&gt;James N. Kienitz Wilkins: &lt;em&gt;&lt;a href=&quot;https://mubi.com/notebook/posts/e-uno-plura-close-up-on-james-n-kienitz-wilkins-the-republic&quot;&gt;The Republic&lt;/a&gt;&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Arthur Lipsett: &lt;em&gt;21-87&lt;/em&gt;, 1963 &lt;a href=&quot;https://vimeo.com/29432400&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Casimir Nozkowski: &lt;em&gt;IDAC&lt;/em&gt;, 2016 &lt;a href=&quot;https://www.youtube.com/watch?v=OvCum88STm8&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Michael Winterbottom: &lt;em&gt;The Trip&lt;/em&gt;, 2010&lt;/li&gt;
  &lt;li&gt;Olivier Assayas: &lt;em&gt;&lt;a href=&quot;http://cinema-scope.com/cinema-scope-online/personal-shopper-olivier-assayas-france-masters/&quot;&gt;Personal Shopper&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Kevan Funk: &lt;em&gt;&lt;a href=&quot;https://www.cbc.ca/news/entertainment/kevan-funk-hello-destroyer-1.4019785&quot;&gt;Hello Destroyer&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Ousmane Sembene: &lt;em&gt;Black Girl&lt;/em&gt;, 1966&lt;/li&gt;
  &lt;li&gt;Sofia Coppola: &lt;em&gt;The Beguiled&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Takashi Ito: &lt;em&gt;December Hide-and-Go-Seek&lt;/em&gt;, 1993&lt;/li&gt;
  &lt;li&gt;Laura Poitras: &lt;em&gt;Risk&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Dana Berman Duff: &lt;em&gt;Catalogue Vol. 6&lt;/em&gt;, 2016 &lt;a href=&quot;https://vimeo.com/204550609&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Chris King: &lt;em&gt;Wipe Poem&lt;/em&gt;, 2017 &lt;a href=&quot;https://vimeo.com/62649373&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;David Leitch: &lt;em&gt;Atomic Blonde&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Jeffrey Chong: &lt;em&gt;Kingsway&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Alabart, Cros, Verheyen, Rius: &lt;em&gt;&lt;a href=&quot;https://www.hollywoodreporter.com/review/agata-s-friends-les-amigues-909581&quot;&gt;Agata’s Friends&lt;/a&gt;&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Chris Marker: &lt;em&gt;La Jetée&lt;/em&gt;, 1962 &lt;a href=&quot;https://www.youtube.com/watch?v=6anMLFwHFqs&quot;&gt;🎥&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Jodie Mack: &lt;em&gt;Wasteland No. 1: Ardent, Verdant&lt;/em&gt;, 2017&lt;/li&gt;
  &lt;li&gt;Maurice Pialat: &lt;em&gt;&lt;a href=&quot;https://lwlies.com/articles/a-nos-amours-maurice-pialat-greatest-teen-movie/&quot;&gt;À Nos Amours&lt;/a&gt;&lt;/em&gt;, 1983&lt;/li&gt;
  &lt;li&gt;Hayao Miyazaki: &lt;em&gt;Kiki’s Delivery Service&lt;/em&gt;, 1989&lt;/li&gt;
  &lt;li&gt;Tom McCarthy: &lt;em&gt;Spotlight&lt;/em&gt;, 2015&lt;/li&gt;
  &lt;li&gt;Tim Sutton: &lt;em&gt;&lt;a href=&quot;https://www.theguardian.com/film/2017/aug/18/dark-night-review-tim-sutton-aurora-massacre&quot;&gt;Dark Night&lt;/a&gt;&lt;/em&gt;, 2016&lt;/li&gt;
  &lt;li&gt;Peter Weir: &lt;em&gt;Picnic at Hanging Rock&lt;/em&gt;, 1975&lt;/li&gt;
&lt;/ul&gt;

</content>
    <id>https://benjaminwil.info/weblog/2017-film</id>
    <link href="https://benjaminwil.info/weblog/2017-film"/>
    <published>2017-12-31T12:00:00-07:00</published>
    <summary>I am sharing with you thirty films that I saw this year, that I liked.</summary>
    <title>The best films I saw: 2017 edition</title>
    <updated>2017-12-31T12:00:00-07:00</updated>
    <dc:date>2017-12-31T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;&lt;em&gt;The Republic&lt;/em&gt; meets my threshold for something that is a movie,
despite there being almost nothing to see. If you don’t already know: &lt;em&gt;The
Republic&lt;/em&gt; doesn’t utilize a camera. It presents solid colours only… and
quite slowly. You could call it a gimmick, but be aware that it is one entry
into a category of films that do the exact same thing—notably Derek Jarman’s
&lt;em&gt;Blue&lt;/em&gt;—and still manage to do a new thing. This entry holds interest
by grounding the viewer in  uncomplicated radioplay storytelIing, relieving us
of the genuinely uncomfortable, OLED-destroying, static abstraction on screen.&lt;/p&gt;

&lt;p&gt;Since you won’t be seeing much, pay attention to the warmth of the
occasional flourishes that create sound-images in a mostly barren
(apocalyptic?) sound-world. Most memorably, there is a doorbell effect that
provides additional relief from what’s on screen, and from the detached,
minimal presentation of sound stage and many of the vocal performances. I
don’t have 7.1 surround at home and don’t believe this medium-fidelity
production would have benefited from it anyway.&lt;/p&gt;

&lt;p&gt;The story describes a group of libertarian outsiders (and e-cigarette
enthusiasts) delicately. Here, in 2010s North America, the libertarians that
get clipped are either loud or dangerous, and so I urge you to take a breath
and reframe before watching, so you can “get behind” an extended scenario
following the downfall of this sovereign of (very serious) libertarians who
want deeply for their society to function.&lt;/p&gt;

&lt;p&gt;Of all the performances, Nour Mobarak’s performance stands out.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/weblog/the-republic-2017</id>
    <link href="https://benjaminwil.info/weblog/the-republic-2017"/>
    <published>2017-07-30T12:00:00-07:00</published>
    <summary>The Republic meets my threshold for something that is a movie, despite there being almost nothing to see.</summary>
    <title>The Republic (2017)</title>
    <updated>2017-07-30T12:00:00-07:00</updated>
    <dc:date>2017-07-30T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;Three years after first presenting &lt;a href=&quot;https://sleepwhen.benjaminwil.info&quot;&gt;&lt;em&gt;Sleep when
exhausted&lt;/em&gt;&lt;/a&gt;, I was invited back to the
University of Victoria to give a short talk about it in &lt;a href=&quot;http://davidleach.ca&quot;&gt;David
Leach&lt;/a&gt;’s WRIT 324 class.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It turns out that giving a
talk is the best possible excuse to revisit old work, especially when you’re a
little embarrassed about it.&lt;/p&gt;

&lt;p&gt;This post is based on that talk. It also attempts to extrapolate on the jokey,
cryptic stuff that appears in &lt;a href=&quot;/weblog/sleep-when-exhausted&quot;&gt;the essay that accompanied the
project&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-this-thing&quot;&gt;What is this thing?&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Sleep when exhausted&lt;/em&gt; is a looping visual poem.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; That means that it begs to
be read over and over again. If you choose to go through it more than once,
you’ll notice that the poem changes depending on the lines you pick out. But the
premise of &lt;em&gt;Sleep when exhausted&lt;/em&gt;, at its simplest, is that it’s a poem.&lt;/p&gt;

&lt;p&gt;For me, re-reading poetry is a necessary part of reading poetry. Every time I
read a poem, I’ll linger on slightly different details, or the same singular
detail with some other cadence. This project formalizes that re-reading process.
Unless you’re mapping out the lines that you’re picking, you probably won’t go
through &lt;em&gt;Sleep when exhausted&lt;/em&gt; the same way twice.&lt;/p&gt;

&lt;p&gt;Even now, as I’ve been going through it again, I get surprised by certain things
that I don’t even remember writing. Like the clock that reads &lt;code&gt;99:99&lt;/code&gt; on the
piano in the living room.&lt;/p&gt;

&lt;h2 id=&quot;why-make-a-poem-out-of-a-website&quot;&gt;Why make a poem out of a website?&lt;/h2&gt;

&lt;p&gt;I received something that the University of Victoria calls a &lt;a href=&quot;https://www.uvic.ca/learningandteaching/students/scholarships/jcura/&quot;&gt;Jamie Cassels
Undergraduate Research
Award&lt;/a&gt;.
It’s given to two students from every department each year.&lt;/p&gt;

&lt;p&gt;In addition to $1,500 toward tuition, recipients get a $50 stipend to spend on
poster materials for the eventual JCURA year-end fair. If you’ve ever been to a
high school science fair or a college job fair, just picture that, but with a
wider array of disciplines represented.&lt;/p&gt;

&lt;p&gt;Because I was not required to use my $50 stipend on printing materials
specifically, I didn’t. My favourite science fair projects, as a kid, were the
ones where you didn’t just read a poster. I figured I’d make something a little
more interactive for my visitors to deal with. So, “Why make a poem out of a
website?” That’s why.&lt;/p&gt;

&lt;h2 id=&quot;whats-with-the-accompanying-essay&quot;&gt;What’s with the accompanying essay?&lt;/h2&gt;

&lt;p&gt;It’s a poemy, tongue-in-cheek window into the nature of my research. While I
think there’s overlap between “creative research” and “academic research,”
creative research doesn’t follow the same rules.&lt;/p&gt;

&lt;p&gt;The academic research that I’m most familiar with as a university graduate
feigns uncontaminatedness and objectivity toward its subject. Although academics
might start research out of a place of curiousity or passion, they may need to
squelch some enthusiasm, or their research may stay unpublished. Rightly so.
There’s value to that system.&lt;/p&gt;

&lt;p&gt;Meanwhile, creative search can start in the same place—a place of passion—but
sprawl across disciplines and styles and remain unsquelched. See Jordan Abel’s
book &lt;a href=&quot;http://www.jordanabel.ca/uninhabited/&quot;&gt;&lt;em&gt;Un/inhabited&lt;/em&gt;&lt;/a&gt;, which documents
the colonialist language used in copyright-lapsed (read: very old) western
novels about land and land ownership.&lt;/p&gt;

&lt;p&gt;The “creative thesis” is getting more and more popular, but it still doesn’t
have the same clout that an “academic” thesis has. I don’t want to say that a
creative thesis is less legitimate, than a “non-creative” thesis, but they do
have a way of making uninteresting subject matter more interesting.&lt;/p&gt;

&lt;p&gt;My own creative research here, and the way I present that research, has less to
do with deep dives into external materials or studies and more to do with sleepy
reflections on the loss of personal motivation, focus, and feeling like life
sure is boring. I don’t want to say that my research is less legitimate, but I’d
agree with you that it’s less interesting.&lt;/p&gt;

&lt;h2 id=&quot;are-you-one-of-those-video-games-arent-art-people&quot;&gt;Are you one of those “video games aren’t art” people?&lt;/h2&gt;

&lt;p&gt;It sounds like you’re referring to the section in the essay about “gameness.” In
it, I say that &lt;em&gt;Sleep when exhausted&lt;/em&gt; falls outside of what I’d normally
consider a game.&lt;/p&gt;

&lt;p&gt;I’m not a “video games aren’t art” person. I just don’t think this is a video
game. You can’t really win, and the poem’s mechanics aren’t skill-based in any
way. The mechanics—clicking through a line to get a new set of lines—are barely
even narrative. I see the forward motion of the poem the same way that I see my
own thought process: not focused, only somewhat linear, and attention-averse.&lt;/p&gt;

&lt;h2 id=&quot;is-this-work-scrappy&quot;&gt;Is this work scrappy?&lt;/h2&gt;

&lt;p&gt;Yeah. When I started this, I had no idea how to build a branching narrative for
the web, and I had no idea what the poem’s content would be. I did outline some
of it, to gauge the general trajectory, but as I was implementing the trees I
veered quickly into doing whatever I felt like at that moment.&lt;/p&gt;

&lt;p&gt;I experimented with doing the whole thing in &lt;a href=&quot;http://twinery.org&quot;&gt;Twine&lt;/a&gt;, but I had a hard time
getting the non-linear, wrap-around, lost feeling using that system.&lt;/p&gt;

&lt;p&gt;Please, please, please don’t look at the source code for this effing thing.&lt;/p&gt;

&lt;h2 id=&quot;does-this-thing-have-a-structure&quot;&gt;Does this thing have a structure?&lt;/h2&gt;

&lt;p&gt;I guess so, but I’m still not able to parse it completely. Or, making a perfect
map of this poem (by hand) would be quite difficult. There are &lt;em&gt;a lot&lt;/em&gt; of
“potential poems” in here, and while I’d love to see them all extracted into a
series of separated poems—there would be a lot of them.&lt;/p&gt;

&lt;p&gt;However, this thing does have a system. There are three types of states:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Observation trees (I went to the kitchen / I went to the bathroom / etc.)&lt;/li&gt;
  &lt;li&gt;Streams of consciousness (I / love / Maria)&lt;/li&gt;
  &lt;li&gt;Clarities (I was bored / /)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s nice to have system language for what this thing is, but I don’t think it
makes the work any more interesting. Just jump in and see how it makes you feel.&lt;/p&gt;

&lt;h2 id=&quot;wheres-this-source-code-im-not-supposed-to-look-at&quot;&gt;Where’s this source code I’m not supposed to look at?&lt;/h2&gt;

&lt;p&gt;You can find the source code &lt;a href=&quot;https://github.com/benjaminwil/sleepwhen&quot;&gt;at this GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;The class is called Writing Interactive Narrative: “A workshop/seminar in writing for digital media, hyper-literature, video games, interactive installations and experiences.” &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;I call it a “visual poem” because the white space, three-column layout, and the nature of content-forking are very central to the piece. Although I can see why someone would argue that it’s not &lt;a href=&quot;https://en.wikipedia.org/wiki/Visual_poetry&quot;&gt;visual poetry according to the definition&lt;/a&gt;. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/sleep-when-exhausted-revisited</id>
    <link href="https://benjaminwil.info/weblog/sleep-when-exhausted-revisited"/>
    <published>2017-02-02T00:00:00+00:00</published>
    <summary>Three years after first presenting Sleep when exhausted, I was invited back to the University of Victoria to give a short...</summary>
    <title>Sleep when exhausted, revisited</title>
    <updated>2017-02-02T00:00:00+00:00</updated>
    <dc:date>2017-02-02T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;I made a theme for &lt;a href=&quot;https://www.obdev.at/products/launchbar/index.html&quot;&gt;LaunchBar 6&lt;/a&gt;, a Mac OS X-based launcher and
automation tool. It’s inspired by Small, the default theme for LaunchBar 5.&lt;/p&gt;

&lt;p&gt;It’s called El Capitan Small. &lt;a href=&quot;https://github.com/benjaminwil/el-capitan-small&quot;&gt;See the GitHub repo&lt;/a&gt; for more information
and installation instructions.&lt;/p&gt;

</content>
    <id>https://benjaminwil.info/weblog/el-capitan-small</id>
    <link href="https://benjaminwil.info/weblog/el-capitan-small"/>
    <published>2015-12-26T12:00:00-07:00</published>
    <summary>I made a theme for LaunchBar 6, a Mac OS X-based launcher and automation tool.</summary>
    <title>El Capitan Small</title>
    <updated>2015-12-26T12:00:00-07:00</updated>
    <dc:date>2015-12-26T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;The technical content of &lt;em&gt;Sleep when exhausted&lt;/em&gt;, to anyone viewing its
page source, is not by any means impressive and is crudely constructed.
Still, as a product I would label foremost as poetry, I will offer here
that the amateurish build quality adds to the final product.&lt;/p&gt;

&lt;h2 id=&quot;process&quot;&gt;Process&lt;/h2&gt;

&lt;p&gt;What I created for this project records my coming to the web browser
as an outsider. I spoke colloquially, as a poet, using JavaScript to
speak to the client’s web browser in a language that the browser
understands. I utilized the browser’s ability to calculate the unfolding
narrative efficiently, in a way that readers need not understand.&lt;/p&gt;

&lt;p&gt;And so, because I am a barely self-taught web developer, and still
wanted to see the poem laid out somehow on the backend, I created much
unnecessary work for myself. I often had to backtrack.&lt;/p&gt;

&lt;p&gt;This became a contemplative act in the same way that prayer is a
contemplative act: instead of humbling myself before the greatness and
nonhumanness of &lt;em&gt;other&lt;/em&gt;, I approached &lt;em&gt;other&lt;/em&gt; as though &lt;em&gt;other&lt;/em&gt; wanted
to be spoken to as if it were humanlike. The only communicative
benefits, as far as I understand them, that can be observed from an act
of prayer are in oneself; &lt;em&gt;other&lt;/em&gt;’s involvement in the conversation was
not observable.&lt;/p&gt;

&lt;p&gt;A practiced web developer could find more efficient ways of creating
&lt;em&gt;Sleep when exhausted&lt;/em&gt;. Instead of inputting each state&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; by hand, I
could have created a collection of data that, with simple keywords,
would grab any input data and automate the output. Instead I chose to
approach the JavaScript like I do any analogue writing project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I assume that I understand the language I will be working in well
enough to communicate something.&lt;/li&gt;
  &lt;li&gt;I research in isolation, without input from mentors or peers until
later in the process.&lt;/li&gt;
  &lt;li&gt;I work linearly, one minuscule task after another.&lt;/li&gt;
  &lt;li&gt;I check for errors and mistakes and inconsistencies.&lt;/li&gt;
  &lt;li&gt;I repeat.&lt;/li&gt;
  &lt;li&gt;I disregard orthodox form and structure,&lt;/li&gt;
  &lt;li&gt;which might also mean disregarding common sense, readability, and
usability.&lt;/li&gt;
  &lt;li&gt;I embrace the long hours and unpaid nature of my project.&lt;/li&gt;
  &lt;li&gt;I stop eating, sleeping, et cetera.&lt;/li&gt;
  &lt;li&gt;I take long walks in the middle of the night when restless.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I do not mean to say that conventional web development cannot be a
contemplative or transcendental act. I only mean to distinguish between
conventional web development, which I know little about, and my own
emulation of web development as a poet in a culture of poetry steeped in
printed matter.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; I also understand that many web designers,
developers, students, and other creatives work in a similar, albeit
unhealthy, way—working more than eighty hours per week, losing sleep,
eating poorly, being obsessed, or whatever.&lt;/p&gt;

&lt;h2 id=&quot;gameness&quot;&gt;Gameness&lt;/h2&gt;

&lt;p&gt;Because the reader generates new information to consume as they navigate
through the speaker’s world, &lt;em&gt;Sleep when exhausted&lt;/em&gt; could be closely
compared to &lt;em&gt;Choose Your Own Adventure&lt;/em&gt;-style gamebooks, other branching
narrative systems, graphical point-and-click adventure games, visual
novels, or whatever.&lt;/p&gt;

&lt;p&gt;The major difference would be that &lt;em&gt;Sleep when exhausted&lt;/em&gt; excludes
actual choice, plot, and gameness.&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; Readers might view themselves as
“players” when interacting with it, but more than usual, their choices
have no effect on this work’s outcome. Readers pick the details that
they pick, and details unveil further details as I have prescribed. The
continuity is not narrative, or, because it is looping, chronological.
It is just a visual artifact of the speaker’s consciousness, much like
other poems.&lt;/p&gt;

&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;

&lt;p&gt;In avoiding gameness, I knew that my project would withdraw further into
the territory of poetry—a region that seems to exclude the majority of
people—and even the majority of writers. I wanted poets and nonpoets to
be able to approach this work. I created an &lt;em&gt;imaginary general
audience&lt;/em&gt;. So I worked to cater to a diverse set of readers, who have
short attention spans, or read more or less in the context of video
games, or who more or less read links acquired from their Facebook
feeds.&lt;/p&gt;

&lt;p&gt;Similarly, I did not want to alienate the “average reader”&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; or the
“average reader of poetry” any more than usual and decided to make
&lt;em&gt;Sleep when exhausted&lt;/em&gt; seem book-like. This is my tiny attempt to trick
them into interacting with the work.&lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;If I ever wanted this imaginary general audience to enjoy, let alone
interact at all with this work, it would need to be completable in under
a minute and absorbing enough to invite readers interested in the work
for another read.&lt;/p&gt;

&lt;h2 id=&quot;literariness&quot;&gt;Literariness&lt;/h2&gt;

&lt;p&gt;There is a girl seated in front of me, sitting next to her mother. She
is twenty-three-ish years old. Our flight attendant passes her a glass
of water. I watch her watching Jeremy Renner fight a wolf with his bare
hands.&lt;/p&gt;

&lt;p&gt;I’ve already seen &lt;em&gt;The Bourne Legacy&lt;/em&gt;, but it seems different now. I am
trying to scrub through my memory of the flick, figure out what events
have already occurred. I view this now without audio, through the crack
between two airline seats. I attempt to measure the viewer’s pleasure,
filtered through her blonde, shoulder-length hair.&lt;/p&gt;

&lt;p&gt;Our flight attendant passes me a glass of orange juice with ice in it.
It takes a few minutes, but I finally find the dimmer to turn off my own
in-flight multimedia station. I admit there is something about watching
a movie you have no intention of finishing because the duration of your
flight just isn’t long enough, but today I want to just be on this
airplane and do nothing.&lt;/p&gt;

&lt;h2 id=&quot;obsolescence&quot;&gt;Obsolescence&lt;/h2&gt;

&lt;p&gt;As web browsers are perpetually modernized, support for &lt;em&gt;Sleep when
exhausted&lt;/em&gt; will likely drop, at least partially. This type of problem
affects all digital works and will impair us from interacting with
content as it was intended—at least until content creators adopt plain
text as &lt;em&gt;the&lt;/em&gt; standard method of digitally storing and/or documenting
human-readable information&lt;sup id=&quot;fnref:6&quot;&gt;&lt;a href=&quot;#fn:6&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; or move back to paper.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sleep when exhausted&lt;/em&gt; will also become visually obsolete as it ages,
and is probably ugly already. I regret aesthetic choices that I have
made. That said, I do not intend to continue support for this work, and
I welcome any obsolescence gratefully.&lt;/p&gt;

&lt;h2&gt;Reading list&lt;/h2&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.kyoolee.net/From_Modernism_to_Hypermodernism_and_Beyond_-_Interview_with_Paul_Virilio.pdf&quot;&gt;From Modernism to Hypermodernism and Beyond&lt;/a&gt;. Armitage, John; Virilio, Paul&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://tm-resource.projects.cavi.au.dk/?page_id=1291&quot;&gt;Post-digital Research, vol. 3, issue 1&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.ubu.com/papers/fahlstrom01.html&quot;&gt;Manifesto for Concrete Poetry&lt;/a&gt;. Fahlström, Öyvind &lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.gauss-pdf.com/post/77921584015/gpdf101-matthew-fee-instructions-for-lightning&quot;&gt;Instructions for Lightning Avoidance&lt;/a&gt;. Fee, Matthew&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://ubu.com/vp/Typewriter_Poems.html&quot;&gt;Typewriter Poems&lt;/a&gt;. Finch, Peter (ed.)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://raley.english.ucsb.edu/wp-content2/uploads/234/Mak.pdf&quot;&gt;How the Page Matters&lt;/a&gt;. Mak, Bonnie&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://vispo.com/bp/introduction.htm&quot;&gt;First Screening&lt;/a&gt;. bpNichol&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://kairos.technorhetoric.net/12.3/topoi/stolley/&quot;&gt;The Lo-Fi Manifesto&lt;/a&gt;. Stolley, Karl&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.zeldman.com/2012/05/18/web-design-manifesto-2012/&quot;&gt;Web Design Manifesto 2012&lt;/a&gt;. Zeldman, Jeffrey&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://dash.generalassemb.ly&quot;&gt;Dash&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/lucaong/jquery-machine&quot;&gt;jQuery-Machine&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://daneden.me/toast/&quot;&gt;Toast&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.dafont.com/liquid-crystal.font&quot; title=&quot;Liquid Crystal&quot;&gt;Liquid Crystal&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.dafont.com/weblysleek-ui.font&quot; title=&quot;Webly Sleek&quot;&gt;Webly Sleek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;This work was developed for and funded by the Jamie Cassels
Undergraduate Research Awards program at the University of Victoria.
This project would not have been as cool without the support and
encouragement of Tim Lilburn and Karolinka Zuzalek, with special thanks
to Patrick Close, Matthew Hooton, Megan Jones, David Leach, Courtney
Løberg, Garth Martens, Helen Marzolf, Jordan Soles, Valerie Tenning, and
UVic’s personal web space.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;By “state,” I mean any three lines that you can see at once. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;This is a generalization about the literary culture in Victoria,
British Columbia. I do not mean you any offence! &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;I define games as objective- and choice-oriented systems, which
are primarily unlike to the arts. I find nothing about gameness
distasteful, but &lt;em&gt;Sleep when exhausted&lt;/em&gt; is not intended to be a
game. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;who deeply hates those awful slideshow-based articles and prefers
to just scroll down a single webpage. &lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;For the JCURA installation, I presented the poem on an Asus Nexus
7 as a fullscreen application generated by Google Chrome. &lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:6&quot;&gt;
      &lt;p&gt;&lt;em&gt;The Lo-Fi Manifesto&lt;/em&gt;. Stolley, Karl. &lt;a href=&quot;#fnref:6&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
    <id>https://benjaminwil.info/weblog/sleep-when-exhausted</id>
    <link href="https://benjaminwil.info/weblog/sleep-when-exhausted"/>
    <published>2014-03-05T12:00:00-07:00</published>
    <summary>The technical content of Sleep when exhausted, to anyone viewing its page source, is not by any means impressive and is c...</summary>
    <title>Sleep when exhausted</title>
    <updated>2014-03-05T12:00:00-07:00</updated>
    <dc:date>2014-03-05T12:00:00-07:00</dc:date>
  </entry>
  <entry>
    <content>&lt;p&gt;how do you feel about this idea? this is something i did today: i ported all of
the reviews from &lt;a href=&quot;https://letterboxd.com/benjaminwil&quot;&gt;my letterboxd account&lt;/a&gt; to
my main weblog, here, on benjaminwil.info.&lt;/p&gt;

&lt;p&gt;it’s something i’ll continue to think about: it kinda looks like i changed
history, after all. that said… it is content that i wrote on those dates. i
could add notes to the posts to contextualize? but my blog isn’t important or
widely read anyway.&lt;/p&gt;
</content>
    <id>https://benjaminwil.info/antisocial/05</id>
    <link href="https://benjaminwil.info/antisocial/05"/>
    <published>2010-03-20T19:25:00-07:00</published>
    <summary>how do you feel about this idea? this is something i did today: i ported all of the reviews from my letterboxd account to...</summary>
    <title>backfilling my weblog?</title>
    <updated>2010-03-20T19:25:00-07:00</updated>
    <dc:date>2010-03-20T19:25:00-07:00</dc:date>
  </entry>
  <dc:language>en</dc:language>
  <dc:date>2026-07-13T11:32:32-07:00</dc:date>
</feed>
