<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>jutty.dev</title>
    <subtitle>Computer nerd memory leaks</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.jutty.dev/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.jutty.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-18T07:07:13-03:00</updated>
    <id>https://blog.jutty.dev/atom.xml</id>
    <entry xml:lang="en">
        <title>jaq: polyglot jq clone</title>
        <published>2026-06-18T07:07:13-03:00</published>
        <updated>2026-06-18T07:07:13-03:00</updated>
        
        <author>
          <name>
            Michael Färber (01mf02)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://gedenkt.at/jaq/manual/"/>
        <id>https://blog.jutty.dev/links/gedenkt-jaq/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/gedenkt-jaq/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>kage: Clone rendered websites locally</title>
        <published>2026-06-18T06:53:44-03:00</published>
        <updated>2026-06-18T06:53:44-03:00</updated>
        
        <author>
          <name>
            Tam Nguyen Duc (tamnd)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kage.tamnd.com/"/>
        <id>https://blog.jutty.dev/links/tamnd-kage/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/tamnd-kage/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Junited 2026</title>
        <published>2026-06-06T19:05:32-03:00</published>
        <updated>2026-06-06T19:05:32-03:00</updated>
        
        <author>
          <name>
            Robert Birming
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://robertbirming.com/junited/"/>
        <id>https://blog.jutty.dev/links/junited-2026/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/junited-2026/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Scoped Commits</title>
        <published>2026-06-05T21:03:09-03:00</published>
        <updated>2026-06-05T21:03:09-03:00</updated>
        
        <author>
          <name>
            Sumner Evans
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://scopedcommits.com/"/>
        <id>https://blog.jutty.dev/links/scopedcommits/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/scopedcommits/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Virtual OS Museum</title>
        <published>2026-05-28T01:40:04-03:00</published>
        <updated>2026-05-28T01:40:04-03:00</updated>
        
        <author>
          <name>
            Andrew Warkentin
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://virtualosmuseum.org/"/>
        <id>https://blog.jutty.dev/links/virtualosmuseum/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/virtualosmuseum/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>rura: TUI for building shell pipelines</title>
        <published>2026-05-28T01:01:26-03:00</published>
        <updated>2026-05-28T01:01:26-03:00</updated>
        
        <author>
          <name>
            am2rican5
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/tlipinski/rura"/>
        <id>https://blog.jutty.dev/links/am2rican5-rura/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/am2rican5-rura/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>No Ghosts!</title>
        <published>2026-05-27T23:33:34-03:00</published>
        <updated>2026-05-27T23:33:34-03:00</updated>
        
        <author>
          <name>
            Dan Gohman (sunfishcode)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sunfishcode.online/no-ghosts/"/>
        <id>https://blog.jutty.dev/links/sunfishcode-no-ghosts/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/sunfishcode-no-ghosts/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>computers should be liberating</title>
        <published>2026-05-27T23:22:32-03:00</published>
        <updated>2026-05-27T23:22:32-03:00</updated>
        
        <author>
          <name>
            jyn
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jyn.dev/liberating/"/>
        <id>https://blog.jutty.dev/links/jyn-computers-should-be-liberating/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jyn-computers-should-be-liberating/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A poet and a scientist on what programming even is</title>
        <published>2026-05-27T13:13:22-03:00</published>
        <updated>2026-05-27T13:13:22-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/what-programming-even-is/"/>
        <id>https://blog.jutty.dev/notes/what-programming-even-is/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/what-programming-even-is/">&lt;p&gt;I was reading this piece, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huronbikes.mataroa.blog&#x2F;blog&#x2F;i-am-not-a-software-engineer&#x2F;&quot;&gt;&lt;em&gt;I am not a Software Engineer&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; by Andrew Golding, and had just skimmed through Peter Naur’s &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gwern.net&#x2F;doc&#x2F;cs&#x2F;algorithm&#x2F;1985-naur.pdf&quot;&gt;&lt;em&gt;Programming as Theory Building&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;. The two immediately connected in my mind, both eloquent and poignant in different ways.&lt;&#x2F;p&gt;
&lt;p&gt;The author says they’re not a software engineer. Perhaps a poet? There is a certain cadence and symbology going on, a certain feeling expressed and reflection on the meaning of more than a few words. My own poet’s heart could feel it. It’s not a rehash of “programmers are not engineers”, it’s actually setting the term aside for what perhaps it always meant, or came to mean, accurate or not per a dictionary.&lt;&#x2F;p&gt;
&lt;p&gt;If software engineering is making code spit itself and not even care what or how it’s spitting, it still would likely offend any engineer to call it as such, but then it might also drift from what the converted ex-programmer signed up for.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve personally always preferred the term &lt;em&gt;programmer&lt;&#x2F;em&gt;, which I suppose the LinkedIn Software Engineer would consider merely the act of writing code. This seems to miss the mark even if you go back several years, with Naur here defining it as “the whole activity of design and implementation of programmed solutions” in 1985. That makes you ask, then, what &lt;em&gt;is&lt;&#x2F;em&gt; software engineering and if you try the “official” route you’ll read things like “sound engineering principles” (Sommerville) and “systematic, disciplined, quantifiable” (IEEE), but the actual trend is moving farther and farther away from this ideal. At its core, it is still “design and implementation”, with the notion of its distinctive feature being rigor having historically failed and now become laughable.&lt;&#x2F;p&gt;
&lt;p&gt;But what if even programming had never been &lt;em&gt;just&lt;&#x2F;em&gt; design and implementation of computer programs?&lt;&#x2F;p&gt;
&lt;p&gt;Naur strikes at the core of it:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;programming properly should be regarded as an activity by which the programmers form or achieve a certain kind of insight, a theory, of the matters at hand. This suggestion is in contrast to what appears to be a more common notion, that programming should be regarded as a production of a program and certain other texts.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;He then goes on to describe what he means by &lt;em&gt;theory&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;What characterizes intellectual activity, over and beyond activity that is merely intelligent, is the person’s building and having a theory, where theory is understood as the knowledge a person must have in order not only to do certain things intelligently but also to explain them, to answer queries about them, to argue about them, and so forth.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Naur goes on and explains that what he means by &lt;em&gt;theory&lt;&#x2F;em&gt; is not merely knowing the hard rules, but being able to understand how the rules apply to different phenomena of the real world in ways that may not be explicit in the general form of the theory. He closes this thought with a striking metaphor:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] the knowledge held by someone who has the theory could not, in principle, be expressed in terms of rules. In fact, the similarities in question are not, and cannot be, expressed in terms of criteria, no more than the similarities of many other kinds of objects, such as human faces, tunes, or tastes of wine, can be thus expressed.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;After a section on change, in which there is also the interesting remark that change without understanding of the program’s theory will cause the decay of the program, Naur’s next section, also poetically called &lt;em&gt;“Program Life, Death and Revival”&lt;&#x2F;em&gt;, we find this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The death of a program happens when the programmer team possessing its theory is dissolved.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;In this same section, he goes into how to properly do some programming necromancy, cautioning that trying to revive a program without contact with its authors and its original theory can end up reviving it with a different theory. What a missed opportunity to call it the program’s &lt;em&gt;spirit&lt;&#x2F;em&gt;, but alas, a serious computer scientist he was.&lt;&#x2F;p&gt;
&lt;p&gt;Naur’s piece is philosophical, always making stops to ask what something &lt;em&gt;is&lt;&#x2F;em&gt;. If you are interested, it is &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gwern.net&#x2F;doc&#x2F;cs&#x2F;algorithm&#x2F;1985-naur.pdf&quot;&gt;available in full here&lt;&#x2F;a&gt;. It’s featured in his 1992 book, &lt;em&gt;Computing: A Human Activity&lt;&#x2F;em&gt;. I’ll leave you with one last quote, from his closing remarks, in which Naur pushes back on the notion that humans work better when they have their intellects confined:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] current discussion of programming seems to assume that programming is similar to industrial production, the programmer being regarded as a component of that production, a component that has to be controlled by rules of procedure and which can be replaced easily. Another related view is that human beings perform best if they act like machines, by following rules, with a consequent stress on formal modes of expression, which make it possible to formulate certain arguments in terms of rules of formal manipulation. Such views agree well with the notion, seemingly common among persons working with computers, that the human mind works like a computer. At the level of industrial management these views support treating programmers as workers of fairly low responsibility, and only brief education. On the Theory Building View the primary result of the programming activity is the theory held by the programmers. Since this theory by its very nature is part of the mental possession of each programmer, it follows that the notion of the programmer as an easily replaceable component in the program production activity has to be abandoned. Instead the programmer must be regarded as a responsible developer and manager of the activity in which the computer is a part.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Technology with a Human Face</title>
        <published>2026-05-27T01:06:21-03:00</published>
        <updated>2026-05-27T01:06:21-03:00</updated>
        
        <author>
          <name>
            Gabriel Garrido
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://garrido.io/microblog/2026/05/116567713284856433/"/>
        <id>https://blog.jutty.dev/links/garrido-technology-with-a-human-face/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/garrido-technology-with-a-human-face/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>bgm-mpd - Music with gaps like game soundtracks</title>
        <published>2026-05-23T18:49:32-03:00</published>
        <updated>2026-05-23T18:49:32-03:00</updated>
        
        <author>
          <name>
            Alex (nytpu)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://git.sr.ht/~nytpu/bgm-mpd"/>
        <id>https://blog.jutty.dev/links/nytpu-bgm-mpd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/nytpu-bgm-mpd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Casuarina Linux: glibc Chimera Linux derivative</title>
        <published>2026-05-20T00:29:09-03:00</published>
        <updated>2026-05-20T00:29:09-03:00</updated>
        
        <author>
          <name>
            Wesley Moore (wezm)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://casuarina.org/news/introducing-casuarina-linux/"/>
        <id>https://blog.jutty.dev/links/casuarina-linux/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/casuarina-linux/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A 2026 survey of Linux music players</title>
        <published>2026-05-16T20:28:09-03:00</published>
        <updated>2026-05-16T20:28:09-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/2026-linux-music-players/"/>
        <id>https://blog.jutty.dev/notes/2026-linux-music-players/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/2026-linux-music-players/">&lt;p&gt;In composing this list, I was looking for a player with:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Queue controls&lt;&#x2F;li&gt;
&lt;li&gt;Library search and filtering&lt;&#x2F;li&gt;
&lt;li&gt;Tray icon&lt;&#x2F;li&gt;
&lt;li&gt;MPRIs&lt;&#x2F;li&gt;
&lt;li&gt;Scrobbling to both ListenBrainz and Libre.fm would be nice to have&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;best-tui&quot;&gt;Best TUI
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#best-tui&quot; aria-label=&quot;Anchor link for: best-tui&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cmus.github.io&#x2F;&quot;&gt;cmus&lt;&#x2F;a&gt; is perhaps the player I’ve used the most. Shoutout to &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clangen&#x2F;musikcube&quot;&gt;musikcube&lt;&#x2F;a&gt;, which looks better, is simpler to navigate, has nice search and filter capabilities that cmus lacks, but that has a single dealbreaker for me: the lack of a hotkey to append the selected track into the queue.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;best-gui&quot;&gt;Best GUI
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#best-gui&quot; aria-label=&quot;Anchor link for: best-gui&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fooyin&#x2F;fooyin&quot;&gt;fooyin&lt;&#x2F;a&gt; and &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;quodlibet.readthedocs.io&#x2F;&quot;&gt;Quod Libet&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;fooyin is (clearly) heavily inspired by &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.foobar2000.org&#x2F;&quot;&gt;foobar2000&lt;&#x2F;a&gt;, but FOSS and available for Linux. I’ve used foobar2000 a lot in my Windows days, so it feels like home. It did crash a few times when clicking things, but it mostly sits in the back anyways.&lt;&#x2F;p&gt;
&lt;p&gt;Quod Libet is also very feature-packed. The tray icon did not show up on my system though.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mpd-clients&quot;&gt;MPD clients
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#mpd-clients&quot; aria-label=&quot;Anchor link for: mpd-clients&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.musicpd.org&#x2F;&quot;&gt;MPD&lt;&#x2F;a&gt; (Music Player Daemon) is the queen of music players and has a plethora of available clients: GUI, CLI, TUI, even specialty things like &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~nytpu&#x2F;bgm-mpd&quot;&gt;bgm-mpd&lt;&#x2F;a&gt;, a player that places random breaks between songs to emulate the experience of game soundtracks. Because MPD frees the client developers from having to implement a backend, they can focus on creating excellent frontends, and this yielded a diversity of options.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tui&quot;&gt;TUI
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#tui&quot; aria-label=&quot;Anchor link for: tui&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I usually will say that I like TUI things because they favor a state of flow between activities. They compose well and you can do a lot without changing neither the application, nor the UI paradigm nor the input device. That’s a lot of tunneling for my attention.&lt;&#x2F;p&gt;
&lt;p&gt;But, to be fair, a music player is something you use to make your selection, and then it gets out of your way and can go on for hours and hours. So it’s not exactly a huge attention hog, particularly because nearly all of them come with keyboard shortcuts and MPRIS integration.&lt;&#x2F;p&gt;
&lt;p&gt;Nonetheless, there are plenty of TUI MPD clients, and the most frutiful lineage seems to have descended from MPD’s own &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.musicpd.org&#x2F;clients&#x2F;ncmpc&#x2F;&quot;&gt;ncmpc&lt;&#x2F;a&gt;, which inspired the venerable &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rybczak.net&#x2F;ncmpcpp&#x2F;&quot;&gt;ncmpcpp&lt;&#x2F;a&gt;, which leads us to… &lt;del&gt;ncmpcpprs&lt;&#x2F;del&gt; &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rmpc.mierak.dev&#x2F;overview&#x2F;&quot;&gt;rmpc&lt;&#x2F;a&gt;, which is a full-blown terminal junkie TUI for MPD.&lt;&#x2F;p&gt;
&lt;p&gt;For a simpler option, you could try any of its ancestors and there’s also &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kimtore&#x2F;pms&quot;&gt;pms&lt;&#x2F;a&gt;. You’ll find many others, but actively developed ones are much fewer. If you have more recommendations on this category, do let me know!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gui&quot;&gt;GUI
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#gui&quot; aria-label=&quot;Anchor link for: gui&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This one was harder than I expected. On the outset, I found players that &lt;em&gt;look&lt;&#x2F;em&gt; very complete, such as &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;htkhiem&#x2F;euphonica&quot;&gt;Euphonica&lt;&#x2F;a&gt;. It could be my machine and its quirks, but I couldn’t get it to find MPD. So I guess I did &lt;em&gt;not&lt;&#x2F;em&gt; find a maximalist GUI MPD client? At least nothing to the level of the other picks in this list.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;honorable-mention&quot;&gt;Honorable mention
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#honorable-mention&quot; aria-label=&quot;Anchor link for: honorable-mention&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;An honorable mention is in order for &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yktoo.com&#x2F;en&#x2F;software&#x2F;ymuse&#x2F;&quot;&gt;Ymuse&lt;&#x2F;a&gt;. As you can see from my top choices, I prefer my music players on the bulkier side with a lot of knobs and pulls. That’s because if I want something simple, I’ll probably reach for plain &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;&quot;&gt;mpv&lt;&#x2F;a&gt; or &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.musicpd.org&#x2F;doc&#x2F;mpc&#x2F;html&#x2F;&quot;&gt;mpc&lt;&#x2F;a&gt;. But If you are looking for something simple, but polished, Ymuse is my recommendation to you. It has a queue, some filtering and is very light on resources.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;see-also&quot;&gt;See also
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#see-also&quot; aria-label=&quot;Anchor link for: see-also&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;MPD’s &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.musicpd.org&#x2F;clients&#x2F;&quot;&gt;own list of clients&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.sr.ht&#x2F;~mariusor&#x2F;mpris-tools&#x2F;mpris-scrobbler&#x2F;&quot;&gt;mpris-scrobbler&lt;&#x2F;a&gt;, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.multi-scrobbler.app&#x2F;&quot;&gt;Multi-Scrobbler&lt;&#x2F;a&gt;: scrobbling from MPD to Libre.fm, ListenBrainz, Last.fm, …&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;natsukagami&#x2F;mpd-mpris&quot;&gt;mpd-mpris&lt;&#x2F;a&gt; and &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;eonpatapon&#x2F;mpDris2&quot;&gt;mpDris2&lt;&#x2F;a&gt;: lets your MPD talk to everything&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>kew: Music for the Shell</title>
        <published>2026-05-12T21:20:06-03:00</published>
        <updated>2026-05-12T21:20:06-03:00</updated>
        
        <author>
          <name>
            Ravachol (ravachol)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://codeberg.org/ravachol/kew"/>
        <id>https://blog.jutty.dev/links/ravachol-kew/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ravachol-kew/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Building the deployment tool I wish I had</title>
        <published>2026-05-07T02:10:00-03:00</published>
        <updated>2026-05-07T02:10:00-03:00</updated>
        
        <author>
          <name>
            Ruud van Asseldonk (ruuda)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ruuda.nl/2026/deptool"/>
        <id>https://blog.jutty.dev/links/ruuda-building-deptool/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ruuda-building-deptool/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The vi family</title>
        <published>2026-05-07T01:36:37-03:00</published>
        <updated>2026-05-07T01:36:37-03:00</updated>
        
        <author>
          <name>
            mathew (lpar)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lpar.ath0.com/posts/2026/05/the-vi-family/"/>
        <id>https://blog.jutty.dev/links/lpar-vi-family/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lpar-vi-family/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Journey of ls</title>
        <published>2026-05-07T01:14:07-03:00</published>
        <updated>2026-05-07T01:14:07-03:00</updated>
        
        <author>
          <name>
            Yoann Padioleau (aryx)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://principia-softwarica.org/ls-journey.html"/>
        <id>https://blog.jutty.dev/links/principia-softwarica-ls-journey/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/principia-softwarica-ls-journey/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Links to CSS colour palettes</title>
        <published>2026-05-05T11:37:42-03:00</published>
        <updated>2026-05-05T11:37:42-03:00</updated>
        
        <author>
          <name>
            Julia Evans
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jvns.ca/blog/2026/05/04/css-colour-palettes/"/>
        <id>https://blog.jutty.dev/links/jvns-css-palettes/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jvns-css-palettes/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>dashbrew: TUI dashboard builder</title>
        <published>2026-05-03T14:30:08-03:00</published>
        <updated>2026-05-03T14:30:08-03:00</updated>
        
        <author>
          <name>
            Gurgen (rasjonell)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/rasjonell/dashbrew"/>
        <id>https://blog.jutty.dev/links/rasjonell-dashbrew/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/rasjonell-dashbrew/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tags, RSS explosion and Octothorpe Protocol</title>
        <published>2026-05-02T17:53:18-03:00</published>
        <updated>2026-05-02T17:53:18-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/tags/"/>
        <id>https://blog.jutty.dev/notes/tags/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/tags/">&lt;p&gt;On more updates to this blog, we now have tags to browse specific topics and dedicated RSS feeds. This means this blog now serves an obscene amount of RSS feeds which is really appropriate considering RSS is adorable.&lt;&#x2F;p&gt;
&lt;p&gt;To complement the tags, I’ve added support for the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;octothorp.es&#x2F;&quot;&gt;Octothorpe Protocol&lt;&#x2F;a&gt;, which is a way to aggregate hashtags and other relations through an indexing server that allows you to discover and curate related content.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve also added webmention metadata to be able to receive it, but haven’t implemented any way to display it yet.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>numbat: Statically typed language for scientific computations</title>
        <published>2026-04-29T22:18:44-03:00</published>
        <updated>2026-04-29T22:18:44-03:00</updated>
        
        <author>
          <name>
            David Peter (sharkdp)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/sharkdp/numbat"/>
        <id>https://blog.jutty.dev/links/sharkdp-numbat/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/sharkdp-numbat/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Collective Speed Is Not the Summation of Individual Speed</title>
        <published>2026-04-29T10:53:44-03:00</published>
        <updated>2026-04-29T10:53:44-03:00</updated>
        
        <author>
          <name>
            Jim Nielsen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jim-nielsen.com/2026/collective-speed-isnt-the-sum-of-individual-speed/"/>
        <id>https://blog.jutty.dev/links/jim-nielsen-collective-speed/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jim-nielsen-collective-speed/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bugs Rust Won&#x27;t Catch</title>
        <published>2026-04-29T10:52:58-03:00</published>
        <updated>2026-04-29T10:52:58-03:00</updated>
        
        <author>
          <name>
            Matthias Endler
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://corrode.dev/blog/bugs-rust-wont-catch/"/>
        <id>https://blog.jutty.dev/links/corrode-bugs-rust-wont-catch/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/corrode-bugs-rust-wont-catch/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Own Your Web: Curators</title>
        <published>2026-04-25T16:52:41-03:00</published>
        <updated>2026-04-25T16:52:41-03:00</updated>
        
        <author>
          <name>
            Matthias Ott
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://newsletter.ownyourweb.site/archive/own-your-web-issue-18-curators/"/>
        <id>https://blog.jutty.dev/links/own-your-web-curators/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/own-your-web-curators/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>gita: CLI tool to manage multiple git repos</title>
        <published>2026-04-23T09:55:53-03:00</published>
        <updated>2026-04-23T09:55:53-03:00</updated>
        
        <author>
          <name>
            Dong Zhou (nosarthur)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/nosarthur/gita"/>
        <id>https://blog.jutty.dev/links/nosarthur-gita/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/nosarthur-gita/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>sem: Semantic version control CLI</title>
        <published>2026-04-14T12:37:18-03:00</published>
        <updated>2026-04-14T12:37:18-03:00</updated>
        
        <author>
          <name>
            Ataraxy Labs
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/Ataraxy-Labs/sem/tree/main"/>
        <id>https://blog.jutty.dev/links/ataraxy-labs-sem/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ataraxy-labs-sem/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Feed &amp; link updates</title>
        <published>2026-04-11T14:04:07-03:00</published>
        <updated>2026-04-11T14:04:07-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/feed-and-links-updates/"/>
        <id>https://blog.jutty.dev/notes/feed-and-links-updates/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/feed-and-links-updates/">&lt;p&gt;I’ve changed where the links RSS feed points its main URL to, linking directly to what I’m sharing instead of a page with nothing where you just click the actual link.&lt;&#x2F;p&gt;
