<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Vir Invictus</title>
  <subtitle>Brandon LaRocque. Programmer, curator, former chef. Native Linux desktop work in Rust and C, local-first by default.</subtitle>
  <link href="https://virinvictus.github.io/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://virinvictus.github.io/"/>
  <id>https://virinvictus.github.io/</id>
  <updated>2026-09-21T19:06:11+00:00</updated>
  <author>
    <name>Brandon LaRocque</name>
  </author>
  <entry>
    <title>The Workshop: A Day at the Terminal</title>
    <link href="https://virinvictus.github.io/2026/07/25/the-workshop.html"/>
    <id>https://virinvictus.github.io/2026/07/25/the-workshop.html</id>
    <published>2026-07-25T00:00:00+00:00</published>
    <updated>2026-07-25T00:00:00+00:00</updated>
    <content type="html">&lt;div class=&quot;dropcap&quot;&gt;
  &lt;p&gt;A &lt;em&gt;What I Use&lt;/em&gt; post tells you what is on the desk, but it does not tell you how the desk gets used. The terminal is where I spend the most consecutive minutes of any working day, more than the browser and more than either editor. That hour budget is what justifies the time spent shaping it. This is a walk through the shape: the Ghostty config and the zsh that follows, the three editors and the deliberate split between them, the daily binaries that replaced their POSIX ancestors, and the small scripts in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/bin/&lt;/code&gt; that take a great deal of pressure off the rest of the system.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&quot;the-terminal-itself&quot;&gt;I. The Terminal Itself&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://ghostty.org/&quot;&gt;&lt;strong&gt;Ghostty&lt;/strong&gt;&lt;/a&gt; runs everything. The config is under seventy lines and most of them are keybindings. The ones that earn their keep:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;window-decoration = false
background-opacity = 0.97
background-blur = 40
unfocused-split-opacity = 0.65
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The last line is the one that matters. When you have three panes open and one is an editor and the others are a build log and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;watchexec&lt;/code&gt;, having the inactive panes physically dim is the single biggest cognitive-load reduction a multiplexer can offer. tmux has no equivalent. I have stopped reaching for it inside Ghostty entirely; splits and tabs live on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Shift&lt;/code&gt; with vim navigation (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{h,j,k,l}&lt;/code&gt;), and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Shift+Z&lt;/code&gt; zooms a pane to fullscreen and back. That, plus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copy-on-select = true&lt;/code&gt; and middle-click paste, is the multiplexer I needed.&lt;/p&gt;

&lt;p&gt;Font is &lt;strong&gt;TX-02&lt;/strong&gt; at ten point, with &lt;strong&gt;Symbols Nerd Font Mono&lt;/strong&gt; behind it for glyph fallback. Exactly two font features are on: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calt&lt;/code&gt; for the programming ligatures and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ss01&lt;/code&gt; for the slashed zero, which matters because TX-02’s &lt;em&gt;default&lt;/em&gt; zero is the dotted one.&lt;/p&gt;

&lt;p&gt;That took an audit to get right. I had previously turned on a handful of stylistic sets on the strength of what their names implied, and when I finally checked by hashing the glyph outlines rather than trusting the feature tags, most of them turned out to be no-ops: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ss02&lt;/code&gt; produced an outline byte-identical to the default zero, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ss04&lt;/code&gt; “crossed seven” was already the default seven, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ss05&lt;/code&gt; moved the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r&lt;/code&gt; twenty units and changed nothing else. There is no single-story &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt; in this font at all, which I had also believed for a while. The lesson generalises past typography: a feature that &lt;em&gt;remaps&lt;/em&gt; something is not the same as a feature that &lt;em&gt;changes&lt;/em&gt; something, and the only way to tell is to compare the artifacts.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;the-shell&quot;&gt;II. The Shell&lt;/h2&gt;

&lt;p&gt;zsh, with &lt;strong&gt;starship&lt;/strong&gt; for the prompt and &lt;strong&gt;atuin&lt;/strong&gt; for history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transient prompt.&lt;/strong&gt; Starship paints a multi-line, branch-aware, status-coloured prompt at the current line. Every prompt above it collapses to a single bare arrow:&lt;/p&gt;

&lt;div class=&quot;language-zsh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;function &lt;/span&gt;enable-transience&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PROMPT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;➜ &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
zstyle &lt;span class=&quot;s1&quot;&gt;&apos;:prompt:starship:transient&apos;&lt;/span&gt; promotion enable-transience
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It turns the scrollback from a chat log into a transcript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atuin replaces history outright.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ATUIN_NOBIND=true&lt;/code&gt; plus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bindkey &apos;^r&apos; atuin-search&lt;/code&gt; means &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl-R&lt;/code&gt; opens a proper full-text shell-history search and nothing else does. The zsh history is still in place at a million lines deep, but the working surface is Atuin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;fzf with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fd&lt;/code&gt; behind it.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FZF_CTRL_T_COMMAND&lt;/code&gt; walks with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fd --hidden&lt;/code&gt;, excluding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.git&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.npm&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.wine&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cache&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node_modules&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl-T&lt;/code&gt; becomes a navigation primitive instead of a curiosity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zoxide aliased over cd.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eval &quot;$(zoxide init --cmd cd zsh)&quot;&lt;/code&gt;. Muscle memory keeps working and the directory database learns underneath. After three weeks, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cd at&lt;/code&gt; lands in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.gitrepos/Atrium&lt;/code&gt; without the rest of the path. There is no other piece of CLI I would more strongly recommend to a friend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git&lt;/code&gt; configurations side by side.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git&lt;/code&gt; runs in the current repo. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config&lt;/code&gt; runs against my dotfiles, which live as a bare repo at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.dotfiles/&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~&lt;/code&gt; as the work tree:&lt;/p&gt;

&lt;div class=&quot;language-zsh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;No symlink farm, no chezmoi, no stow. The home directory is the work tree; the bare repo lives one directory down where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; won’t see it.&lt;/p&gt;

&lt;p&gt;The single funniest alias I have written is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zc&lt;/code&gt;, which is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;killall {{Z,z}oom,{D,d}iscord}&lt;/code&gt;, a one-line meeting eject.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;the-daily-binaries&quot;&gt;III. The Daily Binaries&lt;/h2&gt;

&lt;p&gt;The household replacements: &lt;a href=&quot;https://github.com/eza-community/eza&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eza&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt;, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;l&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ll&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lt&lt;/code&gt; aliases for default, long, and modified-time sort; &lt;a href=&quot;https://github.com/sharkdp/bat&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bat&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt;, themed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gruvbox-dark&lt;/code&gt; (one day I’ll port Kanagawa Dragon); &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rg&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep&lt;/code&gt;, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; honoured by default (which is why I switched); &lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fd&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find&lt;/code&gt;, with no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-exec&lt;/code&gt; ceremony; &lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lazygit&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, where most of my commits actually happen these days; &lt;a href=&quot;https://github.com/dandavison/delta&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delta&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; wired into the git pager so every diff arrives syntax-highlighted and side-by-side; &lt;a href=&quot;https://atuin.sh/&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;atuin&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, as above, carrying the history.&lt;/p&gt;

&lt;p&gt;Less obvious:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sharkdp/hyperfine&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hyperfine&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; when I have a hunch about whether a change made something faster and want the question answered in thirty seconds.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/XAMPPRocky/tokei&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tokei&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for code stats. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tokei .&lt;/code&gt; against the Atrium workspace is the fastest answer to &lt;em&gt;how big has this gotten&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/watchexec/watchexec&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;watchexec&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for filesystem-driven loops. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;watchexec -e rs cargo test&lt;/code&gt; is half the Rust workflow.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/casey/just&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;just&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; as a saner &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make&lt;/code&gt;. Recipes, simple dependencies, no significant whitespace.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/denisidoro/navi&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navi&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for cheatsheets, on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl-G&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/gum&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gum&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; when a shell script needs a TUI and I do not want to write one.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/bootandy/dust&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dust&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;du&lt;/code&gt;; &lt;a href=&quot;https://github.com/muesli/duf&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;duf&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df&lt;/code&gt;; &lt;a href=&quot;https://github.com/aristocratos/btop&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;btop&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;top&lt;/code&gt;; &lt;a href=&quot;https://github.com/dalance/procs&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;procs&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ps&lt;/code&gt;. On the AMD T14s, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amdgpu_top&lt;/code&gt; joins the panel.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/chmln/sd&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for the find-and-replace half of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sed&lt;/code&gt;, where the regex dialect is the one I already know instead of the one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sed&lt;/code&gt; insists on.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ast-grep.github.io/&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ast-grep&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for the searches &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rg&lt;/code&gt; structurally cannot do, when the pattern is a shape in the syntax tree rather than a string.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://difftastic.wilfred.me.uk/&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;difftastic&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delta&lt;/code&gt;’s line view is not enough and I need the diff to understand the grammar it is diffing.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sxyazi/yazi&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yazi&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; for the times a file manager genuinely beats a shell, and &lt;a href=&quot;https://github.com/fujiapple852/trippy&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trippy&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; when the network is the suspect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small constellation of Python tools lives behind &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv tool&lt;/code&gt;: &lt;a href=&quot;https://mitmproxy.org/&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mitmproxy&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://sqlmap.org/&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sqlmap&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ReFirmLabs/binwalk&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;binwalk&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/yt-dlp/yt-dlp&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yt-dlp&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;. The first three are for CTF and security study; the fourth is for the day a podcast feed quietly drops a back-catalogue episode and I want it on the disk. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pipx&lt;/code&gt; was the previous answer; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv tool&lt;/code&gt; is the current one.&lt;/p&gt;

