<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Jorisvandijk.com</title>
    <link>https://jorisvandijk.com/</link>
    <description>Recent content on Jorisvandijk.com</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>en-us</language>
    <managingEditor>contact@jorisvandijk.com (Joris)</managingEditor>
    <webMaster>contact@jorisvandijk.com (Joris)</webMaster>
    <lastBuildDate>Wed, 15 Apr 2026 14:28:45 +0200</lastBuildDate>
    <atom:link href="https://jorisvandijk.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>LUKS</title>
      <link>https://jorisvandijk.com/posts/luks/</link>
      <pubDate>Wed, 15 Apr 2026 14:28:45 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/luks/</guid>
      <description>&lt;p&gt;LUKS, &lt;em&gt;Linux Unified Key Setup&lt;/em&gt;, is a way to encrypt partitions on Linux. It&amp;rsquo;s a good way to store sensitive data on a flash drive or on your main system. Usage is super simple. You issue a command to unlock it and it will prompt you for your passphrase. After entering the right one, you can mount the partition and use it as normal. When you&amp;rsquo;re done with it, you umount the partition and lock it with another command. Without the right passphrase the data on the partition is just noise.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;div class=&#34;warning-banner&#34;&gt;
  &lt;div class=&#34;warning-header&#34;&gt;
    &lt;span class=&#34;warning-icon&#34;&gt;⚠️&lt;/span&gt;
    &lt;span class=&#34;warning-title&#34;&gt;WARNING&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;warning-content&#34;&gt;
    THIS IS A DESTRUCTIVE ACT! IT WILL ERASE EVERYTHING ON THE PARTITION!
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Find the partition you want to encrypt with &lt;code&gt;lsblk&lt;/code&gt; then format it as LUKS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cryptsetup luksFormat /dev/sdXN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Where &lt;code&gt;X&lt;/code&gt; is the drive letter and &lt;code&gt;N&lt;/code&gt; the partition number. You&amp;rsquo;ll be prompted to type &lt;code&gt;YES&lt;/code&gt; in all capitals to confirm you&amp;rsquo;re ok with your data being overwritten. Then you&amp;rsquo;ll set a passphrase and confirm it. Next, unlock the LUKS partition.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cryptsetup luksOpen /dev/sdXN vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I am naming mine &lt;code&gt;vault&lt;/code&gt; here, but you can use whatever you like. Just be sure to use the same name in all other commands. Now you get to pick which filesystem you want to use on the drive. LUKS doesn&amp;rsquo;t care what you pick, it supports pretty much all of them. In this post I&amp;rsquo;ll use &lt;em&gt;ext4&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkfs.ext4 /dev/mapper/vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s basically it. You&amp;rsquo;ve set up the partition as a LUKS partition. The partition is now unlocked and has a filesystem on it.&lt;/p&gt;
&lt;h2 id=&#34;mounting&#34;&gt;Mounting&lt;/h2&gt;

&lt;div class=&#34;note-banner&#34;&gt;
  &lt;div class=&#34;note-header&#34;&gt;
    &lt;span class=&#34;note-icon&#34;&gt;📝&lt;/span&gt;
    &lt;span class=&#34;note-title&#34;&gt;NOTE&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;note-content&#34;&gt;
    This post assumes you&amp;rsquo;re following along from start to finish, which means at this point your partition is unlocked. Remember that if you&amp;rsquo;re not, you&amp;rsquo;ll need to have unlocked the partition before you can mount it. Unlocking is covered further down.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Now would be a good time to store your &lt;code&gt;super-secret-document.md&lt;/code&gt; on the partition. In order to do so, you&amp;rsquo;ll need to mount it. First create the mount point. You&amp;rsquo;ll only need to do this once.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir /mnt/vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can use any name and location, I&amp;rsquo;ll just use &lt;code&gt;vault&lt;/code&gt; again and have it in &lt;code&gt;/mnt/&lt;/code&gt;. And now mount the unlocked partition.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount /dev/mapper/vault /mnt/vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can now use the partition like you&amp;rsquo;d use any other.&lt;/p&gt;
&lt;h2 id=&#34;unmounting&#34;&gt;Unmounting&lt;/h2&gt;
&lt;p&gt;So after storing that &lt;code&gt;super-secret-document.md&lt;/code&gt;, you&amp;rsquo;re done with the partition. We&amp;rsquo;re going to lock it, but before we can, we need to unmount it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo umount /mnt/vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;locking&#34;&gt;Locking&lt;/h2&gt;
&lt;p&gt;And now in order to lock the partition, you issue the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cryptsetup luksClose vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The partition is now locked.&lt;/p&gt;
&lt;h2 id=&#34;unlocking&#34;&gt;Unlocking&lt;/h2&gt;
&lt;p&gt;In order to unlock it, you&amp;rsquo;ll need to issue a command we already covered in the setup. But from here on in, this is how you open the partition.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cryptsetup luksOpen /dev/sdXN vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Obviously, to use it you&amp;rsquo;ll need to mount it. See the mounting section.&lt;/p&gt;
&lt;h2 id=&#34;workflow&#34;&gt;Workflow&lt;/h2&gt;
&lt;p&gt;So the workflow for using your new LUKS partition is going to be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unlock the partition&lt;/li&gt;
&lt;li&gt;Mount the partition&lt;/li&gt;
&lt;li&gt;Do your work in the partition&lt;/li&gt;
&lt;li&gt;Unmount the partition&lt;/li&gt;
&lt;li&gt;Lock the partition&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    <item>
      <title>Rsync</title>
      <link>https://jorisvandijk.com/posts/rsync/</link>
      <pubDate>Sun, 12 Apr 2026 17:04:44 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/rsync/</guid>
      <description>&lt;p&gt;Rsync is an amazing utility to copy (or sync) &lt;em&gt;stuff&lt;/em&gt; from one place to another without having to worry about the command getting cut. With a plain &lt;em&gt;cp&lt;/em&gt;, an interrupted transfer means starting over from scratch. Rsync compares source and destination, skipping files that are already there, and with &lt;code&gt;--partial&lt;/code&gt; it can even resume a file that was only halfway through. It can also remember ownership and permissions, and even copy over &lt;em&gt;ssh&lt;/em&gt;. That is, with the right flags, which I can never remember. Hence this post.&lt;/p&gt;