&lt;p&gt;If there’s a note attached to the link, it will link to it. Otherwise, you get straight to the destination.&lt;&#x2F;p&gt;
&lt;p&gt;As a downside, depending on how it’s configured, this might cause your feed reader to flood you with a bunch of links as if they were new. Sorry!&lt;&#x2F;p&gt;
&lt;p&gt;I’ve also set the &lt;code&gt;author&lt;&#x2F;code&gt; field properly so the feeds and posts don’t all show up as if the content is by me. This should make the “All content” feed less confusing.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, I’ve made some layout changes to make the blog look less cluttered on mobile and the link note page more clearly separated between the link and its commentary.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Capsicum vs seccomp: Process Sandboxing</title>
        <published>2026-04-11T10:46:25-03:00</published>
        <updated>2026-04-11T10:46:25-03:00</updated>
        
        <author>
          <name>
            Vivian Voss
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vivianvoss.net/blog/capsicum-vs-seccomp"/>
        <id>https://blog.jutty.dev/links/vivianvoss-capsicum-vs-seccomp/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/vivianvoss-capsicum-vs-seccomp/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tips and tricks to avoid cloning</title>
        <published>2026-04-07T10:25:21-03:00</published>
        <updated>2026-04-07T10:25:21-03:00</updated>
        
        <author>
          <name>
            Antoine Vandecrème
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://antoine.vandecreme.net/blog/avoiding-clone/"/>
        <id>https://blog.jutty.dev/links/antoine-tips-to-avoid-cloning/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/antoine-tips-to-avoid-cloning/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Shell Tricks That Actually Make Life Easier</title>
        <published>2026-03-26T03:36:21-03:00</published>
        <updated>2026-03-26T03:36:21-03:00</updated>
        
        <author>
          <name>
            Christian Hofstede-Kuhn
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.hofstede.it/shell-tricks-that-actually-make-life-easier-and-save-your-sanity/"/>
        <id>https://blog.jutty.dev/links/hofstede-shell-tricks/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hofstede-shell-tricks/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Capability-based Security for Redox OS</title>
        <published>2026-03-20T23:43:47-03:00</published>
        <updated>2026-03-20T23:43:47-03:00</updated>
        
        <author>
          <name>
            Ibuki Omatsu
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.redox-os.org/news/nlnet-cap-nsmgr-cwd/"/>
        <id>https://blog.jutty.dev/links/redox-capability-based-security/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/redox-capability-based-security/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rob Pike&#x27;s 5 Rules of Programming</title>
        <published>2026-03-19T00:40:32-03:00</published>
        <updated>2026-03-19T00:40:32-03:00</updated>
        
        <author>
          <name>
            David Stotts
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/rstotts-pikes-five-rules/"/>
        <id>https://blog.jutty.dev/links/rstotts-pikes-five-rules/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/rstotts-pikes-five-rules/">&lt;p&gt;I like the last one:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Data structures, not algorithms, are central to programming.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;or its alternative, as also mentioned there:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;write stupid code that uses smart objects&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>AI Agents Recruiting Humans To Observe The Offline World</title>
        <published>2026-03-19T00:39:04-03:00</published>
        <updated>2026-03-19T00:39:04-03:00</updated>
        
        <author>
          <name>
            Umang Bhatt
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.noemamag.com/ai-agents-are-recruiting-humans-to-observe-the-offline-world/"/>
        <id>https://blog.jutty.dev/links/noemamag-ai-recruiting-humans/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/noemamag-ai-recruiting-humans/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The two kinds of error</title>
        <published>2026-03-04T23:09:50-03:00</published>
        <updated>2026-03-04T23:09:50-03:00</updated>
        
        <author>
          <name>
            Evan Hahn
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://evanhahn.com/the-two-kinds-of-error/"/>
        <id>https://blog.jutty.dev/links/evanhahn-two-kinds-of-error/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/evanhahn-two-kinds-of-error/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Printing OCaml Data Structures</title>
        <published>2026-03-04T22:42:08-03:00</published>
        <updated>2026-03-04T22:42:08-03:00</updated>
        
        <author>
          <name>
            Bozhidar Batsov
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://batsov.com/articles/2026/03/01/printing-data-in-ocaml/"/>
        <id>https://blog.jutty.dev/links/batsov-printing-data-structures/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/batsov-printing-data-structures/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>World History Atlas</title>
        <published>2026-03-04T16:57:12-03:00</published>
        <updated>2026-03-04T16:57:12-03:00</updated>
        
        <author>
          <name>
            worldhist.org
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://worldhist.org/"/>
        <id>https://blog.jutty.dev/links/world-history-atlas/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/world-history-atlas/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Making WebAssembly a first-class language on the Web</title>
        <published>2026-02-28T02:54:47-03:00</published>
        <updated>2026-02-28T02:54:47-03:00</updated>
        
        <author>
          <name>
            Ryan Hunt
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hacks.mozilla.org/2026/02/making-webassembly-a-first-class-language-on-the-web/"/>
        <id>https://blog.jutty.dev/links/first-class-webassembly/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/first-class-webassembly/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git Rebase for the Terrified</title>
        <published>2026-02-15T00:59:23-03:00</published>
        <updated>2026-02-15T00:59:23-03:00</updated>
        
        <author>
          <name>
            Aaron Brethorst
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.brethorsting.com/blog/2026/01/git-rebase-for-the-terrified/"/>
        <id>https://blog.jutty.dev/links/brethorsting-git-rebase-for-the-terrified/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/brethorsting-git-rebase-for-the-terrified/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How Terminals Work</title>
        <published>2026-01-22T11:46:28-03:00</published>
        <updated>2026-01-22T11:46:28-03:00</updated>
        
        <author>
          <name>
            Bhumil Haria
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://how-terminals-work.vercel.app/"/>
        <id>https://blog.jutty.dev/links/how-terminals-work/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/how-terminals-work/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Handling secrets (somewhat) securely in shells</title>
        <published>2026-01-21T15:43:41-03:00</published>
        <updated>2026-01-21T15:43:41-03:00</updated>
        
        <author>
          <name>
            Linus Heckemann
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linus.schreibt.jetzt/posts/shell-secrets.html"/>
        <id>https://blog.jutty.dev/links/handling-secrets-in-shells/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/handling-secrets-in-shells/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Three Inverse Laws of Robotics</title>
        <published>2026-01-20T01:33:11-03:00</published>
        <updated>2026-01-20T01:33:11-03:00</updated>
        
        <author>
          <name>
            Susam Pal
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://susam.net/inverse-laws-of-robotics.html"/>
        <id>https://blog.jutty.dev/links/susam-inverse-laws-of-robotics/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/susam-inverse-laws-of-robotics/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>CheriBSD: capability-aware OS for Morello, RISC-V and QEMU</title>
        <published>2026-01-05T01:16:09-03:00</published>
        <updated>2026-01-05T01:16:09-03:00</updated>
        
        <author>
          <name>
            CheriBSD
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.cheribsd.org/"/>
        <id>https://blog.jutty.dev/links/cheribsd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/cheribsd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Stop Forwarding Errors, Start Designing Them</title>
        <published>2026-01-05T01:12:28-03:00</published>
        <updated>2026-01-05T01:12:28-03:00</updated>
        
        <author>
          <name>
            FastLabs Blog
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://fast.github.io/blog/stop-forwarding-errors-start-designing-them/"/>
        <id>https://blog.jutty.dev/links/fastlabs-stop-forwarding-errors/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fastlabs-stop-forwarding-errors/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Assorted less(1) tips</title>
        <published>2026-01-03T12:19:53-03:00</published>
        <updated>2026-01-03T12:19:53-03:00</updated>
        
        <author>
          <name>
            Tim Chase
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.thechases.com/posts/assorted-less-tips/"/>
        <id>https://blog.jutty.dev/links/thechases-assorted-less-tips/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/thechases-assorted-less-tips/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>You can make up HTML tags</title>
        <published>2025-12-31T00:35:22-03:00</published>
        <updated>2025-12-31T00:35:22-03:00</updated>
        
        <author>
          <name>
            Maurycy
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://maurycyz.com/misc/make-up-tags/"/>
        <id>https://blog.jutty.dev/links/maurycyz-make-up-html-tags/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/maurycyz-make-up-html-tags/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>treemd: Terminal markdown tree-based navigation</title>
        <published>2025-12-22T15:15:09-03:00</published>
        <updated>2025-12-22T15:15:09-03:00</updated>
        
        <author>
          <name>
            Epistates
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/epistates/treemd"/>
        <id>https://blog.jutty.dev/links/epistates-treemd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/epistates-treemd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rethinking sudo with object capabilities</title>
        <published>2025-12-22T01:43:00-03:00</published>
        <updated>2025-12-22T01:43:00-03:00</updated>
        
        <author>
          <name>
            Ariadne Conill
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ariadne.space/2025/12/12/rethinking-sudo-with-object-capabilities.html"/>
        <id>https://blog.jutty.dev/links/ariadne-rethinking-sudo-capsudo/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ariadne-rethinking-sudo-capsudo/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>layoutz: Haskell TUI library</title>
        <published>2025-12-12T11:32:55-03:00</published>
        <updated>2025-12-12T11:32:55-03:00</updated>
        
        <author>
          <name>
            Matthieu Court (mattlianje)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/mattlianje/layoutz/tree/master"/>
        <id>https://blog.jutty.dev/links/layoutz-haskell-tuis/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/layoutz-haskell-tuis/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>mosaic: OCaml TUI library</title>
        <published>2025-12-12T11:32:17-03:00</published>
        <updated>2025-12-12T11:32:17-03:00</updated>
        
        <author>
          <name>
            Thibaut Mattio (tmattio)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/tmattio/mosaic"/>
        <id>https://blog.jutty.dev/links/mosaic-ocaml-tuis/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/mosaic-ocaml-tuis/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Cloudflare Outage May Be a Security Roadmap</title>
        <published>2025-11-20T01:42:59-03:00</published>
        <updated>2025-11-20T01:42:59-03:00</updated>
        
        <author>
          <name>
            Brian Krebs
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://krebsonsecurity.com/2025/11/the-cloudflare-outage-may-be-a-security-roadmap/"/>
        <id>https://blog.jutty.dev/links/krebsonsecurity-cloudflare-security-roadmap/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/krebsonsecurity-cloudflare-security-roadmap/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Just enough Makefile to be dangerous</title>
        <published>2025-11-16T19:10:56-03:00</published>
        <updated>2025-11-16T19:10:56-03:00</updated>
        
        <author>
          <name>
            Balthazar Rouberol
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.balthazar-rouberol.com/just-enough-makefile-to-be-dangerous"/>
        <id>https://blog.jutty.dev/links/brouberol-just-enough-makefile/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/brouberol-just-enough-makefile/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Man Pages (Part 1)</title>
        <published>2025-11-15T18:09:50-03:00</published>
        <updated>2025-11-15T18:09:50-03:00</updated>
        
        <author>
          <name>
            Alex Bochannek
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://abochannek.github.io/utilities/2024/12/08/man-pages.html"/>
        <id>https://blog.jutty.dev/links/abochannek-man-pages/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/abochannek-man-pages/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Website and blog building tools</title>
        <published>2025-11-15T17:03:38-03:00</published>
        <updated>2025-11-15T17:03:38-03:00</updated>
        
        <author>
          <name>
            Zak (zkbro)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://html-chunder.neocities.org/blog/web-blog-tools/"/>
        <id>https://blog.jutty.dev/links/zkbro-website-building-tools/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/zkbro-website-building-tools/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Directory of Open Access Books</title>
        <published>2025-11-09T12:14:05-03:00</published>
        <updated>2025-11-09T12:14:05-03:00</updated>
        
        <author>
          <name>
            DOAB Foundation
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://doabooks.org/"/>
        <id>https://blog.jutty.dev/links/doabooks/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/doabooks/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Automated PDF Generation with Typst</title>
        <published>2025-11-09T11:59:22-03:00</published>
        <updated>2025-11-09T11:59:22-03:00</updated>
        
        <author>
          <name>
            Martin Haug
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://typst.app/blog/2025/automated-generation"/>
        <id>https://blog.jutty.dev/links/typst-automated-pdfs/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/typst-automated-pdfs/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>FreeBSD OCI Containers introduction</title>
        <published>2025-11-04T11:51:27-03:00</published>
        <updated>2025-11-04T11:51:27-03:00</updated>
        
        <author>
          <name>
            The FreeBSD Foundation
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://freebsdfoundation.org/blog/oci-containers-on-freebsd/"/>
        <id>https://blog.jutty.dev/links/freebsd-oci-containers/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/freebsd-oci-containers/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Underappreciated top</title>
        <published>2025-10-31T00:48:57-03:00</published>
        <updated>2025-10-31T00:48:57-03:00</updated>
        
        <author>
          <name>
            Drew
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://friendo.monster/posts/underappreciated-top.html"/>
        <id>https://blog.jutty.dev/links/friendo-underappreciated-top/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/friendo-underappreciated-top/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Postgres for Everything</title>
        <published>2025-10-30T16:42:23-03:00</published>
        <updated>2025-10-30T16:42:23-03:00</updated>
        
        <author>
          <name>
            Daniel Olshansky
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/Olshansk/postgres_for_everything"/>
        <id>https://blog.jutty.dev/links/postgres-for-everything/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/postgres-for-everything/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>rsync_cmd: edit locally, build remotely</title>
        <published>2025-10-30T16:34:23-03:00</published>
        <updated>2025-10-30T16:34:23-03:00</updated>
        
        <author>
          <name>
            Laurence Tratt (ltratt)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/ltratt/rsync_cmd"/>
        <id>https://blog.jutty.dev/links/ltratt-rsync-cmd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ltratt-rsync-cmd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Keep Android Open</title>
        <published>2025-10-28T21:53:23-03:00</published>
        <updated>2025-10-28T21:53:23-03:00</updated>
        
        <author>
          <name>
            Keep Android Open
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://keepandroidopen.org/"/>
        <id>https://blog.jutty.dev/links/keep-android-open/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/keep-android-open/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>defuddle-cli: Extract clean html, markdown and metadata from web pages</title>
        <published>2025-10-26T21:40:21-03:00</published>
        <updated>2025-10-26T21:40:21-03:00</updated>
        
        <author>
          <name>
            Steph Ango (kepano)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/kepano/defuddle"/>
        <id>https://blog.jutty.dev/links/kepano-defuddle-cli/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/kepano-defuddle-cli/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>feedlynx: Collect links to read later into an RSS feed</title>
        <published>2025-10-26T12:26:47-03:00</published>
        <updated>2025-10-26T12:26:47-03:00</updated>
        
        <author>
          <name>
            Wesley Moore (wezm)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/wezm/feedlynx"/>
        <id>https://blog.jutty.dev/links/wezm-feedlynx/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/wezm-feedlynx/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Scripts I wrote that I use all the time</title>
        <published>2025-10-23T02:46:15-03:00</published>
        <updated>2025-10-23T02:46:15-03:00</updated>
        
        <author>
          <name>
            Evan Hahn
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://evanhahn.com/scripts-i-wrote-that-i-use-all-the-time/"/>
        <id>https://blog.jutty.dev/links/evanhahn-scripts-i-use-all-the-time/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/evanhahn-scripts-i-use-all-the-time/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>pdfly: CLI tool to manipulate PDF files</title>
        <published>2025-10-15T02:54:42-03:00</published>
        <updated>2025-10-15T02:54:42-03:00</updated>
        
        <author>
          <name>
            py-pdf
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/py-pdf/pdfly"/>
        <id>https://blog.jutty.dev/links/py-pdf-pdfly/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/py-pdf-pdfly/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Octothorpes Protocol: site-independent hashtags</title>
        <published>2025-10-15T02:09:52-03:00</published>
        <updated>2025-10-15T02:09:52-03:00</updated>
        
        <author>
          <name>
            Stucco Software
          </name>
        </author>
        
        <author>
          <name>
            The Idea Store
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://octothorp.es/"/>
        <id>https://blog.jutty.dev/links/octothorpes-protocol/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/octothorpes-protocol/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing oui: standalone installers for OCaml</title>
        <published>2025-10-09T20:43:05-03:00</published>
        <updated>2025-10-09T20:43:05-03:00</updated>
        
        <author>
          <name>
            Nathan Rebours
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://discuss.ocaml.org/t/introducing-oui/17364"/>
        <id>https://blog.jutty.dev/links/ocaml-universal-installer/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ocaml-universal-installer/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>We Move As One</title>
        <published>2025-10-09T04:16:19-03:00</published>
        <updated>2025-10-09T04:16:19-03:00</updated>
        
        <author>
          <name>
            Marcus Luebke (stopthrowingrocks)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://stopthrowingrocks.github.io/wma1/"/>
        <id>https://blog.jutty.dev/links/we-move-as-one/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/we-move-as-one/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to actually test your readme</title>
        <published>2025-10-09T04:00:54-03:00</published>
        <updated>2025-10-09T04:00:54-03:00</updated>
        
        <author>
          <name>
            Terence Eden
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/"/>
        <id>https://blog.jutty.dev/links/shkspr-test-your-readme/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/shkspr-test-your-readme/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>CHERI with a Linux on top</title>
        <published>2025-10-06T03:00:51-03:00</published>
        <updated>2025-10-06T03:00:51-03:00</updated>
        
        <author>
          <name>
            Jake Edge
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lwn.net/Articles/1037974/"/>
        <id>https://blog.jutty.dev/links/lwn-cheri-with-a-linux-on-top/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lwn-cheri-with-a-linux-on-top/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Accessible by Design: Improving CLIs for All</title>
        <published>2025-09-23T18:34:33-03:00</published>
        <updated>2025-09-23T18:34:33-03:00</updated>
        
        <author>
          <name>
            Karl Groves
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://afixt.com/accessible-by-design-improving-command-line-interfaces-for-all-users/"/>
        <id>https://blog.jutty.dev/links/afixt-accessible-clis/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/afixt-accessible-clis/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Baby Steps Accessibility - Color Contrast of Text</title>
        <published>2025-09-23T18:16:56-03:00</published>
        <updated>2025-09-23T18:16:56-03:00</updated>
        
        <author>
          <name>
            Dennis Deacon
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.dennisdeacon.com/web/accessibility/baby-steps-accessibility-color-contrast-of-text/"/>
        <id>https://blog.jutty.dev/links/dennisdeacon-baby-steps-color-contrast/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dennisdeacon-baby-steps-color-contrast/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reverse centaurs are the answer to the AI paradox</title>
        <published>2025-09-18T10:59:58-03:00</published>
        <updated>2025-09-18T10:59:58-03:00</updated>
        
        <author>
          <name>
            Cory Doctorow
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pluralistic.net/2025/09/11/vulgar-thatcherism/#there-is-an-alternative"/>
        <id>https://blog.jutty.dev/links/pluralistic-reverse-centaurs/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/pluralistic-reverse-centaurs/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dot-slash revisited</title>
        <published>2025-09-17T00:38:57-03:00</published>
        <updated>2025-09-17T00:38:57-03:00</updated>
        
        <author>
          <name>
            Andreas (anagogistis)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://anagogistis.com/posts/dot-slash/"/>
        <id>https://blog.jutty.dev/links/anagogistis-dot-slash/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/anagogistis-dot-slash/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>asciinema 3.0</title>
        <published>2025-09-16T21:37:49-03:00</published>
        <updated>2025-09-16T21:37:49-03:00</updated>
        
        <author>
          <name>
            Marcin Kulik
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.asciinema.org/post/three-point-o/"/>
        <id>https://blog.jutty.dev/links/asciinema-3-0/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/asciinema-3-0/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gemini Protocol Quickstart</title>
        <published>2025-09-16T13:07:29-03:00</published>
        <updated>2025-09-16T13:07:29-03:00</updated>
        
        <author>
          <name>
            Jason McBrayer
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://geminiquickst.art/"/>
        <id>https://blog.jutty.dev/links/gemini-protocol-quickstart/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/gemini-protocol-quickstart/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>term.everything: Run any GUI app in the terminal</title>
        <published>2025-09-09T11:42:19-03:00</published>
        <updated>2025-09-09T11:42:19-03:00</updated>
        
        <author>
          <name>
            Michael Mulet (mmulet)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/mmulet/term.everything"/>
        <id>https://blog.jutty.dev/links/mmulet-term-everything/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/mmulet-term-everything/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Capitalization of Initialisms</title>
        <published>2025-09-06T00:32:40-03:00</published>
        <updated>2025-09-06T00:32:40-03:00</updated>
        
        <author>
          <name>
            Lawrence Kesteloot
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.teamten.com/lawrence/writings/capitalization_of_initialisms.html"/>
        <id>https://blog.jutty.dev/links/teamten-capitalization-of-initialisms/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/teamten-capitalization-of-initialisms/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>incplot: great looking plots in the terminal</title>
        <published>2025-09-03T01:10:51-03:00</published>
        <updated>2025-09-03T01:10:51-03:00</updated>
        
        <author>
          <name>
            InCom-0
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/InCom-0/incplot"/>
        <id>https://blog.jutty.dev/links/incom-0-incplot/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/incom-0-incplot/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Half an year on Alpine: just musl aside</title>
        <published>2025-08-31T20:05:26-03:00</published>
        <updated>2025-08-31T20:05:26-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/half-an-year-on-alpine/"/>
        <id>https://blog.jutty.dev/posts/half-an-year-on-alpine/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/half-an-year-on-alpine/">&lt;p&gt;&lt;em&gt;&lt;strong&gt;Warning&lt;&#x2F;strong&gt;: Contains tongue-in-cheek language that might feel provocative if you have invested part of your identity into your software choices.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For roughly six months now, I’ve been running &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpinelinux.org&#x2F;&quot;&gt;Alpine&lt;&#x2F;a&gt; on my laptop as a daily driver.&lt;&#x2F;p&gt;
&lt;p&gt;Before that, I was running &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voidlinux.org&#x2F;&quot;&gt;Void&lt;&#x2F;a&gt;. I like how blazing fast Void is to start up and shut down, has an excellent package management system and its init system, runit, is beautifully integrated. Alpine also fits this description.&lt;&#x2F;p&gt;
&lt;p&gt;When I first learned about Void, I read it described itself as &lt;em&gt;“rolling but stable”&lt;&#x2F;em&gt;, meaning you get new package versions often, but not to the point of breakage. While I never had an upgrade break a system, it still bothered me to upgrade and suddenly have sound or Bluetooth not work anymore, or have the system Python version change frequently, leading to all sorts of complaints from this or that application I didn’t even know was a Python program.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to go back to  a more stable distribution, but I also wanted a simpler, faster init system than systemd. Alpine, which has fixed releases every six months, eventually rose as an alternative.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;
    Expand for an overly detailed rundown of how I narrowed down my options