&lt;p&gt;Finally, &lt;a href=&quot;https://hledger.org/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hledger&lt;/code&gt;&lt;/a&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hb&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hr&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;his&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hbs&lt;/code&gt; aliases. Plaintext double-entry bookkeeping in the shell is one of the more underrated gifts of the Free Software era.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;two-editors&quot;&gt;IV. Three Editors, On Purpose&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LazyVim.&lt;/strong&gt; The configuration is, deliberately, almost nothing. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/nvim/lua/config/&lt;/code&gt; has four files; three of them (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;options.lua&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keymaps.lua&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;autocmds.lua&lt;/code&gt;) are under ten lines apiece, empty placeholders inheriting LazyVim’s defaults; the fourth (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lazy.lua&lt;/code&gt;) is the stock bootstrap. The only override that matters lives in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lua/plugins/colorscheme.lua&lt;/code&gt;, twenty lines of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kanagawa.nvim&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;theme = &quot;dragon&quot;&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;transparent = true&lt;/code&gt; so the terminal alpha bleeds through. LazyVim is good. I do not need to make it mine. The editor is for cutting, and the only customisation I want is the colour scheme matching the rest of the desk. LSPs come in via Mason: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyright&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jdtls&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clangd&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gopls&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lua-language-server&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ruby-lsp&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rust-analyzer&lt;/code&gt; is the exception, since it ships with the rustup toolchain and Mason never sees it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doom Emacs.&lt;/strong&gt; The exact opposite philosophy. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/doom/config.org&lt;/code&gt; is twenty-six hundred lines of literate Org that tangles to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.el&lt;/code&gt; on every &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;doom sync&lt;/code&gt;. I have phases the way the portfolio projects have phases: literate-config bootstrap; Org core; the GTD agenda; a student layer for Northern College course files; spaced repetition with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-fc&lt;/code&gt;; a typography pass with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mixed-pitch&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-modern&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;visual-fill-column&lt;/code&gt;; the portfolio hub; a math layer with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cdlatex&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-fragtog&lt;/code&gt; rendering LaTeX fragments in line at HiDPI; the Roam UX. Phase 13 is queued: GPG encryption on the per-month finance files. Phase 14 is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pdf-tools&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-noter&lt;/code&gt;. The phases are deliberately not all shipped; the brain is permitted to grow when there is friction, and only then.&lt;/p&gt;

&lt;p&gt;The typography is the part I would defend most strongly. TX-02 semi-light at 18pt for code; &lt;strong&gt;Tiempos Text&lt;/strong&gt; at 20pt for prose; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mixed-pitch-mode&lt;/code&gt; swaps the variable face into prose buffers while leaving code blocks, tables, and properties in monospace; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;visual-fill-column&lt;/code&gt; centers prose at ninety-five columns and toggles itself off when the window is too narrow; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-appear&lt;/code&gt; reveals emphasis markers only when the cursor is on them. The result, at full screen, is the closest a code editor has come to typesetting. The journal, the course notes, and this post were all written in it.&lt;/p&gt;

&lt;p&gt;Every helper in the Doom config is namespaced under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;+bdkl/&lt;/code&gt;. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;+&lt;/code&gt; is the Doom convention for user functions; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bdkl/&lt;/code&gt; makes them mine; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--&lt;/code&gt; double-dash on private helpers signals &lt;em&gt;not a public command&lt;/em&gt;. This is the same naming hygiene I would impose on Rust modules. Elisp permits global names; I would rather not take it up on the offer.&lt;/p&gt;

&lt;p&gt;Custom keybindings live under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SPC X&lt;/code&gt; as a personal leader. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SPC X R&lt;/code&gt; is the &lt;em&gt;AI bundle builder&lt;/em&gt;, a capture that gathers the current project’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spec.md&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roadmap.md&lt;/code&gt;, and a slice of the agenda into a clipboard-ready prompt. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SPC X H&lt;/code&gt; opens the portfolio hub: an Org-rendered table of every project’s version, tagline, last-commit, and language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helix.&lt;/strong&gt; The third one, and the one I did not plan on. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hx&lt;/code&gt; is what I reach for when the edit is fifteen seconds long and loading either of the other two is the expensive part: one line in a systemd unit, a typo in a config, a quick look at a file I do not intend to change. It needs no configuration to be useful, its selection-then-verb model is backwards from vim in a way that stops mattering after an afternoon, and it ships its own language-server wiring so there is no plugin layer to maintain. Having a deliberately disposable editor turned out to protect the other two: LazyVim stays uncustomised and Doom stays serious, because neither is being asked to also be the fast path.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;scripts&quot;&gt;V. The Scripts in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/bin/&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/bin/&lt;/code&gt; holds a small set of hand-written zsh utilities that have absorbed the parts of system maintenance I no longer want to think about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sys_maintain&lt;/code&gt;.&lt;/strong&gt; Full-system update with an &lt;em&gt;eighteen-hour cooldown&lt;/em&gt;. One invocation talks to DNF5, Flatpak (system and user), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fwupdmgr&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pipx&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv&lt;/code&gt; (self-update &lt;em&gt;and&lt;/em&gt; tool-upgrade), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cargo install-update&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude update&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;doom upgrade &amp;amp;&amp;amp; doom sync&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sys_snapshot&lt;/code&gt;, then autoremove, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;journalctl&lt;/code&gt; vacuum, a DNF consistency check, and reboot detection. A clean run writes a Unix timestamp to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/state/sys-maintain-timestamp&lt;/code&gt;; the next run reads it, refuses to do anything within eighteen hours, and prints, in colour, the exact &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HH:MM:SS on Weekday, Month Day&lt;/code&gt; at which the lock expires. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--force&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--reset&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--dry-run&lt;/code&gt;. A SIGINT trap unwinds the sudo keepalive without setting the stamp, so an interrupted run is safe to repeat. Failures get collected and reported; the stamp is not written unless everything succeeded.&lt;/p&gt;

&lt;p&gt;The reason for the cooldown is restraint. Without one I would run system updates four times a day, because checking is irresistible and a laptop gains nothing from it. The lockout is the part of the script I actually needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sys_snapshot&lt;/code&gt;.&lt;/strong&gt; A content-aware snapshot of the laptop-specific bits that aren’t in the dotfiles repo: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/thinkfan.yaml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/modprobe.d/thinkfan.conf&lt;/code&gt;, a udev rule for power profiles, a systemd unit for battery-charge thresholds, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/fstab&lt;/code&gt;. Plus four generated manifests: DNF, Flatpak, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cargo install --list&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv tool list&lt;/code&gt;. Each file copies to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/system-backup/&lt;/code&gt; only if its content has changed; the previous version rotates to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bak&lt;/code&gt;. The whole directory is picked up by &lt;strong&gt;borgmatic&lt;/strong&gt; in its hourly run.&lt;/p&gt;