&lt;h2 id=&#34;my-favorite&#34;&gt;My favorite&lt;/h2&gt;
&lt;p&gt;For local copying I like to use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync -avh --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;progress2 --partial &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;source&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;destination&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Flags used are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt;: Archive mode (recursive, preserves permissions, timestamps, symlinks, etc.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt;: Verbose (gimme all the output)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h&lt;/code&gt;: Human-readable sizes (because 1,073,741,824 bytes is not helpful)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--info=progress2&lt;/code&gt;: Shows overall progress (including number of files, percentage done, etc.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--partial&lt;/code&gt;: resumes interrupted transfers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;to-server&#34;&gt;To server&lt;/h2&gt;
&lt;p&gt;Copying files to my server, I&amp;rsquo;d use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync -avh --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;progress2 --partial ~/Photos/ joris@192.168.1.5:/data/photos/ 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So basically the same flags, but this time I am moving my photos to my server over &lt;em&gt;ssh&lt;/em&gt;. Good to note is the trailing slash. &lt;code&gt;Photos/&lt;/code&gt; copies the contents, &lt;code&gt;Photos&lt;/code&gt; copies the directory itself.&lt;/p&gt;
&lt;h2 id=&#34;from-server&#34;&gt;From server&lt;/h2&gt;
&lt;p&gt;And grabbing files from my server is pretty much the same, but reversed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync -avh --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;progress2 --partial joris@192.168.1.5:/logs/ ~/Server_logs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And now my server logs are saved locally.&lt;/p&gt;
&lt;h2 id=&#34;other-interesting-options&#34;&gt;Other interesting options&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--delete&lt;/code&gt;: Mirror mode, which removes files at the destination that no longer exist at the source&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e &amp;quot;ssh -p 2222&amp;quot;&lt;/code&gt;: Use a custom SSH port&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--remove-source-files&lt;/code&gt;: Move instead of copy so it removes source files after successful transfer (this does leave empty directories behind)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt;/&lt;code&gt;--dry-run&lt;/code&gt;: Simulate the transfer without touching anything (especially when running &lt;code&gt;--delete&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Format on MacOS</title>
      <link>https://jorisvandijk.com/posts/format-on-macos/</link>
      <pubDate>Sun, 12 Apr 2026 14:04:50 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/format-on-macos/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m used to formatting disks on Linux with GParted, but unfortunately there&amp;rsquo;s no version for MacOS. They offer some sort of bootable image, but that sounded like a hassle. Luckily it turns out MacOS has a built-in tool. Usage is simple. I wanted to format a drive to ExFat, and all it takes is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;diskutil list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To list the drives on your system and find the name of the one you want to format. Then:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;diskutil eraseDisk ExFAT DRIVENAME diskX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Where &lt;code&gt;ExFAT&lt;/code&gt; is one of the possible formats, &lt;code&gt;DRIVENAME&lt;/code&gt; is the name you want to give to the drive, say &amp;ldquo;MyThumbDrive&amp;rdquo;. The X in &lt;code&gt;diskX&lt;/code&gt; needs to be the number of the drive to be formatted. That&amp;rsquo;s it.&lt;/p&gt;
&lt;div class=&#34;warning-banner&#34;&gt;
  &lt;div class=&#34;warning-header&#34;&gt;
    &lt;span class=&#34;warning-icon&#34;&gt;⚠️&lt;/span&gt;
    &lt;span class=&#34;warning-title&#34;&gt;WARNING&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;warning-content&#34;&gt;
    Be aware this will nuke your entire drive! All data on it will be lost.
  &lt;/div&gt;
&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Don&#39;t Buy The Thing</title>
      <link>https://jorisvandijk.com/posts/physical-things-i-value/</link>
      <pubDate>Wed, 18 Mar 2026 22:24:35 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/physical-things-i-value/</guid>
      <description>&lt;p&gt;I recently noticed myself wanting stuff, then thinking on it only to realize I didn&amp;rsquo;t really. It&amp;rsquo;s like &lt;em&gt;ADHD greed&lt;/em&gt; and I blame YouTube. Anyway, this got me thinking. What do I own that I really do value? I own things I would replace on the spot if I lost them, but there are also things that couldn&amp;rsquo;t be replaced. So there are things I value enough to acquire them a second time, but there are also things I value more. Things that cannot be replaced.&lt;/p&gt;
&lt;h2 id=&#34;server&#34;&gt;Server&lt;/h2&gt;
&lt;p&gt;I have a server that stores my media (movies, series, books, games, etcetera), my photos and my videos. It has my (and my wife&amp;rsquo;s) important documents and all the &lt;em&gt;stuff&lt;/em&gt; I digitally own. It runs my services like the *arr suite and my security cameras. It manages my lights through Home Assistant and it enables me to watch my media through Jellyfin. It does it all and it does it well. If it or any part of it would need replacement, I&amp;rsquo;d do it on the spot. I replaced a dead 16TB hard drive (naturally one month out of warranty) a few weeks ago. It cost an arm and a leg, but I didn&amp;rsquo;t hesitate for a second.&lt;/p&gt;
&lt;h2 id=&#34;coffee-maker&#34;&gt;Coffee maker&lt;/h2&gt;
&lt;p&gt;I love coffee. I drink it throughout the day. Black. But, I like to drink a cappuccino every morning. It&amp;rsquo;s a little ritual the wife and I picked up due to our love of Italy. While we&amp;rsquo;re there, we always start the day with one. When we got home after every trip, we missed that. So we bought a manual espresso machine by an Italian brand that specializes in the things. It was stupid expensive, but the amount of joy we get from it every day more than makes up for the financial pain. If that thing were to explode tomorrow, we&amp;rsquo;d have a new one the next day.&lt;/p&gt;
&lt;h2 id=&#34;macbook&#34;&gt;MacBook&lt;/h2&gt;
&lt;p&gt;I identify as a Linux user. It&amp;rsquo;s what I know and have used for well over 15 years. I recently bought a MacBook Air as my main system. I am never going back. This thing is amazing. It looks good, it works incredibly well and I can Linux my butt off in the terminal as much as I want. And while I know it&amp;rsquo;s not proper Linux, I can still Bash script, use my favorite terminal and do all operations and text editing and &lt;em&gt;what have you&lt;/em&gt; on it. It&amp;rsquo;s compact, light, made of metal and completely silent. The chip in it is plenty fast for my needs and I can even play games on it. And the screen is amazing. Beyond any shadow of a doubt, when this thing fails on me, I am getting a new one.&lt;/p&gt;
&lt;h2 id=&#34;watches&#34;&gt;Watches&lt;/h2&gt;
&lt;p&gt;I own several mechanical watches. All of them automatics and three of them my dad bought. He&amp;rsquo;s no longer with us, but the watches are. These three watches I love wearing and if I was to break any of them, I&amp;rsquo;d pay whatever the price for the repair was. But if I were to lose any of them, I&amp;rsquo;d be gutted.&lt;/p&gt;
&lt;h2 id=&#34;and&#34;&gt;&amp;hellip;and?&lt;/h2&gt;
&lt;p&gt;Well, that&amp;rsquo;s basically it. I read &lt;a href=&#34;https://www.latimes.com/health/la-he-keeping-stuff-20140322-story.html&#34;&gt;somewhere&lt;/a&gt; that my home has about 300,000 things in it (if it was moved eastward by about 5000 kilometers or 3200 miles). Four is a laughable percentage of that. And then though, it&amp;rsquo;s just stuff. Losing any or all would sting. The watches would maybe make me shed a tear, then nothing. Then I&amp;rsquo;d buy a new watch. Stuff does not matter. None of it. Don&amp;rsquo;t buy the thing.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Terminal Abbreviations</title>
      <link>https://jorisvandijk.com/posts/abbreviations/</link>
      <pubDate>Tue, 03 Mar 2026 11:11:21 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/abbreviations/</guid>
      <description>&lt;p&gt;Typing takes time. Typing without typos is an art. Fixing mistakes in a terminal command is a pain in the neck. Luckily there&amp;rsquo;s such a thing as &lt;em&gt;aliases&lt;/em&gt;. An alias lets you set a keyword and a command it should expand to. For example, I have set a super simple one, which is widely used: &lt;code&gt;alias ..=&#39;cd ..&#39;&lt;/code&gt;. This allows me to write &lt;code&gt;..&lt;/code&gt; in terminal and it will act like &lt;code&gt;cd ..&lt;/code&gt;, saving me typing a &lt;em&gt;c&lt;/em&gt;, a &lt;em&gt;d&lt;/em&gt; and a space, followed by two dots. This seems minor, but when you imagine how often I need to go up a directory in terminal, it&amp;rsquo;s a huge timesaver.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not just saving time. Some commands I simply cannot remember. So for using &lt;em&gt;rsync&lt;/em&gt; to move a file over to or from my server, the command I use is &lt;code&gt;rsync -a --no-owner --partial --info=progress2 -e ssh&lt;/code&gt;. There&amp;rsquo;s no way I&amp;rsquo;ll remember that, so I aliased it. There&amp;rsquo;s one snag when it comes to aliases: they can only be used at the start of a line. This &lt;em&gt;rsync&lt;/em&gt; command is usually followed by either a local directory or a location on my server. This means typing out either the local address or the username and IP of the server followed by the remote location. This is a somewhat long string which is always the same. This is a hassle and would be so much easier if it could be replaced by an alias. Enter &lt;a href=&#34;https://github.com/olets/zsh-abbr&#34;&gt;zsh-abbr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This nifty program lets you set up &amp;ldquo;abbreviations&amp;rdquo;, which basically work like aliases, except you can add a flag and they work anywhere on the line! So instead of typing out &lt;code&gt;joris@192.168.1.5:/&lt;/code&gt; I can now type &lt;code&gt;srv&lt;/code&gt; and it automatically (and interactively) expands to that! The automatic expansion is also an improvement over aliases, as it shows the actual command or string in history, not the alias used. I moved over the &lt;em&gt;rsync&lt;/em&gt; command to an abbreviation, which means I can now type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;copy . srv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Instead of:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync -a --no-owner --partial --info=progress2 -e ssh . username@192.168.1.5:/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And remember, it&amp;rsquo;s interactive, meaning that after you typed &lt;code&gt;copy&lt;/code&gt; and pressed space, it visibly changes to the &lt;em&gt;rsync&lt;/em&gt; command. Same for the &lt;code&gt;srv&lt;/code&gt; abbreviation, meaning you see the entire command before you press enter!&lt;/p&gt;
&lt;h2 id=&#34;adding-abbreviations&#34;&gt;Adding Abbreviations&lt;/h2&gt;
&lt;p&gt;First &lt;a href=&#34;https://zsh-abbr.olets.dev/installation.html&#34;&gt;install the program&lt;/a&gt;. Then add an abbreviation in terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;abbr copy=&amp;#34;rsync -a --no-owner --partial --info=progress2 -e ssh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or, when you want to have it work globally (anywhere on the line), add the &lt;code&gt;-g&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;abbr -g srv=&amp;#34;joris@192.168.1.5:/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For more commands, see the &lt;a href=&#34;https://zsh-abbr.olets.dev/commands.html&#34;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;caveats&#34;&gt;Caveats&lt;/h2&gt;
&lt;p&gt;This only works in Zsh. If you use Fish, it&amp;rsquo;s built-in. Bash unfortunately has no support for this as far as I&amp;rsquo;m aware.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Permissions on Shared ZFS Dataset</title>
      <link>https://jorisvandijk.com/posts/permissions-shared-zfs/</link>
      <pubDate>Tue, 24 Feb 2026 17:30:41 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/permissions-shared-zfs/</guid>
      <description>&lt;p&gt;I have a ZFS dataset named &lt;em&gt;data&lt;/em&gt;, mounted at &lt;em&gt;/data&lt;/em&gt;, which I bind-mount into my LXC containers. The dataset is a three drive set with a lot of storage space. Basically, this huge pool of gigabytes is shared by all LXC containers that need to store serious amounts of data. Think &lt;em&gt;Immich&lt;/em&gt;, for photo storage, or &lt;em&gt;Jellyfin&lt;/em&gt; and all the movies, series and music it has to be able to play. As you may imagine, having several different LXCs write to the same &amp;ldquo;drive&amp;rdquo; may cause permission issues.&lt;/p&gt;
&lt;p&gt;What I want is that all files and directories created on this dataset are readable, editable and executable to all users of the space. So far I&amp;rsquo;ve mainly &lt;em&gt;chown&lt;/em&gt;-ed whenever I ran into an issue, but a more sustainable long term solution was needed.&lt;/p&gt;
&lt;h2 id=&#34;acl&#34;&gt;ACL&lt;/h2&gt;
&lt;p&gt;Access Control Lists, or ACLs, extend Linux&amp;rsquo;s basic permission system. Normally you have three categories to work with: owner, group, and others. That&amp;rsquo;s fine for simple setups, but falls apart when multiple services need access to the same files. ACLs let you set permissions for any number of users or groups. More importantly, they support &lt;em&gt;default ACLs&lt;/em&gt; which are rules new files and directories automatically inherit when created inside a given directory. Set it once, forget about it. On ZFS you do need to explicitly enable ACL support on the dataset first, since ZFS does its own thing under the hood.&lt;/p&gt;
&lt;h2 id=&#34;install-and-setup&#34;&gt;Install and setup&lt;/h2&gt;
&lt;p&gt;The process is pretty straight forward. First install the program:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install acl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next, as this is a ZFS dataset, we&amp;rsquo;ll enable support for ACL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zfs &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acltype&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;posixacl data &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; zfs &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;xattr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;sa data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We&amp;rsquo;ll now set the defaults we want to &lt;em&gt;/data&lt;/em&gt;&amp;rsquo;s existing files. Depending on how large the amount of data is, this might take some time. Be patient, grab a cup of coffee.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;setfacl -Rm u::rwx,g::rwx,o::rwx /data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we&amp;rsquo;ll make sure any future files will also inherit these defaults:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;setfacl -Rm u::rwx,g::rwx,o::rwx /data.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;validating&#34;&gt;Validating&lt;/h2&gt;
&lt;p&gt;To make sure all is well, we&amp;rsquo;ll also check it&amp;rsquo;s set up right now:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;getfacl /data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We&amp;rsquo;re looking for an output like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@pve:~# getfacl /data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;getfacl: Removing leading &lt;span class=&#34;s1&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; from absolute path names
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# file: data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# owner: root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# group: root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;user::rwx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;group::rwx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;other::rwx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;default:user::rwx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;default:group::rwx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;default:other::rwx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Where  &lt;code&gt;default:user::rwx&lt;/code&gt;, &lt;code&gt;default:group::rwx&lt;/code&gt;, and &lt;code&gt;default:other::rwx&lt;/code&gt; are what we&amp;rsquo;re looking to see.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also a good idea to test if new files and directories will get the right permissions as well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir /data/acl-test &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; getfacl /data/acl-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The new directory should show the same &lt;code&gt;default:&lt;/code&gt; entries without having set anything manually.&lt;/p&gt;
&lt;p&gt;If this checks out, remove the test file and we&amp;rsquo;re done!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rmdir /data/acl-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    <item>
      <title>Upgrading Proxmox VE From 8 to 9</title>
      <link>https://jorisvandijk.com/posts/upgrade-proxmox-8-to-9/</link>
      <pubDate>Mon, 23 Feb 2026 12:04:12 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/upgrade-proxmox-8-to-9/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s about that time. There&amp;rsquo;s a &lt;a href=&#34;https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-9-0&#34;&gt;new&lt;/a&gt; version of Proxmox VE in town and it has had a couple of months to &amp;ldquo;stabilize&amp;rdquo;. Now is the time to bump up the version of that homelab.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve pulled the trigger and did the upgrade. The following is &lt;em&gt;my&lt;/em&gt; experience with doing this update. I&amp;rsquo;ve run into some issues, which all got solved and I didn&amp;rsquo;t break my server.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You must be on &lt;strong&gt;PVE 8.4.1 or newer&lt;/strong&gt; before upgrading. Check with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pveversion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure all your VMs and containers have &lt;strong&gt;verified backups&lt;/strong&gt; in PBS before starting. It&amp;rsquo;d suck to lose those&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-1-run-the-pre-flight-checker&#34;&gt;Step 1: Run the Pre-flight Checker&lt;/h2&gt;
&lt;p&gt;Proxmox provides an official checker script that identifies issues before you touch anything:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pve8to9 --full
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run this, fix every &lt;strong&gt;FAIL&lt;/strong&gt;, then run it again. Don&amp;rsquo;t proceed until you have 0 failures. Warnings are acceptable but worth addressing.&lt;/p&gt;
&lt;h2 id=&#34;step-2-fix-issues&#34;&gt;Step 2: Fix Issues&lt;/h2&gt;
&lt;p&gt;I cannot go through all possible issues you might encounter, like I stated above: this is my experience of the process. I&amp;rsquo;ll address the issues I ran into.&lt;/p&gt;
&lt;h3 id=&#34;fail-systemd-boot-meta-package-installed&#34;&gt;FAIL: systemd-boot meta-package installed&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_8_to_9#sd-boot-warning&#34;&gt;wiki&lt;/a&gt; has the solution to this: I first checked whether I&amp;rsquo;m actually using systemd-boot or if it&amp;rsquo;s just an orphaned package:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bootctl status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The output said &lt;code&gt;systemd-boot not installed in ESP&lt;/code&gt; and shows GRUB in the EFI variables, so it&amp;rsquo;s safe to remove:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt remove systemd-boot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;fail-resolved-node-ip-not-configured&#34;&gt;FAIL: Resolved node IP not configured&lt;/h3&gt;
&lt;p&gt;The checker resolves your hostname and checks whether that IP is active on an interface. I remember messing around with my network and the IP addresses of devices on it, trying to have a standard. I may have forgotten to update the IP here, so I first checked my actual IP:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip addr show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then I opened &lt;code&gt;/etc/hosts&lt;/code&gt; directly in a text editor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I found the line with my node&amp;rsquo;s hostname and updated the IP to match what &lt;code&gt;ip addr show&lt;/code&gt; had reported. Save and quit.&lt;/p&gt;
&lt;h3 id=&#34;warn-less-than-5-gb-free-on-root&#34;&gt;WARN: Less than 5 GB free on root&lt;/h3&gt;
&lt;p&gt;This is a weird one. My drive is absolutely large enough and I have not used all space on it with my Proxmox system. Let&amp;rsquo;s start with a cleanup:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt clean
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;journalctl --vacuum-size&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;500M
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That wasn&amp;rsquo;t enough, so I looked for what was eating space:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;du -xsh /* 2&amp;gt;/dev/null &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sort -rh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -20
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;(The &lt;code&gt;-x&lt;/code&gt; flag is important as it keeps the scan on the root filesystem only and won&amp;rsquo;t cross into other mounts).&lt;/p&gt;
&lt;p&gt;This pointed me to &lt;code&gt;/cctv&lt;/code&gt;, which turned out to be the issue. Frigate had been writing footage there, but the dedicated CCTV SSD wasn&amp;rsquo;t actually mounted. Somehow the mount had gotten lost. Instead of writing to the SSD, everything had been going straight to the root NVMe. I verified this with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;findmnt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I remounted the SSD and added it back to &lt;code&gt;/etc/fstab&lt;/code&gt; to make it persistent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mount /dev/sdXY /cctv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;UUID=xxxx  /cctv  ext4  defaults  0  2&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After that I cleared out the footage that had accumulated on root, which freed up lots of space to continue the upgrade. How did I miss this? Good question. Turns out I am not a professional IT administrator.&lt;/p&gt;
&lt;h3 id=&#34;notice-lvm-autoactivation&#34;&gt;NOTICE: LVM autoactivation&lt;/h3&gt;
&lt;p&gt;LVM autoactivation means that logical volumes (the virtual disks your VMs and containers use) are automatically made available by the system at boot. In PVE 8 this was the default behaviour, but it can cause problems on shared storage setups where multiple nodes might try to activate the same volume simultaneously. PVE 9 disables autoactivation for all newly created volumes and lets Proxmox handle activation itself when a guest actually needs it. The migration script takes care of bringing the existing volumes in line with this new behaviour.&lt;/p&gt;
&lt;p&gt;As noted in the &lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_8_to_9#LVM/LVM-thin_storage_has_guest_volumes_with_autoactivation_enabled&#34;&gt;Proxmox upgrade documentation&lt;/a&gt;, running the script is optional if your volumes are on local storage only, but still recommended. I ran it anyway:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I confirmed with &lt;code&gt;y&lt;/code&gt; when prompted.&lt;/p&gt;
&lt;h2 id=&#34;step-3-stop-all-guests&#34;&gt;Step 3: Stop All Guests&lt;/h2&gt;
&lt;p&gt;Stopping all guests before upgrading reduces the risk of filesystem or database corruption mid-upgrade.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct stop &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct stop &lt;span class=&#34;m&#34;&gt;102&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ... etc &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm stop &lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ... etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Verify everything is stopped:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;step-4-update-repositories-and-upgrade&#34;&gt;Step 4: Update Repositories and Upgrade&lt;/h2&gt;
&lt;p&gt;I then replaced &lt;code&gt;bookworm&lt;/code&gt; with &lt;code&gt;trixie&lt;/code&gt; in apt sources:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/bookworm/trixie/g&amp;#39;&lt;/span&gt; /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/bookworm/trixie/g&amp;#39;&lt;/span&gt; /etc/apt/sources.list.d/*.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next I updated and verified the new repos resolve without errors:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You should see Debian trixie, trixie-security, trixie-updates, and Proxmox trixie all resolving cleanly. Then I ran the upgrade:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt dist-upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;step-5-answer-config-file-prompts&#34;&gt;Step 5: Answer Config File Prompts&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll be asked about several config files during the upgrade. Here&amp;rsquo;s what I answered for each:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;File&lt;/th&gt;
          &lt;th&gt;Answer&lt;/th&gt;
          &lt;th&gt;Reason&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/etc/issue&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;N&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Keep your current version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/etc/lvm/lvm.conf&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Y&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Take the maintainer&amp;rsquo;s updated version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Y&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;If unmodified&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/etc/default/grub&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;N&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Keep your current version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/etc/chrony/chrony.conf&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Y&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Take the maintainer&amp;rsquo;s updated version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Keyboard layout&lt;/td&gt;
          &lt;td&gt;Pick your layout&lt;/td&gt;
          &lt;td&gt;Physical keyboard preference&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Restart services automatically&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Guests are stopped anyway&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    For any config file you&amp;rsquo;ve customised heavily, use &lt;strong&gt;D&lt;/strong&gt; to diff the versions before deciding.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-6-reboot&#34;&gt;Step 6: Reboot&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After rebooting, verify the upgrade succeeded:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pveversion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;pve-manager/9.x.x/...&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-7-start-guests-back-up&#34;&gt;Step 7: Start Guests Back Up&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start &lt;span class=&#34;m&#34;&gt;102&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ... etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm start &lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ... etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Check the web UI to confirm everything looks right.&lt;/p&gt;
&lt;h2 id=&#34;post-upgrade-cleanup&#34;&gt;Post-Upgrade Cleanup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remove any packages you no longer use. I noticed I still had Zabbix on there I was no longer using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt purge zabbix-agent2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt autoremove
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify all your mounts are correct with &lt;code&gt;findmnt&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check that all storages show as active in the Proxmox web UI under Datacenter → Storage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm backup jobs are still configured under Datacenter → Backup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart any long-running jobs that were interrupted (e.g. media library scans)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And that was it. Pretty painless to be honest. Unfortunately I decided to use the second NVMe slot I wasn&amp;rsquo;t using to set up a ZFS pool with the NVMe that was running Proxmox. That way when one fails, I won&amp;rsquo;t lose my Proxmox setup and had some redundancy. Alas it&amp;rsquo;s impossible to switch an LVM to a ZFS pool on a running Proxmox instance. You&amp;rsquo;ll have to do a fresh install&amp;hellip; which I did a day after doing this upgrade. At least I can say I&amp;rsquo;ve had the experience, I suppose.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Stuff</title>
      <link>https://jorisvandijk.com/posts/stuff/</link>
      <pubDate>Fri, 19 Dec 2025 01:41:14 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/stuff/</guid>
      <description>&lt;p&gt;I have too much shit. It’s been 40 years of me gathering it and storing it. On my dad dying I inherited even more shit. Shit that’s even harder to part with. I like a bare environment. My living room sports two couches, a coffee table, a tv dresser with a tv and sound bar, a large closet, a dinner table, six chairs, a sideboard, two plants a lamp and a statue. That’s it. There are no more furnishings. No clutter, no fluff. Well, ok - the two sofa’s each have two pillows. I had to fight the wife to get it down to four total. Oh, and the house came with a wood burner, which I’ve placed a stand with a set of tools like thongs, a poker, brush and scoop next to. There’s also a single photo frame on the large closed with six photos too. We also have a decorative samovar on the wood burner. Still, when comparing to living rooms of people  I know, mine- well ours is quite sparse. A better example; the bedroom. All it has is a bed, a dresser, two nightstands and a wooden ladder on which the wife hangs clothes in between clean and dirty (don’t ask, I have no clue). In the kitchen there’s a breadbox, salt, pepper, oil and a coffee maker on my counters. Oh, and a fruitbowl.&lt;/p&gt;
&lt;p&gt;To me this seems sparse and clean and I wish this was all I kept. Now let us move to the in-house garage. This place is packed to the rafters with boxes. These boxes have been moved into this house two years ago. They have not been opened since. They store books, trinkets, crap and shit of mine, the wife, my dad and lord knows what. It’s a collection of stuff I can happily live without, apparently, as I have not missed or used a thing in them in two years. I should just put them all into a van without looking into them and drop them off at the dump. Just get rid of it and be done with it.&lt;/p&gt;
&lt;p&gt;I can’t.&lt;/p&gt;
&lt;p&gt;This collection may contain some unknown artifact, wondrous trinket or amazing tome too valuable, rare or important to discard. It may hold great monetary or emotional value. These white-yellow moving boxes simply cannot be tossed aside willy-nilly. One would have to open each and every one to discover the treasure within! They would have to pick through all the worthless gunk in order to unearth the gems underneath. One by one. Box by box.&lt;/p&gt;
&lt;p&gt;I do not have the willpower to actually tackle this task. I don’t want to dig through all this shit and discard everything piece by piece. I don’t want to discover it’s pretty much all junk to be tossed. I especially don’t want to go through all the boxes I know have books in them. How does one throw away a book? How does one store all of them? Which book is worth saving, which is ripe for burning? About half of these boxes contain books as my dad had many. I cannot bin a book. Books are, well books. I should donate them instead. Then again, which ones? If I donate all of them, will I grow to regret it? Should I read them all first? Can I? I grow tired just thinking about this.&lt;/p&gt;
&lt;p&gt;So they sit. Taking up space. Space I would like to use as a home gym, I mean I have the gear sitting next to them waiting for space to open up. This entire room can be used so much better, but isn’t. Let the fucking room flood, please. Let all the boxed be riddled with mildew and water damage. Hell, let it all be washed away in a biblical flood cleaning out the entire garage. Just the garage though. I am rather fond of the house.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Desktop-like Server</title>
      <link>https://jorisvandijk.com/posts/desktop-like-server/</link>
      <pubDate>Thu, 18 Dec 2025 00:58:01 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/desktop-like-server/</guid>
      <description>&lt;p&gt;I just moved my server into my server rack. This sounds silly, but it was a desktop-like enclosure, not a rack mounted one. I do have a rack mount in my basement, but it mainly held switches and the likes. Now it also holds my server and it&amp;rsquo;s amazing.&lt;/p&gt;
&lt;p&gt;The reason for posting this, apart from celebrating the joy of having done this and getting rid of the server sounds in the office, is that I figured there&amp;rsquo;s a tip to be had!&lt;/p&gt;
&lt;p&gt;Buy a cheap second monitor, external display thing from Ali. It&amp;rsquo;s one of those tablet-like and tablet-sized things that will act like a secondary monitor on a laptop. Or, a main display in my case. Get this thing and connect it to your rack-mounted server. You now have a display there. Next, grab the USB dongle from your expensive keyboard you always use through Bluetooth or via cable, and whack it in one of the server&amp;rsquo;s USB ports.&lt;/p&gt;
&lt;p&gt;Now, when you have an issue with your server and SSH is failing, you just need to grab that keyboard and wander on to your rack. Switch the slider of your keyboard to USB dongle, turn on the little monitor and you have a desktop PC-like experience on your server.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>I Love Writing Tutorials</title>
      <link>https://jorisvandijk.com/posts/i-love-writing-tutorials/</link>
      <pubDate>Thu, 04 Dec 2025 15:34:19 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/i-love-writing-tutorials/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I wrote one, but the other day I finally finished &lt;a href=&#34;https://jorisvandijk.com/posts/proxmox-backup-server/&#34;&gt;my tutorial&lt;/a&gt; on setting up &lt;em&gt;Proxmox Backup Server&lt;/em&gt;. It&amp;rsquo;s a detailed account of what I did. I mainly write these to clean up the notes I take while working on things. If I left the notes as-is, in a few months I’d have no idea what I actually did. The notes simply don’t contain everything, so while it&amp;rsquo;s still fresh in my mind, I turn them into a tutorial. I do so mostly for myself, but hopefully its useful to others as well.&lt;/p&gt;
&lt;p&gt;Like I said, it’s been a while since I did this, and I forgot how much I enjoy the process! It’s basically going through my notes and recreating whatever I built, while writing down exactly what needs to be done. It takes hours, but for some reason it gives me a warm, fuzzy feeling inside. I enjoyed it so much that I already started another tutorial. :)&lt;/p&gt;
&lt;p&gt;I’m not going to say I&amp;rsquo;ll be doing more of these in the coming months, because I rarely stick to promises like that. Instead, I just hope I will.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Proxmox Backup Server</title>
      <link>https://jorisvandijk.com/posts/proxmox-backup-server/</link>
      <pubDate>Wed, 03 Dec 2025 19:48:47 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/proxmox-backup-server/</guid>
      <description>&lt;p&gt;This is going to be a long one. I have spent countless hours setting up my Proxmox VE and the VM&amp;rsquo;s and LXC containers on it. It occurred to me that it might be wise to have a decent backup solution for this, in case something goes catastrophically wrong. Luckily Proxmox provides a ready-made solution for this and it is called &lt;em&gt;Proxmox Backup Server&lt;/em&gt; or PBS for short. This post will go through how I set this up on &lt;em&gt;my&lt;/em&gt; system.&lt;/p&gt;
&lt;h1 id=&#34;assumptions&#34;&gt;Assumptions&lt;/h1&gt;
&lt;p&gt;I will be making a number of assumptions in this article regarding the setup of the server and about you, namely:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is running Proxmox 8.x or newer.&lt;/li&gt;
&lt;li&gt;Proxmox is installed on its own drive on the server (in my case this is an nvme drive, not that it matters).&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a separate physical disk (an SSD in my case) where backups will be stored.&lt;/li&gt;
&lt;li&gt;The backup drive is mounted at &lt;code&gt;/media/backups&lt;/code&gt;. You may use a different mount point, this is just the one I use.&lt;/li&gt;
&lt;li&gt;Ownership for unprivileged LXC access of the &lt;em&gt;backups&lt;/em&gt; mountpoint are set with &lt;code&gt;chown -R 100000:100000 /media/backups/&lt;/code&gt; Why 100000? Unprivileged LXC containers map UID 0 (root inside container) to UID 100000 on the host. This allows root in PBS to write to the directory.&lt;/li&gt;
&lt;li&gt;You know your way around basic networking.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;caveats&#34;&gt;Caveats&lt;/h1&gt;
&lt;p&gt;While this setup is reasonably safe, there&amp;rsquo;s some things worth mentioning. Having the backups on the same server as the Proxmox install means that when there&amp;rsquo;s a fire, flood or whatever else that can physically destroy the server, you lose everything. The Proxmox install and the backups. It&amp;rsquo;s always smart to have off-site backups. This article will &lt;strong&gt;not&lt;/strong&gt; be covering that. That being said, having Proxmox on a different drive than the backups means that if the Proxmox drive fails, you still have the backups. If the backups drive fails, you still have Proxmox and can redo the backups. If both drives fail at the same time, which is unlikely, you lose all data.&lt;/p&gt;
&lt;h1 id=&#34;installing-pbs&#34;&gt;Installing PBS&lt;/h1&gt;
&lt;p&gt;To install PBS, we will be using a &lt;em&gt;Helper Script&lt;/em&gt;. This script will automate the install.&lt;/p&gt;
&lt;div class=&#34;warning-banner&#34;&gt;
  &lt;div class=&#34;warning-header&#34;&gt;
    &lt;span class=&#34;warning-icon&#34;&gt;⚠️&lt;/span&gt;
    &lt;span class=&#34;warning-title&#34;&gt;WARNING&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;warning-content&#34;&gt;
    Using these &lt;em&gt;Helper Scrips&lt;/em&gt; means running scripts from the internet on your server with root access. Be sure you trust the site, script and/or author.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The script we&amp;rsquo;ll be using can be found &lt;a href=&#34;https://community-scripts.github.io/ProxmoxVE/scripts?id=proxmox-backup-server&#34;&gt;here&lt;/a&gt;. Under &lt;strong&gt;How to install&lt;/strong&gt; you can copy the install command. At the time of writing this, that would be &lt;code&gt;bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/proxmox-backup-server.sh)&amp;quot;&lt;/code&gt;. Now go to the web UI for Proxmox and navigate in the left dropdown menu to &lt;strong&gt;Datacenter&lt;/strong&gt; &amp;gt; &lt;strong&gt;node&lt;/strong&gt; (this can be named, mine is named &lt;em&gt;pve&lt;/em&gt;). Then in the menu to the right of the dropdown (the secondary menu), click &lt;strong&gt;Shell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The center of the screen will now display a shell/terminal interface. Paste the command we just copied here and press enter. A &lt;em&gt;Terminal User Interface&lt;/em&gt;, or TUI will pop up. Select &lt;strong&gt;3. Advanced Settings&lt;/strong&gt;. Set the following values in the prompts that pass by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unprivileged&lt;/strong&gt; container.&lt;/li&gt;
&lt;li&gt;The root password of your choosing.&lt;/li&gt;
&lt;li&gt;Container ID of your liking (I use the default).&lt;/li&gt;
&lt;li&gt;Hostname of your choosing (I also leave this default).&lt;/li&gt;
&lt;li&gt;Disksize (Leave default).&lt;/li&gt;
&lt;li&gt;CPU cores (default).&lt;/li&gt;
&lt;li&gt;RAM (default).&lt;/li&gt;
&lt;li&gt;Network bridge (You likely have one choice here, if you have multiple you have set up another bridge yourself).&lt;/li&gt;
&lt;li&gt;IPv4 select &lt;strong&gt;Static&lt;/strong&gt; (manual entry).&lt;/li&gt;
&lt;li&gt;Set the IP address. I have an internal network set up and I&amp;rsquo;ll always use 10.10.10.x. Whereas this is container ID 116 for me, I&amp;rsquo;ll pick 10.10.10.116/24. You will need to know how this is set up on your network and system, do not copy my values here!&lt;/li&gt;
&lt;li&gt;Gateway I have set at &lt;strong&gt;10.10.10.1&lt;/strong&gt;. You need to know what yours is and cannot blindly copy this value.&lt;/li&gt;
&lt;li&gt;And for everything else, using the default settings is fine. You can &lt;strong&gt;Enter&lt;/strong&gt; through the rest of the prompts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next up select the location where you want the LXC container to be located. This is likely &lt;strong&gt;local-lvm (lvmthin)&lt;/strong&gt;. After selecting this, have a little patience while the script sets up the container. This would be a good time to have a pee break or grab yourself a new drink.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Setup complete&#34; loading=&#34;lazy&#34; src=&#34;https://jorisvandijk.com/img/proxmox-pbs.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;If everything went well, at the bottom of the output will be the URL you can visit to find your &lt;em&gt;Proxmox Backup Server&lt;/em&gt;. Mine&amp;rsquo;s at &lt;code&gt;https://10.10.10.116:8007&lt;/code&gt;. Visit your URL and check that you can log in with your credentials.&lt;/p&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    If you cannot seem to log in with your credentials, make sure the &lt;strong&gt;Realm&lt;/strong&gt; is set to &lt;em&gt;Linux PAM standard authentication&lt;/em&gt; and not to &lt;em&gt;Proxmox Backup authentication server&lt;/em&gt;.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You&amp;rsquo;ll be greeted with a nag message about &lt;em&gt;No valid subscription&lt;/em&gt;. This can be safely ignored. For now we won&amp;rsquo;t touch this interface and instead go back to the &lt;em&gt;Proxmox VE&lt;/em&gt; browser tab to continue.&lt;/p&gt;
&lt;h1 id=&#34;adding-storage-mount-point-to-the-lxc&#34;&gt;Adding Storage Mount Point to the LXC&lt;/h1&gt;
&lt;p&gt;In order for PBS to be able to access the &lt;code&gt;/media/backups&lt;/code&gt; mount point, within &lt;em&gt;Proxmox VE&lt;/em&gt;, we need to go back to the &lt;strong&gt;Shell&lt;/strong&gt;. We get there by clicking &lt;strong&gt;Datacenter&lt;/strong&gt; in the left menu and then in the secondary menu clicking on &lt;strong&gt;Shell&lt;/strong&gt;. Here we&amp;rsquo;ll stop the PBS container, add the mountpoint to the configuration file of the container and then restart it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop the container by issueing the following: &lt;code&gt;pct stop &amp;lt;container id&amp;gt;&lt;/code&gt;, where container ID in my case would be &lt;code&gt;116&lt;/code&gt;. (I&amp;rsquo;ll be using this from here on in, substitute all &lt;code&gt;116&lt;/code&gt; mentions with your container&amp;rsquo;s ID!)&lt;/li&gt;
&lt;li&gt;Check if it stopped with &lt;code&gt;pct status 116&lt;/code&gt;. It should display &lt;em&gt;status: stopped&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Next we&amp;rsquo;ll add the line needed to the right configuration file: &lt;code&gt;echo &amp;quot;mp0: /media/backups,mp=/backups&amp;quot; &amp;gt;&amp;gt; /etc/pve/lxc/116.conf&lt;/code&gt;, where the &lt;code&gt;mp0:&lt;/code&gt; line creates a bind mount. The first part &lt;code&gt;/media/backups&lt;/code&gt;) is the path on the Proxmox host, and the part after &lt;code&gt;mp=&lt;/code&gt; is where it will appear inside the container. The &lt;code&gt;echo&lt;/code&gt; in front and the &lt;code&gt; &amp;gt;&amp;gt; /etc/pve/lxc/116.conf&lt;/code&gt; parts just mean print the quoted part into the configuration file.&lt;/li&gt;
&lt;li&gt;Check if the line got written to the file with &lt;code&gt;cat /etc/pve/lxc/116.conf&lt;/code&gt; and at the very last line of the output you should see &lt;code&gt;mp0: /media/backups,mp=/backups&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restart the container with &lt;code&gt;pct start 116&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check if the container is running with &lt;code&gt;pct status 116&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now go back to the PBS IP address, &lt;code&gt;https://10.10.10.116:8007&lt;/code&gt; in my case, and verify the drive is present by going to &lt;strong&gt;Administration&lt;/strong&gt; &amp;gt; &lt;strong&gt;Shell&lt;/strong&gt; in the left menu. In this shell issue the following: &lt;code&gt;touch /backups/test&lt;/code&gt;. If you get no output, the drive is mounted right and the permissions are set properly. If you get permission errors, you&amp;rsquo;ll need to fix permissions.&lt;/p&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    To fix permission issues, go to the Proxmox VE Shell and issue &lt;code&gt;chown -R 100000:100000 /media/backups&lt;/code&gt;.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;We can remove the test file we just created with &lt;code&gt;rm /backups/test&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&#34;create-datastore&#34;&gt;Create Datastore&lt;/h1&gt;
&lt;p&gt;In order for PBS to be able to run backups, we need to set the &lt;em&gt;Datastore&lt;/em&gt;. On the PBS web UI, in the left sidebar, navigate to &lt;strong&gt;Datastore&lt;/strong&gt; all the way at the bottom and click &lt;strong&gt;Add Datastore&lt;/strong&gt;. A popup will, well, pop up. Here fill out the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;backups&lt;/code&gt; (or any name you prefer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datastore Type&lt;/strong&gt;: Local&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backing Path&lt;/strong&gt;: &lt;code&gt;/backups&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can set the &lt;em&gt;GC Schedule&lt;/em&gt; (Garbage Collector Schedule) and the &lt;em&gt;Prune Schedule&lt;/em&gt; here to whatever you like. I&amp;rsquo;ll leave it to the default of &lt;em&gt;Daily&lt;/em&gt;. You can set this to whatever you like later in the settings. Same goes for the &lt;em&gt;Prune Options&lt;/em&gt;. I&amp;rsquo;ll leave these blank for now. Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;warning-banner&#34;&gt;
  &lt;div class=&#34;warning-header&#34;&gt;
    &lt;span class=&#34;warning-icon&#34;&gt;⚠️&lt;/span&gt;
    &lt;span class=&#34;warning-title&#34;&gt;WARNING&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;warning-content&#34;&gt;
    Before you continue, make sure you have the right directory set. After the software is done setting up the Datastore, you&amp;rsquo;ll be taken to the &lt;em&gt;Datastores summary&lt;/em&gt; page. Here your datastore will show up with a blue half moon line over it. Make sure the size of the datastore matches the size of your backup drive. If this is not the case, you may have made a typo and the system will have created a new directory within the LXC container. This is &lt;strong&gt;not&lt;/strong&gt; what we want.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h1 id=&#34;create-backup-user&#34;&gt;Create Backup User&lt;/h1&gt;
&lt;p&gt;Next up we&amp;rsquo;re going to create a user that will run the backups. We&amp;rsquo;re doing this so the backups are not being run by the root user. The root user has far too many permissions and could wipe out the PBS if something goes wrong. With setting up a user with fewer permissions, we can make sure only certain intentional actions will be taken.&lt;/p&gt;
&lt;p&gt;On the PBS web UI, in the left menu, go to &lt;strong&gt;Configuration&lt;/strong&gt; &amp;gt; &lt;strong&gt;Access Control&lt;/strong&gt;. Here go to the &lt;strong&gt;User Management&lt;/strong&gt; tab (it does so by default). Here we can set up our new user:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill out the fields as you like. I named the user &lt;em&gt;backup&lt;/em&gt; and gave it a strong password. The &lt;em&gt;Realm&lt;/em&gt; can be left as is. Make sure you do not let the user expire.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Our user has been created. We now will need to give him some privileges. In the left menu, head over to &lt;strong&gt;Datastores&lt;/strong&gt; and select the datastore we&amp;rsquo;ve just created. Mine&amp;rsquo;s named &lt;em&gt;backups&lt;/em&gt;. Here in the top menu click on &lt;strong&gt;Permissions&lt;/strong&gt;. Click &lt;strong&gt;Add&lt;/strong&gt; &amp;gt; &lt;strong&gt;User Permission&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;User:&lt;/strong&gt; field, select the &lt;em&gt;backup@pbs&lt;/em&gt; user (or whatever you&amp;rsquo;ve named yours. Note that the &lt;em&gt;@pbs&lt;/em&gt; got added automatically - this is normal).&lt;/li&gt;
&lt;li&gt;Then under &lt;strong&gt;Role&lt;/strong&gt; select &lt;strong&gt;DatastoreAdmin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now all we need to do is get the &lt;em&gt;Certificate Fingerprint&lt;/em&gt;, which we need for the next section. In the left menu, head over to &lt;strong&gt;Dashboard&lt;/strong&gt;. Here click on the button &lt;strong&gt;Show Fingerprint&lt;/strong&gt;. Copy this and close the popup.&lt;/p&gt;
&lt;h1 id=&#34;add-pbs-to-proxmox-ve&#34;&gt;Add PBS to Proxmox VE&lt;/h1&gt;
&lt;p&gt;Open the Proxmox VE web UI. In the left menu, navigate to &lt;strong&gt;Datacenter&lt;/strong&gt;.  In the secondary menu click on &lt;strong&gt;Storage&lt;/strong&gt;. In the top menu click &lt;strong&gt;Add&lt;/strong&gt; &amp;gt; &lt;strong&gt;Proxmox Backup Server&lt;/strong&gt;. A new popup appears where we need to input the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ID&lt;/strong&gt;: &lt;code&gt;backups&lt;/code&gt; (This is just a name. You can choose any you like).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server&lt;/strong&gt;: &lt;code&gt;10.10.10.116&lt;/code&gt; (This is the IP of the PBS).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;: &lt;code&gt;backup@pbs&lt;/code&gt; (This is the user we made).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;: The password you chose for this user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datastore&lt;/strong&gt;: &lt;code&gt;backups&lt;/code&gt; (This is the name you gave the datastore).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fingerprint&lt;/strong&gt;: Here paste the fingerprint you copied at the end of the last section.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    You can also set up encryption for the backups under the third tab &lt;strong&gt;Encryption&lt;/strong&gt;. I have not done so and the process of setting that up is out of scope for this article.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Click &lt;strong&gt;Add&lt;/strong&gt;. PBS has now been added to Proxmox.&lt;/p&gt;
&lt;h1 id=&#34;create-backup-schedule&#34;&gt;Create Backup Schedule&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;ll want the backups to run on their own without needing user interaction&amp;hellip; so let&amp;rsquo;s set that up now. On the Proxmox VE web UI still, in the left menu click on &lt;strong&gt;Datacenter&lt;/strong&gt;. In the secondary menu click on &lt;strong&gt;Backup&lt;/strong&gt;. In the top menu click &lt;strong&gt;Add&lt;/strong&gt;. We&amp;rsquo;re greeted by another popup. There are several fields here, but we only need to fill out a few, namely:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: &lt;code&gt;backups&lt;/code&gt; (Or whatever name you used as ID in the previous section).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule&lt;/strong&gt;: &lt;code&gt;4:00&lt;/code&gt; (I prefer my backups to run when I am not using the server. You can see the options you have by going through the dropdown menu. My setting here means the backups run every day at 4am).&lt;/li&gt;
&lt;li&gt;In the bottom pane you can see a list of all your LXC containers and virtual machines. Using the checkboxes you can select what you want to back up.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    You can also include the PBS container in the backups as well!
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;We&amp;rsquo;re basically done now, but let&amp;rsquo;s verify it all works.&lt;/p&gt;
&lt;h1 id=&#34;verifying-the-setup&#34;&gt;Verifying the Setup&lt;/h1&gt;
&lt;p&gt;Within the Proxmox VE web UI, in the left menu click on &lt;strong&gt;Datacenter&lt;/strong&gt;. In the secondary menu click on &lt;strong&gt;Backup&lt;/strong&gt;. Next highlight our PBS backup and in the top menu click &lt;strong&gt;Run now&lt;/strong&gt; and click &lt;strong&gt;Yes&lt;/strong&gt; on the popup. You can see what is going on by double clicking the running task named &lt;em&gt;Backup Job&lt;/em&gt; in the bottom pane of the web UI labeled &lt;strong&gt;Tasks&lt;/strong&gt;. This will bring up a popup that shows the backup in progress. When it&amp;rsquo;s done, it&amp;rsquo;ll end with &lt;em&gt;Task OK&lt;/em&gt; is all went well.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s now move over to the PBS web UI and see if it shows the backups. In the left menu navigate to &lt;strong&gt;Datastores&lt;/strong&gt; and click &lt;strong&gt;backups&lt;/strong&gt; (or whatever you named your datastore). In the top menu click &lt;strong&gt;Content&lt;/strong&gt;. A list of backed up containers and virtual machines should show up here.&lt;/p&gt;
&lt;p&gt;When your scheduled backups have ran, you should also check if that went without a hitch. You can do that here as well by looking at the timestamp.&lt;/p&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    Some other things to consider checking are the &lt;em&gt;Prune &amp;amp; GC Jobs&lt;/em&gt;. These are shown when clicking that button in the top menu. You should also check if the backups are working as intended and if you can restore files individually and even if you can restore complete VMs and container. This is very much out of scope of this article, though.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h1 id=&#34;final-notes&#34;&gt;Final Notes&lt;/h1&gt;
&lt;p&gt;Not everything is covered in this article and many more things can be set up, like email alerts, garbage collection and prune jobs and their frequency. Extra things like removing the nag message about the repositories when logging in and much, much more.&lt;/p&gt;
&lt;p&gt;You may also have noticed none of this is backing up Proxmox itself at all, which is true. At the time of writing backing up Proxmox like a container isn&amp;rsquo;t supported by PBS. It&amp;rsquo;s on the roadmap though, so fingers crossed. At a later date I&amp;rsquo;ll share my current solution to this problem.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>YouTube</title>
      <link>https://jorisvandijk.com/posts/youtube/</link>
      <pubDate>Fri, 28 Nov 2025 02:31:05 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/youtube/</guid>
      <description>&lt;p&gt;It sucks. No really, it does. It&amp;rsquo;s a shame, but there&amp;rsquo;s nearly nothing of value left. Nuke all your cookies and the likes and start in a fresh new browser. Wadda ya see? AI slop. Bullshit videos and nearly all thumbs seem AI generated. Lose your soul and drop into shorts&amp;hellip; This place is even worse.&lt;/p&gt;
&lt;p&gt;YouTube is doing full minute ads now too, I hear. I don&amp;rsquo;t suffer from that shit as I have decent adblock. Still though, one minute of a single ad between &amp;ldquo;free&amp;rdquo; content? That&amp;rsquo;s bonkers.&lt;/p&gt;
&lt;p&gt;I have never used the site in the way it was meant to. I do not have a Google account and I do not subscribe to creators. I have a terminal app which pulls RSS feeds from YouTube. The app is named Newsboat. At any rate, this made me &amp;ldquo;subscribe&amp;rdquo; in my own way by following the RSS feed of YouTubers I liked. They all got placed in NewsBoat and I decided there what I wanted to watch and did.&lt;/p&gt;
&lt;p&gt;I did like to scroll the YouTube feed in a browser though. Tumbling down would reveal something interesting I might click. Something that the algorithm correctly would mark as something I may like. It does not anymore. I can scroll from top to actual bottom and not feel the need to click a single video. This is sad. I loved this site. I found interesting people here. Stuff that tickled my fancy. Watch something by Banana Universe and I got more banana content. This made sense. I apparently loved watching banana-related videos, so it would make sense I&amp;rsquo;d love more from other sources.&lt;/p&gt;
&lt;p&gt;It does not work like this anymore though. It&amp;rsquo;s all crap.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t get me wrong though. The people I subscribe to still put out quality content! It&amp;rsquo;s just getting impossible to find that content on the YouTube home page.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Cover Images</title>
      <link>https://jorisvandijk.com/posts/cover-images/</link>
      <pubDate>Wed, 05 Nov 2025 14:01:26 +0100</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/cover-images/</guid>
      <description>&lt;p&gt;I used to have cover images for some posts on my blog. I felt they added some needed pizzazz to the site. Turns out I was wrong. It added a splash of color to the index page, sure, but it also brought some issues.&lt;/p&gt;
&lt;p&gt;First was that some images were too big, spacing out blog posts on the index page, forcing users to scroll way too much to go through the posts list. I tried to remedy this by cropping the images and making them all the same height. This, I found, works for some images, but ruins others. No bueno.&lt;/p&gt;
&lt;p&gt;Second issue was that it created an obstacle to writing. By adding the need to have a cover image meant I needed to hunt for one for each post I made. Fuck that. So I decided I&amp;rsquo;d add a cover image only for non-personal blog posts. This looked awful. Some posts had an image, some did not. This broke the uniformity of the index page.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the point of cover images anyway? Well, there are reasons to have them I suppose. They provide a visual hint about what the content is about. Also, when you share a link, the cover image is usually used as the thumbnail, making for pretty links. And nice thumbnails may pull in more views. Also, having cover images may do something for positive for SEO. Do I think any of these weigh up to the headache of finding appropriate images for each post and editing them to fit the constraints I set? No. Not at all.&lt;/p&gt;
&lt;p&gt;And gone are the cover images.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Focus</title>
      <link>https://jorisvandijk.com/posts/focus/</link>
      <pubDate>Thu, 25 Sep 2025 21:43:50 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/focus/</guid>
      <description>&lt;p&gt;I hate the fact that I cannot enjoy the moment anymore. I used to be able to sit down and watch a movie. A whole movie. Start to finish; watch it. No breaks. No peaking at my phone. No little distractions. I’d get up to take a piss, or grab a drink, sure, but I was into the movie. Not just movies though. Music! I used to be able to enjoy music on its own. Just having an album on I took the time to go out and buy and just enjoy it playing. Nothing else, just the music.&lt;/p&gt;
&lt;p&gt;I have memories, fond memories, of times I just enjoyed a thing. And I really do. I can remember moments I’ve had throughout my childhood and early adolescence where all I did was enjoy the thing. Laying on my bed with earphones on blasting an album. Sitting down at the tv with my dad and watching the latest movie he got on tape. It was special to me. These were true events, not passing moments.&lt;/p&gt;
&lt;p&gt;I was able to do one thing. Just be in that moment and do that one thing and enjoy it.&lt;/p&gt;
&lt;p&gt;I am watching a podcast while I write this. I actually pause it, switch to the text document, write and switch back and press play. This is not normal, is it? Why can’t I do one thing and enjoy doing that one thing anymore? It’s stupid and I’ve found that looking back, none of the things I read, hear or do like this make the cut. They don’t get that asterisk next to them that says, this is a fond memory. I’ll probably forget what podcast played while writing this. I’ll even forget I wrote this while playing a podcast.&lt;/p&gt;
&lt;p&gt;It’s easy to blame my phone, or social media or even the wider society or culture we’re in right now. Everything is short, fast, flashy and meant to keep your attention for just a little bit while you’re blasted with endorphins or some happiness chemical, just for you to jump to the next thing.&lt;/p&gt;
&lt;p&gt;I don’t do social media, but I do watch YouTube. I watch shorts on there at times. I read the news on my phone and even blog posts like these are bite-sized entertainment. I don’t have notifications on my phone, but I do regularly find myself grabbing that little rectangle while I am doing something else. I should not have this problem I have as badly as I have it, at least I don’t think. I still do, though.&lt;/p&gt;
&lt;p&gt;Were things better when you were young? Are memories made when you’re developing worth more?&lt;/p&gt;
&lt;p&gt;There’s research into this that states that earlier memories get ingrained more than later ones, but this does not explain the ADHD switching behavior. I’m sure there’s research into that as well, I was just too busy scrolling on my phone to read it.&lt;/p&gt;
&lt;p&gt;It doesn’t matter. I am going to make a stand against this behavior I seem to have adopted and I am going to put an end to it. From now on I will choose to watch a movie and I will watch that movie. My phone will be in another room and I will be present for the entire movie (snack runs are allowed, as well as bathroom breaks). I will put an effort into focusing on the thing I am doing. I will not get sidetracked by other unimportant shit. I’ll do one thing and do it well. I will force myself into making fond memories damnit!&lt;/p&gt;
&lt;p&gt;Where do I buy an album now though?&lt;/p&gt;
</description>
    </item>
    <item>
      <title>You should delete your RSS reader</title>
      <link>https://jorisvandijk.com/posts/remove-rss/</link>
      <pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/remove-rss/</guid>
      <description>&lt;p&gt;At least, from your computer. Hear me out.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve only recently gotten into reading people&amp;rsquo;s personal blogs. It&amp;rsquo;s very relaxing to read the personal thoughts of real people. Not just thoughts, sometimes there&amp;rsquo;s ideas, tips, tricks, ways to improve something for yourself or, and this is my favorite one, a link to a new blog to explore.&lt;/p&gt;
&lt;p&gt;My list of blogs to keep track of is constantly growing. I discover new people weekly. The point here is, there&amp;rsquo;s a lot to read and reading takes time. And while I absolutely enjoy every minute I spend reading all these great posts, time is something I, well we all, only have a limited amount of.&lt;/p&gt;
&lt;p&gt;When I am at my desk in front of my laptop, I usually have more important things to do. Work that needs to be finished; information that needs to be absorbed; deadlines that need to be met; blog posts that need to be written! Now when I am not doing any of that, but am instead reading blog posts, I feel guilty. Feeling this way totally ruins the experience for me. I don&amp;rsquo;t get the zen, happy feeling I usually get, just because something else demands my attention and it deserves it. It kinda kills the enjoyment.&lt;/p&gt;
&lt;p&gt;The laptop has become my productivity zone, whether I like it or not. My brain has been trained to see this screen as work space. So when I try to read something personal and reflective here, there&amp;rsquo;s this constant background hum of &amp;ldquo;shouldn&amp;rsquo;t you be doing something more important right now?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Compare that to when I am on my phone. I am not a social media person. I do not use Instagram, Facebook, TikTok, whatever. On my phone I talk to people I like through chat apps. I read some Wikipedia. I play a game. I read a blog. When I am on this thing, I have no work to do. I have no pressing other engagements I need to tend to. It&amp;rsquo;s my time and I choose to waste it on this little screen I hold in my palm.&lt;/p&gt;
&lt;p&gt;This is when I get the most out of blogs. I just read and enjoy the posts. It&amp;rsquo;s guilt free and nice. There&amp;rsquo;s something intimate about reading someone&amp;rsquo;s personal thoughts on a small screen while I&amp;rsquo;m relaxed in a chair or, well, in the other location you’re in on your phone a lot. The serendipity works better too – I stumble across a new blog, follow a link, get lost in someone&amp;rsquo;s archive. It feels natural, not systematized.&lt;/p&gt;
&lt;p&gt;That RSS reader on my computer? It was trying to turn blog reading into a task to complete, another inbox to clear. But these personal writings aren&amp;rsquo;t meant to be consumed like email or news. They&amp;rsquo;re meant to be savored and enjoyed!&lt;/p&gt;
</description>
    </item>
    <item>
      <title>If buying isn’t owning, piracy isn’t stealing</title>
      <link>https://jorisvandijk.com/posts/piracy/</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/piracy/</guid>
      <description>&lt;p&gt;Now, this kinda sorta makes sense, but also it doesn’t. I’ve been seeing this quote more and more online and it irks me a little. It’s just, well, wrong.&lt;/p&gt;
&lt;p&gt;When you pay for Netflix, you take out a subscription. You pay to receive something, and receive it you do. You get access to something. It’s like a newspaper. You subscribe and pay a fee and every morning, a newspaper shows up on your lawn, in your mailbox, or wherever they put it for you. You don’t own the newspaper’s office. Ok, you own the paper you got delivered, but it’s value fades after a day. The news is old and the thing is useless.&lt;/p&gt;
&lt;p&gt;How about this then. You pay a subscription for your library pass. This grants you the ability to check out any book you like. Any one. Whichever one you like. You can read that book for as long as you pay for the subscription. You borrow, lend, lease that book. You paid for it in a way, sure. Do you own that book? No. Of course you don’t. It’s the library’s book. You just paid for the honor of getting to read it. You paid for a service, not did not make a purchase.&lt;/p&gt;
&lt;p&gt;Then there’s the second part of that quote. No shit digital piracy isn’t stealing. Obviously it is not. When you steal you take something from someone, or somewhere and they do not have it anymore. To them it’s gone. Stolen. They had it. Now they don’t. You didn’t have it. Now you do. Something got taken from one place and was moved, illegally, to somewhere else. This in no way is the same as illegally downloading another copy of something. Nothing was actually taken. Did you gain value? Sure. Did someone else lose value? Well, that’s debatable. On the one hand, if you’re stealing it, you were never going to buy it, so no loss was had. Then again, if there was absolutely no way to steal it, would you have spent the money to get it legally? What I’m saying is there’s no &lt;em&gt;if&lt;/em&gt; there. Piracy isn’t stealing, it’s &lt;em&gt;unauthorized duplication&lt;/em&gt; or &lt;em&gt;infringement of intellectual property rights&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I do get it though. I do. With services like Netflix, Hulu, Disney, Prime and whomever constantly adding and removing content or, what’s worse, content moving from one place to another, this little quote is comforting. They jack up the price again to well over 12 bucks? Hell, I remember paying 3 for a Netflix account. Anyway, counting this as paying for something not worth paying for (as in, I don’t own it, so why am I paying for it), yeah. I get the feeling. Netflix became the solution to digital piracy by offering the stuff people were illegally downloading for an affordable price per month. No more searching for a good file, no more hoping to not get a virus, no more jittery in-cinema filmed copies of a movie. Just pay the fine and see the stuff.&lt;/p&gt;
&lt;p&gt;Netflix made sense. Why put in the effort when it was cheap to not? It was even legal, no breaking the law. And for a while that worked. It held true - until it didn’t. More companies got in on the action. Richer ones than Netflix and they could purchase whatever content they wanted to be unique to their service. I think it was The Office. Something that had been on Netflix for some time, but was taken by another service, because they simply could outbid Netflix for the rights. This is the start of the end. Now we have many companies offering part of what we want to see and so, we need to own more than one subscription.&lt;/p&gt;
&lt;p&gt;Add to that the fact that prices across services are going up and up and up. I’m pretty sure most of us are paying more for the same content now than we were before the age of streaming services.&lt;/p&gt;
&lt;p&gt;No wonder people are once again considering the high seas.&lt;/p&gt;
&lt;p&gt;So, to get back to my point. You’re paying to use, not to own. If you don’t want to anymore, you’re doing legally questionable things regarding intellectual property.&lt;/p&gt;
&lt;p&gt;“Leasing isn’t owning, and intellectual property infringement is still a debatable gray area.” Not as sexy, more true.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Slash</title>
      <link>https://jorisvandijk.com/posts/slash/</link>
      <pubDate>Sun, 17 Aug 2025 21:57:54 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/slash/</guid>
      <description>&lt;p&gt;I am debating &lt;em&gt;slash pages&lt;/em&gt;. This website is a blog, or at least it aims to be. This time around, I didn&amp;rsquo;t just start blogging. No. I also got into reading other people&amp;rsquo;s blogs. I have a &lt;a href=&#34;https://jorisvandijk.com/blogroll&#34;&gt;blogroll&lt;/a&gt; page where I list some of the ones I enjoy reading. This particular page, the &lt;em&gt;blogroll&lt;/em&gt;, is located under my domain, &lt;code&gt;Jorisvandijk.com&lt;/code&gt;, then a forward slash &lt;code&gt;/&lt;/code&gt; and then the name &lt;code&gt;blogroll&lt;/code&gt;. So &lt;code&gt;https://jorisvandijk.com/blogroll&lt;/code&gt;. Pages like this, pages under the main domain name right after the slash, these are called &lt;em&gt;slash pages&lt;/em&gt;. At least they are in the &lt;a href=&#34;https://en.wikipedia.org/wiki/Blogosphere&#34;&gt;blogosphere&lt;/a&gt; (what a word).&lt;/p&gt;
&lt;p&gt;Anyway, I like clean design and minimalism. A place for everything and everything in its place. Currently the header of this website looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Website header&#34; loading=&#34;lazy&#34; src=&#34;https://jorisvandijk.com/img/header.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;From left to right, the header contains the website URL, a home link, a tags link, a search link, the blogroll link, and a theme toggle. One of these seems out of place to me. The blogroll. Everything there is part of interacting with the website. Blogroll isn&amp;rsquo;t. It does not belong. Hell, I have a &lt;a href=&#34;https://jorisvandijk.com/about&#34;&gt;contact page&lt;/a&gt; which I put in the footer of the site because I felt it does not fit in well up there. Why blogroll then? I put it there because it couldn&amp;rsquo;t go anywhere else, really. &lt;a href=&#34;https://mtwb.blog/blogroll/&#34;&gt;Matt&lt;/a&gt; first told me about the blogroll and I really like that idea. It reminds me of the &lt;em&gt;links page&lt;/em&gt; websites from a better era used to have. A thing my old websites always featured. I feel it&amp;rsquo;s great to link to stuff you like, so people that found and perhaps like your stuff can find stuff you like and in turn may like that.&lt;/p&gt;
&lt;p&gt;Anyway, I believe my website &lt;em&gt;needs&lt;/em&gt; this page. It has to have a place somewhere. The current location ain&amp;rsquo;t it.&lt;/p&gt;
&lt;p&gt;When I learned about the blogroll, I didn&amp;rsquo;t yet know of the concept of slash pages. I found out through several blogs found on the blogosphere. Turns out, there&amp;rsquo;s a huge variety of common slash pages. Ranging from the useful, like a &lt;code&gt;/about&lt;/code&gt; page, to the macabre with the &lt;code&gt;/death&lt;/code&gt; page, or the totally pointless, like &lt;code&gt;/hats&lt;/code&gt;, where one could describe or show all the hats they own. There&amp;rsquo;s so many, that a &lt;a href=&#34;https://slashpages.net/&#34;&gt;website&lt;/a&gt; exists that lists them.&lt;/p&gt;
&lt;p&gt;So, I already have two of these slash pages for sure. I might as well change the menu item to something like &lt;em&gt;more&lt;/em&gt; or &lt;em&gt;slash&lt;/em&gt; or even &lt;em&gt;/&lt;/em&gt;, and have a &lt;code&gt;/slash&lt;/code&gt; (slash-slash page), where I list all the slash pages I have. I could add to these over time whenever I either find or invent new ones. I think I want to go this route, but I am unsure how to label it in a way that makes sense to both bloggers and non-bloggers, and which pages I should have. I mean, I am not going to make a death page, nor a hat one. I know that much. Fine. I have a single black baseball cap and when I die, I have a will.&lt;/p&gt;
&lt;p&gt;At any rate, do you have thoughts on this? Please feel free to email me your thoughts. The address is on my &lt;a href=&#34;https://jorisvandijk.com/about&#34;&gt;/about&lt;/a&gt; page. :)&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Code</title>
      <link>https://jorisvandijk.com/posts/code/</link>
      <pubDate>Wed, 13 Aug 2025 18:43:50 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/code/</guid>
      <description>&lt;p&gt;I see it everywhere now. AI code. Code that pretends to be written by a person, but isn’t. You can smell it if you’ve been around code long enough.&lt;/p&gt;
&lt;p&gt;It’s too clean. Too eager to please. Every function name is a sentence. Every comment explains the obvious, like it&amp;rsquo;s written by someone explaining programming to a golden retriever. Sometimes there’s even an emoji in there. An emoji. In code.&lt;/p&gt;
&lt;p&gt;Real code has scars. You can see where someone tried something stupid at two in the morning, got it working, and never touched it again. There’s a weird indentation that no one can explain. Variable names start sensible, then drift into chaos. Half a function is commented out &amp;ldquo;just in case.”&lt;/p&gt;
&lt;p&gt;AI code doesn’t have any of that. It’s sterile. Polished. It’s code written by something that has never had to hit a deadline, swear at a compiler, or hack together a fix five minutes before a demo. It never just says “fuck it, ship it.”&lt;/p&gt;
&lt;p&gt;Want to spot it fast? Read the comments. If they sound like a grinning intern who just discovered Stack Overflow and thinks you need your hand held every step of the way, it’s probably machine-made. It&amp;rsquo;s the kind of ‘helpful’ that makes you yell, &amp;ldquo;I can read the damned code!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Once you notice it, you’ll see it everywhere. And then you’ll realise something worse: one day, it might be all you see. Code with no scars. No fingerprints. Inhuman. Code written in human-readable syntax by a machine, for a machine.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Secondary blog</title>
      <link>https://jorisvandijk.com/posts/secondary-blog/</link>
      <pubDate>Fri, 01 Aug 2025 19:57:45 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/secondary-blog/</guid>
      <description>&lt;p&gt;I love my new blog website. I like to share useful things I found or did. I prefer to post content that&amp;rsquo;s educational, but not dry. A more personal take-you-by-the-hand-and-pull-you-along kind of educational. I like to think that&amp;rsquo;s pretty much the style I have. There&amp;rsquo;s an issue, though, I also want to yap about other things that may not have any educational value. Just thoughts or experiences or ideas. Straight from my head to this website.&lt;/p&gt;
&lt;p&gt;Now, on one hand, I don&amp;rsquo;t like to &lt;em&gt;pollute&lt;/em&gt; the website with content that &lt;em&gt;has no real value&lt;/em&gt;, but I do feel the need to post more than just tutorials. I am unsure how to go about this. I have tags linked to posts, so I could just mark them &amp;ldquo;personal&amp;rdquo; or &amp;ldquo;rant&amp;rdquo; or something and push them in between informative posts. This is probably more like a blog is supposed to be. I could also make a second type of post, where I can post semi-short form posts with just personal thoughts, insights or rants. Have this on another part of the site. Maybe a different RSS feed for those who care to read this sort of stuff. Kind of like how &lt;a href=&#34;https://mijndertstuij.nl/feeds/&#34;&gt;Mijndert&lt;/a&gt; splits posts on his blog between all posts, blog posts, and week notes. Though, that would leave the website with one long list of stuff that may have value to others, and my babbling.&lt;/p&gt;
&lt;p&gt;Maybe the real question is, what do I want. Come to think of it, this is &lt;em&gt;my&lt;/em&gt; blog. I should just do what I feel fits, the problem, though, is I don&amp;rsquo;t know.&lt;/p&gt;
&lt;p&gt;This post in itself is yapping and adds no real value and I am going to post it on the blog and I will add a tag, just to see how it feels. Maybe I even won&amp;rsquo;t scour the web to find a fitting header image for it. Actually, I just decided - I won&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;If you have thoughts or suggestions, I don&amp;rsquo;t like comment sections, but you can still email me at &lt;code&gt;joris&lt;/code&gt; at this domain.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>More backups are always better</title>
      <link>https://jorisvandijk.com/posts/more-backups-better/</link>
      <pubDate>Wed, 23 Jul 2025 10:15:22 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/more-backups-better/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve &lt;a href=&#34;https://jorisvandijk.com/posts/hugo-hosts-lessons/#github&#34;&gt;mentioned&lt;/a&gt; before that I have my website&amp;rsquo;s repository mirrored across multiple Git hosts. Well, it is not just the website; it is all my repositories. I have four hosts, namely: &lt;a href=&#34;https://github.com/jorisvandijk&#34;&gt;GitHub&lt;/a&gt;, &lt;a href=&#34;https://gitlab.com/jorisvandijk&#34;&gt;GitLab&lt;/a&gt;, &lt;a href=&#34;https://codeberg.org/jorisvandijk&#34;&gt;Codeberg&lt;/a&gt;, and &lt;a href=&#34;https://bitbucket.org&#34;&gt;Bitbucket&lt;/a&gt;. This is overkill, I know. I really like it, though. It gives me a warm, fuzzy feeling knowing my precious crap is safe. If one host goes down, I’ve got three others. If two go down, there are still two left. And if three go down… well, there’s probably something far more serious going on, but let’s not get distracted.&lt;/p&gt;
&lt;p&gt;Four is a lot, but you might think that at least having a second one is not such a bad idea - and you&amp;rsquo;d be right. The process is super simple and short. No reason not to do it. I&amp;rsquo;ll walk through the process assuming we&amp;rsquo;re starting with nothing. This is a new repository you&amp;rsquo;re going to set up.&lt;/p&gt;
&lt;h1 id=&#34;the-setup&#34;&gt;The setup&lt;/h1&gt;
&lt;p&gt;The first step is to go to all your Git providers and create a new repository. We&amp;rsquo;ll use this website&amp;rsquo;s repository as an example. My username across (almost - darn that user on Bitbucket) all the hosts is &lt;code&gt;jorisvandijk&lt;/code&gt;, so substitute that for your own username where applicable. The repository is, unsurprisingly, called &lt;code&gt;website&lt;/code&gt;. How original.&lt;/p&gt;
&lt;h2 id=&#34;in-your-browser&#34;&gt;In your browser&lt;/h2&gt;
&lt;p&gt;For each host you want to have this repository on, create a new repository there. Make sure it is &lt;strong&gt;completely empty&lt;/strong&gt;. Don&amp;rsquo;t initialize with a &lt;em&gt;README.md&lt;/em&gt;! The process differs from host to host, so I can&amp;rsquo;t explain how to set up the repository in detail. You should be greeted by something like this when it is created:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Empty repository&#34; loading=&#34;lazy&#34; src=&#34;https://jorisvandijk.com/img/empty-repo.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;For simplicity&amp;rsquo;s sake, I suggest giving the repositories the same name across all hosts. You don&amp;rsquo;t have to though.&lt;/p&gt;
&lt;h2 id=&#34;in-your-terminal&#34;&gt;In your terminal&lt;/h2&gt;
&lt;p&gt;On your local machine open a terminal. Create a new directory where the repository will live locally. I have a dedicated &lt;code&gt;~/git/&lt;/code&gt; directory where I keep all my Git repositories, so I&amp;rsquo;ll go there and create a new directory and enter it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~/git &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir website &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; website
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here, we need to initialize a Git repository. Oh yeah, I am assuming you already have Git installed (as any Linux user should have); if not you&amp;rsquo;ll need to install it first. You likely know better how to install it on your system than I do, so I won&amp;rsquo;t explain it here. Right, let&amp;rsquo;s initialize the repository.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next up is adding a remote. Now you&amp;rsquo;ll have to pick which of the Git hosts you want to name as your primary one. I went with Bitbucket for mine as I really like the user interface they have. Bitbucket does not have a public facing overview like GitLab or any of the others do, but I don&amp;rsquo;t think that matters all that much, as the content will be availible to the public on all other platforms anyway.&lt;/p&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    This process assumes you&amp;rsquo;ve set up SSH for all your Git repositories. If you have not, you&amp;rsquo;ll need to substitute &lt;code&gt;git@bitbucket.org:&lt;/code&gt; (note the colon there), for &lt;code&gt;https://bitbucket.org/&lt;/code&gt; (note the forward slash here) in all the commands below. Obviously, change it to &lt;em&gt;your&lt;/em&gt; Git host&amp;rsquo;s address. I would however suggest setting up SSH, as it&amp;rsquo;s, in my opinion, far more pleasant to work with than HTTPS.
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add origin git@bitbucket.org:jorisvdijk/website.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So far this has all been standard. You&amp;rsquo;d set up any Git repository like this. The following steps are the ones that count. Let&amp;rsquo;s now set the primary push URL to Bitbucket. We do this to explicitly tell Git this is where pushes go. Otherwise, Git simply assumes the fetch and push URLs are identical.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote set-url --push origin git@bitbucket.org:jorisvdijk/website.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For each repository we want to mirror to, we&amp;rsquo;ll add another push URL. This means that when you issue &lt;code&gt;git push&lt;/code&gt;, it will do so to all the repositories.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote set-url --add --push origin git@github.com:jorisvandijk/website.git &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote set-url --add --push origin git@gitlab.com:jorisvandijk/website.git &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote set-url --add --push origin git@codeberg.org:jorisvandijk/website.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This should be it, but let&amp;rsquo;s check if it&amp;rsquo;s all set as we want before we proceed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If all went well, the output should look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;git remote -v&#34; loading=&#34;lazy&#34; src=&#34;https://jorisvandijk.com/img/git-remote-v.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;p&gt;Let’s now test whether it actually worked. We&amp;rsquo;ll create a &lt;code&gt;README.md&lt;/code&gt; file in the repository and push that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;# This is my website&amp;#39;s repository&amp;#34;&lt;/span&gt; &amp;gt; README.md 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We’ll add this to Git, set a commit message, rename the branch to &lt;code&gt;main&lt;/code&gt; and push.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add README.md &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;initial commit&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git branch -M main &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once the command is done running, it&amp;rsquo;s time to check if all repositories got the README.md file. Open your browser and visit the repositories on all your Git hosts to make sure everything works.&lt;/p&gt;
&lt;h1 id=&#34;future-workflow&#34;&gt;Future workflow&lt;/h1&gt;
&lt;p&gt;Now that everything is set up, you may be wondering &amp;ldquo;How do I use this setup when I want to do another push?&amp;rdquo; Fortunately, you do not have to learn anything new. It&amp;rsquo;s the normal &lt;code&gt;git add .&lt;/code&gt;, &lt;code&gt;git commit -m &amp;quot;your message&amp;quot;&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt; process. This will now push to all repositories.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Hugo, hosts, and hard lessons</title>
      <link>https://jorisvandijk.com/posts/hugo-hosts-lessons/</link>
      <pubDate>Tue, 22 Jul 2025 16:13:47 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/hugo-hosts-lessons/</guid>
      <description>&lt;h1 id=&#34;hugo&#34;&gt;Hugo&lt;/h1&gt;
&lt;p&gt;As I wrote in my &lt;a href=&#34;https://jorisvandijk.com/posts/hello-world/&#34;&gt;Hello World&lt;/a&gt; post, I have switched to Hugo. And so far, I am loving it. It&amp;rsquo;s fast, it works great and I have not had to hack together solutions for things I wanted the site to do, but that were not included in the platform &lt;em&gt;(looking at you, Eleventy!)&lt;/em&gt;. I like how the backend of it works and I like the way you make new posts or run the site locally for testing. I like how you can use a pre-built theme, but then override it so you can make it your own, without having to touch the actual theme files - this also makes updating the theme later possible.&lt;/p&gt;
&lt;p&gt;Hugo is awesome.&lt;/p&gt;
&lt;h1 id=&#34;hosting&#34;&gt;Hosting&lt;/h1&gt;
&lt;p&gt;It&amp;rsquo;s also amazingly simple to host on sites that offer a &lt;em&gt;Pages&lt;/em&gt; functionality, like &lt;em&gt;GitHub Pages&lt;/em&gt;, which most people will know. I&amp;rsquo;ll spare you the exact inner workings of this functionality. In short, first the user has to create a git repository on the providers platform. Next the user has to enable the &lt;em&gt;Pages&lt;/em&gt; functionality within the provider&amp;rsquo;s online UI and this will work differently depending on the provider. Then when the user pushes changes to their git, the provider will automagically &lt;em&gt;run some magic&lt;/em&gt; and the user&amp;rsquo;s repository will be built and hosted - ready to be visited by guests through their browser. That is, if you&amp;rsquo;ve set up a &lt;em&gt;build file&lt;/em&gt;, which is a simple YAML file telling the &amp;rsquo;engine&amp;rsquo; behind the &lt;em&gt;Pages&lt;/em&gt; functionality how to build your site. (The term &lt;em&gt;build file&lt;/em&gt; is not technically correct and each provider has a different name for this file, but let&amp;rsquo;s just go with it, ok?)&lt;/p&gt;
&lt;p&gt;Obviously this is not all that goes into this, but this is not a tutorial on how to set this up.&lt;/p&gt;
&lt;p&gt;At any rate, I decided to use &lt;em&gt;GitHub Pages&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;github&#34;&gt;GitHub&lt;/h2&gt;
&lt;p&gt;Setting this up on GitHub was pretty easy. Their UI is simple and it is clear which actions one has to take in order to set up &lt;em&gt;Pages&lt;/em&gt;. How to set up a custom domain, however, is not that clear, even though they have documentation on how to do it. I&amp;rsquo;ve found it slightly confusing, but got it set up eventually.&lt;/p&gt;
&lt;p&gt;At first all was well. The site would build without issue and be served on my domain. Yay.&lt;/p&gt;
&lt;p&gt;Unfortunately, after a couple of days working on the site, I discovered that even a tiny issue, like having one too many backticks in a single post on the blog, would make the site unreachable. It would build just fine, but on visiting the domain, I&amp;rsquo;d be greeted with a 404 page. A GitHub 404 page rather than one from my own site. The most frustrating thing about this was that there would be no log anywhere explain why the site would not load. The only thing I could do was to go through my latest commit, line by line, and find the problem that way. This was super tedious and considering that I was still playing around with the inner workings of the site, not just posting blogs, I&amp;rsquo;d run into this issue more times than I&amp;rsquo;d care to recall. Annoyingly though, when running the site locally during testing &lt;em&gt;before&lt;/em&gt; I&amp;rsquo;d push to GitHub, I&amp;rsquo;d have no issues. The site would work fine. Push to GitHub and the site wouldn&amp;rsquo;t load.&lt;/p&gt;
&lt;p&gt;After so many times, I got sick of this and decided, well - I am already mirroring the repository to GitLab (as well as to Codeberg - you can never have too many backups), I&amp;rsquo;ll just move my hosting away from GitHub and to GitLab.&lt;/p&gt;
&lt;h2 id=&#34;gitlab&#34;&gt;GitLab&lt;/h2&gt;
&lt;p&gt;Gitlab pages offers a four step process for setting up their version of &lt;em&gt;Pages&lt;/em&gt;, which eventually will result in the generation of a &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file, which is their name for the &lt;em&gt;build file&lt;/em&gt;. I personally didn&amp;rsquo;t go through this and just reused the &lt;em&gt;build file&lt;/em&gt; I had written for GitHub, renamed it to &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; and placed it in the root of my repository. After a push the automatic building of the site started. It failed on the first run though, due to compatibility issues between the way GitHub and GitLab do things. So, I rewrote it to fit with GitLab&amp;rsquo;s way of doing things and the build went through without a hitch.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent a couple of days on GitLab without any issues. I happily played with the inner workings of my site and GitLab accepted my commits and generated the site. I was happy with this, even though the load times were not stellar. At least a simple issue didn&amp;rsquo;t break the entire site now. I decided to stick with GitLab. That is, until this morning.&lt;/p&gt;
&lt;p&gt;When I got up, had a coffee and decided to write this post on how I was enjoying the new site, I was greeted by this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;The connection has timed out&#34; loading=&#34;lazy&#34; src=&#34;https://jorisvandijk.com/img/time-out.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Erm, what now?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This was an odd one. I could visit the site from my mobile phone just fine, but not from my laptop, or my wife&amp;rsquo;s laptop. It took me a couple of hours of research and testing to finally get what was going on. Turns out, my IP address was likely being either throttled or firewalled by GitLab (or by the Google CDN they use). My own website probably thought I was a bot! What&amp;rsquo;s worse, there was nothing I could do about it. I had no control over the backend, and all I could do was wait it out. I guess I had made too many visits to my own site and I got flagged as a bot. This is ridiculous. This could happen again. I don&amp;rsquo;t care for this to happen again. Damn it, I am going to have to move providers again.&lt;/p&gt;
&lt;h2 id=&#34;cloudflare&#34;&gt;Cloudflare&lt;/h2&gt;
&lt;p&gt;This time I didn&amp;rsquo;t just go with what I knew, I did actual research into where to host. Cloudflare offers &lt;em&gt;almost&lt;/em&gt; the same functionality as a &lt;em&gt;Pages&lt;/em&gt; host, but it&amp;rsquo;s even better. Cloudflare won&amp;rsquo;t host your git, but it can pull from an external git provider. Currently they offer GitHub and GitLab. How this works is they will watch for changes in the repository, and when they detect them, it will trigger a rebuild of your site on their systems, hosting an updated version that mirrors the changes in your repository, ready to be visited.&lt;/p&gt;
&lt;p&gt;A custom domain can be added as well, and in a superior manner compared to GitHub or GitLab &lt;em&gt;Pages&lt;/em&gt;, because Cloudflare also functions as a full DNS provider, allowing complete control over DNS records. This meant switching over the DNS for Jorisvandijk.com on my domain name host to the DNS from Cloudflare. Doing so comes with additional perks, like performance optimizations, security features and analytics. I can now also have bot protection that &lt;em&gt;I&lt;/em&gt; control. And I can see the visitor numbers, without having to host an external solution like &lt;em&gt;Umami&lt;/em&gt; or &lt;em&gt;Google Analytics&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    This site does not track individual visitors, it just creates an overview of which country a visit came from and which pages got visited. No personal data is collected!
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;One more thing to note is that websites hosted on Cloudflare are fast. Very fast. Load times blow both git providers out of the water. The build process is also really snappy.&lt;/p&gt;
&lt;p&gt;So, although time will tell, and I hesitate to say this given past experience, perhaps Cloudflare will work out for me.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Hugo - great. Pages - bad. Let&amp;rsquo;s all hope Cloudflare will stick, as I really don&amp;rsquo;t want to spend more time on hosting. I just want to play with my site and blog away. I look forward to many happy posts using Hugo.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>The best function I ever stole</title>
      <link>https://jorisvandijk.com/posts/extract/</link>
      <pubDate>Mon, 21 Jul 2025 10:04:57 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/extract/</guid>
      <description>&lt;p&gt;Extracting archives is a pain on Linux. There are just so many types and so many programs to extract each type. A &lt;code&gt;.tar.gz&lt;/code&gt; file is extracted using the program &lt;a href=&#34;https://www.gnu.org/software/tar/&#34;&gt;GNU tar&lt;/a&gt;, but for a &lt;code&gt;.zip&lt;/code&gt; file, you&amp;rsquo;d need &lt;a href=&#34;https://infozip.sourceforge.net/UnZip.html&#34;&gt;unzip&lt;/a&gt;. What&amp;rsquo;s that? You&amp;rsquo;ve got a &lt;code&gt;.7z&lt;/code&gt; file? Yeah-no, can&amp;rsquo;t use either of the before mentioned extractors, you need &lt;a href=&#34;https://www.7-zip.org/&#34;&gt;7-zip&lt;/a&gt;. Got a &lt;code&gt;.rar&lt;/code&gt;, you&amp;rsquo;d need&amp;hellip; well, you get the point.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s more, some of these programs require &lt;em&gt;flags&lt;/em&gt; you&amp;rsquo;ll need to use to actually extract an archive. For example, to extract a tar file, you might do something like &lt;code&gt;tar xvf &amp;lt;filename&amp;gt;&lt;/code&gt;. For a 7z file though, it&amp;rsquo;d be &lt;code&gt;7z x &amp;lt;filename&amp;gt;&lt;/code&gt;. Other extraction programs don&amp;rsquo;t require flags at all though, just the name of the extraction program followed by the file to extract. This sounds simple enough, but wait&amp;hellip; what was the name of the program to unzip &lt;code&gt;.bz2&lt;/code&gt; files again?&lt;/p&gt;
&lt;p&gt;Considering I don&amp;rsquo;t actually extract archives &lt;em&gt;that&lt;/em&gt; often, I&amp;rsquo;ll never memorize all of this. So what to do? Luckily I, like many others, stumbled across a simple function I could put in my &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; extract &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -f &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tar.bz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;   tar xvjf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tar.gz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;    tar xvzf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tar.xz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;    tar xvJf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.bz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       bunzip2 &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.rar&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       unrar x &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.gz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        gunzip &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tar&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       tar xvf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tbz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;      tar xvjf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.tgz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       tar xvzf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.zip&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       unzip &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.Z&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;         uncompress &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.7z&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        7z x &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.xz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        unxz &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *.exe&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       cabextract &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      *&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;           &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: unrecognized file compression&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; is not a valid file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What this function does is simple. In order to extract &lt;em&gt;any&lt;/em&gt; archive, in the terminal you just issue &lt;code&gt;extract &amp;lt;filename&amp;gt;&lt;/code&gt;, and the file gets extracted. Obviously &lt;strong&gt;you&amp;rsquo;d also need to install the programs listed in the second column&lt;/strong&gt; there, for this function to work. I have found this function on the Arch forums by a user named &lt;em&gt;sausageandeggs&lt;/em&gt;. You can find the original post &lt;a href=&#34;https://bbs.archlinux.org/viewtopic.php?pid=692072#p692072&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Considering I didn&amp;rsquo;t need all of those extraction methods and I wanted to shorten the &lt;code&gt;extract&lt;/code&gt; command even more, I slightly altered it and mine looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; ex &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -f &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.tar.bz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;   tar xvjf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.tar.gz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;    tar xvzf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.bz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       bunzip2 &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.rar&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       unrar x &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.gz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        gunzip &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.tar&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       tar xvf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.tbz2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;      tar xvjf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.tgz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       tar xvzf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.zip&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;       unzip &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.7z&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        7z x &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *.xz&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        tar xvJf &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           *&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;           &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;I don&amp;#39;t know how to extract &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;...&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; is not a valid file!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So - no more remembering which program name goes with which archive, or which flags are needed to extract a specific type of archive. Just &lt;code&gt;ex &amp;lt;filename&amp;gt;&lt;/code&gt; and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;📄 &lt;em&gt;Original code by &lt;a href=&#34;https://bbs.archlinux.org/viewtopic.php?pid=692072#p692072&#34;&gt;sausageandeggs&lt;/a&gt; on the &lt;a href=&#34;https://bbs.archlinux.org&#34;&gt;Arch Linux Forums&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Compose Key</title>
      <link>https://jorisvandijk.com/posts/compose-key/</link>
      <pubDate>Sun, 20 Jul 2025 14:10:38 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/compose-key/</guid>
      <description>&lt;p&gt;In many languages there&amp;rsquo;s a need to add decorations, or glyphs to characters, like for example &lt;code&gt;é&lt;/code&gt; or &lt;code&gt;č&lt;/code&gt;. These are called &lt;a href=&#34;https://en.wikipedia.org/wiki/Diacritic&#34;&gt;diacritics&lt;/a&gt;. These characters don&amp;rsquo;t exist on a US Standard &lt;em&gt;qwerty&lt;/em&gt; keyboard. There is the US International version with &lt;em&gt;dead keys&lt;/em&gt;, which allow for crafting these special characters by pressing the desired diacritic key followed by the character to apply it to. So for example pressing &lt;code&gt;~&lt;/code&gt; followed by &lt;code&gt;n&lt;/code&gt; results in an &lt;code&gt;ñ&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is a great solution for most people, as it is intuitive and works well. There&amp;rsquo;s a downside you may have spotted, which is that when you actually want to use a tilde, a caret, an apostrophe, or any other special key linked to a diacritic, you&amp;rsquo;ll need to follow it with a &lt;code&gt;space&lt;/code&gt; in order to generate the special character on its own. For anyone who writes code, this is a huge hassle. Suddenly, typing a single quotation mark requires two keystrokes (the apostrophe key followed by space). This may seem like a small gripe, but it adds up quickly.&lt;/p&gt;
&lt;p&gt;Luckily, there&amp;rsquo;s a huge pointless button right on the home row that can be made to do something magical!&lt;/p&gt;
&lt;h1 id=&#34;capslock-as-a-compose-key&#34;&gt;CapsLock as a compose key&lt;/h1&gt;
&lt;p&gt;The CapsLock key is, in my opinion, a waste of space. I never need to type anything in ALL CAPS, so locking the keyboard to uppercase is not a function I need. It&amp;rsquo;s also placed on prime real-estate, right where my fingers rest. Now there&amp;rsquo;s a special button that existed on keyboards of old, called the &lt;a href=&#34;https://en.wikipedia.org/wiki/Compose_key&#34;&gt;compose key&lt;/a&gt;. Pressing the compose key begins a key press sequence that involves (usually two) additional key presses, which will then yield a character composed of the two, so like the &lt;em&gt;dead keys&lt;/em&gt;, but with a leader key. Modern keyboards do not have this key, fortunately you can map any key to function like it on Linux.&lt;/p&gt;
&lt;h2 id=&#34;x11&#34;&gt;X11&lt;/h2&gt;
&lt;p&gt;So replacing the CapsLock key with the Compose key is an ideal solution for being able to use diacritics. This can be done in several ways. For example, on &lt;em&gt;X11&lt;/em&gt;, you can add the command below to an &lt;em&gt;autostart.sh&lt;/em&gt; script you run on boot. Or maybe in your &lt;em&gt;~/.profile&lt;/em&gt; or &lt;em&gt;~/.xinitrc&lt;/em&gt;. On desktop environments you can make the command below into a &lt;em&gt;.desktop&lt;/em&gt; file. And window managers like &lt;em&gt;i3&lt;/em&gt; offer startup commands like &lt;code&gt;exec --no-startup-id&lt;/code&gt;, which you can use to issue the command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;setxkbmap -option compose:caps &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;wayland&#34;&gt;Wayland&lt;/h2&gt;
&lt;p&gt;On &lt;em&gt;Wayland&lt;/em&gt; I personally use &lt;em&gt;Hyprland&lt;/em&gt; as my window manager, or well compositor. Within it, the compose key can be set in the &lt;em&gt;hyprland.conf&lt;/em&gt; file, like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;input &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;kb_options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; compose:caps
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It is also possible to set it using &lt;em&gt;NixOs&lt;/em&gt;&amp;rsquo;s session variables, which I haven&amp;rsquo;t tried myself, as the Hyprland solution works fine for me. Anyway, in NixOS you could set something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sessionVariables&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;XKB_DEFAULT_OPTIONS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;compose:caps&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Now I am able to add special characters without any fuss and there are loads of possible combinations to create special characters. Some of my favorites:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Char&lt;/th&gt;
          &lt;th&gt;Combination&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;°&lt;/td&gt;
          &lt;td&gt;oo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;©&lt;/td&gt;
          &lt;td&gt;oc&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;²&lt;/td&gt;
          &lt;td&gt;^2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;³&lt;/td&gt;
          &lt;td&gt;^3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;é&lt;/td&gt;
          &lt;td&gt;&amp;rsquo;e&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ë&lt;/td&gt;
          &lt;td&gt;&amp;ldquo;e&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ø&lt;/td&gt;
          &lt;td&gt;/o&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;≠&lt;/td&gt;
          &lt;td&gt;=/&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And more can be found &lt;a href=&#34;https://math.dartmouth.edu/~sarunas/Linux_Compose_Key_Sequences.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Using external drive as data directory in a Proxmox LXC</title>
      <link>https://jorisvandijk.com/posts/frigate-on-proxmox/</link>
      <pubDate>Sat, 19 Jul 2025 10:55:57 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/frigate-on-proxmox/</guid>
      <description>&lt;p&gt;I have a &lt;em&gt;homelab&lt;/em&gt;, or more simply a personal server I run at home. It&amp;rsquo;s a small square black box that sits in my office, humming away. This server runs &lt;a href=&#34;https://www.proxmox.com/en/products/proxmox-virtual-environment/overview&#34;&gt;Proxmox VE&lt;/a&gt;, a &lt;em&gt;hypervisor&lt;/em&gt;. This controls pretty much everything that goes on, on this server. It has the ability to spin up containers, which it calls &lt;em&gt;LXC&lt;/em&gt;&amp;rsquo;s. These are somewhat akin to &lt;em&gt;Docker containers&lt;/em&gt;. Anyway, the process of spinning one of these up is super simple. Click a few buttons, allocate some space and there&amp;rsquo;s your &amp;lsquo;container&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;While this is a super simple process, there&amp;rsquo;s an even simpler process. Enter &lt;a href=&#34;https://community-scripts.github.io/ProxmoxVE/&#34;&gt;Proxmox VE Helper-Scripts&lt;/a&gt;. This is a repository filled with installation scripts which offer a &lt;em&gt;one-liner&lt;/em&gt; that can be run in Proxmox&amp;rsquo;s terminal, which pulls in a &lt;em&gt;Bash&lt;/em&gt; script and executes it. This script will then proceed to not just create an LXC container, but also installs the program you wanted to run on this LXC. Most scripts can be run either automatically, or will offer you choices on how to set up the container and program. It&amp;rsquo;s like magic.&lt;/p&gt;
&lt;p&gt;Anyway, &lt;a href=&#34;https://community-scripts.github.io/ProxmoxVE/scripts?id=frigate&#34;&gt;one&lt;/a&gt; of these scripts will install &lt;a href=&#34;https://frigate.video/&#34;&gt;Frigate&lt;/a&gt;, which is a bit of software to monitor security cameras - a so-called &lt;em&gt;NVR&lt;/em&gt;. When I bought my house it came with security cameras and a very clunky dedicated physical NVR, which was plonked into a wall-mounted server rack in the garage. The software to view the cameras with and check recordings was god-aweful, so I decided on swapping it out in favor of Frigate on my server.&lt;/p&gt;
&lt;p&gt;Using the script, installation was a breeze, until I hit a snag. I install LXC containers on a dedicated SSD for fast load times. It is meant for running programs and not storing data, like the data a security camera might generate - video, they call it. By default, Frigate will store all camera feeds (and other data, like snapshots of detections and short clips) on the same drive as it is installed on. &amp;ldquo;No problem&amp;rdquo;, I thought, &amp;ldquo;I&amp;rsquo;ll just go into the Frigate UI and switch the storage location to a dedicated drive I have already installed on my server.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Nope. No can do. It is not possible to add another drive to Frigate, which is outside of the LXC from within the UI. Shit.&lt;/p&gt;
&lt;p&gt;This meant having to frantically search online for a solution, which I&amp;rsquo;ve found. The following are the steps required to set it up.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Note the ID of your container on the Proxmox dashboard.&lt;/li&gt;
&lt;li&gt;Open your console on the Proxmox web interface &lt;strong&gt;on the host&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Stop the Frigate LXC.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct stop &amp;lt;container_id&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Again, the container ID can be found on the Proxmox dashboard.&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Edit the config file.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/pve/lxc/&amp;lt;container_id&amp;gt;.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Add the following.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /&amp;lt;location&amp;gt;/&amp;lt;of&amp;gt;/&amp;lt;mount&amp;gt;,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/frigate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;info-banner&#34;&gt;
  &lt;div class=&#34;info-header&#34;&gt;
    &lt;span class=&#34;info-icon&#34;&gt;ℹ️&lt;/span&gt;
    &lt;span class=&#34;info-title&#34;&gt;INFO&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class=&#34;info-content&#34;&gt;
    Note that the path &lt;code&gt;/media/frigate&lt;/code&gt; is mandatory for Frigate to use the external drive! This is because it&amp;rsquo;s the hard-coded location Frigate uses to store its content to. The &lt;em&gt;mp0&lt;/em&gt; stands for &lt;em&gt;Mount Point 0&lt;/em&gt;, this can be any number, but let&amp;rsquo;s start at the top.
  &lt;/div&gt;
&lt;/div&gt;

&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Set the permissions for the drive.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown -R 1000:1000 /&amp;lt;location&amp;gt;/&amp;lt;of&amp;gt;/&amp;lt;mount&amp;gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod -R &lt;span class=&#34;m&#34;&gt;775&lt;/span&gt; /&amp;lt;location&amp;gt;/&amp;lt;of&amp;gt;/&amp;lt;mount&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Restart the container.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start &amp;lt;container_id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And that&amp;rsquo;s it. Without needing to adjust anything else in the UI, Frigate will now store all content on the dedicated external drive.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Making a new post in Hugo</title>
      <link>https://jorisvandijk.com/posts/new-hugo-post/</link>
      <pubDate>Fri, 18 Jul 2025 15:41:03 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/new-hugo-post/</guid>
      <description>&lt;p&gt;According to the &lt;a href=&#34;https://gohugo.io/getting-started/quick-start/&#34;&gt;Hugo Quick Start&lt;/a&gt; documentation, the right way to start a new post is by issuing the following command in a terminal: &lt;code&gt;hugo new content content/posts/my-post-name.md&lt;/code&gt;. This works fine and yields a new Hugo post with basic &lt;em&gt;frontmatter&lt;/em&gt;. I&amp;rsquo;ve found issuing &lt;code&gt;hugo new posts/my-new-post.md&lt;/code&gt; works fine as well. It&amp;rsquo;s shorter, so I prefer it. This is not the point however. The point is the &lt;em&gt;frontmatter&lt;/em&gt;. This is a few lines of text above the content of the Markdown file you&amp;rsquo;ve created by a &lt;code&gt;hugo new&lt;/code&gt; command. The Quick Start shows the following as an example of front matter that it generates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;l&#34;&gt;+++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;title = &amp;#39;My First Post&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;date = 2024-01-14T07:07:07+01:00&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;draft = true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;+++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As can be seen, three fields are created, namely: &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;draft&lt;/code&gt;. The first two speak for themselves. The latter is set to &lt;code&gt;false&lt;/code&gt; when it is time to post this post. This is all the front matter you get by default. So where&amp;rsquo;s the author&amp;rsquo;s name? Or how about some tags? I&amp;rsquo;d also like to add some cover image, maybe even toggle the table of contents on or off. So what is a blogger to do? Just type that stuff by hand each and every time?&lt;/p&gt;
&lt;p&gt;Hell no. It is time to set up &lt;a href=&#34;https://gohugo.io/content-management/archetypes/&#34;&gt;Archetypes&lt;/a&gt;. The idea is simple - a new default &lt;em&gt;template&lt;/em&gt; for a post will be made and all the front matter deemed needed is added there.&lt;/p&gt;
&lt;p&gt;First a new directory is to be added to the root of the project directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p archetypes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next a file named &lt;code&gt;default.md&lt;/code&gt; should be added in this directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch archetypes/default.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then in this file the front matter can be set for any &lt;em&gt;post&lt;/em&gt;.  The example front matter as shown in the Quick Start is in &lt;em&gt;toml&lt;/em&gt;, I prefer &lt;em&gt;yaml&lt;/em&gt; so the following example is in &lt;em&gt;yaml&lt;/em&gt;. This is just a personal preference. Feel free to use &lt;em&gt;toml&lt;/em&gt; if you&amp;rsquo;d like. Anyway, this is what my &lt;code&gt;default.md&lt;/code&gt; currently looks like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ replace .Name &amp;#34;&lt;/span&gt;-&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; | title }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.Date }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;author&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Joris&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;draft&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/img/add-image-name-here.png&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;This is the image&amp;#39;s alt text&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; will be autofilled if left like this, that is probably what you&amp;rsquo;d want. Added are the &lt;code&gt;tags&lt;/code&gt; and &lt;code&gt;cover&lt;/code&gt; options. Many more options are available to you as can be found in the Hugo Quick Start, under &lt;a href=&#34;https://gohugo.io/content-management/front-matter/&#34;&gt;Frontmatter&lt;/a&gt;. After the &lt;code&gt;default.md&lt;/code&gt; file is saved, starting a new post with &lt;code&gt;hugo new posts/my-new-post.md&lt;/code&gt; will give you a brand new post, which includes all the frontmatter you added.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://jorisvandijk.com/posts/hello-world/</link>
      <pubDate>Thu, 17 Jul 2025 20:59:15 +0200</pubDate><author>contact@jorisvandijk.com (Joris)</author>
      <guid>https://jorisvandijk.com/posts/hello-world/</guid>
      <description>&lt;p&gt;And once again a new &lt;em&gt;Hello World&lt;/em&gt; post is born. This is the umpteenth iteration of this website, as I cannot seem to stop wanting to change things up. I like trying out new ideas. Sometimes they lead somewhere, mostly they don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The last version of this site placed the content into a more documentation-like website format. I thought I&amp;rsquo;d like that more than a blog — mainly for organizational purposes. A bit more structured than the &lt;em&gt;throw it at a wall and see what sticks&lt;/em&gt; blog approach.&lt;/p&gt;
&lt;p&gt;Turns out, I hate structure. I also didn&amp;rsquo;t like the look of the site at all. So as with many before it, it got nuked.&lt;/p&gt;
&lt;p&gt;So, now we&amp;rsquo;re here. After running everything from &lt;em&gt;Drupal&lt;/em&gt;, &lt;em&gt;WordPress&lt;/em&gt;, plain HTML, &lt;em&gt;Eleventy&lt;/em&gt;, &lt;em&gt;Docusaurus&lt;/em&gt;, and who-can-remember what else, we&amp;rsquo;re on &lt;em&gt;Hugo&lt;/em&gt; now. The reasoning behind this is simple: I&amp;rsquo;ve never tried it before. It looks good and seems to have all the functionality I would require from a blog platform, like writing in &lt;em&gt;Markdown&lt;/em&gt;, building on &lt;em&gt;GitHub Pages&lt;/em&gt;, good theming possibilities, no dependencies and fast build times. I&amp;rsquo;ve even got a self-reliant search function.&lt;/p&gt;
&lt;p&gt;Working on the layout, looks and functionality of the Hugo site has been a blast. I really enjoy this part of the development of a website — probably more so than the actual blogging on the end result. Anyway, I&amp;rsquo;ve stuck to the &lt;em&gt;Everforest&lt;/em&gt; theme and I&amp;rsquo;ve even included a light version for those who like that sort of thing. The font I am using right now is called &lt;em&gt;Caskaydia Cove Nerd Font&lt;/em&gt;. I like the look of the font in my terminal, but am not totally sold on it as a website font yet.&lt;/p&gt;
&lt;p&gt;So. Here we are. A new website which will need to be filled again. What&amp;rsquo;s the plan? Well, I suppose I&amp;rsquo;ll be bringing back old content to the site, as that still has value. I will be rewriting and updating it as I get through it, though. Apart from that, after 12+ years I&amp;rsquo;ve switched from &lt;em&gt;Arch Linux&lt;/em&gt; to &lt;em&gt;NixOS&lt;/em&gt;, which has forced me to learn and discover new things. I&amp;rsquo;ve gotten more into cyber security due to school and I&amp;rsquo;ve been improving my homelab. I&amp;rsquo;ll probably also pepper in the occasional personal post, thought or babble — we&amp;rsquo;ll see.&lt;/p&gt;
&lt;p&gt;For now, welcome to my new website.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