&lt;&#x2F;summary&gt;
&lt;h2 id=&quot;how-many-options-really&quot;&gt;How many options, really?
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#how-many-options-really&quot; aria-label=&quot;Anchor link for: how-many-options-really&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Preferably not rolling. Preferably without systemd. At first glance it may seem like the choices of operating systems and distributions are endless, but turns out these two requirements are enough to nearly wipe them out.&lt;&#x2F;p&gt;
&lt;p&gt;My main reason to not like systemd is not that I believe Red Hat is involved in a deep state conspiracy to turn frogs gay. In fact, I’d take systemd over SysV-style init on a heartbeat. What I prefer are the sweet spots between them, not the regression into the previous mess.&lt;&#x2F;p&gt;
&lt;p&gt;My reasoning is actually mostly around speed. Call me impatient, and I know it can be tweaked to improve this, but I don’t like it when a machine is coming up or going down and you get a timer from some random process saying it will wait X &lt;em&gt;minutes&lt;&#x2F;em&gt; to exit. I’d rather have a simpler tool tackling initialization and shutdown, and have learned to compose the operating system with various programs that fill in for systemd’s vast feature set.&lt;&#x2F;p&gt;
&lt;p&gt;Admittedly, I also have an insatiable curiosity for getting to know and experiment with how different operating systems work. Before this experience, I knew nothing about OpenRC and several other peculiarities Alpine brings to the table. So no regrets there.&lt;&#x2F;p&gt;
&lt;p&gt;I also did not want a distribution that is too new or too niche, as I don’t appreciate being stuck in dead ends too often. Just sometimes. I am curious about fringe operating systems, but I am looking for something to daily drive and work on, not experiment with.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-systemd-realm&quot;&gt;The systemd realm
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#the-systemd-realm&quot; aria-label=&quot;Anchor link for: the-systemd-realm&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;There’s a plethora of Linux distributions. But the vast majority are based on some other one. I don’t mean that this isn’t meaningful for whatever use case they are suited for — some derivatives do go the extra mile and increment their bases in more advanced ways — but when you are looking for a distribution that &lt;em&gt;you&lt;&#x2F;em&gt; want to set up your way, it makes less sense to go for one whose selling point is how it’s already set up for something.&lt;&#x2F;p&gt;
&lt;p&gt;If we drop the derivatives and focus on some arbitrary measure of adoption, we end up with Debian, Fedora, Arch, OpenSUSE and Nix.&lt;&#x2F;p&gt;
&lt;p&gt;I never seriously tried OpenSUSE or Fedora. Among these three, I think I prefer Debian simply because its governance model seems (feels?) healthier and more independent&#x2F;resilient.&lt;&#x2F;p&gt;
&lt;p&gt;NixOS is its own kind of hell. It truly sets it apart. If you are grasping my preference for compatibility and ease of running experimental programs, you can probably guess how I felt about not even having a standard filesystem hierarchy.&lt;&#x2F;p&gt;
&lt;p&gt;What I am saying about stability and preferring fixed over rolling release should also explain why Arch is not an option either, although I’d say its cultural issues far outweigh anything else for me.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-non-systemd-realm&quot;&gt;The non-systemd realm
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#the-non-systemd-realm&quot; aria-label=&quot;Anchor link for: the-non-systemd-realm&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Then, for all the other ways to summon an operating system from its slumber, we have the BSDs, Gentoo, Slackware, Guix, Void and Alpine. And because changing the init system is significantly more effort than just providing some configuration on top of another system, I think it’s fair to include derivatives here, such as Devuan and antiX.&lt;&#x2F;p&gt;
&lt;p&gt;I run FreeBSD on a separate, desktop machine. I use it a lot over SSH and have also set up a graphical session there. It is a delight to use and learn about, particularly because of its Unix heritage, first-class ZFS support and how different its ecosystem is in comparison. But compatibility-wise (hardware and software), it doesn’t fit the bill for this laptop either. Something (roughly) similar can be said of the other BSDs.&lt;&#x2F;p&gt;
&lt;p&gt;I have tried Gentoo, with binary packages enabled and all, but who has time for compiling a browser? Certainly not me, with my old refurbished computers. There is Guix, but my experience with Nix was a portability nightmare that, while not as wasteful of my time as Gentoo, gets close. And while definitely a control freak, I am not at the Slackware level of control freakiness. As you can see, usability and practicality have grown on me with all this messing around, so now I’d rather not have “just install everything” proposed as the solution to dependency resolution.&lt;&#x2F;p&gt;
&lt;p&gt;You see, it’d be much easier not to be such a nerd. When I set up a computer for someone else, it’s Windows or LMDE or Fedora. It’s such a no-brainer. The relationship with a computer can be simple: like&#x2F;dislike, works&#x2F;doesn’t work, can fix&#x2F;can’t fix. One can actually &lt;em&gt;accept&lt;&#x2F;em&gt; that something can’t be fixed or changed! Really admirable. But that’s not me. I actually care what is the DHCP daemon, who’s resolving the DNS queries and how aggressive the OOM killer is going to be.&lt;&#x2F;p&gt;
&lt;p&gt;And because Void is a rolling release distribution, the only survivor of all this begging and choosing is Alpine.&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;choosing-a-path-forward&quot;&gt;Choosing a path forward
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#choosing-a-path-forward&quot; aria-label=&quot;Anchor link for: choosing-a-path-forward&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So, prompted by a charger dying in the beginning of this year, which put a machine out of work, I decided to take the opportunity to try another system with a slower release cycle and started weighing my options.&lt;&#x2F;p&gt;
&lt;p&gt;What remained in the end were Devuan, antiX and Alpine. And I briefly tried all three during this experiment before settling on Alpine.&lt;&#x2F;p&gt;
&lt;p&gt;Devuan and antiX do offer options besides SysV-style init, but they  don’t really integrate them very well in their systems. While with Void you will really use runit to manage any services installed through the distribution’s package manager, because when a package has a relevant service to ship it will ship a runit service, Devuan and antiX have other init systems as &lt;em&gt;options&lt;&#x2F;em&gt; rather than &lt;em&gt;the&lt;&#x2F;em&gt; distribution’s init system.&lt;&#x2F;p&gt;
&lt;p&gt;What you really get then is a mixture of runit&#x2F;OpenRC and SysV-style init, leaning a lot more towards SysV-style and leveraging the runit&#x2F;OpenRC ability to also run SysV-style init scripts.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; If you like managing SysV-style init, that should not be a problem, although in that case you might as well get the SysV-style version then! Alpine, on the other hand, just like Void, has OpenRC as &lt;em&gt;the&lt;&#x2F;em&gt; way to run services.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alpine-it-is&quot;&gt;Alpine it is
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#alpine-it-is&quot; aria-label=&quot;Anchor link for: alpine-it-is&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;For starters, I wanted to learn a little bit more about this unknown-to-me init system, OpenRC, since I’d be spending some time setting up services with it.&lt;&#x2F;p&gt;
&lt;p&gt;OpenRC can be used alongside or in place of SysV-style init. I will not get into the different roles played by so-called init systems and process supervisors, but OpenRC provides &lt;code&gt;openrc-init&lt;&#x2F;code&gt;, which can replace &lt;code&gt;&#x2F;sbin&#x2F;init&lt;&#x2F;code&gt; for a fully OpenRC-powered system.&lt;&#x2F;p&gt;
&lt;p&gt;I could not find explicit information on whether this is the case with Alpine, but an actual inspection of the running system shows it is not. Mind you, even Alpine’s &lt;code&gt;&#x2F;sbin&#x2F;init&lt;&#x2F;code&gt; is actually BusyBox:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; file&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function&quot;&gt;which&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; init&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;sbin&#x2F;init:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; symbolic link to &#x2F;bin&#x2F;busybox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I then checked out BusyBox’s manual page to try and understand more:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Init is the first process started during boot. It never exits.
It (re)spawns children according to &#x2F;etc&#x2F;inittab.&lt;&#x2F;p&gt;
&lt;p&gt;Signals:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;HUP: reload &#x2F;etc&#x2F;inittab&lt;&#x2F;li&gt;
&lt;li&gt;TSTP: stop respawning until CONT&lt;&#x2F;li&gt;
&lt;li&gt;QUIT: re-exec another init&lt;&#x2F;li&gt;
&lt;li&gt;USR1&#x2F;TER, &#x2F;USR2&#x2F;INT: run halt&#x2F;reboot&#x2F;poweroff&#x2F;Ctrl-Alt-Del script&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I knew Alpine heavily leaned on BusyBox, but didn’t realize it was to this extent. So, following this trail, there was Alpine’s &lt;code&gt;&#x2F;etc&#x2F;inittab&lt;&#x2F;code&gt;, where I found this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;::sysinit:&#x2F;sbin&#x2F;openrc sysinit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;::sysinit:&#x2F;sbin&#x2F;openrc boot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;::wait:&#x2F;sbin&#x2F;openrc default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Meaning, Alpine’s init is BusyBox’s init, which in turn calls on OpenRC to bring services up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;working-around-musl&quot;&gt;Working around musl…
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#working-around-musl&quot; aria-label=&quot;Anchor link for: working-around-musl&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Willing to give OpenRC a try, I had to clear up my only concern with Alpine: lack of compatibility with glibc software.&lt;&#x2F;p&gt;
&lt;p&gt;This took a long time to evaluate, because you need to actually try to do what you usually do in real situations to see if things will work out or not.&lt;&#x2F;p&gt;
&lt;p&gt;If you are questioning whether Alpine &lt;em&gt;can&lt;&#x2F;em&gt; reliably run a full desktop environment or window manager, play and record audio, share your screen, run GUI applications including the latest browsers, act as the host of virtualization and development environments, the answer is an unwavering &lt;em&gt;yes&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If you are questioning whether on top of that Alpine can play DRM video and games (e.g., Netflix and Steam), the answer is &lt;em&gt;also&lt;&#x2F;em&gt; yes, but you’ll need a glibc layer around it. If you like Flatpak, that might actually be trivial.&lt;&#x2F;p&gt;
&lt;p&gt;But for more involved usage of software that requires glibc, in particular novel and experimental stuff you are compiling yourself or exploring and prototyping with, your mileage may vary. It is more likely that a vendor will &lt;em&gt;not&lt;&#x2F;em&gt; provide a musl build of their software.&lt;&#x2F;p&gt;
&lt;p&gt;Some stuff works just by installing &lt;code&gt;gcompat&lt;&#x2F;code&gt;, a compatibility layer that will make glibc software run as-is. Some however won’t work with it.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes I’d just compile something myself, meaning I made my own musl-linked executable of something that was available only for glibc. That works, but compilation for musl is often less documented and may not be possible at all depending on whether or not musl provides all the needed features. The latter case was however quite rare in my experience.&lt;&#x2F;p&gt;
&lt;p&gt;Some other options are running things through Flatpak, or Nix, or Distrobox. But sometimes, if all failed, I just had to accept it wasn’t possible. Or it would work and then crash when using a specific feature at runtime.&lt;&#x2F;p&gt;
&lt;p&gt;And that’s great, having ways to circumvent musl. But you could also just… run stuff directly? It’s nice to have options, but it’s also a lot of friction. And sadly that is what ended up exhausting me from using Alpine as a daily driver.&lt;&#x2F;p&gt;
&lt;p&gt;I think that, if you have a very consistent usage of Alpine, where you are mostly doing the same thing and using the same tools, you could find a comfy workflow there. But I am extremely moved by experimentation and curiosity. And something tells me that I could devise a more fluid workflow to run my experiments and try different tools inside isolated glibc-friendly environments, but in the end it’s still friction. And it’s hard to shake the feeling that, if you were running a more compatible system to begin with, that wouldn’t even be something to think about.&lt;&#x2F;p&gt;
&lt;p&gt;Getting software from the distribution’s package manager is the way to go for numerous reasons. But sometimes that is just not an option. Sometimes the package is just nonexistent in the repositories. Sometimes you need to compile it yourself because you need a specific version. Or because you don’t trust the provided pre-compiled binary. Sometimes you need a specific compilation with a specific feature. Sometimes you are in a hurry, or just curious to try something you can securely run in isolation.&lt;&#x2F;p&gt;
&lt;p&gt;So not being able to install it the conventional way is friction in itself. Having to compile something every time is extra friction. Having to recompile on upgrades is more friction. And to not be able to compile or run it even by compiling it yourself, that is just compounded friction with some frustration sprinkled on top.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;though-i-d-rather-not&quot;&gt;… though I’d rather not
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#though-i-d-rather-not&quot; aria-label=&quot;Anchor link for: though-i-d-rather-not&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is not &lt;em&gt;about&lt;&#x2F;em&gt; Alpine, but it’s also inseparable from Alpine.&lt;&#x2F;p&gt;
&lt;p&gt;Alpine has an excellent, fast package manager that never broke my setup. When things did break, it was able to fix them by itself. The six months release cycle is to me a really sweet spot at which to space versions — not too often, not too seldom. A lot of software is available. Developers are security conscious. It’s extremely lean on resources.&lt;&#x2F;p&gt;
&lt;p&gt;And in the spirit of being so lightweight, Alpine shines on virtualized and embedded systems. This focus on being small is why musl is a great fit, since it’s a lot lighter than glibc, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;musl.libc.org&#x2F;about.html#:~:text=Key%20Principles&quot;&gt;among other advantages&lt;&#x2F;a&gt;. For me though, while I appreciate the smaller size, it’s not that critical that I’d sacrifice compatibility and versatility over it.&lt;&#x2F;p&gt;
&lt;p&gt;So I have zero complaints about Alpine, musl aside. It is perfect in everything I signed up for when I decided to try it. It delivered on every feature and never lied to me. It never said to me it was going to be smooth and easy to run glibc programs. So it’s not so much that I didn’t like Alpine, it’s that I wish there were a glibc Alpine just like there is a glibc Void. But I’m well aware that’s not happening.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;choosing-a-path-beyond&quot;&gt;Choosing a path beyond
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#choosing-a-path-beyond&quot; aria-label=&quot;Anchor link for: choosing-a-path-beyond&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It was excellent to learn hands-on about how Alpine works and what it can offer. I learned a lot about not just its components, such as OpenRC and BusyBox, which were basically strangers to me, known only conceptually. Alpine also taught me a lot about all the things it &lt;em&gt;doesn’t&lt;&#x2F;em&gt; have.&lt;&#x2F;p&gt;
&lt;p&gt;Because, seriously, if you do a chroot installation of Alpine and don’t even run its setup scripts, you’ll end up with something so trimmed down you’ll wonder if you’re midway through &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linuxfromscratch.org&#x2F;&quot;&gt;LFS&lt;&#x2F;a&gt;. You’ll have to work your way up to a usable system piece by piece, finding out what you need, why you need it and how to set it up. And that is a huge learning opportunity for those interested&lt;&#x2F;p&gt;
&lt;p&gt;For now though, I decided to backtrack a little bit and then fully reverse course if I can’t find a working compromise. That means giving Void another try and, if stability keeps being a problem, go further back and land on Debian. If I shed the non-systemd preference aside, Debian would deliver on the stability and compatibility that I am looking for.&lt;&#x2F;p&gt;
&lt;p&gt;You see, I am not looking for the &lt;em&gt;next&lt;&#x2F;em&gt; distribution to try as if it were a hobby and I wanted to try novelty out of FOMO. This is actually a lot of work! I’d rather do other things &lt;em&gt;with&lt;&#x2F;em&gt; the operating system rather than install and configure it, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.jutty.dev&#x2F;posts&#x2F;void-on-zfs&#x2F;#:~:text=I%20don%E2%80%99t%20really%20enjoy%20distro%2Dhopping%2E&quot;&gt;as I mentioned before&lt;&#x2F;a&gt;. And if at the other end of the bell curve it’s Debian, whatever. Perfect is the enemy of good and being picky is exhausting.&lt;&#x2F;p&gt;
&lt;p&gt;I mentioned curiosity is a big factor in wanting to try things too. And frankly, after a while holding this preference for non-systemd operating systems and using systems without it, I might as well seize the opportunity to learn more about systemd as well. At my current internship, systemd is what all the distros we have in production are using. In future work, that is very likely to be the case too. So there is nothing to lose.&lt;&#x2F;p&gt;
&lt;p&gt;I really wish, though, that package managers were more capable of differentiating between security and feature upgrades. If they were, we could run a rolling distro in “Debian mode” at will. This thought may not sit well with some rolling distributions, say, in Arch Linux you have the notion that &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;System_maintenance#Partial_upgrades_are_unsupported&quot;&gt;“Partial upgrades are unsupported”&lt;&#x2F;a&gt;. There may be the expectation that the whole repository at any given time is the end state for all machines subscribed to it, but if dependencies could also be at the version and not only package level, that could also be solved, though I won’t undersell the consequences and added complexity in such a change.&lt;&#x2F;p&gt;
&lt;p&gt;Just like mail clients, all operating systems suck. Some just suck less for some specific use case.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Also, if you find out how to reclaim that identity, do share. Asking for a friend. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;It’s no surprise a distribution’s main init system has better support, as it sure is a lot of work for packagers to support and test multiple init systems. &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up a CI server for Forgejo</title>
        <published>2025-08-27T01:18:36-03:00</published>
        <updated>2025-08-27T01:18:36-03:00</updated>
        
        <author>
          <name>
            Robey Pointer
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://robey.lag.net/2025/08/10/forgejo-ci.html"/>
        <id>https://blog.jutty.dev/links/robey-forgejo-ci-server-setup/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/robey-forgejo-ci-server-setup/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Insecurity of Debian</title>
        <published>2025-08-27T00:58:03-03:00</published>
        <updated>2025-08-27T00:58:03-03:00</updated>
        
        <author>
          <name>
            Cyrus
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://unix.foo/posts/insecurity-of-debian/"/>
        <id>https://blog.jutty.dev/links/the-insecurity-of-debian/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/the-insecurity-of-debian/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>sptlrx: Synchronized lyrics in your terminal</title>
        <published>2025-08-26T23:41:41-03:00</published>
        <updated>2025-08-26T23:41:41-03:00</updated>
        
        <author>
          <name>
            Denis (raitonoberu)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/raitonoberu/sptlrx"/>
        <id>https://blog.jutty.dev/links/raitonoberu-sptlrx/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/raitonoberu-sptlrx/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>doxx: terminal docx viewer</title>
        <published>2025-08-26T21:49:50-03:00</published>
        <updated>2025-08-26T21:49:50-03:00</updated>
        
        <author>
          <name>
            Brandon Greenwell
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/bgreenwell/doxx"/>
        <id>https://blog.jutty.dev/links/bgreenwell-doxx/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/bgreenwell-doxx/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Developing an alt text button for my website</title>
        <published>2025-08-26T17:08:38-03:00</published>
        <updated>2025-08-26T17:08:38-03:00</updated>
        
        <author>
          <name>
            James
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jamesg.blog/2025/08/17/alt-text-button"/>
        <id>https://blog.jutty.dev/links/jamesg-developing-an-alt-text-button/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jamesg-developing-an-alt-text-button/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why Lean 4 replaced OCaml as my Primary Language</title>
        <published>2025-08-26T17:04:25-03:00</published>
        <updated>2025-08-26T17:04:25-03:00</updated>
        
        <author>
          <name>
            Kiran Gopinathan
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kirancodes.me/posts/log-ocaml-to-lean.html"/>
        <id>https://blog.jutty.dev/links/kirancodes-lean-replaced-ocaml/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/kirancodes-lean-replaced-ocaml/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A visual explanation of Big O notation</title>
        <published>2025-08-26T00:38:39-03:00</published>
        <updated>2025-08-26T00:38:39-03:00</updated>
        
        <author>
          <name>
            Sam Rose (samwho)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://samwho.dev/big-o/"/>
        <id>https://blog.jutty.dev/links/samwho-big-o/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/samwho-big-o/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>gcli: Git(hub|lab|tea)&#x2F;Forgejo&#x2F;Bugzilla CLI tool</title>
        <published>2025-08-16T21:59:10-03:00</published>
        <updated>2025-08-16T21:59:10-03:00</updated>
        
        <author>
          <name>
            Nico Sonack (herrhotzenplotz)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/herrhotzenplotz/gcli"/>
        <id>https://blog.jutty.dev/links/herrhotzenplotz-gcli/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/herrhotzenplotz-gcli/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>pspg: Unix pager for PostgreSQL, MySQL CSV, TSV and more</title>
        <published>2025-08-16T21:55:26-03:00</published>
        <updated>2025-08-16T21:55:26-03:00</updated>
        
        <author>
          <name>
            Pavel Stehule (okbob)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/okbob/pspg"/>
        <id>https://blog.jutty.dev/links/okbob-pspg/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/okbob-pspg/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Implementing a basic equivalent of pflog in nftables</title>
        <published>2025-08-16T00:42:08-03:00</published>
        <updated>2025-08-16T00:42:08-03:00</updated>
        
        <author>
          <name>
            Chris Siebenmann
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://utcc.utoronto.ca/~cks/space/blog/linux/NftablesImplementingAPflog"/>
        <id>https://blog.jutty.dev/links/basic-equivalent-of-pflog-in-nftables/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/basic-equivalent-of-pflog-in-nftables/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A Friendly Introduction to SVG</title>
        <published>2025-08-15T10:32:33-03:00</published>
        <updated>2025-08-15T10:32:33-03:00</updated>
        
        <author>
          <name>
            Joshua Comeau
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.joshwcomeau.com/svg/friendly-introduction-to-svg/"/>
        <id>https://blog.jutty.dev/links/joshwcomeau-a-friendly-introduction-to-svg/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/joshwcomeau-a-friendly-introduction-to-svg/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to help someone use a computer</title>
        <published>2025-08-15T10:24:11-03:00</published>
        <updated>2025-08-15T10:24:11-03:00</updated>
        
        <author>
          <name>
            Phil Agre
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://pages.gseis.ucla.edu/faculty/agre/how-to-help.html"/>
        <id>https://blog.jutty.dev/links/how-to-help-someone-use-a-computer/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/how-to-help-someone-use-a-computer/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>ethersync: Editor-agnostic, real-time collaborative text editing</title>
        <published>2025-07-29T11:32:02-03:00</published>
        <updated>2025-07-29T11:32:02-03:00</updated>
        
        <author>
          <name>
            teamtype
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/ethersync/ethersync"/>
        <id>https://blog.jutty.dev/links/ethersync/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ethersync/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>ANSI Escape Codes Inspector</title>
        <published>2025-07-26T02:28:00-03:00</published>
        <updated>2025-07-26T02:28:00-03:00</updated>
        
        <author>
          <name>
            Lars Kappert
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ansi.tools"/>
        <id>https://blog.jutty.dev/links/ansi-escape-codes-inspector/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ansi-escape-codes-inspector/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bread on Penguins</title>
        <published>2025-07-14T18:34:23-03:00</published>
        <updated>2025-07-14T18:34:23-03:00</updated>
        
        <author>
          <name>
            Bread
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.youtube.com/channel/UCwHwDuNd9lCdA7chyyquDXw"/>
        <id>https://blog.jutty.dev/links/bread-on-penguins/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/bread-on-penguins/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>outside: multi-purpose terminal weather client</title>
        <published>2025-07-13T20:35:57-03:00</published>
        <updated>2025-07-13T20:35:57-03:00</updated>
        
        <author>
          <name>
            BaconIsAVeg
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/BaconIsAVeg/outside"/>
        <id>https://blog.jutty.dev/links/baconisaveg-outside/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/baconisaveg-outside/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>BastilleBSD 1.0 Release</title>
        <published>2025-07-10T01:29:31-03:00</published>
        <updated>2025-07-10T01:29:31-03:00</updated>
        
        <author>
          <name>
            Juan David Hurtado G
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/BastilleBSD/bastille/releases/tag/1.0.20250714"/>
        <id>https://blog.jutty.dev/links/bastillebsd-1-0/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/bastillebsd-1-0/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>OCaml, modules, and import schemes</title>
        <published>2025-07-02T20:49:34-03:00</published>
        <updated>2025-07-02T20:49:34-03:00</updated>
        
        <author>
          <name>
            Xavier Van de Woestyne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xvw.lol/en/articles/modules-import.html"/>
        <id>https://blog.jutty.dev/links/xvw-ocaml-modules-and-import-schemes/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/xvw-ocaml-modules-and-import-schemes/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Tectonic Typesetting System</title>
        <published>2025-07-02T20:45:43-03:00</published>
        <updated>2025-07-02T20:45:43-03:00</updated>
        
        <author>
          <name>
            The Tectonic Project
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tectonic-typesetting.github.io"/>
        <id>https://blog.jutty.dev/links/tectonic-typesetting/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/tectonic-typesetting/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>In Praise of Links</title>
        <published>2025-06-20T14:05:14-03:00</published>
        <updated>2025-06-20T14:05:14-03:00</updated>
        
        <author>
          <name>
            Coyote
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://osteophage.neocities.org/writing/in-praise-of-links"/>
        <id>https://blog.jutty.dev/links/osteophage-in-praise-of-links/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/osteophage-in-praise-of-links/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>jarun&#x2F;pdd: Tiny date, time diff calculator with piggybacked timers</title>
        <published>2025-06-18T22:40:49-03:00</published>
        <updated>2025-06-18T22:40:49-03:00</updated>
        
        <author>
          <name>
            Arun Prakash Jana (jarun)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/jarun/pdd"/>
        <id>https://blog.jutty.dev/links/jarun-pdd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jarun-pdd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Poline: esoteric color palette generation</title>
        <published>2025-06-14T20:07:25-03:00</published>
        <updated>2025-06-14T20:07:25-03:00</updated>
        
        <author>
          <name>
            David Aerne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://meodai.github.io/poline/"/>
        <id>https://blog.jutty.dev/links/meodai-poline/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/meodai-poline/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>gbprod&#x2F;substitute: Neovim plugin with replace and exchange operators</title>
        <published>2025-06-14T19:53:14-03:00</published>
        <updated>2025-06-14T19:53:14-03:00</updated>
        
        <author>
          <name>
            gbprod
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/gbprod/substitute.nvim"/>
        <id>https://blog.jutty.dev/links/gbprod-substitute/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/gbprod-substitute/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why apk-tools is different than other package managers</title>
        <published>2025-06-10T21:17:25-03:00</published>
        <updated>2025-06-10T21:17:25-03:00</updated>
        
        <author>
          <name>
            Ariadne Conill
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ariadne.space/2021/04/24/why-apktools-is-different-than.html"/>
        <id>https://blog.jutty.dev/links/ariadne-space-why-apk-tools-is-different/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ariadne-space-why-apk-tools-is-different/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>ifd3f&#x2F;caligula: user-friendly, lightweight TUI for disk imaging</title>
        <published>2025-06-10T17:11:55-03:00</published>
        <updated>2025-06-10T17:11:55-03:00</updated>
        
        <author>
          <name>
            Astrid Yu (ifd3f)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/ifd3f/caligula"/>
        <id>https://blog.jutty.dev/links/ifd3f-caligula/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ifd3f-caligula/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>pastel: A CLI tool to generate, analyze, convert and manipulate colors</title>
        <published>2025-06-10T17:03:27-03:00</published>
        <updated>2025-06-10T17:03:27-03:00</updated>
        
        <author>
          <name>
            David Peter (sharkdp)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/sharkdp/pastel"/>
        <id>https://blog.jutty.dev/links/sharkdp-pastel/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/sharkdp-pastel/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>the algebra of dependent types</title>
        <published>2025-05-29T00:32:09-03:00</published>
        <updated>2025-05-29T00:32:09-03:00</updated>
        
        <author>
          <name>
            Tony Finch
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dotat.at/@/2025-05-28-types.html"/>
        <id>https://blog.jutty.dev/links/the-algebra-of-dependent-types/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/the-algebra-of-dependent-types/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Waypipe: graphical remote access for Wayland applications</title>
        <published>2025-05-28T19:29:14-03:00</published>
        <updated>2025-05-28T19:29:14-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/waypipe/"/>
        <id>https://blog.jutty.dev/notes/waypipe/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/waypipe/">&lt;p&gt;Tried out &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;mstoeckl&#x2F;waypipe&quot;&gt;Waypipe&lt;&#x2F;a&gt; today as a way to remotely control graphical Wayland applications between Alpine Linux and FreeBSD hosts and it’s snappy on my wireless network + decade-old hardware combo!&lt;&#x2F;p&gt;