&lt;p&gt;This is the single most valuable script I have written for my own machine. A clean Fedora reinstall is now a one-evening exercise: clone the dotfiles bare repo, replay the four manifests, paste the snapshotted system files back, restore &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/&lt;/code&gt; from borg. I learned to write this by getting it wrong twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_calibre&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_hledger&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_gemini&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_zlib&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_bitwarden&lt;/code&gt;.&lt;/strong&gt; Version-aware updaters, one each for a tool that doesn’t ship through DNF or Flatpak on Fedora. Same shape every time: read local version, hit the canonical API (GitHub releases, npm), compare with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sort -V&lt;/code&gt;, refuse to downgrade, gate on a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[y/N]&lt;/code&gt;, download, install, clean up. None of them are clever. They are the kind of script you write once and leave alone for the rest of the laptop’s life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfile-sync&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;btrfs_health&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;borg-offsite&lt;/code&gt;.&lt;/strong&gt; The maintenance tail. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfile-sync&lt;/code&gt; commits tracked drift in the bare dotfiles repo and pointedly never adds untracked files, so a new config is always a deliberate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config add&lt;/code&gt; rather than something that wandered in. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;btrfs_health&lt;/code&gt; checks the filesystem I chose partly for snapshots and would otherwise never think about again. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;borg-offsite&lt;/code&gt; pushes the encrypted repository somewhere that is not this laptop, which is the only part of a backup strategy that actually counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;doom-mode&lt;/code&gt; (in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt;).&lt;/strong&gt; Yamagi Quake 2, Hammer of Thyrion’s Hexen 2, dhewm3, Ironwail Quake, uzdoom. The function turns &lt;em&gt;touchpad-disable-while-typing&lt;/em&gt; &lt;strong&gt;off&lt;/strong&gt; before launching (dodging Cyberdemon fire with a dead touchpad is its own punishment), then back &lt;strong&gt;on&lt;/strong&gt; when the game exits. Six lines and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;case&lt;/code&gt; block, and currently due a rewrite: the toggle still goes through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings&lt;/code&gt;, which Hyprland does not read, so the fix has been ceremonial since the move off GNOME.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;home-directory&quot;&gt;VI. The Shape of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The home directory is laid out the way the library is laid out. Each top-level is a working surface; nothing escapes its surface.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/.gitrepos/   ← workspace, parent of every project repo
~/docs/        ← Calibre Library + papers + catalogues + zines
~/org/         ← Doom&apos;s second brain (private, never tracked)
~/Tasks/       ← Atrium&apos;s Org-mode round-trip surface
~/school/      ← Northern College coursework
~/Games/       ← native game installs (Quake, Hexen, Doom ports)
~/Zotero/      ← academic library
~/Sync/        ← one Syncthing folder, named for what it is
~/.dotfiles/   ← bare git repo for the home work tree
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.gitrepos/&lt;/code&gt; is the &lt;em&gt;workshop&lt;/em&gt;: not a git repo itself, the parent directory of every project. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; at its root maps which directories are portfolio code, which are exploratory, which belong to friends, and which are read-only by policy. Writing it forced me to draw the boundary between projects I’m shipping and projects I am, in the language of the file, &lt;em&gt;poking at curiously&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/docs/&lt;/code&gt; is one tree, three species. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/docs/Calibre Library/&lt;/code&gt;&lt;/strong&gt; is the four-thousand-six-hundred-book SQLite library that anchors four of the portfolio projects. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/docs/papers/&lt;/code&gt;&lt;/strong&gt; is a hand-organised archive in sixteen subtrees, by topic. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/docs/bdkl/&lt;/code&gt;&lt;/strong&gt; is the Obsidian vault, which is the scratch journal rather than the second brain; the distinction is that anything in it which survives contact with a second week eventually gets promoted into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;doc_inventory&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; walks them; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_docs&lt;/code&gt; regenerates the Calibre catalogues into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/docs/catalogs/&lt;/code&gt; and snapshots the paper directory alongside them, and at 211 invocations it is the fourth-most-run command on this machine.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/&lt;/code&gt; is &lt;em&gt;deliberately&lt;/em&gt; not git-tracked. The finance files contain enough information about my actual life that the encryption phase is queued; until then, the privacy budget is &lt;em&gt;don’t sync it, don’t track it, let borgmatic carry the encrypted offsite copy&lt;/em&gt;. Inside: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inbox.org&lt;/code&gt;, the GTD project files, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/&lt;/code&gt; for daily journals and concept notes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;courses/&lt;/code&gt; for BCS flashcard decks, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;finance/YYYY-MM.org&lt;/code&gt; for per-month ledgers, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reviews.org&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/Tasks/&lt;/code&gt; is Atrium’s Org-mode round-trip target. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;atrium-cli export org ~/Tasks&lt;/code&gt; writes the live SQLite store out to plain text with UUIDs, CLOCK drawers, and TODO state preserved; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;atrium-cli import org ~/Tasks&lt;/code&gt; reads it back. If the round-trip stops being identical, the round-trip is wrong; the script that proves it is two lines.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.dotfiles/&lt;/code&gt; is the bare repo described in §II. Cloning to a fresh machine is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone --bare repo ~/.dotfiles &amp;amp;&amp;amp; config checkout&lt;/code&gt;, and nothing else.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;the-languages&quot;&gt;VII. The Languages&lt;/h2&gt;

&lt;p&gt;In roughly the order it eats my week:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust.&lt;/strong&gt; Atrium, Viaduct, Conservatory, and Colophon are all Rust. The reasons are the boring ones: compile-time invariants beat code review, sum types beat status enums, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; beats throwing, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cargo&lt;/code&gt; beats every other build tool I have used. The reason that doesn’t get said often enough is that Rust forces the architectural conversation to happen before the code does, and you cannot hide a lifetime bug behind a runtime cast. The single-writer SQLite worker, the read-only connection pool, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Send + Sync&lt;/code&gt; boundary on a tokio handler: these are not conventions, they are load-bearing types. I am not as fast in Rust as I am in Python yet, though I am closer than I was a year ago, and the compiler keeps catching a class of mistake Python would have let me ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C.&lt;/strong&gt; Framework is C, for the same reason &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mupdf&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cairo&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gtk4&lt;/code&gt; are C: no FFI tax, no glue-language tax, the binding surface is the bare metal. K&amp;amp;R is the most important book I have read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python.&lt;/strong&gt; Hermitage is Python because GTK4 via PyGObject is a perfectly serviceable native-desktop story. CalibreQuarry is Python, stdlib-only, because the constraint &lt;em&gt;forced&lt;/em&gt; me to write a real recursive-descent parser instead of pulling in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lark&lt;/code&gt; and waving. I love Python the way I would love a well-worn pair of work boots: type hints throughout, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from __future__ import annotations&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dataclasses&lt;/code&gt; over namedtuples, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pathlib&lt;/code&gt; over string paths, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;argparse&lt;/code&gt; over &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;click&lt;/code&gt; until &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;click&lt;/code&gt; is justified. The standard library is enormous, and most people writing Python never finish reading it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby.&lt;/strong&gt; A language I keep trying to graduate from &lt;em&gt;liking&lt;/em&gt; to &lt;em&gt;using&lt;/em&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rbenv&lt;/code&gt; is installed; 3.4.8 is the current version. Sandi Metz’s &lt;em&gt;Practical Object-Oriented Design&lt;/em&gt; is the book of hers I most often re-shelve at the front. I am still waiting for the project that wants to be Ruby: a small Sinatra service, a Thor CLI, a static-site engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C++.&lt;/strong&gt; I write more C++ than I admit. The version that wants my attention is the one Scott Meyers writes about: C++17 with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Wall -Wpedantic&lt;/code&gt;, not C++26.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Java.&lt;/strong&gt; School. The Computer Engineering Technician program at Northern College is Java-first; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jdtls&lt;/code&gt; in LazyVim and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(java +lsp +dap)&lt;/code&gt; layer in Doom carry the coursework. Java is a more honest language than its 2000s reputation gives it credit for, and the JVM is, separately, a remarkable piece of engineering. I will not be writing Atrium in it. I am also no longer rolling my eyes when someone else reaches for it.&lt;/p&gt;

&lt;p&gt;Languages I am studying deeper into:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Zig.&lt;/strong&gt; A smaller language than Rust, no hidden allocations, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;comptime&lt;/code&gt; as a first-class metaprogramming surface, and the most readable system-language standard library I have ever browsed. The 1.0 release is not here yet; the language is real now anyway.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Go.&lt;/strong&gt; Fast compilation, concurrency primitives that do what they say, a standard library that does almost everything anyone would ask of it. The language I would write a small backend service in if I had one to write.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;OCaml.&lt;/strong&gt; Probably the one I am most curious about. The MirageOS work, the Jane Street functional-programming tradition, the type system that quietly handles what Haskell handles loudly. If I ever sit down with the compilers project I have been mentally drafting since the Calibre search parser, the front end is going to be OCaml.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Common Lisp.&lt;/strong&gt; For the same reason a chef should be able to butcher a chicken. I am not going to write production CL; I would like to be able to &lt;em&gt;read&lt;/em&gt; it, including SBCL itself.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Erlang/Elixir.&lt;/strong&gt; The most beautiful concurrency story in the field and one I have never lived inside. Armstrong’s thesis is on the shelf.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are on the list for hiring. They are on the list because the field has more good ideas in it than one career can absorb.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--fleuron&quot;&gt;❦&lt;/p&gt;

&lt;h2 id=&quot;atuin-confessional&quot;&gt;VIII. What the History Shows&lt;/h2&gt;

&lt;p&gt;Atuin keeps everything. Seventeen thousand two hundred and eight commands in the local index across three thousand six hundred and eighty-eight unique ones, ranked by recency, fully searchable. The interesting question a year of full history can answer, more usefully than a wishful inventory, is &lt;em&gt;which tools actually do the work?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Strip the navigation noise (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt; at 4,197, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cd&lt;/code&gt; at 2,571, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit&lt;/code&gt; at 2,259, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v&lt;/code&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nvim&lt;/code&gt; at 510) and the most-typed program on this machine is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude&lt;/code&gt;, at eight hundred and ninety-two invocations. That is not the answer I expected to publish. It is roughly one and a half times &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt; and more than double &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm&lt;/code&gt;, and it means the single thing I reach for most in a working day is the assistant described in the previous post’s §X. I have decided to report that rather than quietly omit it, because a &lt;em&gt;What I Use&lt;/em&gt; that launders its own history is worth nothing.&lt;/p&gt;

&lt;p&gt;Behind those: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt; at 583, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm&lt;/code&gt; at 389, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt; at 294. I am not, it turns out, the curated minimalist I sometimes pretend to be on the internet; I am a person who copies-and-deletes-and-cats a great deal of files.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt; surviving at 294 is the more interesting confession, because I now have Helix installed for exactly the fifteen-second edit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt; was covering, and the muscle memory has not moved. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt; is, on its own merits, a good piece of software. It does one thing, it tells you how to do that thing at the bottom of the screen, and it does not impose a mode model on a config change that doesn’t deserve one. Installing a better tool does not uninstall a habit; that takes its own separate effort, and I have not made it yet.&lt;/p&gt;

&lt;p&gt;Two of my own scripts crack the top ten: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_docs&lt;/code&gt; at 211 and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sys_maintain&lt;/code&gt; at 197. A script that makes the top ten of your own shell history has justified itself and does not need defending again.&lt;/p&gt;

&lt;p&gt;The artifact I am most pleased by is a one-off test file: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;echo &quot;phase 13&quot; &amp;gt; /tmp/test.txt&lt;/code&gt;, followed by a successful &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gpg --encrypt&lt;/code&gt;. The first end-to-end rehearsal of the Doom finance-encryption phase. The phase still isn’t shipped. That is how the &lt;em&gt;brain&lt;/em&gt; changes shape: a queued idea, a one-evening proof, and then a wait until the moment is right to roll the rest of the work in behind it.&lt;/p&gt;

&lt;p class=&quot;ornament ornament--asterism&quot;&gt;⁂&lt;/p&gt;

&lt;p&gt;None of this is really about the configs. There is a small, stable surface of tools and conventions here that I keep iterating against, and the iteration is where most of the value has been. My &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; gains about one alias a quarter and loses one a quarter, which feels like the right rate. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/bin/&lt;/code&gt; has five scripts in it, and I would rather it never had fifty, because the day it does is the day I stop knowing what is in it.&lt;/p&gt;

&lt;p&gt;That is the workshop I am trying to keep: a small room with the right tools at hand.&lt;/p&gt;

&lt;h2 id=&quot;postscript-2026-09-13&quot;&gt;Postscript (2026-09-13)&lt;/h2&gt;

&lt;p&gt;Two lines here were overtaken by events. On 2026-09-03 the Claude Code client was retired from this machine, so the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude update&lt;/code&gt; stanza in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sys_maintain&lt;/code&gt; now guards a binary that is not there (the updater rotation gained &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_zcode&lt;/code&gt; in the same spirit), and the eight hundred and ninety-two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude&lt;/code&gt; invocations of §VIII measure a tool that is gone; the numbers stand for the window they measured, which is all a shell history ever promises. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; map in §VI is still in place and still doing its job; the per-repo files now carry &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; symlinks so the new client loads the same contracts, and the global file moved with the rest of the kit to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.zcode/&lt;/code&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What I Use: Constraints and Good Iron</title>
    <link href="https://virinvictus.github.io/2026/07/23/what-i-use.html"/>
    <id>https://virinvictus.github.io/2026/07/23/what-i-use.html</id>
    <published>2026-07-23T00:00:00+00:00</published>
    <updated>2026-07-23T00:00:00+00:00</updated>
    <content type="html">&lt;div class=&quot;dropcap&quot;&gt;
  &lt;p&gt;Most &lt;em&gt;What I Use&lt;/em&gt; posts are vanity galleries: aluminium rectangles and SaaS subscriptions arranged for the reader’s envy rather than their use. The format invites it, and I will try not to fall in. There is, however, real value in seeing how someone else has shaped their friction. Tools are leverage; an environment that fights you bleeds time and focus you cannot get back.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I came to this work from kitchens and mining camps. In a kitchen, a knife roll is your livelihood. In a camp, bad gear can get you killed, or at the very least fired. Software is gentler than either, but the principle holds: the gear should disappear so the work can show through.&lt;/p&gt;

&lt;p&gt;Here, then, is what I read, write, and build with. Local-first where it matters. No cloud accounts, no marketing copy, and as little ceremony as I can manage.&lt;/p&gt;

&lt;h2 id=&quot;the-iron&quot;&gt;I. The Iron &amp;amp; The OS&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;ThinkPad T14s AMD Gen 6&lt;/strong&gt;: Ryzen AI 7 PRO 360, Radeon 880M integrated graphics, 32 GB of RAM, a 1920x1200 panel, btrfs on a 382 GB disk. A workhorse rather than a lifestyle accessory. The AMD chassis runs warm under load and cool under prose, which is the right way around. I keep &lt;strong&gt;Windows 11 Pro&lt;/strong&gt; on a dual-boot partition for the handful of programs that demand it, but the work happens in Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fedora 44 Workstation&lt;/strong&gt;, Hyprland on Wayland. Fedora’s pace suits me: current enough that I am not backporting anything myself, stable enough that I am not repairing the system on an afternoon I wanted for something else. Arch asks for more ongoing maintenance than I want to give a laptop, and Ubuntu keeps making decisions I would rather make myself.&lt;/p&gt;

&lt;p&gt;A phone lives in the other pocket, an &lt;strong&gt;iPhone 16 Pro&lt;/strong&gt;, but it is a triage device, not a workstation. We’ll come back to it.&lt;/p&gt;

&lt;h2 id=&quot;aesthetics&quot;&gt;II. Aesthetics as Ergonomics&lt;/h2&gt;

&lt;p&gt;Twelve-hour stretches in front of a screen are easier to survive when the screen is willing to compromise, and most of what follows was chosen for how it holds up at hour ten.&lt;/p&gt;

&lt;p&gt;The terminal runs &lt;strong&gt;Gruber Darker&lt;/strong&gt;. Everything else (Neovim, Emacs, the GTK theme, the bar, the lock screen, the standalone GUI tools I write) runs &lt;a href=&quot;https://github.com/rebelot/kanagawa.nvim&quot;&gt;&lt;strong&gt;Kanagawa Dragon&lt;/strong&gt;&lt;/a&gt;. It is the rare dark theme that earns its contrast: no searing accents, no neon to apologise for at midnight. The Emacs port I use is my own, &lt;em&gt;&lt;a href=&quot;https://github.com/VirInvictus/kanagawa-dragon-nvim-emacs&quot;&gt;kanagawa-dragon-nvim-emacs&lt;/a&gt;&lt;/em&gt;, because the existing Emacs Kanagawa packages had the palette right but covered nothing like enough faces. It is a work in progress; the Java buffer at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;treesit-font-lock-level 4&lt;/code&gt; is my acceptance test.&lt;/p&gt;

&lt;p&gt;Type is where I spend actual money. &lt;strong&gt;TX-02&lt;/strong&gt; does all the monospace work: 18pt semi-light in Doom Emacs, 10pt in Ghostty, and it is also the fixed-width face for Qt applications and every element of the lock screen, where the clock runs in TX-02 ExtraBold at 110pt. &lt;strong&gt;Tiempos Text&lt;/strong&gt; at 20pt handles Org prose, swapped in by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mixed-pitch&lt;/code&gt; so code blocks and tables stay in TX-02. Both are premium licensed faces, and that is the trade I accept: pay once, look at it forever. TX-02 draws zero and O with enough air between them that I never second-guess a literal in a hex dump.&lt;/p&gt;