&lt;p&gt;At first, the minimal example given by Waypipe in its README and man page did not work:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;waypipe&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ssh user@server foot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;small&gt;&lt;em&gt;(I’m using &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;dnkl&#x2F;foot&quot;&gt;foot&lt;&#x2F;a&gt; as the example here because that’s the terminal I use on both systems, but it could be anything — a simplistic application, a web browser or even a full-blown compositor).&lt;&#x2F;em&gt;&lt;&#x2F;small&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This failed with the following message:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;S2874:  0.603209 [src&#x2F;server.c:649] Env. var XDG_RUNTIME_DIR not available, cannot place display socket for WAYLAND_DISPLAY=&amp;quot;wayland-HBTrV7VT&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The issue here is that most (all?) Wayland applications expect at least &lt;code&gt;XDG_RUNTIME_DIR&lt;&#x2F;code&gt; to be set, and a bare ssh connection will not set that on its own.&lt;&#x2F;p&gt;
&lt;p&gt;The man page does mention this and how to fix it. It gives you several options, one of which is using &lt;code&gt;~&#x2F;.ssh&#x2F;environment&lt;&#x2F;code&gt; and setting it up properly at the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.openbsd.org&#x2F;ssh#USER&quot;&gt;client&lt;&#x2F;a&gt; and &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.openbsd.org&#x2F;sshd_config.5#PermitUserEnvironment&quot;&gt;server&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, I prefer to use the following approach because it’s isolated to each host instead:&lt;&#x2F;p&gt;
&lt;p&gt;Client &lt;code&gt;~&#x2F;.ssh&#x2F;config&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Host &amp;lt;server&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    User &amp;lt;user&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    SetEnv XDG_RUNTIME_DIR=&amp;lt;user-writable-directory&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The directory above must exist prior to the connection and must be writable by the user as whom we will ssh into the server. Otherwise, it will throw the following error:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;S2889: 60.436704 [src&#x2F;util.c:237] Error opening folder in which to connect to socket: Permission denied&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you’d rather reuse the &lt;code&gt;XDG_RUNTIME_DIR&lt;&#x2F;code&gt; value you already have set on the client, you can also use &lt;code&gt;SendEnv&lt;&#x2F;code&gt; instead of &lt;code&gt;SetEnv&lt;&#x2F;code&gt;, but their values may not be interchangeable. In my case, Alpine and FreeBSD use different directories with different permissions. This is one other advantage of this method over &lt;code&gt;~&#x2F;.ssh&#x2F;environment&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Next, you need to make sure the server will allow the client to send this environment variable.&lt;&#x2F;p&gt;
&lt;p&gt;Server &lt;code&gt;&#x2F;etc&#x2F;ssh&#x2F;sshd_config&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AcceptEnv XDG_RUNTIME_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Make sure you have Waypipe installed on both server and client. Finally, from the client’s shell:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;waypipe&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ssh user@server foot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That’s it! If all went well, a window should pop up with &lt;code&gt;foot&lt;&#x2F;code&gt; — or whatever command you chose — running directly from the server.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why Algebraic Effects?</title>
        <published>2025-05-27T22:22:25-03:00</published>
        <updated>2025-05-27T22:22:25-03:00</updated>
        
        <author>
          <name>
            Jake Fecher
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://antelang.org/blog/why_effects/"/>
        <id>https://blog.jutty.dev/links/antelang-why-algebraic-effects/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/antelang-why-algebraic-effects/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Having your compile-time cake and eating it too</title>
        <published>2025-05-24T18:58:45-03:00</published>
        <updated>2025-05-24T18:58:45-03:00</updated>
        
        <author>
          <name>
            Derin Eryılmaz
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://0x44.xyz/blog/comptime-1"/>
        <id>https://blog.jutty.dev/links/0x44-having-compile-time-cake-and-eating-it-too/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/0x44-having-compile-time-cake-and-eating-it-too/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Parsing expressions by precedence climbing</title>
        <published>2025-05-13T23:26:52-03:00</published>
        <updated>2025-05-13T23:26:52-03:00</updated>
        
        <author>
          <name>
            Eli Bendersky
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://eli.thegreenplace.net/2012/08/02/parsing-expressions-by-precedence-climbing"/>
        <id>https://blog.jutty.dev/links/eli-thegreenplace-precedence-climbing-parsing/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/eli-thegreenplace-precedence-climbing-parsing/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>FreeBSD VM under Incus on Debian</title>
        <published>2025-05-06T03:18:31-03:00</published>
        <updated>2025-05-06T03:18:31-03:00</updated>
        
        <author>
          <name>
            linus
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://agren.cc/p/freebsd-vm-incus"/>
        <id>https://blog.jutty.dev/links/agren-incus-freebsd-vm/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/agren-incus-freebsd-vm/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linux on a 70&#x27;s Typewriter</title>
        <published>2025-04-29T19:51:06-03:00</published>
        <updated>2025-04-29T19:51:06-03:00</updated>
        
        <author>
          <name>
            Alnwlsn
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.youtube.com/watch?v=1kXnsvYfaF4"/>
        <id>https://blog.jutty.dev/links/linux-on-a-70s-typewriter/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/linux-on-a-70s-typewriter/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Revisiting an early critique of formal verification</title>
        <published>2025-04-19T00:53:46-03:00</published>
        <updated>2025-04-19T00:53:46-03:00</updated>
        
        <author>
          <name>
            Lawrence C. Paulson
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lawrencecpaulson.github.io/2025/03/14/revisiting_demillo.html"/>
        <id>https://blog.jutty.dev/links/lawrencecpaulson-revisiting-a-critique-of-verification/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lawrencecpaulson-revisiting-a-critique-of-verification/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Allowed commands in SSH authorized_keys</title>
        <published>2025-04-17T20:56:14-03:00</published>
        <updated>2025-04-17T20:56:14-03:00</updated>
        
        <author>
          <name>
            Dan Langille
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dan.langille.org/2025/04/17/using-ssh-authorized-keys-to-decide-what-the-incoming-connection-can-do/"/>
        <id>https://blog.jutty.dev/links/langille-allowed-commands-in-ssh-authorized-keys/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/langille-allowed-commands-in-ssh-authorized-keys/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introduction to Linear Types</title>
        <published>2025-04-15T17:19:58-03:00</published>
        <updated>2025-04-15T17:19:58-03:00</updated>
        
        <author>
          <name>
            Fernando Borretti
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://austral-lang.org/linear-types"/>
        <id>https://blog.jutty.dev/links/austral-introduction-to-linear-types/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/austral-introduction-to-linear-types/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Two Years of Rust</title>
        <published>2025-04-15T15:21:27-03:00</published>
        <updated>2025-04-15T15:21:27-03:00</updated>
        
        <author>
          <name>
            Fernando Borretti
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://borretti.me/article/two-years-of-rust"/>
        <id>https://blog.jutty.dev/links/borretti-two-years-of-rust/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/borretti-two-years-of-rust/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>OEM Support in Linux Mint Debian Edition</title>
        <published>2025-04-09T19:52:51-03:00</published>
        <updated>2025-04-09T19:52:51-03:00</updated>
        
        <author>
          <name>
            The Mint Team
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.linuxmint.com/?p=4825#:~:text=OEM%20Support%20in%20LMDE"/>
        <id>https://blog.jutty.dev/links/lmde-oem-support/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lmde-oem-support/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>End-user Programming</title>
        <published>2025-04-05T22:18:40-03:00</published>
        <updated>2025-04-05T22:18:40-03:00</updated>
        
        <author>
          <name>
            Szymon Kaliski
          </name>
        </author>
        
        <author>
          <name>
            Adam Wiggins
          </name>
        </author>
        
        <author>
          <name>
            James Lindenbaum
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.inkandswitch.com/end-user-programming/"/>
        <id>https://blog.jutty.dev/links/inkandswitch-end-user-programming/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/inkandswitch-end-user-programming/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Pitfalls of Safe Rust</title>
        <published>2025-04-04T19:37:22-03:00</published>
        <updated>2025-04-04T19:37:22-03:00</updated>
        
        <author>
          <name>
            Matthias Endler
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://corrode.dev/blog/pitfalls-of-safe-rust/"/>
        <id>https://blog.jutty.dev/links/pitfalls-of-safe-rust/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/pitfalls-of-safe-rust/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>clawtype: wearable chorded keyboard and mouse</title>
        <published>2025-04-04T19:21:17-03:00</published>
        <updated>2025-04-04T19:21:17-03:00</updated>
        
        <author>
          <name>
            Mateusz Czapliński (akavel)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/akavel/clawtype"/>
        <id>https://blog.jutty.dev/links/akavel-clawtype/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/akavel-clawtype/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>landrun: unprivileged Linux sandboxes using Landlock</title>
        <published>2025-03-28T20:34:29-03:00</published>
        <updated>2025-03-28T20:34:29-03:00</updated>
        
        <author>
          <name>
            Armin ranjbar (Zouuup)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/Zouuup/landrun"/>
        <id>https://blog.jutty.dev/links/zouuup-landrun/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/zouuup-landrun/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Using elinks to browse the web</title>
        <published>2025-03-27T17:37:24-03:00</published>
        <updated>2025-03-27T17:37:24-03:00</updated>
        
        <author>
          <name>
            Dion Moult
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://thinkmoult.com/using-elinks-browse-web.html"/>
        <id>https://blog.jutty.dev/links/thinkmoult-using-elinks/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/thinkmoult-using-elinks/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Don&#x27;t Be Afraid Of Types</title>
        <published>2025-03-22T13:33:16-03:00</published>
        <updated>2025-03-22T13:33:16-03:00</updated>
        
        <author>
          <name>
            Leon Mika
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lmika.org/2025/03/18/dont-be-afraid-of-types.html"/>
        <id>https://blog.jutty.dev/links/lmika-dont-be-afraid-of-types/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lmika-dont-be-afraid-of-types/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>slipshow: the next-gen version of slides</title>
        <published>2025-03-20T21:53:40-03:00</published>
        <updated>2025-03-20T21:53:40-03:00</updated>
        
        <author>
          <name>
            Paul-Elliot Anglès d&#x27;Auriac (panglesd)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/panglesd/slipshow"/>
        <id>https://blog.jutty.dev/links/slipshow-next-gen-version-of-slides/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/slipshow-next-gen-version-of-slides/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The road to mainstream Matrix</title>
        <published>2025-03-18T23:36:24-03:00</published>
        <updated>2025-03-18T23:36:24-03:00</updated>
        
        <author>
          <name>
            Joe Brockmeier
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lwn.net/SubscriberLink/1009932/572571cd50cc094b/"/>
        <id>https://blog.jutty.dev/links/lwn-road-to-mainstream-matrix/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lwn-road-to-mainstream-matrix/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Verification-First Development</title>
        <published>2025-03-18T21:26:19-03:00</published>
        <updated>2025-03-18T21:26:19-03:00</updated>
        
        <author>
          <name>
            Hillel Wayne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://buttondown.com/hillelwayne/archive/verification-first-development/"/>
        <id>https://blog.jutty.dev/links/hillelwayne-verification-first-development/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hillelwayne-verification-first-development/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>An interview with Mike Amundsen, Author of &#x27;RESTful Web APIs&#x27;</title>
        <published>2025-03-17T17:52:16-03:00</published>
        <updated>2025-03-17T17:52:16-03:00</updated>
        
        <author>
          <name>
            Carson Gross
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://htmx.org/essays/interviews/mike-amundsen/"/>
        <id>https://blog.jutty.dev/links/an-interview-with-mike-amundsen/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/an-interview-with-mike-amundsen/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Almquist Shell Variants</title>
        <published>2025-03-13T22:32:48-03:00</published>
        <updated>2025-03-13T22:32:48-03:00</updated>
        
        <author>
          <name>
            Sven Mascheck
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.in-ulm.de/~mascheck/various/ash/"/>
        <id>https://blog.jutty.dev/links/mascheck-ash-variants/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/mascheck-ash-variants/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Beyond Bad Output</title>
        <published>2025-03-13T22:31:53-03:00</published>
        <updated>2025-03-13T22:31:53-03:00</updated>
        
        <author>
          <name>
            Paris Buttfield-Addison
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hey.paris/posts/beyond-bad-output/"/>
        <id>https://blog.jutty.dev/links/heyparis-beyond-bad-output/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/heyparis-beyond-bad-output/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>termpicker: A color picker for the terminal</title>
        <published>2025-03-11T22:02:09-03:00</published>
        <updated>2025-03-11T22:02:09-03:00</updated>
        
        <author>
          <name>
            Benjamin Chausse (ChausseBenjamin)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/ChausseBenjamin/termpicker"/>
        <id>https://blog.jutty.dev/links/chaussebenjamin-termpicker/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/chaussebenjamin-termpicker/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Understanding Unix filesystem timestamps</title>
        <published>2025-03-09T14:52:25-03:00</published>
        <updated>2025-03-09T14:52:25-03:00</updated>
        
        <author>
          <name>
            Unix Digest
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://unixdigest.com/articles/understanding-unix-filesystem-timestamps.html"/>
        <id>https://blog.jutty.dev/links/unixdigest-filesystem-timestamps/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/unixdigest-filesystem-timestamps/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Build your own Command Line with ANSI escape codes</title>
        <published>2025-03-07T21:55:40-03:00</published>
        <updated>2025-03-07T21:55:40-03:00</updated>
        
        <author>
          <name>
            Li Haoyi
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html"/>
        <id>https://blog.jutty.dev/links/lihaoyi-build-your-own-command-line/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lihaoyi-build-your-own-command-line/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Standards for ANSI escape codes</title>
        <published>2025-03-07T21:26:21-03:00</published>
        <updated>2025-03-07T21:26:21-03:00</updated>
        
        <author>
          <name>
            Julia Evans
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jvns.ca/blog/2025/03/07/escape-code-standards/"/>
        <id>https://blog.jutty.dev/links/jvns-ansi-escape-codes/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jvns-ansi-escape-codes/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dependent Haskell Roadmap</title>
        <published>2025-03-07T17:11:14-03:00</published>
        <updated>2025-03-07T17:11:14-03:00</updated>
        
        <author>
          <name>
            Serokell
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ghc.serokell.io/dh"/>
        <id>https://blog.jutty.dev/links/dependent-haskell-roadmap/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dependent-haskell-roadmap/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why ZFS Reports Less Space: Space Accounting Explained</title>
        <published>2025-03-04T17:09:59-03:00</published>
        <updated>2025-03-04T17:09:59-03:00</updated>
        
        <author>
          <name>
            Jim Salter
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://klarasystems.com/articles/why-zfs-reports-less-available-space-space-accounting-explained/"/>
        <id>https://blog.jutty.dev/links/klarasystems-zfs-space-accounting/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/klarasystems-zfs-space-accounting/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>hue.tools</title>
        <published>2025-03-04T14:54:54-03:00</published>
        <updated>2025-03-04T14:54:54-03:00</updated>
        
        <author>
          <name>
            Pascal Bürkle (pabueco)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hue.tools/"/>
        <id>https://blog.jutty.dev/links/hue-tools/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hue-tools/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Falsehoods programmers believe about languages</title>
        <published>2025-03-02T12:07:14-03:00</published>
        <updated>2025-03-02T12:07:14-03:00</updated>
        
        <author>
          <name>
            Michal Měchura
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.lexiconista.com/falsehoods-about-languages/"/>
        <id>https://blog.jutty.dev/links/lexiconista-language-falsehoods/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lexiconista-language-falsehoods/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>mdo: FreeBSD su alternative without setuid binaries</title>
        <published>2025-02-27T01:25:49-03:00</published>
        <updated>2025-02-27T01:25:49-03:00</updated>
        
        <author>
          <name>
            The FreeBSD Project
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.freebsd.org/status/report-2024-10-2024-12/#_mac_do4_setcred2_mdo1"/>
        <id>https://blog.jutty.dev/links/freebsd-mdo/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/freebsd-mdo/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A timeline of Unix shells</title>
        <published>2025-02-24T14:34:25-03:00</published>
        <updated>2025-02-24T14:34:25-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/shells-timeline/"/>
        <id>https://blog.jutty.dev/notes/shells-timeline/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/shells-timeline/">&lt;p&gt;For some reason, I really like timeline visualizations, meaning a graph with events listed along a temporal axis with the dates in which they happened. I remember using tape to glue several pieces of paper on the wall as a kid to make a long timeline of world history events.&lt;&#x2F;p&gt;
&lt;p&gt;So every time I find a tool to do that, I want to check it out. The latest was &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;markwhen.com&#x2F;&quot;&gt;Markwhen&lt;&#x2F;a&gt;, which works entirely by defining the timeline as code and then running an executable against it to render image or interactive web outputs.&lt;&#x2F;p&gt;
&lt;p&gt;To try it out, I made this timeline of Unix shells. You can view &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jultty.github.io&#x2F;shells-timeline&#x2F;&quot;&gt;the HTML version here&lt;&#x2F;a&gt; or the images below (dark and light themes):&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;shells-timeline&#x2F;shells-timeline_dark.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;shells-timeline&#x2F;shells-timeline_dark.png&quot; alt=&quot;A timeline of Unix shells with events starting in 1963 and ending in 2020. Years are represented horizontally and events start from the top left towards the bottom right, forming a diagonal of events and their labels. Each event is represented by a dot, a date and a shell name. Foreground is white and gray, background is black.&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;shells-timeline&#x2F;shells-timeline_light.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;shells-timeline&#x2F;shells-timeline_light.png&quot; alt=&quot;The same timeline as in the previous picture, but with black and gray foreground and white background.&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Expand for a textual list of the timeline events&lt;&#x2F;summary&gt;
&lt;ul&gt;
&lt;li&gt;1963: RUNCOM&lt;&#x2F;li&gt;
&lt;li&gt;1965: Multics shell&lt;&#x2F;li&gt;
&lt;li&gt;1971-11: Thompson shell (sh)&lt;&#x2F;li&gt;
&lt;li&gt;1977-07-01: PWB shell (sh)&lt;&#x2F;li&gt;
&lt;li&gt;1978: C shell (csh)&lt;&#x2F;li&gt;
&lt;li&gt;1979: Bourne shell (sh)&lt;&#x2F;li&gt;
&lt;li&gt;1983-10-04: TENEX C Shell (tcsh)&lt;&#x2F;li&gt;
&lt;li&gt;1983-06-09: KornShell (ksh)&lt;&#x2F;li&gt;
&lt;li&gt;1989-05-30: Almquist shell (ash)&lt;&#x2F;li&gt;
&lt;li&gt;1989-06-08: Bourne-Again Shell (bash)&lt;&#x2F;li&gt;
&lt;li&gt;1990-12-14: Z shell (zsh)&lt;&#x2F;li&gt;
&lt;li&gt;1992: Plan 9 Rc (rc)&lt;&#x2F;li&gt;
&lt;li&gt;1995-06-16: Public Domain KornShell (pdksh)&lt;&#x2F;li&gt;
&lt;li&gt;1997-06-19: Debian Almquist shell (dash)&lt;&#x2F;li&gt;
&lt;li&gt;2004-04-07: MirBSD Korn Shell (mksh)&lt;&#x2F;li&gt;
&lt;li&gt;2005: friendly interactive shell (fish)&lt;&#x2F;li&gt;
&lt;li&gt;2019-08-23: Nushell (nu)&lt;&#x2F;li&gt;
&lt;li&gt;2020-10-30: Portable OpenBSD KornShell (oksh)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Don’t ask me why every item is followed by …, I’d love to know.&lt;&#x2F;p&gt;
&lt;p&gt;If you are interested, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jultty&#x2F;shells-timeline&#x2F;blob&#x2F;main&#x2F;shells.mw&quot;&gt;here is the source code&lt;&#x2F;a&gt; that was used to generate the images above. The source code also contains notes that are only displayed in the HTML version. These notes are sources for the dates and sometimes observations on the date precision.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Enjoying Alpine as a daily driver</title>
        <published>2025-02-23T22:07:09-03:00</published>
        <updated>2025-02-23T22:07:09-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/enjoying-alpine/"/>
        <id>https://blog.jutty.dev/notes/enjoying-alpine/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/enjoying-alpine/">&lt;p&gt;I am happy to report that my Alpine root-on-ZFS experiment is – apparently – a success. I’ve been running it as my only OS on my laptop for the past week.&lt;&#x2F;p&gt;
&lt;p&gt;I was previously on Void and I switched because the stable part in “rolling but stable” wasn’t really fulfilling what I expected, with occasional breakage on updates, or just things changing too often. For instance, every minor Python version you get a bump and every Python program on your system starts yelling deprecation warnings amid their output. I just can’t with this rate of change of fundamental stuff like compilers and interpreters.&lt;&#x2F;p&gt;
&lt;p&gt;My favorite model of update is FreeBSD’s. Your core system updates in one way, the third-party packages update another way, the core only updates if necessary and packages not too often as to introduce such breakage. But for this machine FreeBSD is just not there (yet).&lt;&#x2F;p&gt;
&lt;p&gt;Alpine updates every six months and it can be made as rolling as setting your Debian repositories to “stable” or “testing” (“edge” in Alpine) if you appreciate chaos enough.&lt;&#x2F;p&gt;
&lt;p&gt;It’s my first time daily driving OpenRC and musl, which I feared would introduce painful compatibility issues, but so far I’ve been able to use everything I need, sometimes leveraging the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.alpinelinux.org&#x2F;wiki&#x2F;Running_glibc_programs&quot;&gt;alternatives&lt;&#x2F;a&gt;, like its glibc compatibility layer or a Flatpak as last resort (e.g. for playing DRM video).&lt;&#x2F;p&gt;
&lt;p&gt;I started drafting a blog post with the journey so far, but I’ll keep using it and hitting some more of my use cases along the way to have a more complete write-up.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Post-Quantum Cryptography in February 2025</title>
        <published>2025-02-19T22:16:13-03:00</published>
        <updated>2025-02-19T22:16:13-03:00</updated>
        
        <author>
          <name>
            Jan Schaumann
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.netmeister.org/blog/pqc-2025-02.html"/>
        <id>https://blog.jutty.dev/links/netmeister-post-quantum-crypto-february-2025/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/netmeister-post-quantum-crypto-february-2025/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Five Kinds of Nondeterminism</title>
        <published>2025-02-19T19:18:12-03:00</published>
        <updated>2025-02-19T19:18:12-03:00</updated>
        
        <author>
          <name>
            Hillel Wayne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://buttondown.com/hillelwayne/archive/five-kinds-of-nondeterminism/"/>
        <id>https://blog.jutty.dev/links/hillelwayne-five-kinds-of-nondeterminism/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hillelwayne-five-kinds-of-nondeterminism/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>LabPlot – Scientific plotting and data analysis</title>
        <published>2025-02-15T18:42:03-03:00</published>
        <updated>2025-02-15T18:42:03-03:00</updated>
        
        <author>
          <name>
            LabPlot Team
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://labplot.org/"/>
        <id>https://blog.jutty.dev/links/labplot/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/labplot/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>laktak&#x2F;tome: script playbooks with vim</title>
        <published>2025-01-23T23:20:35-03:00</published>
        <updated>2025-01-23T23:20:35-03:00</updated>
        
        <author>
          <name>
            Christian Zangl (laktak)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/laktak/tome/"/>
        <id>https://blog.jutty.dev/links/laktak-tome/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/laktak-tome/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>nixbsd: An unofficial NixOS fork with a FreeBSD kernel</title>
        <published>2025-01-21T17:32:00-03:00</published>
        <updated>2025-01-21T17:32:00-03:00</updated>
        
        <author>
          <name>
            NixBSD
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/nixos-bsd/nixbsd"/>
        <id>https://blog.jutty.dev/links/nixbsd-nixos-fork-with-a-freebsd-kernel/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/nixbsd-nixos-fork-with-a-freebsd-kernel/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Koto Programming Language</title>
        <published>2025-01-08T21:31:31-03:00</published>
        <updated>2025-01-08T21:31:31-03:00</updated>
        
        <author>
          <name>
            Ian Hobson
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://koto.dev/"/>
        <id>https://blog.jutty.dev/links/koto-programming-language/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/koto-programming-language/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>aaronik&#x2F;treewalker.nvim: Move around your code in a syntax tree aware manner</title>
        <published>2025-01-08T03:31:48-03:00</published>
        <updated>2025-01-08T03:31:48-03:00</updated>
        
        <author>
          <name>
            Aaron Sullivan (aaronik)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/aaronik/treewalker.nvim"/>
        <id>https://blog.jutty.dev/links/github-aaronik-treewalker-nvim/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/github-aaronik-treewalker-nvim/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>yassinebenaid&#x2F;bunster: Compile shell scripts to machine code</title>
        <published>2025-01-07T00:07:58-03:00</published>
        <updated>2025-01-07T00:07:58-03:00</updated>
        
        <author>
          <name>
            Yassine Benaid (yassinebenaid)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/yassinebenaid/bunster"/>
        <id>https://blog.jutty.dev/links/yassinebenaid-bunster/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/yassinebenaid-bunster/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>One-stop performance analysis using atop</title>
        <published>2025-01-06T00:39:14-03:00</published>
        <updated>2025-01-06T00:39:14-03:00</updated>
        
        <author>
          <name>
            Jan Christiaan van Winkel
          </name>
        </author>
        
        <author>
          <name>
            Gerlof Langeveld
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lwn.net/Articles/387202/"/>
        <id>https://blog.jutty.dev/links/lwn-one-stop-performance-analysis-using-atop/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lwn-one-stop-performance-analysis-using-atop/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Category Theory Illustrated</title>
        <published>2024-12-29T19:08:10-03:00</published>
        <updated>2024-12-29T19:08:10-03:00</updated>
        
        <author>
          <name>
            Jencel Panic
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://abuseofnotation.github.io/category-theory-illustrated/"/>
        <id>https://blog.jutty.dev/links/abuseofnotation-category-theory-illustrated/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/abuseofnotation-category-theory-illustrated/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Revisiting the NetBSD build system</title>
        <published>2024-12-28T22:26:03-03:00</published>
        <updated>2024-12-28T22:26:03-03:00</updated>
        
        <author>
          <name>
            Julio Merino
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blogsystem5.substack.com/p/netbsd-build-system"/>
        <id>https://blog.jutty.dev/links/blogsystem5-revisiting-the-netbsd-build-system/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/blogsystem5-revisiting-the-netbsd-build-system/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Canop&#x2F;rhit: A nginx log explorer</title>
        <published>2024-12-27T00:37:00-03:00</published>
        <updated>2024-12-27T00:37:00-03:00</updated>
        
        <author>
          <name>
            Denys Séguret (Canop)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/Canop/rhit"/>
        <id>https://blog.jutty.dev/links/canop-rhit-nginx-log-explorer/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/canop-rhit-nginx-log-explorer/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Schemio, a platform for dynamic diagramming</title>
        <published>2024-12-24T00:28:30-03:00</published>
        <updated>2024-12-24T00:28:30-03:00</updated>
        
        <author>
          <name>
            Ivan Shubin (ishubin)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://schem.io/"/>
        <id>https://blog.jutty.dev/links/schemio-dynamic-diagramming/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/schemio-dynamic-diagramming/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ideas from &quot;A Philosophy of Software Design&quot;</title>
        <published>2024-12-22T17:33:54-03:00</published>
        <updated>2024-12-22T17:33:54-03:00</updated>
        
        <author>
          <name>
            16elt
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.16elt.com/2024/09/25/first-book-of-byte-sized-tech/"/>
        <id>https://blog.jutty.dev/links/16elt-ideas-from-a-philosophy-of-software-design/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/16elt-ideas-from-a-philosophy-of-software-design/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Cognitive load is what matters</title>
        <published>2024-12-22T16:46:15-03:00</published>
        <updated>2024-12-22T16:46:15-03:00</updated>
        
        <author>
          <name>
            Artem Zakirullin
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://minds.md/zakirullin/cognitive#long"/>
        <id>https://blog.jutty.dev/links/zakirullin-cognitive-load-is-what-matters/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/zakirullin-cognitive-load-is-what-matters/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to properly shut down a Linux system</title>
        <published>2024-12-21T18:14:32-03:00</published>
        <updated>2024-12-21T18:14:32-03:00</updated>
        
        <author>
          <name>
            Leah Neukirchen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://leahneukirchen.org/blog/archive/2024/12/how-to-properly-shut-down-a-linux-system.html"/>
        <id>https://blog.jutty.dev/links/leahneukirchen-how-to-properly-shut-down-a-linux-system/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/leahneukirchen-how-to-properly-shut-down-a-linux-system/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Web Origami</title>
        <published>2024-12-21T12:22:49-03:00</published>
        <updated>2024-12-21T12:22:49-03:00</updated>
        
        <author>
          <name>
            Jan Miksovsky
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://weborigami.org/"/>
        <id>https://blog.jutty.dev/links/web-origami/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/web-origami/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Artemis - a calm web reader</title>
        <published>2024-12-21T00:40:57-03:00</published>
        <updated>2024-12-21T00:40:57-03:00</updated>
        
        <author>
          <name>
            James
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://artemis.jamesg.blog/"/>
        <id>https://blog.jutty.dev/links/jamesg-artemis/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jamesg-artemis/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Conjuring a Linux distribution out of thin air</title>
        <published>2024-12-13T16:59:18-03:00</published>
        <updated>2024-12-13T16:59:18-03:00</updated>
        
        <author>
          <name>
            Martijn Braam
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.brixit.nl/conjuring-a-linux-distribution-out-of-thin-air/"/>
        <id>https://blog.jutty.dev/links/brixit-conjuring-a-linux-distribution/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/brixit-conjuring-a-linux-distribution/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Telescopic Text</title>
        <published>2024-12-11T18:48:21-03:00</published>
        <updated>2024-12-11T18:48:21-03:00</updated>
        
        <author>
          <name>
            Joe Davis
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.telescopictext.org/"/>
        <id>https://blog.jutty.dev/links/telescopic-text/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/telescopic-text/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>An Undefeated Pull Request Template</title>
        <published>2024-12-10T22:39:33-03:00</published>
        <updated>2024-12-10T22:39:33-03:00</updated>
        
        <author>
          <name>
            Ashlee M Boyer
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ashleemboyer.com/blog/pull-request-template/"/>
        <id>https://blog.jutty.dev/links/ashleemboyer-undefeated-pull-request-template/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/ashleemboyer-undefeated-pull-request-template/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Pronounce Chinese Names a Little Better</title>
        <published>2024-12-07T11:14:25-03:00</published>
        <updated>2024-12-07T11:14:25-03:00</updated>
        
        <author>
          <name>
            Jack O&#x27;Connor
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jacko.io/chinese_names.html"/>
        <id>https://blog.jutty.dev/links/jacko-pronounce-chinese-names/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jacko-pronounce-chinese-names/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>8 months of OCaml after 8 years of Haskell</title>
        <published>2024-12-04T00:00:00+00:00</published>
        <updated>2024-12-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Dmitrii Kovanikov
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://chshersh.com/blog/2023-12-16-8-months-of-ocaml-after-8-years-of-haskell.html"/>
        <id>https://blog.jutty.dev/links/chshersh-haskell-ocaml-comparison/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/chshersh-haskell-ocaml-comparison/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Demystifying git submodules</title>
        <published>2024-12-04T00:00:00+00:00</published>
        <updated>2024-12-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Dmitry Mazin
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.cyberdemon.org/2024/03/20/submodules.html"/>
        <id>https://blog.jutty.dev/links/cyberdemon-demystifying-git-submodules/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/cyberdemon-demystifying-git-submodules/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>December Adventure</title>
        <published>2024-12-04T00:00:00+00:00</published>
        <updated>2024-12-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Eli Mellen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://eli.li/december-adventure"/>
        <id>https://blog.jutty.dev/links/eli-december-adventure/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/eli-december-adventure/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Announcing Hurl 6.0.0</title>
        <published>2024-12-04T00:00:00+00:00</published>
        <updated>2024-12-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            CCMD Team
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hurl.dev/blog/2024/12/04/announcing-hurl-6.0.0.html"/>
        <id>https://blog.jutty.dev/links/hurl-6-0-0/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hurl-6-0-0/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Typst as a Language</title>
        <published>2024-12-03T00:00:00+00:00</published>
        <updated>2024-12-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Justin Pombrio
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://justinpombrio.net/2024/11/30/typst.html"/>
        <id>https://blog.jutty.dev/links/justinpombrio-typst-as-a-language/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/justinpombrio-typst-as-a-language/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The &quot;Property Based Testing&quot; series</title>
        <published>2024-12-03T00:00:00+00:00</published>
        <updated>2024-12-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Scott Wlaschin
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://fsharpforfunandprofit.com/series/property-based-testing/"/>
        <id>https://blog.jutty.dev/links/scott-wlaschin-property-based-testing/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/scott-wlaschin-property-based-testing/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linear Types and Exceptions</title>
        <published>2024-12-02T00:00:00+00:00</published>
        <updated>2024-12-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            Fernando Borretti
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://borretti.me/article/linear-types-exceptions"/>
        <id>https://blog.jutty.dev/links/borretti-linear-types-exceptions/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/borretti-linear-types-exceptions/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dependent Types and the Art of HTTP Headers</title>
        <published>2024-11-28T00:00:00+00:00</published>
        <updated>2024-11-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            Michael Herstine
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.unwoundstack.com/blog/dependent-types-and-http-headers.html"/>
        <id>https://blog.jutty.dev/links/unwoundstack-dependent-types-http-headers/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/unwoundstack-dependent-types-http-headers/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Frederik Braun: Modern solutions against cross-site attacks</title>
        <published>2024-11-27T00:00:00+00:00</published>
        <updated>2024-11-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Frederik Braun
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://frederikbraun.de/modern-solutions-xsleaks.html"/>
        <id>https://blog.jutty.dev/links/frederikbraun-cross-site-solutions/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/frederikbraun-cross-site-solutions/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>I ❤ [tmux] shortcuts #2</title>
        <published>2024-11-26T00:00:00+00:00</published>
        <updated>2024-11-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Hyde
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lazybea.rs/ils2/"/>
        <id>https://blog.jutty.dev/links/lazybear-tmux-shortcuts/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lazybear-tmux-shortcuts/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Functional programming self-affirmations - NorikiTech</title>
        <published>2024-11-26T00:00:00+00:00</published>
        <updated>2024-11-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Yuri Karabatov
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://norikitech.com/posts/functional-affirmations/"/>
        <id>https://blog.jutty.dev/links/norikitech-fp-affirmations/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/norikitech-fp-affirmations/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>How I configure my Git identities | benji</title>
        <published>2024-11-25T00:00:00+00:00</published>
        <updated>2024-11-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            benji
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.benji.dog/articles/git-config/"/>
        <id>https://blog.jutty.dev/links/benji-git-identities/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/benji-git-identities/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>re2c — Regular Expressions to Code</title>
        <published>2024-11-25T00:00:00+00:00</published>
        <updated>2024-11-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            Peter Bumbulis
          </name>
        </author>
        
        <author>
          <name>
            Peter Bumbulis
          </name>
        </author>
        
        <author>
          <name>
            Marcus Boerger
          </name>
        </author>
        
        <author>
          <name>
            Dan Nuffer
          </name>
        </author>
        
        <author>
          <name>
            Brian Young
          </name>
        </author>
        
        <author>
          <name>
            Marcus Boerger
          </name>
        </author>
        
        <author>
          <name>
            Dan Nuffer
          </name>
        </author>
        
        <author>
          <name>
            Ulya Trofimovich
          </name>
        </author>
        
        <author>
          <name>
            Serghei Iakovlev
          </name>
        </author>
        
        <author>
          <name>
            Sergei Trofimovich
          </name>
        </author>
        
        <author>
          <name>
            Petr Skocik
          </name>
        </author>
        
        <author>
          <name>
            ligfx
          </name>
        </author>
        
        <author>
          <name>
            raekye
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://re2c.org/"/>
        <id>https://blog.jutty.dev/links/re2c/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/re2c/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>On self-hosting being a patch</title>
        <published>2024-11-23T15:00:00-03:00</published>
        <updated>2024-11-23T15:00:00-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/self-hosting-patch/"/>
        <id>https://blog.jutty.dev/posts/self-hosting-patch/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/self-hosting-patch/">&lt;p&gt;Recently the blog post &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;matduggan.com&#x2F;self-hosting-isnt-a-solution-its-a-patch&#x2F;&quot;&gt;Self-Hosting Isn’t a Solution; It’s A Patch&lt;&#x2F;a&gt; landed in my reading list via &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lobste.rs&#x2F;s&#x2F;eisgx0&#x2F;self_hosting_isn_t_solution_it_s_patch&quot;&gt;Lobsters&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It was an interesting read and I recommend anyone interested in tech decentralization and regulation to check it out, but two thoughts came to mind:&lt;&#x2F;p&gt;
&lt;p&gt;First, perhaps most of the blame is in the concept of “self-hosting” itself. It is too narrow for what it really represents. Something described as self-hosted can most of the times not only be individually-hosted but community-hosted. You can host it yourself and bear all the associated burdens alone, yes, but the way the article portrays this as the only possibility is a bit of a straw man. “Self-hosting” also implies open-source software that you could run for a whole community, a town, a country, a continent, or the planet if you can.&lt;&#x2F;p&gt;
&lt;p&gt;It implies that not only the software’s source is available and its license is a free software license, but that it is designed in a way that you should be able to run it to its full capacity yourself. How large that scale will be, how many people are running it, and how it gets funded and managed can take multiple forms and, if regulation is to be the answer, that is one possible structure (government) that can fund such projects, though it doesn’t have to be.&lt;&#x2F;p&gt;
&lt;p&gt;The second thought is that regulation and self-hosting are not opposed to each other. In fact, they are not at odds at all. So to point to regulation as the better solution and self-hosting as a limited one may pose the illusion that we have to choose – we miss that they actually are far more effective together. That is, unless your goal is just to reform the big-technology-corporation-owns-everything model. For that, regulation alone is much better, with all the long-winded bureaucracy, ceremony and always-open possibility of a reversal.&lt;&#x2F;p&gt;
&lt;p&gt;The regulations in Europe during the past years have surprised in how strong they are in favoring interoperability and some decentralization. Also, more then a few stories about European tech funds putting money into open source projects have crossed the same channels that landed this article among my browser tabs.&lt;&#x2F;p&gt;
&lt;p&gt;Neither of them is, alone, the solution, as you could also see regulation as a lubricant, a way of legitimizing the predatory practices of everyday capitalism by putting it into a nice, confined setting and stamping it with the seal of compliance, however you are able to ascertain it, while still allowing most of the damage to happen, be it a loophole, a cover-up or simply something that didn’t happen to bother the regulators to begin with.&lt;&#x2F;p&gt;
&lt;p&gt;In this sense, the act of building completely independent platforms, able to operate using their own software and infrastructure, comes from a whole different angle and a much more incisive one at that. It works not simply on the level of “how can we make these companies play nice” but of “how can we not depend on these companies to begin with”. This is not solely a concern about reliability, as seen when the article notices how small and underfunded decentralized projects can simply vanish due to lack of funds or inability to stand up to legal threats, it is a concern about privacy and autonomy too.&lt;&#x2F;p&gt;
&lt;p&gt;While it is always sad to see an open-source project or community close down, this is also a community that was built on foundations of interoperability and that values the capacity of taking your data out and moving it elsewhere when needed. I do think platforms like the Fediverse could improve in this regard, as, for instance you can’t always move your content with you as easily as more portable data such as follows and followers, but that is one of many issues we can work on and move past.&lt;&#x2F;p&gt;
&lt;p&gt;Conversely, when a company goes out of business or sells out, a completely different situation is presented to you. Your data may simply be “transitioned” to the infrastructure of another company and the way you interface with it may completely change. Or it may have been built on fully proprietary software and data formats that will essentially become useless a few years after the company shuts down. Or it may simply vanish and you never had a way to get your data to begin with.&lt;&#x2F;p&gt;
&lt;p&gt;Our systems do not need to be high-maintenance, intensive on resources and energy needs. They don’t have to answer every request with availability and latency that measures up to however many nines or zeroes are the current industry standard. They have to attend to the needs of those who are using them, which can be much less demanding. We can run both infrastructure and software at more human scales and learn other ways of growing or shrinking, and we can also scale to high performance and availability too. This is what the concept of a network enables after all, but it is often used to centralize and create dependency instead.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Styling Graphviz with CSS</title>
        <published>2024-11-18T00:00:00+00:00</published>
        <updated>2024-11-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            Chris Palmer
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://noncombatant.org/2024/11/16/styling-graphviz-with-css/"/>
        <id>https://blog.jutty.dev/links/noncombatant-graphviz-css/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/noncombatant-graphviz-css/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>New notes section</title>
        <published>2024-11-17T00:00:01-03:00</published>
        <updated>2024-11-17T00:00:01-03:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/notes/notes/"/>
        <id>https://blog.jutty.dev/notes/notes/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/notes/notes/">&lt;p&gt;This blog now has a Notes section for shorter, less elaborate thoughts, meant to allow more free-form updates as opposed to the longer posts which take much more time to write.&lt;&#x2F;p&gt;
&lt;p&gt;As usual, &lt;a href=&quot;&#x2F;feeds&quot;&gt;dedicated RSS feeds&lt;&#x2F;a&gt; are available for all content or just notes on a per-language basis.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>MomBoard: E-ink display for a parent with amnesia</title>
        <published>2024-11-13T00:00:00+00:00</published>
        <updated>2024-11-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jan Miksovsky
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jan.miksovsky.com/posts/2024/11-12-momboard"/>
        <id>https://blog.jutty.dev/links/jan-miksovsky-momboard/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jan-miksovsky-momboard/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A mental model for Linux file, hard and soft links | Jayesh Bhoot</title>
        <published>2024-11-09T00:00:00+00:00</published>
        <updated>2024-11-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jayesh Bhoot
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://bhoot.dev/2024/on-linux-file-and-links/"/>
        <id>https://blog.jutty.dev/links/bhoot-dev-linux-links/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/bhoot-dev-linux-links/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Configuring SSH Keys for Multiple Accounts</title>
        <published>2024-11-05T00:00:00+00:00</published>
        <updated>2024-11-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            Steven Harman
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://stevenharman.net/configure-ssh-keys-for-multiple-github-accounts"/>
        <id>https://blog.jutty.dev/links/stevenharman-multi-account-ssh/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/stevenharman-multi-account-ssh/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Searching for and navigating Git commits</title>
        <published>2024-11-03T00:00:00+00:00</published>
        <updated>2024-11-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Alex Harri
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alexharri.com/blog/searching-and-navigating-git-commits"/>
        <id>https://blog.jutty.dev/links/alexharri-searching-navigating-commits/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/alexharri-searching-navigating-commits/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Debugging Haskell Type Errors | jelv.is</title>
        <published>2024-11-03T00:00:00+00:00</published>
        <updated>2024-11-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Tikhon Jelvis
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jelv.is/blog/Debugging-Haskell-Type-Errors"/>
        <id>https://blog.jutty.dev/links/jelvis-debugging-haskell-type-errors/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jelvis-debugging-haskell-type-errors/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Nobody cares about decentralization until they do</title>
        <published>2024-10-31T00:00:00+00:00</published>
        <updated>2024-10-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            Kye Fox
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kyefox.com/nobody-cares-about-decentralization-until-they-do/"/>
        <id>https://blog.jutty.dev/links/kyefox-nobody-cares-about-decentralization/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/kyefox-nobody-cares-about-decentralization/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>nickgerace&#x2F;gfold: CLI tool to keep track of Git repositories</title>
        <published>2024-10-29T00:00:00+00:00</published>
        <updated>2024-10-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            Nick Gerace (nickgerace)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/nickgerace/gfold"/>
        <id>https://blog.jutty.dev/links/nickgerace-gfold/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/nickgerace-gfold/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Improving SSH&#x27;s security with SSHFP DNS records | APNIC Blog</title>
        <published>2024-10-26T00:00:00+00:00</published>
        <updated>2024-10-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Sebastian Neef
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.apnic.net/2022/12/02/improving-sshs-security-with-sshfp-dns-records/"/>
        <id>https://blog.jutty.dev/links/apnic-sshfp/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/apnic-sshfp/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Smarter than &#x27;Ctrl+F&#x27;: Linking Directly to Web Page Content</title>
        <published>2024-10-24T00:00:00+00:00</published>
        <updated>2024-10-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            Ahmad Alfy
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alfy.blog/2024/10/19/linking-directly-to-web-page-content.html"/>
        <id>https://blog.jutty.dev/links/alfy-text-fragments/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/alfy-text-fragments/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Solene&#x27;% : A dedicated administration workstation</title>
        <published>2024-10-23T00:00:00+00:00</published>
        <updated>2024-10-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            Solène Rapenne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dataswamp.org/~solene/2024-10-19-my-admin-workstation.html"/>
        <id>https://blog.jutty.dev/links/solene-admin-workstation/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/solene-admin-workstation/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>against &#x2F;tmp - Tony Finch</title>
        <published>2024-10-22T00:00:00+00:00</published>
        <updated>2024-10-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            Tony Finch
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dotat.at/@/2024-10-22-tmp.html"/>
        <id>https://blog.jutty.dev/links/dotat-against-tmp/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dotat-against-tmp/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Typst 0.12 is just ... better</title>
        <published>2024-10-18T00:00:00+00:00</published>
        <updated>2024-10-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            Typst GmbH
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://typst.app/blog/2024/typst-0.12/"/>
        <id>https://blog.jutty.dev/links/typst-0-12/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/typst-0-12/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>That&#x27;s Not an Abstraction, That&#x27;s Just a Layer of Indirection</title>
        <published>2024-10-14T00:00:00+00:00</published>
        <updated>2024-10-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            Fernando Hurtado Cardenas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://fhur.me/posts/2024/thats-not-an-abstraction"/>
        <id>https://blog.jutty.dev/links/fhur-me-abstraction/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fhur-me-abstraction/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>FFmpeg Explorer</title>
        <published>2024-10-14T00:00:00+00:00</published>
        <updated>2024-10-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            Sam Lavigne
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lav.io/notes/ffmpeg-explorer/"/>
        <id>https://blog.jutty.dev/links/lav-io-ffmpeg-explorer/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lav-io-ffmpeg-explorer/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The ultimate guide to Haskell Strings · Hasufell&#x27;s blog</title>
        <published>2024-10-11T00:00:00+00:00</published>
        <updated>2024-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            Julian Ospald
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hasufell.github.io/posts/2024-05-07-ultimate-string-guide.html"/>
        <id>https://blog.jutty.dev/links/hasufell-haskell-strings/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hasufell-haskell-strings/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>HTML for People</title>
        <published>2024-10-10T00:00:00+00:00</published>
        <updated>2024-10-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Blake Watson
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.htmlforpeople.com/"/>
        <id>https://blog.jutty.dev/links/html-for-people/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/html-for-people/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Statically Typed Functional Programming with Python 3.12</title>
        <published>2024-10-07T00:00:00+00:00</published>
        <updated>2024-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            Oskar Wickström
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://wickstrom.tech/2024-05-23-statically-typed-functional-programming-python-312.html"/>
        <id>https://blog.jutty.dev/links/wickstrom-functional-python-3-12/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/wickstrom-functional-python-3-12/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Chris&#x27;s Wiki :: blog&#x2F;unix</title>
        <published>2024-10-05T00:00:00+00:00</published>
        <updated>2024-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            Chris Siebenmann
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/cks-blog-unix/"/>
        <id>https://blog.jutty.dev/links/cks-blog-unix/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/cks-blog-unix/">&lt;p&gt;A hypermedia rabbit hole in which I quickly fell.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>wrestling the web from corporate control requires making it boring again</title>
        <published>2024-10-05T00:00:00+00:00</published>
        <updated>2024-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            washbear
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/washbear-wrestling-the-web/"/>
        <id>https://blog.jutty.dev/links/washbear-wrestling-the-web/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/washbear-wrestling-the-web/">&lt;blockquote&gt;
&lt;p&gt;In an age where web is essential, we need a universal web browser for minority platforms. One that focuses on keeping HTML+JS working rather than chasing things like “WebVR” and collaborating with the ads industry. Unfortunately, I think the system has been set up to ensure that small players are no longer possible. Let’s hope I’m proven wrong.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sandboxing Adoption in Open Source Ecosystems</title>
        <published>2024-10-04T00:00:00+00:00</published>
        <updated>2024-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Maysara Alhindi
          </name>
        </author>
        
        <author>
          <name>
            Joseph Hallett
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://arxiv.org/abs/2405.06447"/>
        <id>https://blog.jutty.dev/links/alhindi-sandboxing/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/alhindi-sandboxing/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Reticular Society</title>
        <published>2024-10-04T00:00:00+00:00</published>
        <updated>2024-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Ian Alan Paul
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/the-reticular-society/"/>
        <id>https://blog.jutty.dev/links/the-reticular-society/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/the-reticular-society/">&lt;blockquote&gt;
&lt;p&gt;In &lt;em&gt;necroreticular flows&lt;&#x2F;em&gt; which cut across algorithmically distributed gigs and connected places of work, the number of lives integrated together corresponds to the interoperable potential of the reticular society’s optimization and domination, &lt;em&gt;subsuming life&lt;&#x2F;em&gt; and in so doing &lt;em&gt;circulating death&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>carl: modern version of cal that can incorporate ICal (ics) data</title>
        <published>2024-10-01T00:00:00+00:00</published>
        <updated>2024-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Birger Schacht
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/b1rger-carl/"/>
        <id>https://blog.jutty.dev/links/b1rger-carl/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/b1rger-carl/">&lt;p&gt;This is superb in conjunction with &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vdirsyncer.pimutils.org&#x2F;en&#x2F;stable&#x2F;&quot;&gt;vdirsyncer&lt;&#x2F;a&gt;, which I’ve been using for a long time for exactly the purpose of having a local directory of &lt;code&gt;.ics&lt;&#x2F;code&gt; files for each of my Nextcloud DAV calendars.&lt;&#x2F;p&gt;
&lt;p&gt;If you like this, you may also like &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pimutils&#x2F;khal&quot;&gt;khal&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>diffnav: git diff pager based on delta but with a file tree</title>
        <published>2024-10-01T00:00:00+00:00</published>
        <updated>2024-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Dolev Hadar (dlvhdr)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/dlvhdr/diffnav"/>
        <id>https://blog.jutty.dev/links/dlvhdr-diffnav/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dlvhdr-diffnav/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>I Want Process-Aware Types</title>
        <published>2024-09-30T00:00:00+00:00</published>
        <updated>2024-09-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            Sean Barag
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sean.barag.org/writing/process-aware-types#proposed-the-inproc-and-xproc-type-modifiers"/>
        <id>https://blog.jutty.dev/links/barag-process-aware-types/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/barag-process-aware-types/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Alopex Networks Wiki</title>
        <published>2024-09-29T00:00:00+00:00</published>
        <updated>2024-09-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            Simon Heath
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://wiki.alopex.li/CrystalNotes"/>
        <id>https://blog.jutty.dev/links/alopex-crystal-notes/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/alopex-crystal-notes/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Small Internet protocol roundup</title>
        <published>2024-09-29T00:00:00+00:00</published>
        <updated>2024-09-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            D. Bohdan
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="http://dbohdan.sdf.org/smolnet/"/>
        <id>https://blog.jutty.dev/links/dbohdan-smallweb-txt/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dbohdan-smallweb-txt/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Release tmux 3.5 · tmux&#x2F;tmux</title>
        <published>2024-09-27T00:00:00+00:00</published>
        <updated>2024-09-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Nicholas Marriott (nicm)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/links/tmux-3-5/"/>
        <id>https://blog.jutty.dev/links/tmux-3-5/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/tmux-3-5/">&lt;p&gt;Interesting &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;tmux&#x2F;tmux&#x2F;3.5&#x2F;CHANGES&quot;&gt;changes&lt;&#x2F;a&gt; include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;“Display hyperlinks in copy mode and add &lt;code&gt;copy_cursor_hyperlink&lt;&#x2F;code&gt; format to get
the hyperlink under the cursor.”&lt;&#x2F;li&gt;
&lt;li&gt;“Add a prefix timeout option.”&lt;&#x2F;li&gt;
&lt;li&gt;“Add mirrored versions of the &lt;code&gt;main-horizontal&lt;&#x2F;code&gt; and &lt;code&gt;main-vertical&lt;&#x2F;code&gt; layouts where
the main pane is bottom or right instead of top or left.”&lt;&#x2F;li&gt;
&lt;li&gt;“Add &lt;code&gt;--enable-jemalloc&lt;&#x2F;code&gt; to build with jemalloc memory allocator (since glibc
malloc is so poor).”&lt;&#x2F;li&gt;
&lt;li&gt;“Add &lt;code&gt;N&lt;&#x2F;code&gt; to search backwards in tree modes.”&lt;&#x2F;li&gt;
&lt;li&gt;“Use &lt;code&gt;default-shell&lt;&#x2F;code&gt; for command prompt, &lt;code&gt;#()&lt;&#x2F;code&gt; and popups.”&lt;&#x2F;li&gt;
&lt;li&gt;“Add a &lt;code&gt;command-error&lt;&#x2F;code&gt; hook when a command fails.”&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Debating ifupdown replacements for Debian trixie [LWN.net]</title>
        <published>2024-09-26T00:00:00+00:00</published>
        <updated>2024-09-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Joe Brockmeier
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lwn.net/Articles/989055/"/>
        <id>https://blog.jutty.dev/links/lwn-trixie-ifupdown/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lwn-trixie-ifupdown/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Project Cybersyn - 99% Invisible</title>
        <published>2024-09-22T00:00:00+00:00</published>
        <updated>2024-09-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            99% Invisible
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://99percentinvisible.org/episode/project-cybersyn/"/>
        <id>https://blog.jutty.dev/links/99percentinvisble-cybersyn/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/99percentinvisble-cybersyn/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lagrange v1.18: TUI and Misfin</title>
        <published>2024-09-22T00:00:00+00:00</published>
        <updated>2024-09-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jaakko Keränen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://gmi.skyjake.fi/gemlog/2024-09_lagrange-1.18.gmi"/>
        <id>https://blog.jutty.dev/links/lagrange-1-18/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/lagrange-1-18/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>jacek-kurlit&#x2F;pik: Process Interactive Kill</title>
        <published>2024-09-17T00:00:00+00:00</published>
        <updated>2024-09-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            RustyJack (jacek-kurlit)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/jacek-kurlit/pik"/>
        <id>https://blog.jutty.dev/links/jacek-kurlit-pik/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jacek-kurlit-pik/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The First HTML LSP That Reports Syntax Errors | Loris Cro&#x27;s Blog</title>
        <published>2024-09-11T00:00:00+00:00</published>
        <updated>2024-09-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            Loris Cro
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kristoff.it/blog/first-html-lsp/"/>
        <id>https://blog.jutty.dev/links/kristoff-html-lsp/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/kristoff-html-lsp/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Make Your Own Read-Only Device With NetBSD - IT Notes</title>
        <published>2024-09-10T00:00:00+00:00</published>
        <updated>2024-09-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Stefano Marinelli
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://it-notes.dragas.net/2024/09/10/make-your-own-readonly-device-with-netbsd/"/>
        <id>https://blog.jutty.dev/links/dragas-read-only-netbsd/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/dragas-read-only-netbsd/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Critical analysis of Fediverse decentralization promises</title>
        <published>2024-09-08T00:00:00+00:00</published>
        <updated>2024-09-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            Henrique S. Xavier
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://arxiv.org/abs/2408.15383"/>
        <id>https://blog.jutty.dev/links/xavier-fediverse-decentralization-promises/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/xavier-fediverse-decentralization-promises/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Unix command line conventions over time</title>
        <published>2024-09-06T00:00:00+00:00</published>
        <updated>2024-09-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            Lars Wirzenius
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.liw.fi/posts/2022/05/07/unix-cli/"/>
        <id>https://blog.jutty.dev/links/wirzenius-unix-cli-conventions/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/wirzenius-unix-cli-conventions/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>FenTiger&#x2F;FedIAM: Login and access control based on open identities</title>
        <published>2024-09-01T00:00:00+00:00</published>
        <updated>2024-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Mike P (FenTiger)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://codeberg.org/FenTiger/FedIAM"/>
        <id>https://blog.jutty.dev/links/fentiger-fediam/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fentiger-fediam/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Notice on RSS feeds</title>
        <published>2024-09-01T00:00:00+00:00</published>
        <updated>2024-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/notice-on-rss-feeds/"/>
        <id>https://blog.jutty.dev/posts/notice-on-rss-feeds/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/notice-on-rss-feeds/">&lt;p&gt;For those subscribing to this blog’s RSS feeds:&lt;&#x2F;p&gt;