&lt;p&gt;Two more do the work TX-02 doesn’t. The bar is &lt;strong&gt;MonaspiceNe Nerd Font&lt;/strong&gt; at 13px medium, chosen because the Nerd Font glyph coverage carries the entire icon set and I wanted no icon font in the stack at all. UI chrome is &lt;strong&gt;Söhne&lt;/strong&gt; in Qt apps and &lt;strong&gt;Inter&lt;/strong&gt; in the hyprtoolkit ones.&lt;/p&gt;

&lt;p&gt;A correction to an earlier version of this page: it claimed IBM Plex Mono in the terminal. It never was. &lt;strong&gt;Source Serif 4&lt;/strong&gt; and &lt;strong&gt;IBM Plex Mono&lt;/strong&gt; are what &lt;em&gt;this website&lt;/em&gt; is set in, and nothing else. The Source Serif is at least load-bearing twice over, since Atrium ships it for body text.&lt;/p&gt;

&lt;p&gt;The mouse pointer is &lt;strong&gt;&lt;a href=&quot;https://github.com/phisch/phinger-cursors&quot;&gt;phinger-cursors&lt;/a&gt;&lt;/strong&gt;. The default Adwaita pointer is perfectly serviceable, but phinger has a larger hit-area, a cleaner silhouette, and a hand variant that actually looks like a hand. It vanished into habit inside a week and I have not wanted to go back since.&lt;/p&gt;

&lt;h2 id=&quot;two-brain&quot;&gt;III. The Two-Brain Architecture&lt;/h2&gt;

&lt;p&gt;Trying to make one piece of software hold the whole of a working life is how you get mediocrity in both halves. VS Code wants to be an operating system. I want an editor. I keep writing code separate from running my life, on purpose.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The brain: &lt;a href=&quot;https://github.com/doomemacs/doomemacs&quot;&gt;Doom Emacs&lt;/a&gt;.&lt;/strong&gt; This is where my life is stored. GTD, spaced repetition, the journal, the course notebooks for Northern College, the monthly finance ledgers. The reason it is Emacs and not Notion or Obsidian is &lt;strong&gt;Org-mode&lt;/strong&gt;: a plaintext data format that will outlive every SaaS roadmap. My &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.org&lt;/code&gt; is a single source of truth; everything else generates from it. It took me eighteen months to be productive in Doom. I do not regret a minute.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The scalpel: &lt;a href=&quot;https://www.lazyvim.org/&quot;&gt;LazyVim&lt;/a&gt;.&lt;/strong&gt; Emacs is a Lisp machine and slow to start; that is a fine trade for a notebook and an unbearable one for a buffer of unsaved code. LazyVim is the cheapest path to keystrokes-into-LSP I have found. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rust-analyzer&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyright&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jdtls&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clangd&lt;/code&gt;. Kanagawa Dragon again, transparent background.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-terminal&quot;&gt;IV. The Terminal Ecosystem&lt;/h2&gt;

&lt;p&gt;The Suckless inheritance is honourable, and I patched my share of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dwm&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;st&lt;/code&gt; in earlier lives. But I do not romanticise GNU coreutils when a generation of Rust and Go rewrites has fixed most of their sharp corners. The terminal is the place I spend the most consecutive minutes; it gets the most current tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://ghostty.org/&quot;&gt;Ghostty&lt;/a&gt;&lt;/strong&gt; under &lt;strong&gt;zsh&lt;/strong&gt;, with &lt;a href=&quot;https://starship.rs/&quot;&gt;&lt;strong&gt;starship&lt;/strong&gt;&lt;/a&gt; for the prompt and &lt;a href=&quot;https://atuin.sh/&quot;&gt;&lt;strong&gt;atuin&lt;/strong&gt;&lt;/a&gt; for shell history I can actually search. Ghostty’s renderer is GPU-accelerated and stays smooth under font ligatures and 24-bit colour, which is more than I can say for some of its predecessors on this exact laptop.&lt;/p&gt;

&lt;p&gt;The coreutils replacements have become muscle memory: &lt;a href=&quot;https://github.com/eza-community/eza&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eza&lt;/code&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt;, &lt;a href=&quot;https://github.com/sharkdp/bat&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bat&lt;/code&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt;, &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rg&lt;/code&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep&lt;/code&gt;, &lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fd&lt;/code&gt;&lt;/a&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rg&lt;/code&gt; honours &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; by default, which is most of why I switched. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bat&lt;/code&gt; syntax-highlights what it prints, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eza&lt;/code&gt; reports file sizes with units instead of raw bytes. &lt;a href=&quot;https://github.com/ajeetdsouza/zoxide&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zoxide&lt;/code&gt;&lt;/a&gt; learns my directory habits so I stop typing the same eight characters every morning, and &lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lazygit&lt;/code&gt;&lt;/a&gt; is the rare TUI I prefer to the underlying command, which from me is a high compliment. &lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fzf&lt;/code&gt;&lt;/a&gt; sits underneath most of it as the connective tissue.&lt;/p&gt;

&lt;h2 id=&quot;desktop-stack&quot;&gt;V. The Desktop &amp;amp; Application Stack&lt;/h2&gt;

&lt;div class=&quot;codex-plate&quot;&gt;
  &lt;img src=&quot;/assets/img/hyprland-desktop.webp&quot; alt=&quot;The Hyprland desktop: an empty workspace showing the wallpaper and the dragonbar strip across the top&quot; loading=&quot;lazy&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;For years this was GNOME with a few defaults bent: &lt;a href=&quot;https://extensions.gnome.org/extension/4000/pop-shell/&quot;&gt;&lt;strong&gt;Pop Shell&lt;/strong&gt;&lt;/a&gt; for tiling, &lt;strong&gt;Vitals&lt;/strong&gt; for sensors on the panel, &lt;strong&gt;Blur My Shell&lt;/strong&gt; to sand the seams. What that stack was really doing was approximating a tiling window manager, so eventually I went and got one.&lt;/p&gt;

&lt;p&gt;The desktop is &lt;strong&gt;&lt;a href=&quot;https://hypr.land/&quot;&gt;Hyprland&lt;/a&gt;&lt;/strong&gt; 0.56 on Wayland now, configured in &lt;strong&gt;Lua&lt;/strong&gt; rather than the usual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hyprland.conf&lt;/code&gt;, in a modular tree under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/hypr/&lt;/code&gt;. The GNOME session is not merely unused, it is uninstalled; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/share/xsessions/&lt;/code&gt; is empty and there is no fallback, so a broken config drops me to a TTY rather than a safe desktop, and I edit it with correspondingly more care. A handful of GNOME &lt;em&gt;applications&lt;/em&gt; stayed on merit, though (Control Center, Disks, Calendar), because leaving the shell was never an argument with the apps.&lt;/p&gt;

&lt;p&gt;The bar is mine. &lt;strong&gt;dragonbar&lt;/strong&gt; is about a thousand lines of QML on &lt;a href=&quot;https://quickshell.org/&quot;&gt;&lt;strong&gt;Quickshell&lt;/strong&gt;&lt;/a&gt;, replacing a Waybar config I had spent two years accreting; the Waybar directory is still on disk as a deliberate rollback lever rather than as cruft. The rest of the session is &lt;strong&gt;SDDM&lt;/strong&gt; behind a Kanagawa-matrix greeter, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hyprlock&lt;/code&gt; with fingerprint unlock wired in, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;swaync&lt;/code&gt; for notifications, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hyprlauncher&lt;/code&gt; for launching, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sunsetr&lt;/code&gt; for night light, and Thunar as the file manager after Nautilus left with the rest of GNOME. GTK is themed &lt;strong&gt;Kanagawa-Dark-Dragon&lt;/strong&gt; across GTK2/3/4, icons are &lt;strong&gt;kora&lt;/strong&gt;, and Qt routes through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hyprqt6engine&lt;/code&gt; so it doesn’t look like a stranger in its own session.&lt;/p&gt;

&lt;div class=&quot;codex-plate&quot;&gt;
  &lt;img src=&quot;/assets/img/hyprland-fastfetch.webp&quot; alt=&quot;fastfetch on the same desktop, listing Fedora 44, Hyprland 0.56, dragonbar on Quickshell, the Kanagawa Dragon palette, and the machine&apos;s hardware&quot; loading=&quot;lazy&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fastfetch&lt;/code&gt; config is its own small vanity, and it does report the truth: compositor, greeter, bar, GTK theme, icon set, cursor, palette, and wallpaper, because those are the seven things I actually change. The network block is pixelated for the obvious reason.&lt;/p&gt;

&lt;p&gt;The application layer is where I am pickiest, because a great deal of what passes for desktop software in 2026 is a web app in a native-looking window. I avoid those wherever a real alternative exists.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Web.&lt;/strong&gt; &lt;a href=&quot;https://zen-browser.app/&quot;&gt;Zen Browser&lt;/a&gt;. A Firefox fork with the dignity of restraint; the vertical-tab sidebar finally stuck for me where the official one never did.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reading &amp;amp; media.&lt;/strong&gt; &lt;a href=&quot;https://calibre-ebook.com/&quot;&gt;Calibre&lt;/a&gt; is the corner of my desk the rest of the work organises around, and it gets its own section in a moment (§VI). For everything else: I read PDFs in my own &lt;a href=&quot;https://github.com/VirInvictus/Framework&quot;&gt;Framework&lt;/a&gt;; comics in &lt;a href=&quot;https://www.yacreader.com/&quot;&gt;YACReader&lt;/a&gt;; music, podcasts, and audiobooks have all migrated into my own &lt;a href=&quot;https://github.com/VirInvictus/Conservatory&quot;&gt;Conservatory&lt;/a&gt;, which absorbed the podcast client I had been building separately. The occasional album lands via &lt;a href=&quot;https://nicotine-plus.org/&quot;&gt;Nicotine+&lt;/a&gt; when the streaming services have shrugged at a rare release. Academic citations live in &lt;a href=&quot;https://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Comms.&lt;/strong&gt; &lt;a href=&quot;https://github.com/squidowl/halloy&quot;&gt;Halloy&lt;/a&gt; for IRC, &lt;a href=&quot;https://gitlab.gnome.org/World/fractal&quot;&gt;Fractal&lt;/a&gt; for Matrix, &lt;a href=&quot;https://tuba.geopjr.dev/&quot;&gt;Tuba&lt;/a&gt; for Mastodon. All three are native, which keeps three more things out of the browser.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Finance.&lt;/strong&gt; &lt;a href=&quot;https://actualbudget.org/&quot;&gt;Actual&lt;/a&gt; for the household envelope view; &lt;a href=&quot;https://hledger.org/&quot;&gt;hledger&lt;/a&gt; for the plaintext double-entry ledger underneath it. Mint’s shutdown was a useful lesson in what not to build a decade of records on top of. Actual is the post-Mint generation done right, and hledger is the format I expect to still be able to read in twenty years.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Security.&lt;/strong&gt; &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;. I am militant about local-first, and credentials are the load-bearing exception. Rolling your own sync protocol for secrets is a fool’s errand; I outsource that to people who have read more crypto papers than I have.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For RSS, an &lt;a href=&quot;https://www.inoreader.com/&quot;&gt;Inoreader&lt;/a&gt; backend reads my feeds because its filter rules are still ahead of the field. The local client today is &lt;a href=&quot;https://gitlab.com/news-flash/news_flash_gtk&quot;&gt;NewsFlash&lt;/a&gt;, at least until I switch fully to my own &lt;a href=&quot;https://github.com/VirInvictus/Viaduct&quot;&gt;Viaduct&lt;/a&gt;, which already runs my OPML well enough that admitting NewsFlash is still here is starting to feel slightly sheepish.&lt;/p&gt;

&lt;h2 id=&quot;the-library&quot;&gt;VI. The Library&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://calibre-ebook.com/&quot;&gt;Calibre&lt;/a&gt; is my favourite program on any operating system. That is a small confession to drop into a &lt;em&gt;What I Use&lt;/em&gt; post, because Calibre is also one of the homeliest pieces of software you will ever boot: a Qt5 application with the visual confidence of a 2009-era tax form and a ribbon that has not been redesigned since the iPad was new. None of that matters. Underneath the surface is a fully indexed SQLite library, a real search-expression grammar with a proper parser, and a virtual-library system that lets a careful user build their own taxonomy and never lose track of where a book lives. It is the closest thing the open-source world has to a digital-archivist’s framework, and almost nobody talks about it as one.&lt;/p&gt;

&lt;p&gt;My library runs to four-thousand six-hundred-and-change books. Mostly EPUB, about fifteen-hundred PDFs, a long tail of DjVu where the scan is the only thing that exists, and an embarrassed handful of MOBI from before I knew better. Almost all of them are catalogued, which is the part that took the years.&lt;/p&gt;

&lt;p&gt;The taxonomy is the part I am most pleased with. Every tag is a path. There are three roots, &lt;em&gt;Fic&lt;/em&gt;, &lt;em&gt;NonFic&lt;/em&gt;, &lt;em&gt;Gaming&lt;/em&gt;, and every other tag is dot-separated underneath them. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fic.Fantasy.Grimdark&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fic.SciFi.SpaceOpera&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NonFic.Tech.CS.Compilers&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gaming.TTRPG.WoD.Vampire&lt;/code&gt;. Three-hundred-and-sixty-eight tags in the tree, mostly three levels deep with about seventy at four. That structure is the seed of Hermitage’s recursive tag browser; that grammar is what CalibreQuarry’s parser was written to handle.&lt;/p&gt;

&lt;p&gt;On top of the tag tree sit twenty virtual libraries, all of them named &lt;em&gt;Wing&lt;/em&gt;: the &lt;em&gt;Grimdark &amp;amp; Epic Wing&lt;/em&gt;, the &lt;em&gt;Sci-Fi Wing&lt;/em&gt;, the &lt;em&gt;CS Wing&lt;/em&gt;, the &lt;em&gt;Historical Fiction Wing&lt;/em&gt;, the &lt;em&gt;Programming Wing&lt;/em&gt;, &lt;em&gt;The Tabletop&lt;/em&gt;, &lt;em&gt;The Classics&lt;/em&gt;. Calibre virtual libraries are search expressions saved against the library, and they compose. An &lt;em&gt;IT Wing&lt;/em&gt; says &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(tags:&quot;NonFic.Tech&quot;) and not (vl:&quot;CS Wing&quot; or vl:&quot;Programming Wing&quot;)&lt;/code&gt;, carving its scope out of what other wings already own. An &lt;em&gt;Unsorted Wing&lt;/em&gt; is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;not&lt;/code&gt; of every other wing, so any book that escapes the taxonomy surfaces in the first place I would look. The whole arrangement is checkable: every book either belongs to exactly one wing or sits politely in the backstop until I file it.&lt;/p&gt;

&lt;p&gt;Two custom columns earn their keep. &lt;em&gt;Audience&lt;/em&gt; keeps adjacent fiction sorted without bleeding genres. &lt;em&gt;Status&lt;/em&gt; is an enumeration (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unread&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reading&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;finished&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;abandoned&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reference&lt;/code&gt;) and it is the field that turned the library from a hoard into a reading practice; an &lt;em&gt;unread → reading → finished&lt;/em&gt; gradient that I can sort, filter, and report against.&lt;/p&gt;

&lt;p&gt;Series fidelity is the other discipline. Five-hundred-and-fifty-four series in the database, the largest being Discworld at forty-one books, then the full Aubrey-Maturin, the full Vorkosigan Saga, the full Expanse, all of Dresden, all of Wheel of Time. Where a series matters, the gaps are filled. CalibreQuarry’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--audit series-gap&lt;/code&gt; mode was originally written against this library to catch the books I had told myself I would come back to and never did.&lt;/p&gt;

&lt;p&gt;Most digital-library tools assume you want a Netflix-style infinite scroll. Calibre assumes you want a card catalogue and the muscle memory of a librarian, which is the assumption that holds up across a library you intend to keep for decades.&lt;/p&gt;

&lt;h2 id=&quot;the-reader&quot;&gt;VII. The Reader: Ink &amp;amp; Type&lt;/h2&gt;

&lt;p&gt;The library lives on the laptop; the actual reading happens on a &lt;strong&gt;Kindle Oasis&lt;/strong&gt; (last generation). The Oasis was the only Kindle worth owning: aluminium back, an asymmetric grip with hardware page-turn buttons, an actual warm-light slider. The only Kindle that ever felt like an object instead of a tablet. Amazon discontinued it. The current Kindle line is split between a basic plastic slab and a Scribe-branded notepad, and neither is the reader the Oasis was. The Voyage is gone; the Oasis is gone; Amazon’s premium e-reader segment is effectively gone. The state of the high-end e-reader market in 2026 is the most frustrating it has been in the device’s twenty-year history.&lt;/p&gt;