&lt;p&gt;First, if you are getting links but would rather only be notified about posts, you are probably subscribed to an “all content” feed. You can find all feed options in the &lt;a href=&quot;&#x2F;feeds&quot;&gt;feeds&lt;&#x2F;a&gt; page.&lt;&#x2F;p&gt;
&lt;p&gt;Second, as per a &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.bsd.cafe&#x2F;@jutty&#x2F;113013450769036273&quot;&gt;recent thread&lt;&#x2F;a&gt; I started on Mastodon, I am planning on keeping only the Atom feeds in the future.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, all feeds are served in two formats, for example:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.jutty.dev&#x2F;posts&#x2F;rss.xml&quot;&gt;https:&#x2F;&#x2F;blog.jutty.dev&#x2F;posts&#x2F;rss.xml&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.jutty.dev&#x2F;posts&#x2F;atom.xml&quot;&gt;https:&#x2F;&#x2F;blog.jutty.dev&#x2F;posts&#x2F;atom.xml&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;On a much later date, I plan on retiring the &lt;code&gt;rss.xml&lt;&#x2F;code&gt; feeds, so if that’s what you are subscribed to, consider changing to the equivalent &lt;code&gt;atom.xml&lt;&#x2F;code&gt; feed sometime in the future.&lt;&#x2F;p&gt;
&lt;p&gt;Both formats will keep working for now. The only immediate change will be that only the &lt;code&gt;atom.xml&lt;&#x2F;code&gt; ones will be advertised on the &lt;a href=&quot;&#x2F;feeds&quot;&gt;feeds&lt;&#x2F;a&gt; page and on HTML meta tags.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>jatcwang&#x2F;instant-scala: instant Scala script startup</title>
        <published>2024-08-30T00:00:00+00:00</published>
        <updated>2024-08-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jacob Wang (jatcwang)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/jatcwang/instant-scala"/>
        <id>https://blog.jutty.dev/links/jatcwang-instant-scala/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jatcwang-instant-scala/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Deterministic Replay of QEMU Emulation</title>
        <published>2024-08-29T00:00:00+00:00</published>
        <updated>2024-08-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            The QEMU Project Developers
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.qemu.org/docs/master/system/replay.html"/>
        <id>https://blog.jutty.dev/links/qemu-replay/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/qemu-replay/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hurl 5.0.0, the Parallel Edition</title>
        <published>2024-08-28T00:00:00+00:00</published>
        <updated>2024-08-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            CCMD Team
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hurl.dev/blog/2024/08/29/hurl-5.0.0-the-parallel-edition.html"/>
        <id>https://blog.jutty.dev/links/hurl-5-0-0/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hurl-5-0-0/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Good programmers worry about data structures and their relationships</title>
        <published>2024-08-27T00:00:00+00:00</published>
        <updated>2024-08-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Engineer&#x27;s Codex
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://read.engineerscodex.com/p/good-programmers-worry-about-data"/>
        <id>https://blog.jutty.dev/links/engineerscodex-data-structures/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/engineerscodex-data-structures/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Misconceptions about the UNIX Philosophy</title>
        <published>2024-08-26T00:00:00+00:00</published>
        <updated>2024-08-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jacob Moody
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://posixcafe.org/blogs/2024/01/05/0/"/>
        <id>https://blog.jutty.dev/links/posixcafe-unix-misconceptions/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/posixcafe-unix-misconceptions/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Impressionist Blogging Movement - Jim Nielsen’s Blog</title>
        <published>2024-08-20T00:00:00+00:00</published>
        <updated>2024-08-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            Jim Nielsen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jim-nielsen.com/2024/impressionist-blogging/"/>
        <id>https://blog.jutty.dev/links/nielsen-impressionist-blogging/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/nielsen-impressionist-blogging/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Support PUT, PATCH, and DELETE in HTML Forms</title>
        <published>2024-08-19T00:00:00+00:00</published>
        <updated>2024-08-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            Alexander Petros
          </name>
        </author>
        
        <author>
          <name>
            Carson Gross
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alexanderpetros.com/triptych/form-http-methods"/>
        <id>https://blog.jutty.dev/links/triptych-form-http-methods/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/triptych-form-http-methods/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Giving up simplicity</title>
        <published>2024-08-10T00:00:00+00:00</published>
        <updated>2024-08-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/unwinding/"/>
        <id>https://blog.jutty.dev/posts/unwinding/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/unwinding/">&lt;p&gt;&lt;em&gt;or&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;unwinding&quot;&gt;Unwinding&lt;&#x2F;h1&gt;