&lt;p&gt;For a while that had me shopping. The &lt;strong&gt;&lt;a href=&quot;https://pocketbook.ch/en-ch/e-readers/era&quot;&gt;PocketBook Era&lt;/a&gt;&lt;/strong&gt; was the candidate I kept returning to: one of the few remaining independents, firmware sitting on Linux without trying terribly hard to hide it, a current-generation Carta panel, and no tether to a retail account.&lt;/p&gt;

&lt;p&gt;I did something else instead. The Oasis is &lt;strong&gt;jailbroken and boots straight into &lt;a href=&quot;https://koreader.rocks/&quot;&gt;KOReader&lt;/a&gt;&lt;/strong&gt;, and the Amazon framework is not used at all. That single change did more for the device than any replacement would have. KOReader is a better reader than the stock software by a distance that is almost unfair: real typography control, real dictionary and statistics support, a plugin system, and a settings tree that assumes you might have an opinion. Buying a new device to escape Amazon’s software turned out to be the expensive way to solve a problem the community had already solved for free.&lt;/p&gt;

&lt;p&gt;Colour e-ink stays off the table. The Gallery and Kaleido panels currently render black-and-white text visibly softer than the best monochrome Carta, and reading is the application I am least willing to compromise on. I will reconsider on the day a colour panel renders monochrome text the way a monochrome panel renders it today.&lt;/p&gt;

&lt;p&gt;The fonts all come from &lt;strong&gt;&lt;a href=&quot;https://github.com/nicoverbruggen/ebook-fonts&quot;&gt;Nico Verbruggen’s ebook-fonts&lt;/a&gt;&lt;/strong&gt;, a curated collection of faces remetricked specifically for e-readers, currently at v4.1 and mirrored onto the device as a single directory of 173 files. It is the best thing of its kind I have found, and it saves digging through fifteen years of &lt;a href=&quot;https://www.mobileread.com/forums/&quot;&gt;MobileRead&lt;/a&gt; thread history to assemble the same set by hand.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Libron&lt;/strong&gt; is the reading font. It is a modified Readerly with trimmed serifs on several capitals and reworked glyphs for a more neutral look, and it replaced Readerly outright in the collection’s Core set. It reads dense and patient, and it is what I see for hours a night.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;NV Legible Next&lt;/strong&gt; is the interface font, which is &lt;a href=&quot;https://www.brailleinstitute.org/freefont/&quot;&gt;Atkinson Hyperlegible Next&lt;/a&gt; under a shortened name. Atkinson was drawn by the Braille Institute for low-vision legibility, which turns out to be exactly the brief for menu text on a small grey panel you are reading in the dark. Setting it required a patch: KOReader has no UI font picker of its own, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2--ui-font.lua&lt;/code&gt; adds one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The device has become a small platform of its own. Three of my projects live on it: a &lt;a href=&quot;https://github.com/VirInvictus/2-kobo-style-sleepscreen-banner-prettified&quot;&gt;sleep-screen patch&lt;/a&gt; that redraws the lock screen as a Kobo-style card over the cover with a random highlight as a pull-quote, a &lt;a href=&quot;https://github.com/VirInvictus/1-timezone&quot;&gt;timezone patch&lt;/a&gt; that fixes every clock in the app on a framework-less install, and a &lt;a href=&quot;https://github.com/VirInvictus/dead-reckoning-bookend-preset&quot;&gt;Bookends preset&lt;/a&gt; that turns the footer into a navigation cockpit. A fourth, &lt;a href=&quot;https://github.com/VirInvictus/Colophon&quot;&gt;Colophon&lt;/a&gt;, reads the statistics database off it. That an Amazon e-reader ended up being the most hackable device I own is the best joke in this entire post. That an Amazon e-reader ended up being the most hackable device I own is the best joke in this entire post.&lt;/p&gt;

&lt;h2 id=&quot;iphone&quot;&gt;VIII. The iPhone: Triage &amp;amp; Consumption&lt;/h2&gt;

&lt;p&gt;A phone is a triage device. If real work is happening on a six-inch glass rectangle, something has gone wrong upstream, so the homescreen is arranged for speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Page one&lt;/strong&gt; anchors on a tall &lt;strong&gt;Fantastical&lt;/strong&gt; widget. Natural-language event entry remains its killer feature, and Apple’s calendar still cannot read &lt;em&gt;lunch with M next Tuesday at 1&lt;/em&gt;. The dock is the working core: a &lt;strong&gt;Learning&lt;/strong&gt; folder (Blackboard, Reminders, PCalc, Soulver), Messages, Safari, and &lt;strong&gt;Claude&lt;/strong&gt;. The desktop is where the heavy lifting happens, but a high-reasoning model in my pocket has quietly become one of the most useful things I carry.&lt;/p&gt;

&lt;p&gt;Around it: &lt;strong&gt;Raindrop.io&lt;/strong&gt; for bookmarks, &lt;strong&gt;Overcast&lt;/strong&gt; for podcasts (Smart Speed and Voice Boost are doing real audio-engineering work, not posturing), &lt;strong&gt;foobar2000&lt;/strong&gt; for local audio because it has never failed me in twenty years, and &lt;strong&gt;Awful&lt;/strong&gt; because the SomethingAwful forums require their own client and I refuse to engage otherwise.&lt;/p&gt;

&lt;p&gt;The folders break out cleanly. An &lt;em&gt;Important&lt;/em&gt; drawer (Tangerine, Wealthsimple, Passwords, 1Password, Outlook, AnyList, Authy, LocalSend, Cronometer). A &lt;em&gt;Feeds&lt;/em&gt; drawer (Reddit, WhatsApp, Mail, &lt;strong&gt;Ice Cubes&lt;/strong&gt; for Mastodon, &lt;strong&gt;HEY&lt;/strong&gt; for the email I want and not the email I am given, and &lt;strong&gt;NetNewsWire&lt;/strong&gt; because the iOS port is still the gold standard). A &lt;em&gt;Social&lt;/em&gt; drawer (Discord, LinkedIn, Steam, Spotify, Snapchat, Phone, LibraryThing, GitHub).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Page two&lt;/strong&gt; is utility. A large &lt;strong&gt;Todoist&lt;/strong&gt; widget shows today’s shared tasks; underneath it, a smart-stack widget rotates between CARROT Weather, Mail, and Gmail. &lt;strong&gt;CARROT Weather&lt;/strong&gt; is there because the default app gives a polite shrug where I want a radar.&lt;/p&gt;

&lt;h2 id=&quot;custom-code&quot;&gt;IX. Custom Code: Building What I Need&lt;/h2&gt;

&lt;p&gt;Eventually you get tired of compromising. Native GTK4, SQLite in WAL mode, a single-writer worker, FTS5 indexes where search has to be fast: that is the loose architecture I keep coming back to, and it is the entire reason these exist instead of an Electron lookalike of each one.&lt;/p&gt;