&lt;p&gt;Due to a worker strike, the university semester ended late this year. That meant everything had to be compressed into little more than a month in order to wrap up what would have taken four. Now that we’re almost through it, my mind wanders to writing. It is almost always what springs from the void in me, what has been winded up loosens and the scattered meaning starts to recollect into the drain of language and swirl through the piping of my nervous system.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Wind&lt;&#x2F;em&gt; is air that has been somehow compressed. If there was no pressure pushing it anywhere, it would be just expansive air, floating in peace with the atmosphere.&lt;&#x2F;p&gt;
&lt;p&gt;If you’d entertain this thought further, consider a work of visual art. It can be more figurative, clearly depicting shapes that mean something, and therefore able to convey an array of ideas to whatever extent of detail the artist wants. Conversely, it can be more abstract, where ideas will be a lot more sparse, possibly to the point where nothing at all is conveyed other than the appearance, whatever aesthetic is employed being the whole message in itself. Very little is packed into the work, just like the air you can’t even feel weighing on you.&lt;&#x2F;p&gt;
&lt;p&gt;In computing, and more specifically in the realm of programming – a craft presently overshadowed by the semantically starved jargon of whatever the department responsible for inflating public perception numbers is called these days – simplicity is often emphasized. Code is supposed to be clear, expressive and clean. A software application is supposed to have as few dependencies as possible, and strive to keep it simple, or risk stupidity.&lt;&#x2F;p&gt;
&lt;p&gt;While that is a lofty goal, and while clear, expressive and clean code is a refreshing and tranquilizing sight, more often than not software just can’t be simple.&lt;&#x2F;p&gt;
&lt;p&gt;Not having dependencies means implementing more and more yourself. There are corner cases to cover, tests to run, different architectures and operating systems to support. Even the simplest of software ideas, say, a calculator, a program that prints back a sentence in reverse, that displays a picture you give it, whatever you conceive as the simplest use case, is hardly ever implemented with simplicity in the naïve sense of something that is, quite literally, simplistic.&lt;&#x2F;p&gt;
&lt;p&gt;More often than not, simplicity is actually abstraction. The breaking apart of complexity behind a simpler facade. More so a way to manage complexity by conveying it simply than to enact simplicity in its actual sense. Each step in abstraction is actually a layer deeper into intricacy. And yet, it makes things immensely easier to manage and understand.&lt;&#x2F;p&gt;
&lt;p&gt;For some reason, I have always felt very drawn to abstract works. Staring into them, there is no expectation to understand, get, or argue about. Interestingly, to me that also means they couldn’t be any more clear. It does not mean a specific, intelligible message is conveyed from the artist to me, rather, it means whatever impression is caused on the viewer was never intended to reach too deep anyways. It never intended to carry that much through its medium.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes, too much detail, no matter how specific, can draw an idea so far out that it becomes harder and harder to grasp. In contrast to that, a brisk exposition can get the message across like lightning.&lt;&#x2F;p&gt;
&lt;p&gt;So detail does not always convey meaning, although it can convey a specific meaning to someone who will bear with you as you build the context for it. Otherwise, you could convey your message just as effectively in an abstract manner if your receiver already has that context from the outset.&lt;&#x2F;p&gt;
&lt;p&gt;In computing, such possibility is simply absent from us. No context whatsoever can be assumed, and if it is present, that is because some other structure is providing it.&lt;&#x2F;p&gt;
&lt;p&gt;Complexity produces confusion, confusion produces frustration, and frustration can lead to either surrender or a rebound. So the interesting thing about this pressurizing of ideas is that it springs back into action a process that may reverse it or deflect into something else entirely.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of surrendering to the frustration of complexity, sometimes I actually take the time to recollect myself and analyze it into understanding. This feeling of winning over something that had me on my knees and ready to give up is a very gratifying one. It convinces me I can squeeze grit from despair if I bet on it and willingly risk desperation in order to see it through.&lt;&#x2F;p&gt;
&lt;p&gt;Yet, after chasing the deadline of effort all of it relaxes back into this state. In it, the only way to rest is to embrace complexity as the whole, and simplicity as one of its manifestations. It is so cold right now in the south, but in the north it is not. Four days and nine hours ago it was the peak of the winter. I’m wrapped in blankets and the room is dark like the depths of a submarine cave, LED lights here and there like fluorescent eyes blinking in silence.&lt;&#x2F;p&gt;
&lt;p&gt;The professor had us build games and then present them to the whole faculty. Among the outputs, one algorithm I produced stuck with me for what I deem is simplicity. It is responsible for causing an enemy to chase the player by finding the difference between their positions and lowering it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt; move_to&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	var x_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	var y_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt; y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;	if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function&quot;&gt; abs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;x_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; chase_speed:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;		if&lt;&#x2F;span&gt;&lt;span&gt; x_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;			self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; -=&lt;&#x2F;span&gt;&lt;span&gt; chase_speed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;		else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;			self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; chase_speed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;	else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;		self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; x_difference&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;	if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function&quot;&gt; abs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;y_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; chase_speed:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;		if&lt;&#x2F;span&gt;&lt;span&gt; y_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;			self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; -=&lt;&#x2F;span&gt;&lt;span&gt; chase_speed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;		else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;			self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; chase_speed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;	else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special&quot;&gt;		self&lt;&#x2F;span&gt;&lt;span&gt;.global_position.y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; y_difference&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It could be further abstracted. The logic is repetitive. The math could be condensed. But should it? Would that make it harder or easier to understand? And to whom? There is no single answer, and yet I would really appreciate knowing.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>mrusme&#x2F;reader: for your command line what the &#x27;readability view&#x27; is for browsers</title>
        <published>2024-08-06T00:00:00+00:00</published>
        <updated>2024-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            マリウス
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/mrusme/reader"/>
        <id>https://blog.jutty.dev/links/mrusme-reader/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/mrusme-reader/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>A handful of reasons JavaScript won’t be available - Piccalilli</title>
        <published>2024-08-01T00:00:00+00:00</published>
        <updated>2024-08-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Andy Bell
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://piccalil.li/blog/a-handful-of-reasons-javascript-wont-be-available/"/>
        <id>https://blog.jutty.dev/links/piccalil-no-javascript-reasons/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/piccalil-no-javascript-reasons/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>jgs font</title>
        <published>2024-07-02T00:00:00+00:00</published>
        <updated>2024-07-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            Adel Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adelfaure.net/tools/jgs/"/>
        <id>https://blog.jutty.dev/links/adelfaure-jgs-font/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/adelfaure-jgs-font/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing tori</title>
        <published>2024-06-30T00:00:00+00:00</published>
        <updated>2024-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/introducing-tori/"/>
        <id>https://blog.jutty.dev/posts/introducing-tori/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/introducing-tori/">&lt;p&gt;&lt;strong&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tori.jutty.dev&#x2F;&quot;&gt;tori&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; is a tool to track your personal systems’ configurations and replicate them.&lt;&#x2F;p&gt;
&lt;p&gt;For the past 5 months, I’ve been simultaneously using and writing it to manage my main machine’s configuration. By “manage the configuration” what I mean is keeping track of installed packages, configuration files, symlinks, and other settings that can be queried and set through command line interfaces.&lt;&#x2F;p&gt;
&lt;p&gt;After installing a given system, I wanted to get it to the same configuration state I was used to, or to a certain configuration specific to its purpose. Just copying backups would certainly be a very manual task, namely because:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Not all settings live in &lt;code&gt;&#x2F;etc&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Some settings must be set using a specific CLI utility&lt;&#x2F;li&gt;
&lt;li&gt;Backups usually carry an overwhelming amount of redundant default configuration you never even touched&lt;&#x2F;li&gt;
&lt;li&gt;It does not track what is changing as you are still using the system&lt;&#x2F;li&gt;
&lt;li&gt;I actually wanted to &lt;em&gt;know&lt;&#x2F;em&gt; what I was tracking&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Configuring a system can become a very vague process as you start to lose track of where the changes are being made and what is the specific configuration needed for something to work.&lt;&#x2F;p&gt;
&lt;p&gt;Every time you change some configuration file, every time you create a symlink somewhere, that’s all having effects on the system that you may expect to be there in the future, but you may not remember how to accomplish that. This drift between what you have and what you are able to replicate only grows as you keep using your system.&lt;&#x2F;p&gt;
&lt;p&gt;To get a better idea, see the code snippet below. It’s from the main file that I use to manage all function calls:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  xbps_get_many&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_service&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dbus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_group&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; audio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_group&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; video&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  copy&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dhcpcd.conf &#x2F;etc&#x2F;dhcpcd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  place&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; kernel-cmd-line.conf &#x2F;etc&#x2F;dracut.conf.d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_link&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;localtime &#x2F;usr&#x2F;share&#x2F;zoneinfo&#x2F;America&#x2F;Sao_Paulo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_nix&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; tailspin tspin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_cargo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; taplo-cli taplo&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; --locked&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_bun&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; bash-language-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_bin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;hackerb9&#x2F;lsix&#x2F;master&#x2F;lsix&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; lsix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_gsettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; gtk-theme&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Plata-Noir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_gsettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; font-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Mononoki Nerd Font Regular&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What is happening here:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A file named &lt;code&gt;packages&lt;&#x2F;code&gt; containing package names is parsed and all packages are queried and installed by the &lt;code&gt;xbps&lt;&#x2F;code&gt; package manager, if not already installed&lt;&#x2F;li&gt;
&lt;li&gt;Service &lt;code&gt;dbus&lt;&#x2F;code&gt; is enabled if not already enabled&lt;&#x2F;li&gt;
&lt;li&gt;The user is added to groups &lt;code&gt;audio&lt;&#x2F;code&gt; and &lt;code&gt;video&lt;&#x2F;code&gt;, unless already in them&lt;&#x2F;li&gt;
&lt;li&gt;File &lt;code&gt;dhcpcd.conf&lt;&#x2F;code&gt; from the configuration directory’s &lt;code&gt;base&lt;&#x2F;code&gt; directory is checked against the one in the passed path and overwrites it if the user chooses to do so&lt;&#x2F;li&gt;
&lt;li&gt;File &lt;code&gt;kernel-cmd-line.conf&lt;&#x2F;code&gt; from the configuration directory’s &lt;code&gt;base&lt;&#x2F;code&gt; directory is copied into the passed path. If the file already exists or differs, tori will present an error&lt;&#x2F;li&gt;
&lt;li&gt;A symlink is checked to be on &lt;code&gt;&#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt; pointing to the passed path. If it doesn’t, it is created or fixed&lt;&#x2F;li&gt;
&lt;li&gt;If not installed, a few packages are installed using different package managers: &lt;code&gt;tailspin&lt;&#x2F;code&gt;, &lt;code&gt;taplo&lt;&#x2F;code&gt; and &lt;code&gt;bash-language-server&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;If absent, an executable for &lt;code&gt;lsix&lt;&#x2F;code&gt; is downloaded from a URL and placed at &lt;code&gt;~&#x2F;.local&#x2F;bin&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Some &lt;code&gt;gsettings&lt;&#x2F;code&gt; values are read and set if they differ: &lt;code&gt;gtk-theme&lt;&#x2F;code&gt; and &lt;code&gt;font-name&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Notice how everything is conditioned to the system not already presenting that state? tori aims to be idempotent. Running it twice should do nothing the second time it runs so you can run it multiple times while making changes without any doubled effects.&lt;&#x2F;p&gt;
&lt;p&gt;I mentioned a &lt;code&gt;base&lt;&#x2F;code&gt; directory. This is what a sample tori directory would look like in its present state:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── base&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── dhcpcd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kernel-cmd-line.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── vars.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .bkp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── canonical&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── opt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── ephemeral&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│       └── etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── checks.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── copy.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── get.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── strap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What you are seeing in this sample of the directory are the following files and directories:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;base&lt;&#x2F;code&gt;: Where you place the configuration files that functions like &lt;code&gt;copy&lt;&#x2F;code&gt; and &lt;code&gt;place&lt;&#x2F;code&gt; will look for and copy into the desired locations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.bkp&#x2F;canonical&lt;&#x2F;code&gt;: Where tori will look for initial backups and create them if none exists&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.bkp&#x2F;ephemeral&lt;&#x2F;code&gt;: Where tori will place timestamped backups every time a file is modified or overwritten&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;src&lt;&#x2F;code&gt;: Where the source files live, mostly containing function definitions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;strap&lt;&#x2F;code&gt;: The main file used to call the functions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Because I developed tori for my own purposes initially, I didn’t really care to separate the actual source files from the context-sensitive data. While a mistake from a higher level, it allowed me to just keep developing the whole system configuration and the code that tracked it from a single, version-controlled location, amounting to very little complexity. I can’t deny to have enjoyed it so far, but going forward that is going to change.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, tori is able to install several package managers and their packages, including xbps, apt, nix, opam, stack, cargo, go, sdkmanager, npm, flatpak and pipx.&lt;&#x2F;p&gt;
&lt;p&gt;It can also perform several other tasks:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;setup programming runtimes for OCaml, Scala (via Coursier), Go, JavaScript (node and bun), Rust (via rustup)&lt;&#x2F;li&gt;
&lt;li&gt;generate GPG certificates&lt;&#x2F;li&gt;
&lt;li&gt;query and set options with &lt;code&gt;update-alternatives&lt;&#x2F;code&gt; and &lt;code&gt;gsettings&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;change the user shell&lt;&#x2F;li&gt;
&lt;li&gt;check and enable services (systemd and runit)&lt;&#x2F;li&gt;
&lt;li&gt;download pre-built binaries from tarballs and (g)zip files, unpacking and making them executable&lt;&#x2F;li&gt;
&lt;li&gt;get files through the network using rsync&lt;&#x2F;li&gt;
&lt;li&gt;several other things likely not worth mentioning&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The application slowly grew to accommodate many of my needs, but I also made it very hard to share with the world in the process, since I never really meant to go public with it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;portability-issues&quot;&gt;Portability issues
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#portability-issues&quot; aria-label=&quot;Anchor link for: portability-issues&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Despite it being very useful to me in its current state and still being something I actively use every day, a lot of it is hard-coded for my very personal use. It was not written with portability in mind and therefore requires a lot of source-code editing to use in a different system.&lt;&#x2F;p&gt;
&lt;p&gt;For instance, when I switched from Debian to Void Linux, most of it broke. I certainly would not expect the package list to be compatible between them, but I realized at that point how tightly it was coupled to Debian.&lt;&#x2F;p&gt;
&lt;p&gt;When I started delving deeper into FreeBSD and setting up the system, I kept reaching out to something like tori. But it wasn’t there, and it wouldn’t work even if it were.&lt;&#x2F;p&gt;
&lt;p&gt;Something that certainly influenced my desire to write tori was my experience using NixOS, which was full of mixed feelings, but undeniably had good feelings that stuck.&lt;&#x2F;p&gt;
&lt;p&gt;I really liked being able to manage the system configuration and packages from a single file. But, at the same time, I felt it was overkill. It was limiting because most of the time you were &lt;strong&gt;forced&lt;&#x2F;strong&gt; to configure things through its interfaces. It was basically incompatible with what every other Unix system expects, and therefore what people who write software for these systems also expect.&lt;&#x2F;p&gt;
&lt;p&gt;I appreciated bringing the system configuration to a centralized file, but I certainly did not want to manage all my &lt;code&gt;~&#x2F;.config&lt;&#x2F;code&gt; configuration files from that same place. After writing tori, I can choose what to place under its tracking and what not to. Third-party software still works as both me and its creators expect it to, instead of my system breaking things and needing them to work the way &lt;em&gt;it&lt;&#x2F;em&gt; expects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;glad-to-reinvent-the-wheel&quot;&gt;Glad to reinvent the wheel
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#glad-to-reinvent-the-wheel&quot; aria-label=&quot;Anchor link for: glad-to-reinvent-the-wheel&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;While I understand there are very mature and powerful tools to manage a system’s state and reproduce it, I am aiming here for a much simpler use case. I have no intention to see it used in enterprise or distributed systems. It is all about managing how your personal computing is set up and having a backup of how you did it.&lt;&#x2F;p&gt;
&lt;p&gt;What I need is not a tool that can orchestrate a fleet of containers running a given configuration. What I need is a tool that can run in a bare system that just got installed and get it to a state that feels useful to me. I do not want it to run instructions over a range of IPs, I just want to be able to check at any time if the system state has diverged from the configuration I am using to track it. I wanted a tool that would help me develop a different habit when I need to make system-level changes.&lt;&#x2F;p&gt;
&lt;p&gt;And finally, I suppose I just really wanted to build this. I really enjoy the process of configuring operating systems and learning how they work and differ. And I really wanted to learn more about portable, POSIX-compatible shell scripting.&lt;&#x2F;p&gt;
&lt;p&gt;So I decided to rewrite it with portability in mind. I am doing this rewrite in FreeBSD, to put the portability to the test. Once some basic functionality is done, the next step will be bringing it to Void Linux, Debian and NetBSD.&lt;&#x2F;p&gt;
&lt;p&gt;tori is a bird that has just hatched, so everything is still very, very crude. At this stage, the docs often show intentions rather than implemented functionality. Still, because it is something I’ve come to depend on, it has this rewarding sense of usefulness behind it.&lt;&#x2F;p&gt;
&lt;p&gt;If it sounds interesting to you, take a look. You can follow development at the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;tori&#x2F;tori&quot;&gt;main repository at Codeberg&lt;&#x2F;a&gt; or through its mirrors on &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tori-nest&#x2F;tori&quot;&gt;GitHub&lt;&#x2F;a&gt; and &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tori.jutty.dev&#x2F;code&quot;&gt;elsewhere&lt;&#x2F;a&gt;. Going forward, I will also probably be talking a lot about it on my &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.bsd.cafe&#x2F;@jutty&quot;&gt;Mastodon profile&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Differential Analysis: A Summary</title>
        <published>2024-06-28T00:00:00+00:00</published>
        <updated>2024-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brown PLT
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.brownplt.org/2024/06/27/differential-analysis.html"/>
        <id>https://blog.jutty.dev/links/brownplt-differential-analysis/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/brownplt-differential-analysis/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>aryak&#x2F;mozhi: Mozhi is an alternative-frontend for many translation engines. - Codeberg.org</title>
        <published>2024-06-27T00:00:00+00:00</published>
        <updated>2024-06-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Arya Kiran
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://codeberg.org/aryak/mozhi"/>
        <id>https://blog.jutty.dev/links/aryak-mozhi/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/aryak-mozhi/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>JFryy&#x2F;qq: jq multi-configuration format tool with interactive REPL.</title>
        <published>2024-06-23T00:00:00+00:00</published>
        <updated>2024-06-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            James Fotherby (JFryy)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/JFryy/qq/"/>
        <id>https://blog.jutty.dev/links/jfryy-qq/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/jfryy-qq/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>phyphox | F-Droid - Free and Open Source Android App Repository</title>
        <published>2024-06-21T00:00:00+00:00</published>
        <updated>2024-06-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            RWTH Aachen University
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://f-droid.org/packages/de.rwth_aachen.phyphox/"/>
        <id>https://blog.jutty.dev/links/fdroid-phyphox/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fdroid-phyphox/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>UserLAnd | F-Droid - Free and Open Source Android App Repository</title>
        <published>2024-06-21T00:00:00+00:00</published>
        <updated>2024-06-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            UserLAnd Technologies
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://f-droid.org/en/packages/tech.ula/"/>
        <id>https://blog.jutty.dev/links/fdroid-userland/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fdroid-userland/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sounds of the Forest - Soundmap  Timber Festival</title>
        <published>2024-06-14T00:00:00+00:00</published>
        <updated>2024-06-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            Wild Rumpus CIC
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://timberfestival.org.uk/soundsoftheforest-soundmap/"/>
        <id>https://blog.jutty.dev/links/sounds-of-the-forest/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/sounds-of-the-forest/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Effects Showroom - TerminalTextEffects Docs</title>
        <published>2024-06-10T00:00:00+00:00</published>
        <updated>2024-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            chrisbuilds
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://chrisbuilds.github.io/terminaltexteffects/showroom/"/>
        <id>https://blog.jutty.dev/links/chrisbuilds-effects-showroom/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/chrisbuilds-effects-showroom/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Piku</title>
        <published>2024-06-10T00:00:00+00:00</published>
        <updated>2024-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Rui Carmo
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://piku.github.io/"/>
        <id>https://blog.jutty.dev/links/piku/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/piku/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Void on ZFS</title>
        <published>2024-06-09T00:00:00+00:00</published>
        <updated>2024-06-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/void-on-zfs/"/>
        <id>https://blog.jutty.dev/posts/void-on-zfs/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/void-on-zfs/">&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;void-on-zfs&#x2F;desk.jpg&quot; alt=&quot;An L-shaped desk with two laptops, an external monitor, a router and a third headless computer in a tower case with several power cables connected to a power strip on top of it. Next to the power strip are two cellphones, a long red box, and a charging case for Bluetooth headphones with a red LED on. The tower case has three stickers on it: one with the machine specifications, one the FreeBSD logo, and one reading “platform feodalism (sic) is so 1492”. Scattered around the machines are some office supplies, medicine containers, a screwdriver, a notepad, a small notebook, an NVMe SSD card on top of its packaging, a mug, a water bottle and a scarf. Hanging on the wall are a small painting of a dead tree before the twilight, prayer beads, a sunflower-pattern keychain and a calendar. Between the desk and the camera, a green plastic chair has a pillow and blanket on top of it. A few wires and cardboard boxes are visible under the desk.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;June is here. It brings the usual cold weather and some extra rhinitis complications. With that I find myself in a recovery mood Sunday, wrapped in a blanket with a mug of tea, a screwdriver, some notes on paper, a flash drive, a couple of NVMe cards and the trio of Unix-powered machines that will help me get this done.&lt;&#x2F;p&gt;
&lt;p&gt;The mission is to get a root-on-ZFS EFI installation of Void Linux with ZFSBootMenu on a Dell Latitude 7480.&lt;&#x2F;p&gt;
&lt;p&gt;To my left, a ceiling-collapse-survivor Sony VAIO is running NetBSD with spectrwm. It’s split with sakura and tmux on a terminal to one side, where Neovim is storing these words, and Firefox on the other, ready to fetch all the docs. In the middle, the object of today’s operation. And to my right, a headless PC board runs FreeBSD with ZFS, holding all the backups needed for the post-install tasks.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;void-on-zfs&#x2F;duo.jpg&quot; alt=&quot;Two laptops side-by-side on a desk, each with a USB keyboard plugged in. Writing utensils inside a holder and post-its are between the two. A sunflower-patterned keychain and prayer beads hang from the wall. The computer on the left has a brown cloth for a wrist rest in front of its USB keyboard, to the left of which lies a small blue Campus notebook.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This lengthy post, written not after the fact but during it, is my way of documenting and also sharing how it all went. Additionally, it’s a way to delve deeper into many of the things the ZFSBootMenu docs leave unexplained, an urge I already had yesterday as I just tried it out without much modification.&lt;&#x2F;p&gt;
&lt;p&gt;Last night, I ran through the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.zfsbootmenu.org&#x2F;en&#x2F;latest&#x2F;guides&#x2F;void-linux&#x2F;uefi.html&quot;&gt;ZFSBootMenu documentation guide for Void&lt;&#x2F;a&gt; and followed it both on a VM and then on an external SATA HDD plugged through a USB case, taking some notes and getting a general idea of the process.&lt;&#x2F;p&gt;
&lt;p&gt;The Void installer does not support ZFS out of the box, so the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.voidlinux.org&#x2F;&quot;&gt;Void Handbook&lt;&#x2F;a&gt; itself recommends the ZFSBootMenu documentation before &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.voidlinux.org&#x2F;installation&#x2F;guides&#x2F;zfs.html&quot;&gt;its own&lt;&#x2F;a&gt; (a manual chroot installation) when it comes to doing a ZFS-on-root install. This guide from ZFSBootMenu is what we’ll be following throughout this post.&lt;&#x2F;p&gt;
&lt;p&gt;Do note that, while comprehensive, my account is no replacement for &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.zfsbootmenu.org&#x2F;en&#x2F;latest&#x2F;guides&#x2F;void-linux&#x2F;uefi.html&quot;&gt;the original guide&lt;&#x2F;a&gt;. Although more concise, it contains certain notes not included in this post and covers a larger set of possibilities than I did here. Some of the code blocks you’ll see here are identical to the ones from the guide, but many others are specific to how I did things, so keep that in mind and try things before going with your final installation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-void&quot;&gt;Why Void?
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#why-void&quot; aria-label=&quot;Anchor link for: why-void&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I don’t really enjoy distro-hopping. I usually will spend a few years on the same OS and only switch for good reason and after some thorough testing. And after some Debian time, I felt interested in trying Void for a few reasons:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;rolling, but stable&lt;&#x2F;li&gt;
&lt;li&gt;runit init system&lt;&#x2F;li&gt;
&lt;li&gt;BSD-like rc files&lt;&#x2F;li&gt;
&lt;li&gt;BSD-like handbook documentation&lt;&#x2F;li&gt;
&lt;li&gt;numerous, up to date, but stable packages&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;After trying it, some other features made me settle:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;fast and feature-packed package manager&lt;&#x2F;li&gt;
&lt;li&gt;very fast startup time (kudos to runit)&lt;&#x2F;li&gt;
&lt;li&gt;first-class support in ZFSBootMenu&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The Void package manager, &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.voidlinux.org&#x2F;xbps&#x2F;index.html&quot;&gt;xbps&lt;&#x2F;a&gt;, has several interesting features. One of my favorites, for a taste, is &lt;code&gt;xbps-query --cat&lt;&#x2F;code&gt;, which shows the original contents of a given file in a package.&lt;&#x2F;p&gt;
&lt;p&gt;For example, &lt;code&gt;xpbps-query --cat &#x2F;etc&#x2F;zfsbootmenu&#x2F;config.yaml zfsbootmenu&lt;&#x2F;code&gt; will show you the original content of the &lt;code&gt;config.yaml&lt;&#x2F;code&gt; file in the &lt;code&gt;zfsbootmenu&lt;&#x2F;code&gt; package. You can use it for very core packages like &lt;code&gt;base-system&lt;&#x2F;code&gt; or &lt;code&gt;runit-void&lt;&#x2F;code&gt; to determine the original version of files shipped by them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;and-why-zfs&quot;&gt;And why ZFS?
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#and-why-zfs&quot; aria-label=&quot;Anchor link for: and-why-zfs&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;My first contact with ZFS was when using FreeBSD, which provides it as an option in its installer, making it a bit too easy not to try. Having a server on ZFS means all the data it holds can be safeguarded and transferred in robust ways, and mistakes are also easier to recover from.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from all the data integrity features and flexibility it brings, the features that interest me the most are the ones for managing snapshots.&lt;&#x2F;p&gt;
&lt;p&gt;ZFS snapshots allow you to store the filesystem state at a given point in time, and to compare against, access the content of, and fully revert to this state. After the guide has been followed throughout, an extra section at the end of this post has some snapshot basics.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-in&quot;&gt;Getting in
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#getting-in&quot; aria-label=&quot;Anchor link for: getting-in&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So, first things first, open the machine up and swap the NVMe cards. For me, that means getting my 128 GB NVMe stick, which I use basically for tests, and replace it with the 256 GB one which currently has Debian on it. Yes, I get by just fine with that much.&lt;&#x2F;p&gt;
&lt;p&gt;While a bit dusty, the machine was overall in good state. The release date for the model is 2017, which for my computing standards is very recent.&lt;&#x2F;p&gt;
&lt;p&gt;It has a single NVMe slot, one 16 GB RAM stick and one unused RAM slot. If you look closely, you can notice a dent on the vent tube connecting the cooler to the CPU. Despite this, it very rarely heats up.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;void-on-zfs&#x2F;karu-inside.jpg&quot; alt=&quot;The Dell laptop seen from above, lid closed, with the screen against the desk and the bottom cover removed, exposing the motherboard.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Next up is to boot up &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;leahneukirchen&#x2F;hrmpf&quot;&gt;hrmpf&lt;&#x2F;a&gt; in EFI mode.&lt;&#x2F;p&gt;
&lt;p&gt;hrmpf is a Void-based rescue system maintained by a Void team member and distributed as a bootable image that can accomplish many things, some of them being a full Void installation, entering a proper chroot, and being ZFS-ready with the needed drivers and tools.&lt;&#x2F;p&gt;
&lt;p&gt;Once booted into it, EFI support can be confirmed by filtering the output of &lt;code&gt;dmesg&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;dmesg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; efivars&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The output should contain “Registered efivars operations”.&lt;&#x2F;p&gt;
&lt;p&gt;Make sure you have an Internet connection at this point. Most of the following steps will run fine without one, but closer to the end, when installing the Void base system, it will all go to waste if we can’t reach a package mirror.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setting-up-the-installation-environment&quot;&gt;Setting up the installation environment
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#setting-up-the-installation-environment&quot; aria-label=&quot;Anchor link for: setting-up-the-installation-environment&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The ZFSBootMenu guide uses some variables in order to avoid mistakes and make the instructions more portable across the different storage types and supported operating systems.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;etc-os-release&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;os-release&lt;&#x2F;code&gt;
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#etc-os-release&quot; aria-label=&quot;Anchor link for: etc-os-release&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;&#x2F;etc&#x2F;os-release&lt;&#x2F;code&gt; file typically contains information on the operating system you are running.&lt;&#x2F;p&gt;
&lt;p&gt;In the hrmpf live system, these are its contents:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Void&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;PRETTY_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Void Linux&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;HOME_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;voidlinux.org&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;DOCUMENTATION&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;docs.voidlinux.org&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;LOGO&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;void-logo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;ANSI_COLOR&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;0;38;2;71;128;97&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;DISTRIB_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;void&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For comparison, here is FreeBSD’s &lt;code&gt;os-release&lt;&#x2F;code&gt; file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;FreeBSD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;VERSION&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;14.0-RELEASE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;VERSION_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;14.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;freebsd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;ANSI_COLOR&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;0;31&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;PRETTY_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;FreeBSD 14.0-RELEASE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;CPE_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;cpe:&#x2F;o:freebsd:freebsd:14.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;HOME_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;FreeBSD.org&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;BUG_REPORT_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;bugs.FreeBSD.org&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In contrast, NetBSD has no such file.&lt;&#x2F;p&gt;
&lt;p&gt;For the purposes of the ZFSBootMenu guide, only the &lt;code&gt;$ID&lt;&#x2F;code&gt; value appears to be used. And because the file already is structured as shell-compatible variable assignments, we just source it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;os-release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage&quot;&gt;export&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;hostid&quot;&gt;&lt;code&gt;hostid&lt;&#x2F;code&gt;
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#hostid&quot; aria-label=&quot;Anchor link for: hostid&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Required by ZFS intallations, a host ID is a 32-bit hexadecimal value that, supposedly, will uniquely identify a machine. Considering the number of existing machines and the 32-bit range, you might guess why I say &lt;em&gt;supposedly&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If your machine has the &lt;code&gt;hostid&lt;&#x2F;code&gt; utilities, you can see the host ID by simply running &lt;code&gt;hostid&lt;&#x2F;code&gt;. Prior to generation, my hrmpf live system reports &lt;code&gt;00000000&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It can’t provide a real guarantee that it will be unique, so it’s up to you to take care that it is unique among &lt;em&gt;your&lt;&#x2F;em&gt; machines. Read on for why that’s hardly an issue.&lt;&#x2F;p&gt;
&lt;p&gt;From the &lt;code&gt;gethostid(3)&lt;&#x2F;code&gt; man page:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] a unique 32-bit identifier for the current machine. The 32-bit identifier was intended to be unique among all UNIX systems in existence. This normally resembles the Internet address for the local machine, as returned by &lt;code&gt;gethostbyname(3)&lt;&#x2F;code&gt;, and thus usually never needs to be set.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This seems to be more or less a legacy feature. In Void’s man page for &lt;code&gt;gethostid(3)&lt;&#x2F;code&gt;, you see this in the history section:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.2BSD; dropped in 4.4BSD. SVr4 and POSIX.1-2001 include gethostid() but not sethostid().&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Still, it is something that OpenZFS requires to be set:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;At time of import or creation, the pool stores the system’s unique host ID and for the purposes of supporting multipath, import into other systems will fail unless forced. &lt;br&#x2F;&gt;&lt;br&#x2F;&gt;
— &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openzfs.readthedocs.io&#x2F;en&#x2F;latest&#x2F;introduction.html&quot;&gt;OpenZFS docs, Introduction to ZFS: Storage pools&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;code&gt;zgenhostid&lt;&#x2F;code&gt;, which is shipped by OpenZFS, according to its man page “emulates the &lt;code&gt;genhostid(1)&lt;&#x2F;code&gt; utility and is provided for use on systems which do not include the utility or do not provide the &lt;code&gt;sethostid(3)&lt;&#x2F;code&gt; function.”&lt;&#x2F;p&gt;
&lt;p&gt;When used without arguments, these commands will generate a random host ID. But they can also be passed a hexadecimal value, which gets stored by default in &lt;code&gt;&#x2F;etc&#x2F;hostid&lt;&#x2F;code&gt; unless another path is given with &lt;code&gt;-o&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Considering this information, it threw me off a bit that the ZFSBootMenu guide tells you to specify an arbitrary host ID rather than generate a random one:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zgenhostid&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0x00bab10c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If they must be unique, that seems odd.&lt;&#x2F;p&gt;
&lt;p&gt;The value &lt;code&gt;0x00bab10c&lt;&#x2F;code&gt; actually has significance in the context of OpenZFS as an identifier (and leetspeak) for its uberblock. However, it apparently is totally unrelated to host IDs.&lt;&#x2F;p&gt;
&lt;p&gt;Should you be curious still, you can refer to &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zbm-dev&#x2F;zfsbootmenu&#x2F;discussions&#x2F;465&quot;&gt;this GitHub discussion&lt;&#x2F;a&gt; where a ZFSBootMenu user brought this exact question to the developers.&lt;&#x2F;p&gt;
&lt;p&gt;According to the answer given above, the uniqueness of host IDs is useful for “multipathed SAS enclosures with two discrete head unis attached”, which is an enterprise-grade storage solution.&lt;&#x2F;p&gt;
&lt;p&gt;The value &lt;code&gt;0x00bab10c&lt;&#x2F;code&gt; is indeed unrelated and chosen for easy identification. Any value may be used, but when using the pre-built ZFSBootMenu images it may make the process slightly slower (around 250ms) as ZFSBootMenu will have to “discover the hostid every boot”.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;disk-variables&quot;&gt;Disk variables
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#disk-variables&quot; aria-label=&quot;Anchor link for: disk-variables&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Here too, the ZFSBootMenu guide &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.zfsbootmenu.org&#x2F;en&#x2F;latest&#x2F;guides&#x2F;void-linux&#x2F;uefi.html#define-disk-variables&quot;&gt;works with a set of variables&lt;&#x2F;a&gt; to make it easier covering different possible storage types:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BOOT_DISK&lt;&#x2F;code&gt;, &lt;code&gt;BOOT_PART&lt;&#x2F;code&gt; and &lt;code&gt;BOOT_DEVICE&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;POOL_DISK&lt;&#x2F;code&gt;, &lt;code&gt;POOL_PART&lt;&#x2F;code&gt; and &lt;code&gt;POOL_DEVICE&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;My target device is an NVMe at &lt;code&gt;nvme0n1&lt;&#x2F;code&gt;, so I’ll have:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BOOT_DISK=&quot;&#x2F;dev&#x2F;nvme0n1&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;BOOT_PART=&quot;1&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;BOOT_DEVICE=&quot;${BOOT_DISK}p${BOOT_PART}&quot;&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;which evaluates to &lt;code&gt;&#x2F;dev&#x2F;nvme0n1p1&lt;&#x2F;code&gt;
&lt;br&#x2F;&gt;&lt;br&#x2F;&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;POOL_DISK=&quot;&#x2F;dev&#x2F;nvme0n1&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;POOL_PART=&quot;2&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;POOL_DEVICE=&quot;${POOL_DISK}p${POOL_PART}&quot;&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;which evaluates to &lt;code&gt;&#x2F;dev&#x2F;nvme0n1p2&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;While this may seem silly at first, it allows using the values separately in the next steps. It also makes the docs a lot more concise while covering several possible disk setups.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;confirming-the-environment-setup&quot;&gt;Confirming the environment setup
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#confirming-the-environment-setup&quot; aria-label=&quot;Anchor link for: confirming-the-environment-setup&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;At this point, we should be able to print something like this in our environment:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# env | grep ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;void&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# hostid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;00bab10c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# echo $BOOT_DEVICE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;dev&#x2F;nvme0n1p1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# echo $POOL_DEVICE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;dev&#x2F;nvme0n1p2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Take care to keep this same environment for all the next steps as they depend on it. For instance, the hrmpf live system ships tmux. While that is great  and I have used it throughout, you must be careful to use a single pane for all the actual steps, and the other panes just for secondary things like looking up man pages or checking file contents.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;filesystem-setup&quot;&gt;Filesystem setup
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#filesystem-setup&quot; aria-label=&quot;Anchor link for: filesystem-setup&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;wiping&quot;&gt;Wiping
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#wiping&quot; aria-label=&quot;Anchor link for: wiping&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The first step is to clear the current ZFS label information from the device:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; labelclear&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$POOL_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;-f&lt;&#x2F;code&gt; option will “treat exported or foreign devices as inactive”, per the man page.&lt;&#x2F;p&gt;
&lt;p&gt;This step fails consistenly for me, which I assume is because the previous filesystem was not ZFS to begin with.&lt;&#x2F;p&gt;
&lt;p&gt;Next, we will use &lt;code&gt;wipefs&lt;&#x2F;code&gt; to erase the current filesystem signature.&lt;&#x2F;p&gt;
&lt;p&gt;This command is not ZFS-specific, but part of the kernel utilities. It does not erase the filesystems themselves, nor their content, but the signatures that aid in their detection.&lt;&#x2F;p&gt;
&lt;p&gt;Without any options, it will list all the filesystems that are still visible:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# wipefs &amp;quot;$BOOT_DISK&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;DEVICE&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  OFFSET          TYPE    UUID    LABEL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nvme0n1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0x200&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;           gpt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nvme0n1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0x3d9e655e00&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;    gpt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nvme0n1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0x1fe&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;           PMBR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;-a&lt;&#x2F;code&gt; option is for erasing all signatures. This means it will “scan the device again after each modification until no magic string [signature] is found”, as per its man page.&lt;&#x2F;p&gt;
&lt;p&gt;In my case:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;wipefs&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$POOL_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;wipefs&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Along the guide, commands are sometimes repeated for both &lt;code&gt;$POOL_DISK&lt;&#x2F;code&gt; and &lt;code&gt;$BOOT_DISK&lt;&#x2F;code&gt;. If you are using the same disk for both, this may be redundant, although also harmless.&lt;&#x2F;p&gt;
&lt;p&gt;This is my case, so I am not typically running it twice. I’ll still leave it as is however, so as not to mislead the reader.&lt;&#x2F;p&gt;
&lt;p&gt;Now, when listing the signatures again with &lt;code&gt;wipefs &quot;$BOOT_DISK&quot;&lt;&#x2F;code&gt;, there should be no output.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, the current MBR and GPT tables must be destroyed. For this, the ZFSBootMenu guide uses &lt;code&gt;sgdisk&lt;&#x2F;code&gt;. This is also not ZFS-specific.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sgdisk&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; --zap-all&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$POOL_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sgdisk&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; --zap-all&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;--zap-all&lt;&#x2F;code&gt; option contrasts with &lt;code&gt;--zap&lt;&#x2F;code&gt; in that it will destroy both MBR and GPT partition tables.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;partitioning&quot;&gt;Partitioning
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#partitioning&quot; aria-label=&quot;Anchor link for: partitioning&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In the ZFSBootMenu guide, &lt;code&gt;sgdisk&lt;&#x2F;code&gt; is used again for creating the partitions:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sgdisk&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;    -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;BOOT_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;}:1m:+512m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;    -t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;BOOT_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;}:ef00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sgdisk&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;    -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;POOL_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;}:0:-10m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;    -t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;POOL_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;}:bf00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$POOL_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the commands above, option &lt;code&gt;-n&lt;&#x2F;code&gt; is short for &lt;code&gt;--new&lt;&#x2F;code&gt;, and is specifying the start and end sectors by using relative kibibyte measures. The format is &lt;code&gt;--new partnum:start:end&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Breaking it down:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1m&lt;&#x2F;code&gt; 1 mebibyte from the start of the disk&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;+512m&lt;&#x2F;code&gt; 512 mebibytes after the default start sector&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-10m&lt;&#x2F;code&gt; 10 mebibytes before the last available sector&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;0&lt;&#x2F;code&gt; the default value&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In the list above, “default” is “the start of the largest available block for the start sector and the end of the same block for the end sector”, as per the &lt;code&gt;sgdisk&lt;&#x2F;code&gt; man page.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;1:1m:+512m&lt;&#x2F;code&gt;, therefore, means that partition 1 will start 1 mebibyte from the start of the disk and end 512 mebibytes after the start of the largest available block.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;2:0:-10m&lt;&#x2F;code&gt;, in turn, means partition 2 will begin at the start of the largest available block and end 10 mebibytes before the last available sector.&lt;&#x2F;p&gt;
&lt;p&gt;Option &lt;code&gt;-t&lt;&#x2F;code&gt; is for setting the typecode for each partition. Typecode &lt;code&gt;ef00&lt;&#x2F;code&gt; is for the EFI system partition, and typecode &lt;code&gt;bf00&lt;&#x2F;code&gt; is for “Solaris root”, the Unix system upon whose ZFS implementation OpenZFS was based.&lt;&#x2F;p&gt;
&lt;p&gt;For a list of typecodes, see &lt;code&gt;sgdisk -L&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While just running these commands as-is is your safest option, you might have a different layout in mind or prefer an interactive UI.&lt;&#x2F;p&gt;
&lt;p&gt;For one thing, I’ve had issues in the past with the boot partition being too small, so I’ll be using &lt;code&gt;2g&lt;&#x2F;code&gt; instead of &lt;code&gt;512m&lt;&#x2F;code&gt; for it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sgdisk&lt;&#x2F;code&gt; has a friendlier counterpart named &lt;code&gt;gdisk&lt;&#x2F;code&gt;, which you can use just by passing it the disk path, as in &lt;code&gt;gdisk &#x2F;dev&#x2F;sda&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At this point, you should be safe to try partitioning and going back to wiping as needed until you are satisfied.&lt;&#x2F;p&gt;
&lt;p&gt;When you are done, you can use &lt;code&gt;lsblk&lt;&#x2F;code&gt; to confirm the results. The following will show you the options just configured:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;lsblk&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; NAME,SIZE,TYPE,PARTTYPENAME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;creating-the-pool&quot;&gt;Creating the pool
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#creating-the-pool&quot; aria-label=&quot;Anchor link for: creating-the-pool&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This part of the guide was the one that actually made me want to delve deeper and understand what each option meant.&lt;&#x2F;p&gt;
&lt;p&gt;With little knowledge about ZFS still, I wanted to understand precisely what was happening here, but also what a pool even is and what its creation meant.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s the &lt;code&gt;zpool(8)&lt;&#x2F;code&gt; man page:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A storage pool is a collection of devices that provides physical storage and data replication for ZFS datasets. All datasets within a storage pool share the same space.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;The definition of a dataset is then indicated to be at &lt;code&gt;zfs(8)&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A dataset is identified by a unique path within the ZFS namespace: &lt;br&#x2F;&gt;
&lt;code&gt;pool[&#x2F;component]&#x2F;component&lt;&#x2F;code&gt; for example: &lt;code&gt;rpool&#x2F;var&#x2F;log&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Here, it’s also explained that a dataset can be a file system, logical volume, snapshot or bookmark.&lt;&#x2F;p&gt;
&lt;p&gt;Further information is also hinted to be found at &lt;code&gt;zpoolconcepts(7)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At this point you start to notice the breadth of knowledge available in the documentation. The man pages are not only comprehensible, but sometimes contain several examples on how to apply their concepts. Each command has their own man page  named with a hyphen for separation, as in &lt;code&gt;zpool-create&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We’ll be exploring only the &lt;code&gt;zpool-create(8)&lt;&#x2F;code&gt; command in depth, in particular the options used in the ZFSBootMenu guide:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;&#x2F;code&gt; force the use of virtual devices, even if they appear in use&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-o feature=value&lt;&#x2F;code&gt; set a pool feature&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-O property=value&lt;&#x2F;code&gt; set a file system property in the root file system of the pool&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-o compatibility=off|legacy|file[,file]&lt;&#x2F;code&gt; specify a compatibility feature set&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-m mountpoint&lt;&#x2F;code&gt; the mountpoint (default: &lt;code&gt;&#x2F;pool&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;pool&lt;&#x2F;code&gt; the pool&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;vdev&lt;&#x2F;code&gt; the virtual device&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The listing with pool features (including compatibility feature sets) is at &lt;code&gt;zpool-features(7)&lt;&#x2F;code&gt;. Pool properties are at &lt;code&gt;zpoolprops(7)&lt;&#x2F;code&gt; and file system properties at &lt;code&gt;zfsprops(7)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In the guide, these are the options given:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; create&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ashift=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-constant z-character z-escape&quot;&gt;12 \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compression=lz4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; acltype=posixacl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; xattr=sa&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; relatime=on&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; autotrim=on&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compatibility=openzfs-2.1-linux&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -m&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; none zroot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$POOL_DEVICE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Among the options above, several pool features and system properties are set:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o ashift=12&lt;&#x2F;code&gt; “Alignment shift”, used to calculate physical sector sizes.This is discussed at greater length in the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openzfs.github.io&#x2F;openzfs-docs&#x2F;Performance%20and%20Tuning&#x2F;Workload%20Tuning.html#alignment-shift-ashift&quot;&gt;online documentation on Workload Tuning&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-O compression=lz4&lt;&#x2F;code&gt; Sets the compression algorithm used (&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;LZ4_(compression_algorithm)&quot;&gt;LZ4&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-O acltype=posixacl&lt;&#x2F;code&gt; Whether &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Access-control_list&quot;&gt;ACLs&lt;&#x2F;a&gt; are enabled and what type to use. The value &lt;code&gt;posixacl&lt;&#x2F;code&gt; is equivalent to &lt;code&gt;posix&lt;&#x2F;code&gt; (default on Linux: off)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-O xattr=sa&lt;&#x2F;code&gt; Enables extended attributes. If value is &lt;code&gt;on&lt;&#x2F;code&gt;, uses directory-based extended attributes, while &lt;code&gt;sa&lt;&#x2F;code&gt; uses system-attribute-based. The latter has performance benefits, and is important for ACLs and SELinux usage&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-O relatime=on&lt;&#x2F;code&gt; “Causes the access time to be updated relative to the modify or change time.” Also, “access time is only updated if the previous access time was earlier than the current modify or change time or if the existing access time hasn’t been updated within the past 24hours”&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-o autotrim=on&lt;&#x2F;code&gt; Automatically reclaims unused blocks from time to time. Can put the filesystem under some stress&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The last option, the compatibility feature set, specifies in this case a relative filename to &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;zfs&#x2F;compatibility.d&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o compatibility=openzfs-2.1-linux&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;zpool-create(8)&lt;&#x2F;code&gt; also states:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;By default, all supported features are enabled on the new pool. The &lt;code&gt;-d&lt;&#x2F;code&gt; option and the &lt;code&gt;-o&lt;&#x2F;code&gt; compatibility property […] can be used to restrict the features that are enabled, so that the pool can be imported on other releases of ZFS.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;The compatibility option &lt;code&gt;openzfs-2.1-linux&lt;&#x2F;code&gt; is described as a “conservative” choice in the ZFSBootMenu guide and in my tests had little impact, so I decided to not use it for this installation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;creating-the-filesystems&quot;&gt;Creating the filesystems
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#creating-the-filesystems&quot; aria-label=&quot;Anchor link for: creating-the-filesystems&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Once the pool is ready, the filesystems can be created.&lt;&#x2F;p&gt;
&lt;p&gt;For this task, the &lt;code&gt;zfs&lt;&#x2F;code&gt; command is used with &lt;code&gt;create&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; create&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mountpoint=none zroot&#x2F;ROOT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; create&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mountpoint=&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; canmount=noauto zroot&#x2F;ROOT&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; create&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mountpoint=&#x2F;home zroot&#x2F;home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The ZFSBootMenu guide explains at this point that if &lt;code&gt;canmount=noauto&lt;&#x2F;code&gt; is not set on file systems with the &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; mountpoint, the OS will try to mount them all and fail. It goes on to say:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Automatic mounting of &#x2F; is not required because the root file system is explicitly mounted in the boot process.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;After the filesystems have been created, the boot file system must be set.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; set bootfs=zroot&#x2F;ROOT&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Essentially, this is saying “set &lt;code&gt;zroot&lt;&#x2F;code&gt;’s &lt;code&gt;bootfs&lt;&#x2F;code&gt; property to &lt;code&gt;zroot&#x2F;ROOT&#x2F;void&lt;&#x2F;code&gt;”&lt;&#x2F;p&gt;
&lt;h3 id=&quot;export-reimport-and-mount&quot;&gt;Export, reimport and mount
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#export-reimport-and-mount&quot; aria-label=&quot;Anchor link for: export-reimport-and-mount&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The next steps consist in exporting and then importing the pool with a given mountpoint.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; export zroot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -N -R&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;mnt zroot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;From what I gather, exporting means putting the pool in a more portable state. According to the &lt;code&gt;zpool-export(8)&lt;&#x2F;code&gt; man page, “the devices [marked as exported] can be moved between systems […] and imported as long as a sufficient number of devices are present.”&lt;&#x2F;p&gt;
&lt;p&gt;If &lt;code&gt;zfs import&lt;&#x2F;code&gt; is used without any arguments, it will list the exported pools available to be imported.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;-N root&lt;&#x2F;code&gt; option imports the pool without mounting any of its file systems, the &lt;code&gt;-R&lt;&#x2F;code&gt; option “sets the &lt;code&gt;cachefile&lt;&#x2F;code&gt; property to &lt;code&gt;none&lt;&#x2F;code&gt; and the &lt;code&gt;altroot&lt;&#x2F;code&gt; property to &lt;code&gt;root&lt;&#x2F;code&gt;”. In this case, that &lt;code&gt;root&lt;&#x2F;code&gt; will be &lt;code&gt;&#x2F;mnt&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;altroot&lt;&#x2F;code&gt; stands for the alternate root directory. In &lt;code&gt;zpoolprops(7)&lt;&#x2F;code&gt;, this becomes clearer when it is stated that “this directory is prepended to any mount points within the pool.”&lt;&#x2F;p&gt;
&lt;p&gt;Once re-imported, we can mount:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mount zroot&#x2F;ROOT&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mount zroot&#x2F;home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And verify that all is mounted correctly with &lt;code&gt;mount | grep mnt&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# mount | grep mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zroot&#x2F;ROOT&#x2F;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; on &#x2F;mnt type zfs&lt;&#x2F;span&gt;&lt;span&gt; (rw,relatime,xattr,posixacl,casesensitive)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zroot&#x2F;home&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; on &#x2F;mnt&#x2F;home type zfs&lt;&#x2F;span&gt;&lt;span&gt; (rw,relatime,xattr,posixacl,casesensitive)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, we request the device events from the kernel to update the device symlinks:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;udevadm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; trigger&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;setting-up-void&quot;&gt;Setting up Void
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#setting-up-void&quot; aria-label=&quot;Anchor link for: setting-up-void&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;installation&quot;&gt;Installation
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;So far, not much here was Void-specific. This is when we start bootstrapping the void system into the filesystem we laid out.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;XBPS_ARCH&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;x86_64&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; xbps-install&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -S -R&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; https:&#x2F;&#x2F;repo-fastly.voidlinux.org&#x2F;current&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;mnt base-system&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here, we are passing an environment variable to set the architecture to &lt;code&gt;x86_64&lt;&#x2F;code&gt;, then use &lt;code&gt;xbps-install&lt;&#x2F;code&gt; from the xbps package manager to fetch the Void base system.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;-S&lt;&#x2F;code&gt; takes care of synchronizing the data from the mirror so that package data is fetched, &lt;code&gt;-R&lt;&#x2F;code&gt; allows us to manually specify the repository for this run, and &lt;code&gt;-r&lt;&#x2F;code&gt; allows choosing a different root directory to act upon.&lt;&#x2F;p&gt;
&lt;p&gt;Here, I chose the Fastly mirror over the ServerCentral one. &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;xmirror.voidlinux.org&#x2F;&quot;&gt;Any working mirror&lt;&#x2F;a&gt; should do.&lt;&#x2F;p&gt;
&lt;p&gt;Note that not all mirrors have the same content at the root of their URL. Some point directly to a Void repo, some don’t. You can access the mirror in a browser or otherwise inspect it to find the path to the  &lt;code&gt;current&lt;&#x2F;code&gt; directory.&lt;&#x2F;p&gt;
&lt;p&gt;With this done, we can copy the host ID file, which will also be required in our final system, and we are ready to chroot.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;hostid &#x2F;mnt&#x2F;etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;chrooting&quot;&gt;chrooting
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#chrooting&quot; aria-label=&quot;Anchor link for: chrooting&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We will chroot into the system mounted at the &lt;code&gt;&#x2F;mnt&lt;&#x2F;code&gt; directory using &lt;code&gt;xchroot&lt;&#x2F;code&gt;, which is part of the xbps &lt;code&gt;xtools&lt;&#x2F;code&gt; package and should already be available on hrmpf. It provides a &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.voidlinux.org&#x2F;config&#x2F;containers-and-vms&#x2F;chroot.html#chroot-usage&quot;&gt;more sane&lt;&#x2F;a&gt; chroot than the plain one, in particular regarding the required mountpoints:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;xchroot&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is a good time to get back to the notes I mentioned taking the day before.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;img&#x2F;posts&#x2F;void-on-zfs&#x2F;notes.jpg&quot; alt=&quot;A block of paper with some notes scribbled: “check connection first of all”, “reconfigure after chroot”, “see &#x2F;usr&#x2F;share&#x2F;doc&#x2F;efibootmgr&#x2F;README.voidlinux for automatic EFI entry management”, “superb docs”, “take the first snapshot ASAP”. An arrow points from the last note to “on chroot?” Visible above the block of paper is a keyboard. To the right, the tip of a notebook and a piece of brown cloth are visible. On top of the block, there is a mechanical pencil and a Tombow MONO One plastic eraser.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h4 id=&quot;reconfiguring-packages&quot;&gt;Reconfiguring packages
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#reconfiguring-packages&quot; aria-label=&quot;Anchor link for: reconfiguring-packages&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;After chrooting, it may be a good idea to run &lt;code&gt;xbps-reconfigure&lt;&#x2F;code&gt; to make sure packages are properly configured. This is because in the bootstrap process some packets may have tried to configure themselves while relying on directories that were not mounted anywhere.&lt;&#x2F;p&gt;
&lt;p&gt;This is particularly true for &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;OSInside&#x2F;kiwi&#x2F;issues&#x2F;1867&quot;&gt;&lt;code&gt;dracut&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, which is a tool that generates initramfs and initrd images, therefore being critical to the early boot process. You might see error messages related to it in your first run of xbps outside of the chroot, when installing the base system.&lt;&#x2F;p&gt;
&lt;p&gt;To reconfigure &lt;strong&gt;all&lt;&#x2F;strong&gt; packages, just run &lt;code&gt;xbps-reconfigure -fa&lt;&#x2F;code&gt;. If you’d rather only reconfigure &lt;code&gt;dracut&lt;&#x2F;code&gt;, go with &lt;code&gt;xpbs-reconfigure -f dracut&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;root-password&quot;&gt;root password
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#root-password&quot; aria-label=&quot;Anchor link for: root-password&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;As early as possible is a good time to run &lt;code&gt;passwd&lt;&#x2F;code&gt; and set the root password.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;rc-conf&quot;&gt;&lt;code&gt;rc.conf&lt;&#x2F;code&gt;
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#rc-conf&quot; aria-label=&quot;Anchor link for: rc-conf&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;&lt;code&gt;runit&lt;&#x2F;code&gt; reads the &lt;code&gt;&#x2F;etc&#x2F;rc.conf&lt;&#x2F;code&gt; file during startup to configure the system, setting up things like the keymap, hardware clock and terminal font.&lt;&#x2F;p&gt;
&lt;p&gt;For your reference, here is what I added to mine during the installation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;HARDWARECLOCK&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;UTC&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;KEYMAP&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;br-abnt2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;FONT&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;ter-120n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;time-zone-and-locale&quot;&gt;Time zone and locale
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#time-zone-and-locale&quot; aria-label=&quot;Anchor link for: time-zone-and-locale&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;To configure your local time zone, create a symlink at &lt;code&gt;&#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt; that points to the corresponding time zone in the &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;zoneinfo&lt;&#x2F;code&gt; directory.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ln&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -sf&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;usr&#x2F;share&#x2F;zoneinfo&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;timezon&lt;&#x2F;span&gt;&lt;span&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;localtime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Unless you are using &lt;code&gt;musl&lt;&#x2F;code&gt;, you also want to set and generate the &lt;code&gt;glibc&lt;&#x2F;code&gt; locales. Edit &lt;code&gt;&#x2F;etc&#x2F;default&#x2F;libc-locales&lt;&#x2F;code&gt; and uncomment the desired locales, then run &lt;code&gt;xbps-reconfigure -f glibc-locales&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;dracut&quot;&gt;dracut
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#dracut&quot; aria-label=&quot;Anchor link for: dracut&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;&lt;code&gt;dracut&lt;&#x2F;code&gt; generates file system images used by the kernel at the very early stages of boot. We have to make it able to identify our ZFS root filesystem by enabling the proper modules. This is accomplished by creating &lt;code&gt;&#x2F;etc&#x2F;dracut.conf.d&#x2F;zol.conf&lt;&#x2F;code&gt; with:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;nofsck&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;yes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;add_dracutmodules&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt; zfs &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;omit_dracutmodules&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt; btrfs &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Notice the spaces surrounding the module names.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-and-configuring-zfsbootmenu&quot;&gt;Installing and configuring ZFSBootMenu
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-and-configuring-zfsbootmenu&quot; aria-label=&quot;Anchor link for: installing-and-configuring-zfsbootmenu&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We are now ready to install both ZFS and ZFSBootMenu. Let’s start with ZFS:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;xbps-install&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -R&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; https:&#x2F;&#x2F;repo-fastly.voidlinux.org&#x2F;current zfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, before installing ZFSBootMenu, we set the kernel commandline. This is the command line that will be used by the Linux kernel, so any options you are used to go here.&lt;&#x2F;p&gt;
&lt;p&gt;The ZFSBootMenu guide has only the &lt;code&gt;quiet&lt;&#x2F;code&gt; option. In my case, I added &lt;code&gt;net.ifnames=0&lt;&#x2F;code&gt; to have the classic &lt;code&gt;eth0&lt;&#x2F;code&gt;, &lt;code&gt;wlan0&lt;&#x2F;code&gt; network interface names, and &lt;code&gt;fbcon=nodefer video=efifb:nobgrt&lt;&#x2F;code&gt;, which prevents the manufacturer’s logo from showing after boot and sometimes obscuring the boot process output.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; set org.zfsbootmenu:commandline=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;quiet net.ifnames=0 fbcon=nodefer video=efifb:nobgrt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We also need a &lt;code&gt;vfat&lt;&#x2F;code&gt; filesystem on our boot device:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mkfs.vfat&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -F32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DEVICE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now we can add an &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt; entry pointing to it, and mount:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;blkid&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DEVICE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; cut&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;) &#x2F;boot&#x2F;efi vfat defaults 0 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;fstab&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mount&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Into this directory we just mounted, we can now install ZFSBootMenu.&lt;&#x2F;p&gt;
&lt;p&gt;The guide provides two different paths here: a prebuilt image or the Void package, which you can get through xbps.&lt;&#x2F;p&gt;
&lt;p&gt;While there are advantages to both, I decided to go with the prebuilt image since I’d rather the package manager not touch the boot manager on updating. This has the downside of you having to take care of being aware of any relevant versions and when to upgrade to them.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;xbps-install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;ZBM&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;ZBM&#x2F;VMLINUZ.EFI&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -L&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; https:&#x2F;&#x2F;get.zfsbootmenu.org&#x2F;efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;ZBM&#x2F;VMLINUZ.EFI &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;ZBM&#x2F;VMLINUZ-BACKUP.EFI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you’d rather use the repository package, see the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.zfsbootmenu.org&#x2F;en&#x2F;latest&#x2F;guides&#x2F;void-linux&#x2F;uefi.html#install-zfsbootmenu&quot;&gt;corresponding instructions in the guide&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, a second choice has to be made between &lt;code&gt;rEFind&lt;&#x2F;code&gt; or plain &lt;code&gt;efibootmgr&lt;&#x2F;code&gt; for managing the boot entries. I prefer to go with the simpler one, but you may find &lt;code&gt;rEFind&lt;&#x2F;code&gt; more feature-packed.&lt;&#x2F;p&gt;
&lt;p&gt;First, install &lt;code&gt;efibootmgr&lt;&#x2F;code&gt; using &lt;code&gt;xbps-install efibootmgr&lt;&#x2F;code&gt;, then run the following commands:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;efibootmgr&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -c -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -L&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;ZFSBootMenu (Backup)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;\EFI\ZBM\VMLINUZ-BACKUP.EFI&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;efibootmgr&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -c -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_DISK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;$BOOT_PART&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -L&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;ZFSBootMenu&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;  -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;\EFI\ZBM\VMLINUZ.EFI&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you’d prefer to use rEFInd, see the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.zfsbootmenu.org&#x2F;en&#x2F;latest&#x2F;guides&#x2F;void-linux&#x2F;uefi.html#configure-efi-boot-entries&quot;&gt;guide’s relevant section&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;zbm-kcl&lt;&#x2F;code&gt; is mentioned here in passing. This utility allows you, among other things, to set ZFSBootMenu options, such as the delay before automatically booting. I am not sure if it comes included with the ZFSBootMenu package, as I went for the pre-built image, but you can nonetheless get it from GitHub:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;zbm-dev&#x2F;zfsbootmenu&#x2F;master&#x2F;bin&#x2F;zbm-kcl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +x zbm-kcl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, if you want to change an option, you can use its &lt;code&gt;-a&lt;&#x2F;code&gt; option to append an argument to the target image’s command line:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zbm-kcl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;zbm.timeout=2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;ZBM&#x2F;VMLINUZ.EFI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the example above, the timeout before automatically booting is set from its 10 seconds default to 2 seconds.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-out&quot;&gt;Getting out
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#getting-out&quot; aria-label=&quot;Anchor link for: getting-out&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We are all done. It’s time to exit the chroot, unmount and export the pool.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function&quot;&gt;exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;umount&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -n -R&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zpool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; export zroot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If all above went well, we can now run &lt;code&gt;reboot&lt;&#x2F;code&gt;, remove the flash drive used for installation, and log in for the first time into our new system.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zfs-snapshot-basics&quot;&gt;ZFS snapshot basics
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#zfs-snapshot-basics&quot; aria-label=&quot;Anchor link for: zfs-snapshot-basics&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Something you might want to do at this point is to take a snapshot of the current state, since it can serve as a baseline before any further tweaking, allowing you to go back or access the files in this state as you make important changes that could potentially break the system.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; snapshot&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@baseline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note that, if you followed the ZFSBootMenu guide in creating a separate dataset for your home directory, this snapshot will not include the contents inside and under &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; (which at this point should be empty anyways).&lt;&#x2F;p&gt;
&lt;p&gt;You can access the contents of a snapshot at any time in the &lt;code&gt;.zfs&lt;&#x2F;code&gt; directory at the root of a given dataset. For the ones we previously set up, those would be &lt;code&gt;&#x2F;.zfs&lt;&#x2F;code&gt; and &lt;code&gt;&#x2F;home&#x2F;.zfs&lt;&#x2F;code&gt;. Note that these directories are not only hidden in the traditional way, but they won’t show up even if you use &lt;code&gt;ls -a&lt;&#x2F;code&gt;. You need to actually &lt;code&gt;cd&lt;&#x2F;code&gt; into the apparently absent directory for it to work.&lt;&#x2F;p&gt;
&lt;p&gt;ZFS snapshots start taking virtually no space at all, but grow with time as the snapshot drifts from the present system state. For that reason, keeping a snapshot of the very first moment of your system can take up significant space. Depending on your storage resources, you might eventually decide to destroy this snapshot:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; destroy&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@baseline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You may also want to list your current snapshots. While typically you can use &lt;code&gt;zfs list -t snap&lt;&#x2F;code&gt;, I tend to use the following command in order to get more relevant output:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; list&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; snap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; creation,name,used,written,referenced,refcompressratio&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -S&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; creation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, you might want to rename a snapshot:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@baseline @day0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Combined, these commands can get you as far as an automatic, rolling snapshot system. Say, for instance you add the following to &lt;code&gt;rc.local&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; destroy&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@fallbackBoot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@previousBoot @fallbackBoot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@currentBoot @previousBoot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;zfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; snapshot&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zroot&#x2F;ROOT&#x2F;void@currentBoot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This would give you a per-boot snapshot trail to rely on.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;zfs-snapshot(8)&lt;&#x2F;code&gt; man page provides a similar example for daily snapshots. Considering how simple the zfs CLI is, scripting several snapshot schemes can be quite easy, be them per boot, daily, or even every so many minutes using cron. Because ZFS snapshots grow as they drift from the present state, rotating them is optimal when storage space is a concern.&lt;&#x2F;p&gt;
&lt;p&gt;That’s it! I hope this was helpful to you in either learning about ZFS or about Void installations with Root on ZFS.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Originally written June 2nd, 2024&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Share Paste O2 | F-Droid - Free and Open Source Android App Repository</title>
        <published>2024-06-08T00:00:00+00:00</published>
        <updated>2024-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            nain
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://f-droid.org/en/packages/alt.nainapps.sharepaste.fdroid/"/>
        <id>https://blog.jutty.dev/links/fdroid-share-paste/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/fdroid-share-paste/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>hackerb9&#x2F;lsix Like ls, but for images. Shows thumbnails in terminal using sixel graphics.</title>
        <published>2024-06-06T00:00:00+00:00</published>
        <updated>2024-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            hackerb9
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://github.com/hackerb9/lsix"/>
        <id>https://blog.jutty.dev/links/hackerb9-lsix/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/hackerb9-lsix/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Moving Beyond Type Systems | Vhyrro&#x27;s Digital Garden</title>
        <published>2024-06-06T00:00:00+00:00</published>
        <updated>2024-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            Mariusz (vhyrro)
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vhyrro.github.io/posts/effect-systems/"/>
        <id>https://blog.jutty.dev/links/vhyrro-beyond-type-systems/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/vhyrro-beyond-type-systems/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Capital Offense How to Handle Abbreviations in CamelCase - Approxion</title>
        <published>2024-06-05T00:00:00+00:00</published>
        <updated>2024-06-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            Ralf Holly
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.approxion.com/capital-offenses-how-to-handle-abbreviations-in-camelcase/"/>
        <id>https://blog.jutty.dev/links/approxion-camelcase-abbreviations/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/links/approxion-camelcase-abbreviations/">
            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
    <entry xml:lang="en">
        <title>Meeting the BSD family</title>
        <published>2024-05-20T00:00:00+00:00</published>
        <updated>2024-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/meeting-the-bsd-family/"/>
        <id>https://blog.jutty.dev/posts/meeting-the-bsd-family/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/meeting-the-bsd-family/">&lt;p&gt;During this year I have been delving deeper and deeper in the BSD realm. Switching my home server to FreeBSD, trying NetBSD and OpenBSD on my backup machine, getting a cheap SSD to see how they’d all run on my main one, all beaming with the joy of tinkering and learning.&lt;&#x2F;p&gt;
&lt;p&gt;As a nerd who delights in reading documentation, manuals and handbooks, I feel like I have found a gigantic library to lose myself in. And to me the delight of such reading is in that it’s never a passive learning experience, but something you can act on and bring to fruition yourself.&lt;&#x2F;p&gt;
&lt;p&gt;While Linux-based operating systems, with all the popularity they have gained, have developed into a complex and extremely active ecosystem, the BSD operating systems feel less bloated and more focused on whatever their specialty is.&lt;&#x2F;p&gt;
&lt;p&gt;You can’t really complain about software availability, given the amount of pre-packaged binaries you will find. When trying FreeBSD, I could not miss anything I needed. More recently, on NetBSD, I also found most of the tools I reached for.&lt;&#x2F;p&gt;
&lt;p&gt;Though I have a mostly text-driven workflow, doing almost all things with a browser and a terminal alone – which certainly helps in making your stack more portable – I do rely on some GUI applications for the domains where they excel.&lt;&#x2F;p&gt;
&lt;p&gt;What you might experience is a slower pace of change for major things, such as on Wayland adoption, which like it or not is coming for all of us with X deprecation looming.&lt;&#x2F;p&gt;
&lt;p&gt;Running BSD is an incredible opportunity to really learn about UNIX-like systems and operating systems in general.&lt;&#x2F;p&gt;
&lt;p&gt;Recently, I’ve been learning more about NetBSD after spending some time with FreeBSD. And this inner diversity of fully-independent operating systems with their own kernels and perks keeps multiplying the learning opportunities.&lt;&#x2F;p&gt;
&lt;p&gt;If you already learned a lot about whatever OS you currently use, I’d say particularly if that OS is Linux-based, when you start to play with a BSD system you are able to realize what is similar and what is not.&lt;&#x2F;p&gt;
&lt;p&gt;Whatever is different is likely teaching you the more portable, UNIX way of doing things. Even if it isn’t, it’s teaching you how a different OS is designed and behaves.&lt;&#x2F;p&gt;
&lt;p&gt;Things that are the same, which are not few, also offer learning opportunities. You get to see what parts of a Linux-based OS perhaps didn’t really originate there, or aren’t in any way an exclusive feature of it.&lt;&#x2F;p&gt;
&lt;p&gt;Now, to lay any zealousness aside and not make this a saccharine one-sided tale, I’d also like to mention a certain social phenomenon that this endeavour reminded me of.&lt;&#x2F;p&gt;
&lt;p&gt;This is certainly not something specific to BSD, but because it has such an engaged and savvy community, you definitely get to notice it sometimes. I’m talking about the tendency to identify with and then indiscriminately defend the software you use.&lt;&#x2F;p&gt;
&lt;p&gt;One common meme you’ll find is people complaining about lack of hardware support, especially wifi. In response, I’ve seen people stating with little nuance that any difficulty to getting your hardware to work on &lt;code&gt;&amp;lt;insert a BSD OS here&amp;gt;&lt;&#x2F;code&gt; is to be explained by poor skills or lack of dedication in reading the documentation.&lt;&#x2F;p&gt;
&lt;p&gt;I see that as denial. When everyone around is just defending something to no end, no critiques allowed, it starts to feel… awkward, to say the least.&lt;&#x2F;p&gt;
&lt;p&gt;Conversely, when I see people openly pointing out weaknesses in something I value and that I can tell they also care for, I feel relief and admiration for that person and that community at large. And thankfully I have also found a lot of this among the BSD folks.&lt;&#x2F;p&gt;
&lt;p&gt;Because running a given operating system on a machine you rely on is such a big commitment, it intensifies this phenomenon where users start to identify with the software they use and defend it beyond reason.&lt;&#x2F;p&gt;
&lt;p&gt;It happens with frameworks, desktop environments and window managers, but operating systems require you to commit even more because you can’t just swap them as easily, so my guess is we identify to compensate this sense of being tied to it. And from this identification comes an urge to deny any defect.&lt;&#x2F;p&gt;
&lt;p&gt;If you are cognizant of the perils, identifying with something is not necessarily a bad thing, though. To some extent, it is inevitable, and being really into something, caring about it, nurturing immense curiosity and a desire to discuss it, are all sources of pleasure I do not excuse myself from.&lt;&#x2F;p&gt;
&lt;p&gt;Software wars aside, getting to know this family of operating systems better has been a joy. It opened up whole new avenues and perspectives to understanding operating systems as a whole, and how beyond Linux-based OSs there are numerous other free and open source operating systems that strengthen the diversity in this field.&lt;&#x2F;p&gt;

            <!-- Collects fully anonymized stats. See: jutty.dev/privacy -->
            <img src="https://stats.jutty.dev/p/Did2mE0LN"/>
        </content>
        
    </entry>
</feed>