&lt;p&gt;Before the list, a structural note. Every project here ships the same scaffolding. A public &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; for the front door. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spec.md&lt;/code&gt; that defines the contract, the file I read before changing semantics. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roadmap.md&lt;/code&gt; with phase-by-phase checkboxes that get ticked when a release lands. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;patchnotes.md&lt;/code&gt; with newest entries at the top. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LICENSE&lt;/code&gt; and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;logo.svg&lt;/code&gt; from day one. A single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;VERSION&lt;/code&gt; source of truth that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyproject.toml&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt; mirrors and never gets out of sync with. And a per-project &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; that documents the project’s contract for the assistant I work with (more on that in §X). The scaffolding is half the value: it means I can drop back into any of these after weeks away and pick up where the last release left off, without re-reading the code to remember what the contract was supposed to be.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Framework&quot;&gt;Framework&lt;/a&gt;.&lt;/strong&gt; A document viewer for PDF, DjVu, comic archives, XPS, EPUB, FB2, MOBI/AZW3, and Markdown. The space between feature-heavy Okular and bare MuPDF wrappers; a SumatraPDF-shaped experience for Linux. Three-tier cache, parallel rendering across eight MuPDF instances, a zero-copy MuPDF→Cairo pipeline. It opens immediately and then gets out of the way.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Viaduct&quot;&gt;Viaduct&lt;/a&gt;.&lt;/strong&gt; A Linux port of NetNewsWire that I started because no Linux RSS client carried NetNewsWire’s manners. Single-writer SQLite, OPML as the source of truth, three databases in WAL mode, a neutered WebKit pane for the article view. Idles between 100–300 MB against a hard 500 MB ceiling enforced by an in-tree memory harness.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/CalibreQuarry&quot;&gt;CalibreQuarry&lt;/a&gt;.&lt;/strong&gt; A stdlib-only Python toolkit that reads Calibre’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.db&lt;/code&gt; directly for catalogs, audits, virtual-library exports, and analytics. The search-expression parser is at 100% parity with Calibre’s own. No third-party dependencies; installs as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cquarry&lt;/code&gt;; complete software that I am not in a hurry to extend.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Hermitage&quot;&gt;Hermitage&lt;/a&gt;.&lt;/strong&gt; A native GTK4 gallery for Calibre libraries: read-only on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.db&lt;/code&gt;, edge-to-edge cover grid, per-book accent tinting via median-cut quantization, a recursive tag-hierarchy browser that turns my dot-separated tags into a navigable tree. The Calibre client I want when I am browsing the library rather than curating it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/lattice-music&quot;&gt;lattice-music&lt;/a&gt;.&lt;/strong&gt; The music-collection counterpart to Quarry, but the filesystem is the source of truth and tags are read with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mutagen&lt;/code&gt;. Library tree, parallel FLAC/MP3/Opus integrity verification, per-genre &lt;em&gt;wings&lt;/em&gt; the way Calibre virtual libraries work, a TUI for the days I want a single pane of glass over a six-thousand-track library.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Atrium&quot;&gt;Atrium&lt;/a&gt;.&lt;/strong&gt; The largest piece. A native Linux task manager that wears an OmniFocus / Things 3 surface over an Org-mode core. Local-first SQLite, single-writer worker, FTS5, a hand-written Calibre-style search expression grammar. Two surfaces over one schema: a calm &lt;strong&gt;Simple Mode&lt;/strong&gt; for &lt;em&gt;what am I doing right now&lt;/em&gt;, and a full &lt;strong&gt;Builder Mode&lt;/strong&gt; with Forecast, Agenda, Kanban, Review, Perspectives. I am slowly eating my own dogfood. Org-mode handles school and finance; Todoist with Rin handles shared chores; Atrium is consuming both.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Conservatory&quot;&gt;Conservatory&lt;/a&gt;.&lt;/strong&gt; Calibre for audio. It owns and moves the music, podcast, and audiobook files on disk (the database is truth, inverting lattice-music), presents them through a foobar2000 Columns UI browse surface, and plays all three from one libmpv queue with a 10-band EQ, a DSP rack, and a waveform seek bar drawn from the track’s real loudness envelope.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Colophon&quot;&gt;Colophon&lt;/a&gt;.&lt;/strong&gt; A statistics viewer for KOReader that imports a copy of the device’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;statistics.sqlite3&lt;/code&gt; and draws its own Cairo charts: reading-speed trend, a when-do-I-read heatmap, inferred read-throughs, a reading-personality card. No charting crate and no new dependencies, because drawing them myself was the interesting part.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/VirInvictus/Carrel&quot;&gt;Carrel&lt;/a&gt;.&lt;/strong&gt; A single-user reading room over the same Calibre library, with no login at all and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.db&lt;/code&gt; attached read-only. Its search bar routes through CalibreQuarry’s parser, which is why &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author:&quot;King&quot;&lt;/code&gt; went from returning 0 results upstream to returning 55.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these exists because I wanted the thing and it did not exist, which is the only project-selection heuristic I have ever needed.&lt;/p&gt;

&lt;h2 id=&quot;ai-layer&quot;&gt;X. The AI Layer: Augmented Intelligence&lt;/h2&gt;

&lt;p&gt;I treat large language models as cognitive compilers, not search engines. They are wonderful at structural review, mechanical refactoring, boilerplate, and rapid synthesis. They are bad at facts, and they will never be reliable at facts in the way the marketing implies. Use them where the cost of being wrong is cheap and the value of being structured is high. This is the most controversial corner of the workflow and I have made peace with that.&lt;/p&gt;

&lt;p&gt;The model is &lt;strong&gt;Claude Opus 5&lt;/strong&gt;, the top of the line I can actually reach. For a stretch it was &lt;strong&gt;Claude Fable 5&lt;/strong&gt;, a tier above; when US government pressure forced Anthropic to close off access to Fable, I dropped back to the best Claude still on the table. This line has now read Opus 4.7, then Fable 5, then Opus 4.8, now Opus 5: the name keeps moving and the tier is the part that doesn’t change. Not the smaller tiers, not the API for one-shots. Claude Max bundles it into the plan, so I leave it on and never look at the meter. I run it twelve to fourteen hours a day, every day, against the projects in §IX. The reasoning gap between the frontier model and the rest matters most at the design level. At the moments where I am sketching a schema or shaping a parser, the assistant either has the architecture in mind or it doesn’t, and the smaller tiers still lose the thread in a way the frontier model doesn’t.&lt;/p&gt;

&lt;p&gt;The interface is &lt;strong&gt;Claude Code&lt;/strong&gt;, in the terminal, by itself. No agentic harness, no IDE extension, no third-party orchestrator layered on top. There is a small cottage industry of AI-assistant wrappers and meta-tools at the moment, and most of it is an attempt to recoup ergonomic decisions the user could make for themselves. Mine are these. Plan mode for any non-trivial change. Tight, specific prompts. No guessing when something is genuinely ambiguous; the model comes back with a question instead.&lt;/p&gt;

&lt;p&gt;The actual workflow lives in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; files. There is a global one at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.claude/CLAUDE.md&lt;/code&gt; that carries my voice, my languages, my hard rules. No Docker. No cloud-only services. Tests are not optional. Don’t rely on my fonts. There is a workspace one at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.gitrepos/CLAUDE.md&lt;/code&gt; that maps which directories are portfolio code, which are exploratory, which are for friends, and which are read-only by policy. And there is a per-project one in every repo with that project’s contract: the spec, the conventions, the things that must not break. The three load in order, most-specific wins, and the result is a layered context that does the same job a long-tenured human collaborator does on a small team. There is no prompt-engineering theatre in any of it; they are the same instructions I would give a person if a person were available.&lt;/p&gt;

&lt;p&gt;The other half is the &lt;strong&gt;memory system&lt;/strong&gt;. The assistant writes its own notes against my projects, what I corrected, what I confirmed, what I told it to ignore, and reads them back when relevant. The notes are mine to audit, edit, and prune. Most of the corrections that used to recur every session don’t anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini Pro&lt;/strong&gt; stays installed as a second opinion when I want to cross-check a structural decision against a different architecture. I would rather have it and not need it.&lt;/p&gt;

&lt;p&gt;I expect this section to age the fastest of anything in this post.&lt;/p&gt;

&lt;h2 id=&quot;postscript-2026-09-13&quot;&gt;Postscript (2026-09-13)&lt;/h2&gt;

&lt;p&gt;§X aged on schedule. On 2026-09-03 Claude Code was retired from this machine, and the agent client in its place is &lt;strong&gt;ZCode&lt;/strong&gt;, running &lt;strong&gt;GLM&lt;/strong&gt; models from Z.ai; the Claude Max line item is gone with it. What survived is everything in this section that actually did the work: plan mode, tight prompts, coming back with a question instead of a guess, and the layered context files. The global one now lives at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.zcode/AGENTS.md&lt;/code&gt;, converted from the original &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.claude/CLAUDE.md&lt;/code&gt; (kept, frozen, at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/refs/CLAUDE.md&lt;/code&gt;); the workspace file never moved; and the per-project files keep their &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; names, each paired with an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; symlink, because the filenames are load-bearing convention rather than loyalty to any one tool.&lt;/p&gt;

&lt;h2 id=&quot;postscript-2026-09-15&quot;&gt;Postscript (2026-09-15)&lt;/h2&gt;

&lt;p&gt;§IX has drifted too. The CalibreQuarry bullet says “stdlib-only” and “installs as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cquarry&lt;/code&gt;”; neither has been true since the cquarry split: the package now builds on cquarry and vir-tui (tqdm for the progress bars), installs from PyPI as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calibrequarry&lt;/code&gt;, and the write-capable curation verbs that landed through September make “complete software that I am not in a hurry to extend” the fastest-ageing sentence in this post.&lt;/p&gt;
</content>
  </entry>
</feed>
