[{"content":"LUKS, Linux Unified Key Setup, is a way to encrypt partitions on Linux. It\u0026rsquo;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\u0026rsquo;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.\nSetup ⚠️ WARNING THIS IS A DESTRUCTIVE ACT! IT WILL ERASE EVERYTHING ON THE PARTITION! Find the partition you want to encrypt with lsblk then format it as LUKS.\n1 sudo cryptsetup luksFormat /dev/sdXN Where X is the drive letter and N the partition number. You\u0026rsquo;ll be prompted to type YES in all capitals to confirm you\u0026rsquo;re ok with your data being overwritten. Then you\u0026rsquo;ll set a passphrase and confirm it. Next, unlock the LUKS partition.\n1 sudo cryptsetup luksOpen /dev/sdXN vault I am naming mine vault 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\u0026rsquo;t care what you pick, it supports pretty much all of them. In this post I\u0026rsquo;ll use ext4.\n1 sudo mkfs.ext4 /dev/mapper/vault That\u0026rsquo;s basically it. You\u0026rsquo;ve set up the partition as a LUKS partition. The partition is now unlocked and has a filesystem on it.\nMounting 📝 NOTE This post assumes you\u0026rsquo;re following along from start to finish, which means at this point your partition is unlocked. Remember that if you\u0026rsquo;re not, you\u0026rsquo;ll need to have unlocked the partition before you can mount it. Unlocking is covered further down. Now would be a good time to store your super-secret-document.md on the partition. In order to do so, you\u0026rsquo;ll need to mount it. First create the mount point. You\u0026rsquo;ll only need to do this once.\n1 sudo mkdir /mnt/vault You can use any name and location, I\u0026rsquo;ll just use vault again and have it in /mnt/. And now mount the unlocked partition.\n1 sudo mount /dev/mapper/vault /mnt/vault You can now use the partition like you\u0026rsquo;d use any other.\nUnmounting So after storing that super-secret-document.md, you\u0026rsquo;re done with the partition. We\u0026rsquo;re going to lock it, but before we can, we need to unmount it.\n1 sudo umount /mnt/vault Locking And now in order to lock the partition, you issue the following:\n1 sudo cryptsetup luksClose vault The partition is now locked.\nUnlocking In order to unlock it, you\u0026rsquo;ll need to issue a command we already covered in the setup. But from here on in, this is how you open the partition.\n1 sudo cryptsetup luksOpen /dev/sdXN vault Obviously, to use it you\u0026rsquo;ll need to mount it. See the mounting section.\nWorkflow So the workflow for using your new LUKS partition is going to be:\nUnlock the partition Mount the partition Do your work in the partition Unmount the partition Lock the partition ","permalink":"https://jorisvandijk.com/posts/luks/","summary":"\u003cp\u003eLUKS, \u003cem\u003eLinux Unified Key Setup\u003c/em\u003e, is a way to encrypt partitions on Linux. It\u0026rsquo;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\u0026rsquo;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.\u003c/p\u003e","title":"LUKS"},{"content":"Rsync is an amazing utility to copy (or sync) stuff from one place to another without having to worry about the command getting cut. With a plain cp, an interrupted transfer means starting over from scratch. Rsync compares source and destination, skipping files that are already there, and with --partial it can even resume a file that was only halfway through. It can also remember ownership and permissions, and even copy over ssh. That is, with the right flags, which I can never remember. Hence this post.\nMy favorite For local copying I like to use:\n1 rsync -avh --info=progress2 --partial [source] [destination] Flags used are:\na: Archive mode (recursive, preserves permissions, timestamps, symlinks, etc.) v: Verbose (gimme all the output) h: Human-readable sizes (because 1,073,741,824 bytes is not helpful) --info=progress2: Shows overall progress (including number of files, percentage done, etc.) --partial: resumes interrupted transfers To server Copying files to my server, I\u0026rsquo;d use:\n1 rsync -avh --info=progress2 --partial ~/Photos/ joris@192.168.1.5:/data/photos/ So basically the same flags, but this time I am moving my photos to my server over ssh. Good to note is the trailing slash. Photos/ copies the contents, Photos copies the directory itself.\nFrom server And grabbing files from my server is pretty much the same, but reversed:\n1 rsync -avh --info=progress2 --partial joris@192.168.1.5:/logs/ ~/Server_logs/ And now my server logs are saved locally.\nOther interesting options --delete: Mirror mode, which removes files at the destination that no longer exist at the source -e \u0026quot;ssh -p 2222\u0026quot;: Use a custom SSH port --remove-source-files: Move instead of copy so it removes source files after successful transfer (this does leave empty directories behind) -n/--dry-run: Simulate the transfer without touching anything (especially when running --delete) ","permalink":"https://jorisvandijk.com/posts/rsync/","summary":"\u003cp\u003eRsync is an amazing utility to copy (or sync) \u003cem\u003estuff\u003c/em\u003e from one place to another without having to worry about the command getting cut. With a plain \u003cem\u003ecp\u003c/em\u003e, an interrupted transfer means starting over from scratch. Rsync compares source and destination, skipping files that are already there, and with \u003ccode\u003e--partial\u003c/code\u003e it can even resume a file that was only halfway through. It can also remember ownership and permissions, and even copy over \u003cem\u003essh\u003c/em\u003e. That is, with the right flags, which I can never remember. Hence this post.\u003c/p\u003e","title":"Rsync"},{"content":"I\u0026rsquo;m used to formatting disks on Linux with GParted, but unfortunately there\u0026rsquo;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:\n1 diskutil list To list the drives on your system and find the name of the one you want to format. Then:\n1 diskutil eraseDisk ExFAT DRIVENAME diskX Where ExFAT is one of the possible formats, DRIVENAME is the name you want to give to the drive, say \u0026ldquo;MyThumbDrive\u0026rdquo;. The X in diskX needs to be the number of the drive to be formatted. That\u0026rsquo;s it.\n⚠️ WARNING Be aware this will nuke your entire drive! All data on it will be lost. ","permalink":"https://jorisvandijk.com/posts/format-on-macos/","summary":"\u003cp\u003eI\u0026rsquo;m used to formatting disks on Linux with GParted, but unfortunately there\u0026rsquo;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:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ediskutil list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eTo list the drives on your system and find the name of the one you want to format. Then:\u003c/p\u003e","title":"Format on MacOS"},{"content":"I recently noticed myself wanting stuff, then thinking on it only to realize I didn\u0026rsquo;t really. It\u0026rsquo;s like ADHD greed 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\u0026rsquo;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.\nServer I have a server that stores my media (movies, series, books, games, etcetera), my photos and my videos. It has my (and my wife\u0026rsquo;s) important documents and all the stuff 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\u0026rsquo;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\u0026rsquo;t hesitate for a second.\nCoffee maker I love coffee. I drink it throughout the day. Black. But, I like to drink a cappuccino every morning. It\u0026rsquo;s a little ritual the wife and I picked up due to our love of Italy. While we\u0026rsquo;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\u0026rsquo;d have a new one the next day.\nMacBook I identify as a Linux user. It\u0026rsquo;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\u0026rsquo;s not proper Linux, I can still Bash script, use my favorite terminal and do all operations and text editing and what have you on it. It\u0026rsquo;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.\nWatches I own several mechanical watches. All of them automatics and three of them my dad bought. He\u0026rsquo;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\u0026rsquo;d pay whatever the price for the repair was. But if I were to lose any of them, I\u0026rsquo;d be gutted.\n\u0026hellip;and? Well, that\u0026rsquo;s basically it. I read somewhere 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\u0026rsquo;s just stuff. Losing any or all would sting. The watches would maybe make me shed a tear, then nothing. Then I\u0026rsquo;d buy a new watch. Stuff does not matter. None of it. Don\u0026rsquo;t buy the thing.\n","permalink":"https://jorisvandijk.com/posts/physical-things-i-value/","summary":"\u003cp\u003eI recently noticed myself wanting stuff, then thinking on it only to realize I didn\u0026rsquo;t really. It\u0026rsquo;s like \u003cem\u003eADHD greed\u003c/em\u003e 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\u0026rsquo;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.\u003c/p\u003e","title":"Don't Buy The Thing"},{"content":"Typing takes time. Typing without typos is an art. Fixing mistakes in a terminal command is a pain in the neck. Luckily there\u0026rsquo;s such a thing as aliases. 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: alias ..='cd ..'. This allows me to write .. in terminal and it will act like cd .., saving me typing a c, a d 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\u0026rsquo;s a huge timesaver.\nIt\u0026rsquo;s not just saving time. Some commands I simply cannot remember. So for using rsync to move a file over to or from my server, the command I use is rsync -a --no-owner --partial --info=progress2 -e ssh. There\u0026rsquo;s no way I\u0026rsquo;ll remember that, so I aliased it. There\u0026rsquo;s one snag when it comes to aliases: they can only be used at the start of a line. This rsync 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 zsh-abbr.\nThis nifty program lets you set up \u0026ldquo;abbreviations\u0026rdquo;, which basically work like aliases, except you can add a flag and they work anywhere on the line! So instead of typing out joris@192.168.1.5:/ I can now type srv 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 rsync command to an abbreviation, which means I can now type:\n1 copy . srv Instead of:\n1 rsync -a --no-owner --partial --info=progress2 -e ssh . username@192.168.1.5:/ And remember, it\u0026rsquo;s interactive, meaning that after you typed copy and pressed space, it visibly changes to the rsync command. Same for the srv abbreviation, meaning you see the entire command before you press enter!\nAdding Abbreviations First install the program. Then add an abbreviation in terminal:\n1 abbr copy=\u0026#34;rsync -a --no-owner --partial --info=progress2 -e ssh\u0026#34; Or, when you want to have it work globally (anywhere on the line), add the -g flag:\n1 abbr -g srv=\u0026#34;joris@192.168.1.5:/\u0026#34; For more commands, see the documentation.\nCaveats This only works in Zsh. If you use Fish, it\u0026rsquo;s built-in. Bash unfortunately has no support for this as far as I\u0026rsquo;m aware.\n","permalink":"https://jorisvandijk.com/posts/abbreviations/","summary":"\u003cp\u003eTyping takes time. Typing without typos is an art. Fixing mistakes in a terminal command is a pain in the neck. Luckily there\u0026rsquo;s such a thing as \u003cem\u003ealiases\u003c/em\u003e. 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: \u003ccode\u003ealias ..='cd ..'\u003c/code\u003e. This allows me to write \u003ccode\u003e..\u003c/code\u003e in terminal and it will act like \u003ccode\u003ecd ..\u003c/code\u003e, saving me typing a \u003cem\u003ec\u003c/em\u003e, a \u003cem\u003ed\u003c/em\u003e 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\u0026rsquo;s a huge timesaver.\u003c/p\u003e","title":"Terminal Abbreviations"},{"content":"I have a ZFS dataset named data, mounted at /data, 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 Immich, for photo storage, or Jellyfin 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 \u0026ldquo;drive\u0026rdquo; may cause permission issues.\nWhat 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\u0026rsquo;ve mainly chown-ed whenever I ran into an issue, but a more sustainable long term solution was needed.\nACL Access Control Lists, or ACLs, extend Linux\u0026rsquo;s basic permission system. Normally you have three categories to work with: owner, group, and others. That\u0026rsquo;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 default ACLs 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.\nInstall and setup The process is pretty straight forward. First install the program:\n1 apt install acl Next, as this is a ZFS dataset, we\u0026rsquo;ll enable support for ACL:\n1 zfs set acltype=posixacl data \u0026amp;\u0026amp; zfs set xattr=sa data We\u0026rsquo;ll now set the defaults we want to /data\u0026rsquo;s existing files. Depending on how large the amount of data is, this might take some time. Be patient, grab a cup of coffee.\n1 setfacl -Rm u::rwx,g::rwx,o::rwx /data And we\u0026rsquo;ll make sure any future files will also inherit these defaults:\n1 setfacl -Rm u::rwx,g::rwx,o::rwx /data. Validating To make sure all is well, we\u0026rsquo;ll also check it\u0026rsquo;s set up right now:\n1 getfacl /data We\u0026rsquo;re looking for an output like this:\n1 2 3 4 5 6 7 8 9 10 11 root@pve:~# getfacl /data getfacl: Removing leading \u0026#39;/\u0026#39; from absolute path names # file: data # owner: root # group: root user::rwx group::rwx other::rwx default:user::rwx default:group::rwx default:other::rwx Where default:user::rwx, default:group::rwx, and default:other::rwx are what we\u0026rsquo;re looking to see.\nIt\u0026rsquo;s also a good idea to test if new files and directories will get the right permissions as well:\n1 mkdir /data/acl-test \u0026amp;\u0026amp; getfacl /data/acl-test The new directory should show the same default: entries without having set anything manually.\nIf this checks out, remove the test file and we\u0026rsquo;re done!\n1 rmdir /data/acl-test ","permalink":"https://jorisvandijk.com/posts/permissions-shared-zfs/","summary":"\u003cp\u003eI have a ZFS dataset named \u003cem\u003edata\u003c/em\u003e, mounted at \u003cem\u003e/data\u003c/em\u003e, 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 \u003cem\u003eImmich\u003c/em\u003e, for photo storage, or \u003cem\u003eJellyfin\u003c/em\u003e 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 \u0026ldquo;drive\u0026rdquo; may cause permission issues.\u003c/p\u003e","title":"Permissions on Shared ZFS Dataset"},{"content":"It\u0026rsquo;s about that time. There\u0026rsquo;s a new version of Proxmox VE in town and it has had a couple of months to \u0026ldquo;stabilize\u0026rdquo;. Now is the time to bump up the version of that homelab.\nI\u0026rsquo;ve pulled the trigger and did the upgrade. The following is my experience with doing this update. I\u0026rsquo;ve run into some issues, which all got solved and I didn\u0026rsquo;t break my server.\nPrerequisites You must be on PVE 8.4.1 or newer before upgrading. Check with:\n1 pveversion Make sure all your VMs and containers have verified backups in PBS before starting. It\u0026rsquo;d suck to lose those\u0026hellip;\nStep 1: Run the Pre-flight Checker Proxmox provides an official checker script that identifies issues before you touch anything:\n1 pve8to9 --full Run this, fix every FAIL, then run it again. Don\u0026rsquo;t proceed until you have 0 failures. Warnings are acceptable but worth addressing.\nStep 2: Fix Issues I cannot go through all possible issues you might encounter, like I stated above: this is my experience of the process. I\u0026rsquo;ll address the issues I ran into.\nFAIL: systemd-boot meta-package installed The wiki has the solution to this: I first checked whether I\u0026rsquo;m actually using systemd-boot or if it\u0026rsquo;s just an orphaned package:\n1 bootctl status The output said systemd-boot not installed in ESP and shows GRUB in the EFI variables, so it\u0026rsquo;s safe to remove:\n1 apt remove systemd-boot FAIL: Resolved node IP not configured 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:\n1 ip addr show Then I opened /etc/hosts directly in a text editor:\n1 nano /etc/hosts I found the line with my node\u0026rsquo;s hostname and updated the IP to match what ip addr show had reported. Save and quit.\nWARN: Less than 5 GB free on root 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\u0026rsquo;s start with a cleanup:\n1 2 apt clean journalctl --vacuum-size=500M That wasn\u0026rsquo;t enough, so I looked for what was eating space:\n1 du -xsh /* 2\u0026gt;/dev/null | sort -rh | head -20 (The -x flag is important as it keeps the scan on the root filesystem only and won\u0026rsquo;t cross into other mounts).\nThis pointed me to /cctv, which turned out to be the issue. Frigate had been writing footage there, but the dedicated CCTV SSD wasn\u0026rsquo;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:\n1 2 findmnt lsblk I remounted the SSD and added it back to /etc/fstab to make it persistent:\n1 2 mount /dev/sdXY /cctv echo \u0026#34;UUID=xxxx /cctv ext4 defaults 0 2\u0026#34; \u0026gt;\u0026gt; /etc/fstab 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.\nNOTICE: LVM autoactivation 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.\nAs noted in the Proxmox upgrade documentation, running the script is optional if your volumes are on local storage only, but still recommended. I ran it anyway:\n1 /usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation I confirmed with y when prompted.\nStep 3: Stop All Guests Stopping all guests before upgrading reduces the risk of filesystem or database corruption mid-upgrade.\n1 2 3 4 5 pct stop 101 pct stop 102 # ... etc qm stop 100 # ... etc Verify everything is stopped:\n1 2 pct list qm list Step 4: Update Repositories and Upgrade I then replaced bookworm with trixie in apt sources:\n1 2 sed -i \u0026#39;s/bookworm/trixie/g\u0026#39; /etc/apt/sources.list sed -i \u0026#39;s/bookworm/trixie/g\u0026#39; /etc/apt/sources.list.d/*.list Next I updated and verified the new repos resolve without errors:\n1 apt update You should see Debian trixie, trixie-security, trixie-updates, and Proxmox trixie all resolving cleanly. Then I ran the upgrade:\n1 apt dist-upgrade Step 5: Answer Config File Prompts You\u0026rsquo;ll be asked about several config files during the upgrade. Here\u0026rsquo;s what I answered for each:\nFile Answer Reason /etc/issue N Keep your current version /etc/lvm/lvm.conf Y Take the maintainer\u0026rsquo;s updated version /etc/ssh/sshd_config Y If unmodified /etc/default/grub N Keep your current version /etc/chrony/chrony.conf Y Take the maintainer\u0026rsquo;s updated version Keyboard layout Pick your layout Physical keyboard preference Restart services automatically Yes Guests are stopped anyway ℹ️ INFO For any config file you\u0026rsquo;ve customised heavily, use D to diff the versions before deciding. Step 6: Reboot 1 reboot After rebooting, verify the upgrade succeeded:\n1 pveversion You should see pve-manager/9.x.x/....\nStep 7: Start Guests Back Up 1 2 3 4 5 pct start 101 pct start 102 # ... etc qm start 100 # ... etc Check the web UI to confirm everything looks right.\nPost-Upgrade Cleanup Remove any packages you no longer use. I noticed I still had Zabbix on there I was no longer using.\n1 2 apt purge zabbix-agent2 apt autoremove Verify all your mounts are correct with findmnt\nCheck that all storages show as active in the Proxmox web UI under Datacenter → Storage\nConfirm backup jobs are still configured under Datacenter → Backup\nRestart any long-running jobs that were interrupted (e.g. media library scans)\nConclusion And that was it. Pretty painless to be honest. Unfortunately I decided to use the second NVMe slot I wasn\u0026rsquo;t using to set up a ZFS pool with the NVMe that was running Proxmox. That way when one fails, I won\u0026rsquo;t lose my Proxmox setup and had some redundancy. Alas it\u0026rsquo;s impossible to switch an LVM to a ZFS pool on a running Proxmox instance. You\u0026rsquo;ll have to do a fresh install\u0026hellip; which I did a day after doing this upgrade. At least I can say I\u0026rsquo;ve had the experience, I suppose.\n","permalink":"https://jorisvandijk.com/posts/upgrade-proxmox-8-to-9/","summary":"\u003cp\u003eIt\u0026rsquo;s about that time. There\u0026rsquo;s a \u003ca href=\"https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-9-0\"\u003enew\u003c/a\u003e version of Proxmox VE in town and it has had a couple of months to \u0026ldquo;stabilize\u0026rdquo;. Now is the time to bump up the version of that homelab.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve pulled the trigger and did the upgrade. The following is \u003cem\u003emy\u003c/em\u003e experience with doing this update. I\u0026rsquo;ve run into some issues, which all got solved and I didn\u0026rsquo;t break my server.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003ePrerequisites\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou must be on \u003cstrong\u003ePVE 8.4.1 or newer\u003c/strong\u003e before upgrading. Check with:\u003c/p\u003e","title":"Upgrading Proxmox VE From 8 to 9"},{"content":"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.\nTo 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.\nI can’t.\nThis 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.\nI 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.\nSo 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.\n","permalink":"https://jorisvandijk.com/posts/stuff/","summary":"\u003cp\u003eI 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.\u003c/p\u003e","title":"Stuff"},{"content":"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\u0026rsquo;s amazing.\nThe 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\u0026rsquo;s a tip to be had!\nBuy a cheap second monitor, external display thing from Ali. It\u0026rsquo;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\u0026rsquo;s USB ports.\nNow, 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.\n","permalink":"https://jorisvandijk.com/posts/desktop-like-server/","summary":"\u003cp\u003eI 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\u0026rsquo;s amazing.\u003c/p\u003e\n\u003cp\u003eThe 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\u0026rsquo;s a tip to be had!\u003c/p\u003e","title":"Desktop-like Server"},{"content":"It\u0026rsquo;s been a while since I wrote one, but the other day I finally finished my tutorial on setting up Proxmox Backup Server. It\u0026rsquo;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\u0026rsquo;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.\nLike 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. :)\nI’m not going to say I\u0026rsquo;ll be doing more of these in the coming months, because I rarely stick to promises like that. Instead, I just hope I will.\n","permalink":"https://jorisvandijk.com/posts/i-love-writing-tutorials/","summary":"\u003cp\u003eIt\u0026rsquo;s been a while since I wrote one, but the other day I finally finished \u003ca href=\"https://jorisvandijk.com/posts/proxmox-backup-server/\"\u003emy tutorial\u003c/a\u003e on setting up \u003cem\u003eProxmox Backup Server\u003c/em\u003e. It\u0026rsquo;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\u0026rsquo;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.\u003c/p\u003e","title":"I Love Writing Tutorials"},{"content":"This is going to be a long one. I have spent countless hours setting up my Proxmox VE and the VM\u0026rsquo;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 Proxmox Backup Server or PBS for short. This post will go through how I set this up on my system.\nAssumptions I will be making a number of assumptions in this article regarding the setup of the server and about you, namely:\nIt is running Proxmox 8.x or newer. Proxmox is installed on its own drive on the server (in my case this is an nvme drive, not that it matters). There\u0026rsquo;s a separate physical disk (an SSD in my case) where backups will be stored. The backup drive is mounted at /media/backups. You may use a different mount point, this is just the one I use. Ownership for unprivileged LXC access of the backups mountpoint are set with chown -R 100000:100000 /media/backups/ 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. You know your way around basic networking. Caveats While this setup is reasonably safe, there\u0026rsquo;s some things worth mentioning. Having the backups on the same server as the Proxmox install means that when there\u0026rsquo;s a fire, flood or whatever else that can physically destroy the server, you lose everything. The Proxmox install and the backups. It\u0026rsquo;s always smart to have off-site backups. This article will not 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.\nInstalling PBS To install PBS, we will be using a Helper Script. This script will automate the install.\n⚠️ WARNING Using these Helper Scrips means running scripts from the internet on your server with root access. Be sure you trust the site, script and/or author. The script we\u0026rsquo;ll be using can be found here. Under How to install you can copy the install command. At the time of writing this, that would be bash -c \u0026quot;$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/proxmox-backup-server.sh)\u0026quot;. Now go to the web UI for Proxmox and navigate in the left dropdown menu to Datacenter \u0026gt; node (this can be named, mine is named pve). Then in the menu to the right of the dropdown (the secondary menu), click Shell.\nThe center of the screen will now display a shell/terminal interface. Paste the command we just copied here and press enter. A Terminal User Interface, or TUI will pop up. Select 3. Advanced Settings. Set the following values in the prompts that pass by:\nUnprivileged container. The root password of your choosing. Container ID of your liking (I use the default). Hostname of your choosing (I also leave this default). Disksize (Leave default). CPU cores (default). RAM (default). Network bridge (You likely have one choice here, if you have multiple you have set up another bridge yourself). IPv4 select Static (manual entry). Set the IP address. I have an internal network set up and I\u0026rsquo;ll always use 10.10.10.x. Whereas this is container ID 116 for me, I\u0026rsquo;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! Gateway I have set at 10.10.10.1. You need to know what yours is and cannot blindly copy this value. And for everything else, using the default settings is fine. You can Enter through the rest of the prompts. Next up select the location where you want the LXC container to be located. This is likely local-lvm (lvmthin). 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.\nIf everything went well, at the bottom of the output will be the URL you can visit to find your Proxmox Backup Server. Mine\u0026rsquo;s at https://10.10.10.116:8007. Visit your URL and check that you can log in with your credentials.\nℹ️ INFO If you cannot seem to log in with your credentials, make sure the Realm is set to Linux PAM standard authentication and not to Proxmox Backup authentication server. You\u0026rsquo;ll be greeted with a nag message about No valid subscription. This can be safely ignored. For now we won\u0026rsquo;t touch this interface and instead go back to the Proxmox VE browser tab to continue.\nAdding Storage Mount Point to the LXC In order for PBS to be able to access the /media/backups mount point, within Proxmox VE, we need to go back to the Shell. We get there by clicking Datacenter in the left menu and then in the secondary menu clicking on Shell. Here we\u0026rsquo;ll stop the PBS container, add the mountpoint to the configuration file of the container and then restart it.\nStop the container by issueing the following: pct stop \u0026lt;container id\u0026gt;, where container ID in my case would be 116. (I\u0026rsquo;ll be using this from here on in, substitute all 116 mentions with your container\u0026rsquo;s ID!) Check if it stopped with pct status 116. It should display status: stopped. Next we\u0026rsquo;ll add the line needed to the right configuration file: echo \u0026quot;mp0: /media/backups,mp=/backups\u0026quot; \u0026gt;\u0026gt; /etc/pve/lxc/116.conf, where the mp0: line creates a bind mount. The first part /media/backups) is the path on the Proxmox host, and the part after mp= is where it will appear inside the container. The echo in front and the \u0026gt;\u0026gt; /etc/pve/lxc/116.conf parts just mean print the quoted part into the configuration file. Check if the line got written to the file with cat /etc/pve/lxc/116.conf and at the very last line of the output you should see mp0: /media/backups,mp=/backups. Restart the container with pct start 116. Check if the container is running with pct status 116. Now go back to the PBS IP address, https://10.10.10.116:8007 in my case, and verify the drive is present by going to Administration \u0026gt; Shell in the left menu. In this shell issue the following: touch /backups/test. If you get no output, the drive is mounted right and the permissions are set properly. If you get permission errors, you\u0026rsquo;ll need to fix permissions.\nℹ️ INFO To fix permission issues, go to the Proxmox VE Shell and issue chown -R 100000:100000 /media/backups. We can remove the test file we just created with rm /backups/test.\nCreate Datastore In order for PBS to be able to run backups, we need to set the Datastore. On the PBS web UI, in the left sidebar, navigate to Datastore all the way at the bottom and click Add Datastore. A popup will, well, pop up. Here fill out the following fields:\nName: backups (or any name you prefer) Datastore Type: Local Backing Path: /backups You can set the GC Schedule (Garbage Collector Schedule) and the Prune Schedule here to whatever you like. I\u0026rsquo;ll leave it to the default of Daily. You can set this to whatever you like later in the settings. Same goes for the Prune Options. I\u0026rsquo;ll leave these blank for now. Click Add.\n⚠️ WARNING Before you continue, make sure you have the right directory set. After the software is done setting up the Datastore, you\u0026rsquo;ll be taken to the Datastores summary 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 not what we want. Create Backup User Next up we\u0026rsquo;re going to create a user that will run the backups. We\u0026rsquo;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.\nOn the PBS web UI, in the left menu, go to Configuration \u0026gt; Access Control. Here go to the User Management tab (it does so by default). Here we can set up our new user:\nClick Add. Fill out the fields as you like. I named the user backup and gave it a strong password. The Realm can be left as is. Make sure you do not let the user expire. Click Add. Our user has been created. We now will need to give him some privileges. In the left menu, head over to Datastores and select the datastore we\u0026rsquo;ve just created. Mine\u0026rsquo;s named backups. Here in the top menu click on Permissions. Click Add \u0026gt; User Permission.\nIn the User: field, select the backup@pbs user (or whatever you\u0026rsquo;ve named yours. Note that the @pbs got added automatically - this is normal). Then under Role select DatastoreAdmin. Click Add. Now all we need to do is get the Certificate Fingerprint, which we need for the next section. In the left menu, head over to Dashboard. Here click on the button Show Fingerprint. Copy this and close the popup.\nAdd PBS to Proxmox VE Open the Proxmox VE web UI. In the left menu, navigate to Datacenter. In the secondary menu click on Storage. In the top menu click Add \u0026gt; Proxmox Backup Server. A new popup appears where we need to input the following:\nID: backups (This is just a name. You can choose any you like). Server: 10.10.10.116 (This is the IP of the PBS). Username: backup@pbs (This is the user we made). Password: The password you chose for this user. Datastore: backups (This is the name you gave the datastore). Fingerprint: Here paste the fingerprint you copied at the end of the last section. ℹ️ INFO You can also set up encryption for the backups under the third tab Encryption. I have not done so and the process of setting that up is out of scope for this article. Click Add. PBS has now been added to Proxmox.\nCreate Backup Schedule We\u0026rsquo;ll want the backups to run on their own without needing user interaction\u0026hellip; so let\u0026rsquo;s set that up now. On the Proxmox VE web UI still, in the left menu click on Datacenter. In the secondary menu click on Backup. In the top menu click Add. We\u0026rsquo;re greeted by another popup. There are several fields here, but we only need to fill out a few, namely:\nStorage: backups (Or whatever name you used as ID in the previous section). Schedule: 4:00 (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). 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. Click Create. ℹ️ INFO You can also include the PBS container in the backups as well! We\u0026rsquo;re basically done now, but let\u0026rsquo;s verify it all works.\nVerifying the Setup Within the Proxmox VE web UI, in the left menu click on Datacenter. In the secondary menu click on Backup. Next highlight our PBS backup and in the top menu click Run now and click Yes on the popup. You can see what is going on by double clicking the running task named Backup Job in the bottom pane of the web UI labeled Tasks. This will bring up a popup that shows the backup in progress. When it\u0026rsquo;s done, it\u0026rsquo;ll end with Task OK is all went well.\nLet\u0026rsquo;s now move over to the PBS web UI and see if it shows the backups. In the left menu navigate to Datastores and click backups (or whatever you named your datastore). In the top menu click Content. A list of backed up containers and virtual machines should show up here.\nWhen 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.\nℹ️ INFO Some other things to consider checking are the Prune \u0026amp; GC Jobs. 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. Final Notes 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.\nYou 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\u0026rsquo;t supported by PBS. It\u0026rsquo;s on the roadmap though, so fingers crossed. At a later date I\u0026rsquo;ll share my current solution to this problem.\n","permalink":"https://jorisvandijk.com/posts/proxmox-backup-server/","summary":"\u003cp\u003eThis is going to be a long one. I have spent countless hours setting up my Proxmox VE and the VM\u0026rsquo;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 \u003cem\u003eProxmox Backup Server\u003c/em\u003e or PBS for short. This post will go through how I set this up on \u003cem\u003emy\u003c/em\u003e system.\u003c/p\u003e","title":"Proxmox Backup Server"},{"content":"It sucks. No really, it does. It\u0026rsquo;s a shame, but there\u0026rsquo;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\u0026hellip; This place is even worse.\nYouTube is doing full minute ads now too, I hear. I don\u0026rsquo;t suffer from that shit as I have decent adblock. Still though, one minute of a single ad between \u0026ldquo;free\u0026rdquo; content? That\u0026rsquo;s bonkers.\nI 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 \u0026ldquo;subscribe\u0026rdquo; 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.\nI 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\u0026rsquo;d love more from other sources.\nIt does not work like this anymore though. It\u0026rsquo;s all crap.\nDon\u0026rsquo;t get me wrong though. The people I subscribe to still put out quality content! It\u0026rsquo;s just getting impossible to find that content on the YouTube home page.\n","permalink":"https://jorisvandijk.com/posts/youtube/","summary":"\u003cp\u003eIt sucks. No really, it does. It\u0026rsquo;s a shame, but there\u0026rsquo;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\u0026hellip; This place is even worse.\u003c/p\u003e\n\u003cp\u003eYouTube is doing full minute ads now too, I hear. I don\u0026rsquo;t suffer from that shit as I have decent adblock. Still though, one minute of a single ad between \u0026ldquo;free\u0026rdquo; content? That\u0026rsquo;s bonkers.\u003c/p\u003e","title":"YouTube"},{"content":"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.\nFirst 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.\nSecond 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\u0026rsquo;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.\nWhat\u0026rsquo;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.\nAnd gone are the cover images.\n","permalink":"https://jorisvandijk.com/posts/cover-images/","summary":"\u003cp\u003eI 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.\u003c/p\u003e\n\u003cp\u003eFirst 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.\u003c/p\u003e","title":"Cover Images"},{"content":"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.\nI 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.\nI was able to do one thing. Just be in that moment and do that one thing and enjoy it.\nI 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.\nIt’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.\nI 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.\nWere things better when you were young? Are memories made when you’re developing worth more?\nThere’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.\nIt 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!\nWhere do I buy an album now though?\n","permalink":"https://jorisvandijk.com/posts/focus/","summary":"\u003cp\u003eI 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.\u003c/p\u003e","title":"Focus"},{"content":"At least, from your computer. Hear me out.\nI\u0026rsquo;ve only recently gotten into reading people\u0026rsquo;s personal blogs. It\u0026rsquo;s very relaxing to read the personal thoughts of real people. Not just thoughts, sometimes there\u0026rsquo;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.\nMy list of blogs to keep track of is constantly growing. I discover new people weekly. The point here is, there\u0026rsquo;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.\nWhen 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\u0026rsquo;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.\nThe 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\u0026rsquo;s this constant background hum of \u0026ldquo;shouldn\u0026rsquo;t you be doing something more important right now?\u0026rdquo;\nCompare 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\u0026rsquo;s my time and I choose to waste it on this little screen I hold in my palm.\nThis is when I get the most out of blogs. I just read and enjoy the posts. It\u0026rsquo;s guilt free and nice. There\u0026rsquo;s something intimate about reading someone\u0026rsquo;s personal thoughts on a small screen while I\u0026rsquo;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\u0026rsquo;s archive. It feels natural, not systematized.\nThat 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\u0026rsquo;t meant to be consumed like email or news. They\u0026rsquo;re meant to be savored and enjoyed!\n","permalink":"https://jorisvandijk.com/posts/remove-rss/","summary":"\u003cp\u003eAt least, from your computer. Hear me out.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve only recently gotten into reading people\u0026rsquo;s personal blogs. It\u0026rsquo;s very relaxing to read the personal thoughts of real people. Not just thoughts, sometimes there\u0026rsquo;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.\u003c/p\u003e\n\u003cp\u003eMy list of blogs to keep track of is constantly growing. I discover new people weekly. The point here is, there\u0026rsquo;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.\u003c/p\u003e","title":"You should delete your RSS reader"},{"content":"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.\nWhen 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.\nHow 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.\nThen 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 if there. Piracy isn’t stealing, it’s unauthorized duplication or infringement of intellectual property rights.\nI 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.\nNetflix 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.\nAdd 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.\nNo wonder people are once again considering the high seas.\nSo, 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.\n“Leasing isn’t owning, and intellectual property infringement is still a debatable gray area.” Not as sexy, more true.\n","permalink":"https://jorisvandijk.com/posts/piracy/","summary":"\u003cp\u003eNow, 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.\u003c/p\u003e\n\u003cp\u003eWhen 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.\u003c/p\u003e","title":"If buying isn’t owning, piracy isn’t stealing"},{"content":"I am debating slash pages. This website is a blog, or at least it aims to be. This time around, I didn\u0026rsquo;t just start blogging. No. I also got into reading other people\u0026rsquo;s blogs. I have a blogroll page where I list some of the ones I enjoy reading. This particular page, the blogroll, is located under my domain, Jorisvandijk.com, then a forward slash / and then the name blogroll. So https://jorisvandijk.com/blogroll. Pages like this, pages under the main domain name right after the slash, these are called slash pages. At least they are in the blogosphere (what a word).\nAnyway, I like clean design and minimalism. A place for everything and everything in its place. Currently the header of this website looks like this:\nFrom 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\u0026rsquo;t. It does not belong. Hell, I have a contact page 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\u0026rsquo;t go anywhere else, really. Matt first told me about the blogroll and I really like that idea. It reminds me of the links page websites from a better era used to have. A thing my old websites always featured. I feel it\u0026rsquo;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.\nAnyway, I believe my website needs this page. It has to have a place somewhere. The current location ain\u0026rsquo;t it.\nWhen I learned about the blogroll, I didn\u0026rsquo;t yet know of the concept of slash pages. I found out through several blogs found on the blogosphere. Turns out, there\u0026rsquo;s a huge variety of common slash pages. Ranging from the useful, like a /about page, to the macabre with the /death page, or the totally pointless, like /hats, where one could describe or show all the hats they own. There\u0026rsquo;s so many, that a website exists that lists them.\nSo, I already have two of these slash pages for sure. I might as well change the menu item to something like more or slash or even /, and have a /slash (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.\nAt any rate, do you have thoughts on this? Please feel free to email me your thoughts. The address is on my /about page. :)\n","permalink":"https://jorisvandijk.com/posts/slash/","summary":"\u003cp\u003eI am debating \u003cem\u003eslash pages\u003c/em\u003e. This website is a blog, or at least it aims to be. This time around, I didn\u0026rsquo;t just start blogging. No. I also got into reading other people\u0026rsquo;s blogs. I have a \u003ca href=\"/blogroll\"\u003eblogroll\u003c/a\u003e page where I list some of the ones I enjoy reading. This particular page, the \u003cem\u003eblogroll\u003c/em\u003e, is located under my domain, \u003ccode\u003eJorisvandijk.com\u003c/code\u003e, then a forward slash \u003ccode\u003e/\u003c/code\u003e and then the name \u003ccode\u003eblogroll\u003c/code\u003e. So \u003ccode\u003ehttps://jorisvandijk.com/blogroll\u003c/code\u003e. Pages like this, pages under the main domain name right after the slash, these are called \u003cem\u003eslash pages\u003c/em\u003e. At least they are in the \u003ca href=\"https://en.wikipedia.org/wiki/Blogosphere\"\u003eblogosphere\u003c/a\u003e (what a word).\u003c/p\u003e","title":"Slash"},{"content":"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.\nIt’s too clean. Too eager to please. Every function name is a sentence. Every comment explains the obvious, like it\u0026rsquo;s written by someone explaining programming to a golden retriever. Sometimes there’s even an emoji in there. An emoji. In code.\nReal 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 \u0026ldquo;just in case.”\nAI 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.”\nWant 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\u0026rsquo;s the kind of ‘helpful’ that makes you yell, \u0026ldquo;I can read the damned code!\u0026rdquo;\nOnce 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.\n","permalink":"https://jorisvandijk.com/posts/code/","summary":"\u003cp\u003eI 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.\u003c/p\u003e\n\u003cp\u003eIt’s too clean. Too eager to please. Every function name is a sentence. Every comment explains the obvious, like it\u0026rsquo;s written by someone explaining programming to a golden retriever. Sometimes there’s even an emoji in there. An emoji. In code.\u003c/p\u003e\n\u003cp\u003eReal 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 \u0026ldquo;just in case.”\u003c/p\u003e","title":"Code"},{"content":"I love my new blog website. I like to share useful things I found or did. I prefer to post content that\u0026rsquo;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\u0026rsquo;s pretty much the style I have. There\u0026rsquo;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.\nNow, on one hand, I don\u0026rsquo;t like to pollute the website with content that has no real value, 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 \u0026ldquo;personal\u0026rdquo; or \u0026ldquo;rant\u0026rdquo; 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 Mijndert 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.\nMaybe the real question is, what do I want. Come to think of it, this is my blog. I should just do what I feel fits, the problem, though, is I don\u0026rsquo;t know.\nThis 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\u0026rsquo;t scour the web to find a fitting header image for it. Actually, I just decided - I won\u0026rsquo;t.\nIf you have thoughts or suggestions, I don\u0026rsquo;t like comment sections, but you can still email me at joris at this domain.\n","permalink":"https://jorisvandijk.com/posts/secondary-blog/","summary":"\u003cp\u003eI love my new blog website. I like to share useful things I found or did. I prefer to post content that\u0026rsquo;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\u0026rsquo;s pretty much the style I have. There\u0026rsquo;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.\u003c/p\u003e","title":"Secondary blog"},{"content":"I\u0026rsquo;ve mentioned before that I have my website\u0026rsquo;s repository mirrored across multiple Git hosts. Well, it is not just the website; it is all my repositories. I have four hosts, namely: GitHub, GitLab, Codeberg, and Bitbucket. 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.\nFour is a lot, but you might think that at least having a second one is not such a bad idea - and you\u0026rsquo;d be right. The process is super simple and short. No reason not to do it. I\u0026rsquo;ll walk through the process assuming we\u0026rsquo;re starting with nothing. This is a new repository you\u0026rsquo;re going to set up.\nThe setup The first step is to go to all your Git providers and create a new repository. We\u0026rsquo;ll use this website\u0026rsquo;s repository as an example. My username across (almost - darn that user on Bitbucket) all the hosts is jorisvandijk, so substitute that for your own username where applicable. The repository is, unsurprisingly, called website. How original.\nIn your browser For each host you want to have this repository on, create a new repository there. Make sure it is completely empty. Don\u0026rsquo;t initialize with a README.md! The process differs from host to host, so I can\u0026rsquo;t explain how to set up the repository in detail. You should be greeted by something like this when it is created:\nFor simplicity\u0026rsquo;s sake, I suggest giving the repositories the same name across all hosts. You don\u0026rsquo;t have to though.\nIn your terminal On your local machine open a terminal. Create a new directory where the repository will live locally. I have a dedicated ~/git/ directory where I keep all my Git repositories, so I\u0026rsquo;ll go there and create a new directory and enter it.\n1 2 3 cd ~/git \u0026amp;\u0026amp; mkdir website \u0026amp;\u0026amp; cd website 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\u0026rsquo;ll need to install it first. You likely know better how to install it on your system than I do, so I won\u0026rsquo;t explain it here. Right, let\u0026rsquo;s initialize the repository.\n1 git init Next up is adding a remote. Now you\u0026rsquo;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\u0026rsquo;t think that matters all that much, as the content will be availible to the public on all other platforms anyway.\nℹ️ INFO This process assumes you\u0026rsquo;ve set up SSH for all your Git repositories. If you have not, you\u0026rsquo;ll need to substitute git@bitbucket.org: (note the colon there), for https://bitbucket.org/ (note the forward slash here) in all the commands below. Obviously, change it to your Git host\u0026rsquo;s address. I would however suggest setting up SSH, as it\u0026rsquo;s, in my opinion, far more pleasant to work with than HTTPS. 1 git remote add origin git@bitbucket.org:jorisvdijk/website.git So far this has all been standard. You\u0026rsquo;d set up any Git repository like this. The following steps are the ones that count. Let\u0026rsquo;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.\n1 git remote set-url --push origin git@bitbucket.org:jorisvdijk/website.git For each repository we want to mirror to, we\u0026rsquo;ll add another push URL. This means that when you issue git push, it will do so to all the repositories.\n1 2 3 git remote set-url --add --push origin git@github.com:jorisvandijk/website.git \u0026amp;\u0026amp; git remote set-url --add --push origin git@gitlab.com:jorisvandijk/website.git \u0026amp;\u0026amp; git remote set-url --add --push origin git@codeberg.org:jorisvandijk/website.git This should be it, but let\u0026rsquo;s check if it\u0026rsquo;s all set as we want before we proceed.\n1 git remote -v If all went well, the output should look like this:\nTesting Let’s now test whether it actually worked. We\u0026rsquo;ll create a README.md file in the repository and push that.\n1 echo \u0026#34;# This is my website\u0026#39;s repository\u0026#34; \u0026gt; README.md We’ll add this to Git, set a commit message, rename the branch to main and push.\n1 2 3 4 git add README.md \u0026amp;\u0026amp; git commit -m \u0026#34;initial commit\u0026#34; \u0026amp;\u0026amp; git branch -M main \u0026amp;\u0026amp; git push -u origin main Once the command is done running, it\u0026rsquo;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.\nFuture workflow Now that everything is set up, you may be wondering \u0026ldquo;How do I use this setup when I want to do another push?\u0026rdquo; Fortunately, you do not have to learn anything new. It\u0026rsquo;s the normal git add ., git commit -m \u0026quot;your message\u0026quot; and git push process. This will now push to all repositories.\n","permalink":"https://jorisvandijk.com/posts/more-backups-better/","summary":"\u003cp\u003eI\u0026rsquo;ve \u003ca href=\"/posts/hugo-hosts-lessons/#github\"\u003ementioned\u003c/a\u003e before that I have my website\u0026rsquo;s repository mirrored across multiple Git hosts. Well, it is not just the website; it is all my repositories. I have four hosts, namely: \u003ca href=\"https://github.com/jorisvandijk\"\u003eGitHub\u003c/a\u003e, \u003ca href=\"https://gitlab.com/jorisvandijk\"\u003eGitLab\u003c/a\u003e, \u003ca href=\"https://codeberg.org/jorisvandijk\"\u003eCodeberg\u003c/a\u003e, and \u003ca href=\"https://bitbucket.org\"\u003eBitbucket\u003c/a\u003e. 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.\u003c/p\u003e","title":"More backups are always better"},{"content":"Hugo As I wrote in my Hello World post, I have switched to Hugo. And so far, I am loving it. It\u0026rsquo;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 (looking at you, Eleventy!). 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.\nHugo is awesome.\nHosting It\u0026rsquo;s also amazingly simple to host on sites that offer a Pages functionality, like GitHub Pages, which most people will know. I\u0026rsquo;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 Pages functionality within the provider\u0026rsquo;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 run some magic and the user\u0026rsquo;s repository will be built and hosted - ready to be visited by guests through their browser. That is, if you\u0026rsquo;ve set up a build file, which is a simple YAML file telling the \u0026rsquo;engine\u0026rsquo; behind the Pages functionality how to build your site. (The term build file is not technically correct and each provider has a different name for this file, but let\u0026rsquo;s just go with it, ok?)\nObviously this is not all that goes into this, but this is not a tutorial on how to set this up.\nAt any rate, I decided to use GitHub Pages.\nGitHub 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 Pages. How to set up a custom domain, however, is not that clear, even though they have documentation on how to do it. I\u0026rsquo;ve found it slightly confusing, but got it set up eventually.\nAt first all was well. The site would build without issue and be served on my domain. Yay.\nUnfortunately, 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\u0026rsquo;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\u0026rsquo;d run into this issue more times than I\u0026rsquo;d care to recall. Annoyingly though, when running the site locally during testing before I\u0026rsquo;d push to GitHub, I\u0026rsquo;d have no issues. The site would work fine. Push to GitHub and the site wouldn\u0026rsquo;t load.\nAfter 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\u0026rsquo;ll just move my hosting away from GitHub and to GitLab.\nGitLab Gitlab pages offers a four step process for setting up their version of Pages, which eventually will result in the generation of a .gitlab-ci.yml file, which is their name for the build file. I personally didn\u0026rsquo;t go through this and just reused the build file I had written for GitHub, renamed it to .gitlab-ci.yml 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\u0026rsquo;s way of doing things and the build went through without a hitch.\nI\u0026rsquo;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\u0026rsquo;t break the entire site now. I decided to stick with GitLab. That is, until this morning.\nWhen 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:\n\u0026ldquo;Erm, what now?\u0026rdquo;\nThis was an odd one. I could visit the site from my mobile phone just fine, but not from my laptop, or my wife\u0026rsquo;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\u0026rsquo;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\u0026rsquo;t care for this to happen again. Damn it, I am going to have to move providers again.\nCloudflare This time I didn\u0026rsquo;t just go with what I knew, I did actual research into where to host. Cloudflare offers almost the same functionality as a Pages host, but it\u0026rsquo;s even better. Cloudflare won\u0026rsquo;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.\nA custom domain can be added as well, and in a superior manner compared to GitHub or GitLab Pages, 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 I control. And I can see the visitor numbers, without having to host an external solution like Umami or Google Analytics.\nℹ️ INFO 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! 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.\nSo, although time will tell, and I hesitate to say this given past experience, perhaps Cloudflare will work out for me.\nConclusion Hugo - great. Pages - bad. Let\u0026rsquo;s all hope Cloudflare will stick, as I really don\u0026rsquo;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.\n","permalink":"https://jorisvandijk.com/posts/hugo-hosts-lessons/","summary":"\u003ch1 id=\"hugo\"\u003eHugo\u003c/h1\u003e\n\u003cp\u003eAs I wrote in my \u003ca href=\"/posts/hello-world/\"\u003eHello World\u003c/a\u003e post, I have switched to Hugo. And so far, I am loving it. It\u0026rsquo;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 \u003cem\u003e(looking at you, Eleventy!)\u003c/em\u003e. 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.\u003c/p\u003e","title":"Hugo, hosts, and hard lessons"},{"content":"Extracting archives is a pain on Linux. There are just so many types and so many programs to extract each type. A .tar.gz file is extracted using the program GNU tar, but for a .zip file, you\u0026rsquo;d need unzip. What\u0026rsquo;s that? You\u0026rsquo;ve got a .7z file? Yeah-no, can\u0026rsquo;t use either of the before mentioned extractors, you need 7-zip. Got a .rar, you\u0026rsquo;d need\u0026hellip; well, you get the point.\nWhat\u0026rsquo;s more, some of these programs require flags you\u0026rsquo;ll need to use to actually extract an archive. For example, to extract a tar file, you might do something like tar xvf \u0026lt;filename\u0026gt;. For a 7z file though, it\u0026rsquo;d be 7z x \u0026lt;filename\u0026gt;. Other extraction programs don\u0026rsquo;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\u0026hellip; what was the name of the program to unzip .bz2 files again?\nConsidering I don\u0026rsquo;t actually extract archives that often, I\u0026rsquo;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 .bashrc file.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 extract () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.tar.xz) tar xvJf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *.xz) unxz $1 ;; *.exe) cabextract $1 ;; *) echo \u0026#34;$1: unrecognized file compression\u0026#34; ;; esac else echo \u0026#34;$1 is not a valid file\u0026#34; fi } What this function does is simple. In order to extract any archive, in the terminal you just issue extract \u0026lt;filename\u0026gt;, and the file gets extracted. Obviously you\u0026rsquo;d also need to install the programs listed in the second column there, for this function to work. I have found this function on the Arch forums by a user named sausageandeggs. You can find the original post here.\nConsidering I didn\u0026rsquo;t need all of those extraction methods and I wanted to shorten the extract command even more, I slightly altered it and mine looks like this:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function ex () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.7z) 7z x $1 ;; *.xz) tar xvJf $1 ;; *) echo \u0026#34;I don\u0026#39;t know how to extract \u0026#39;$1\u0026#39;...\u0026#34; ;; esac else echo \u0026#34;$1 is not a valid file!\u0026#34; fi } So - no more remembering which program name goes with which archive, or which flags are needed to extract a specific type of archive. Just ex \u0026lt;filename\u0026gt; and you\u0026rsquo;re done.\n📄 Original code by sausageandeggs on the Arch Linux Forums.\n","permalink":"https://jorisvandijk.com/posts/extract/","summary":"\u003cp\u003eExtracting archives is a pain on Linux. There are just so many types and so many programs to extract each type. A \u003ccode\u003e.tar.gz\u003c/code\u003e file is extracted using the program \u003ca href=\"https://www.gnu.org/software/tar/\"\u003eGNU tar\u003c/a\u003e, but for a \u003ccode\u003e.zip\u003c/code\u003e file, you\u0026rsquo;d need \u003ca href=\"https://infozip.sourceforge.net/UnZip.html\"\u003eunzip\u003c/a\u003e. What\u0026rsquo;s that? You\u0026rsquo;ve got a \u003ccode\u003e.7z\u003c/code\u003e file? Yeah-no, can\u0026rsquo;t use either of the before mentioned extractors, you need \u003ca href=\"https://www.7-zip.org/\"\u003e7-zip\u003c/a\u003e. Got a \u003ccode\u003e.rar\u003c/code\u003e, you\u0026rsquo;d need\u0026hellip; well, you get the point.\u003c/p\u003e\n\u003cp\u003eWhat\u0026rsquo;s more, some of these programs require \u003cem\u003eflags\u003c/em\u003e you\u0026rsquo;ll need to use to actually extract an archive. For example, to extract a tar file, you might do something like \u003ccode\u003etar xvf \u0026lt;filename\u0026gt;\u003c/code\u003e. For a 7z file though, it\u0026rsquo;d be \u003ccode\u003e7z x \u0026lt;filename\u0026gt;\u003c/code\u003e. Other extraction programs don\u0026rsquo;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\u0026hellip; what was the name of the program to unzip \u003ccode\u003e.bz2\u003c/code\u003e files again?\u003c/p\u003e","title":"The best function I ever stole"},{"content":"In many languages there\u0026rsquo;s a need to add decorations, or glyphs to characters, like for example é or č. These are called diacritics. These characters don\u0026rsquo;t exist on a US Standard qwerty keyboard. There is the US International version with dead keys, 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 ~ followed by n results in an ñ.\nThis is a great solution for most people, as it is intuitive and works well. There\u0026rsquo;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\u0026rsquo;ll need to follow it with a space 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.\nLuckily, there\u0026rsquo;s a huge pointless button right on the home row that can be made to do something magical!\nCapsLock as a compose key 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\u0026rsquo;s also placed on prime real-estate, right where my fingers rest. Now there\u0026rsquo;s a special button that existed on keyboards of old, called the compose key. 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 dead keys, but with a leader key. Modern keyboards do not have this key, fortunately you can map any key to function like it on Linux.\nX11 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 X11, you can add the command below to an autostart.sh script you run on boot. Or maybe in your ~/.profile or ~/.xinitrc. On desktop environments you can make the command below into a .desktop file. And window managers like i3 offer startup commands like exec --no-startup-id, which you can use to issue the command.\n1 setxkbmap -option compose:caps \u0026amp; Wayland On Wayland I personally use Hyprland as my window manager, or well compositor. Within it, the compose key can be set in the hyprland.conf file, like so:\n1 2 3 input { kb_options = compose:caps } It is also possible to set it using NixOs\u0026rsquo;s session variables, which I haven\u0026rsquo;t tried myself, as the Hyprland solution works fine for me. Anyway, in NixOS you could set something like:\n1 2 3 environment.sessionVariables = { XKB_DEFAULT_OPTIONS = \u0026#34;compose:caps\u0026#34;; }; Conclusion 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:\nChar Combination ° oo © oc ² ^2 ³ ^3 é \u0026rsquo;e ë \u0026ldquo;e ø /o ≠ =/ And more can be found here.\n","permalink":"https://jorisvandijk.com/posts/compose-key/","summary":"\u003cp\u003eIn many languages there\u0026rsquo;s a need to add decorations, or glyphs to characters, like for example \u003ccode\u003eé\u003c/code\u003e or \u003ccode\u003eč\u003c/code\u003e. These are called \u003ca href=\"https://en.wikipedia.org/wiki/Diacritic\"\u003ediacritics\u003c/a\u003e. These characters don\u0026rsquo;t exist on a US Standard \u003cem\u003eqwerty\u003c/em\u003e keyboard. There is the US International version with \u003cem\u003edead keys\u003c/em\u003e, 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 \u003ccode\u003e~\u003c/code\u003e followed by \u003ccode\u003en\u003c/code\u003e results in an \u003ccode\u003eñ\u003c/code\u003e.\u003c/p\u003e","title":"Compose Key"},{"content":"I have a homelab, or more simply a personal server I run at home. It\u0026rsquo;s a small square black box that sits in my office, humming away. This server runs Proxmox VE, a hypervisor. This controls pretty much everything that goes on, on this server. It has the ability to spin up containers, which it calls LXC\u0026rsquo;s. These are somewhat akin to Docker containers. Anyway, the process of spinning one of these up is super simple. Click a few buttons, allocate some space and there\u0026rsquo;s your \u0026lsquo;container\u0026rsquo;.\nWhile this is a super simple process, there\u0026rsquo;s an even simpler process. Enter Proxmox VE Helper-Scripts. This is a repository filled with installation scripts which offer a one-liner that can be run in Proxmox\u0026rsquo;s terminal, which pulls in a Bash 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\u0026rsquo;s like magic.\nAnyway, one of these scripts will install Frigate, which is a bit of software to monitor security cameras - a so-called NVR. 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.\nUsing 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. \u0026ldquo;No problem\u0026rdquo;, I thought, \u0026ldquo;I\u0026rsquo;ll just go into the Frigate UI and switch the storage location to a dedicated drive I have already installed on my server.\u0026rdquo;\nNope. No can do. It is not possible to add another drive to Frigate, which is outside of the LXC from within the UI. Shit.\nThis meant having to frantically search online for a solution, which I\u0026rsquo;ve found. The following are the steps required to set it up.\nNote the ID of your container on the Proxmox dashboard. Open your console on the Proxmox web interface on the host. Stop the Frigate LXC. 1 pct stop \u0026lt;container_id\u0026gt; Again, the container ID can be found on the Proxmox dashboard.\nEdit the config file. 1 nano /etc/pve/lxc/\u0026lt;container_id\u0026gt;.conf Add the following. 1 mp0: /\u0026lt;location\u0026gt;/\u0026lt;of\u0026gt;/\u0026lt;mount\u0026gt;,mp=/media/frigate ℹ️ INFO Note that the path /media/frigate is mandatory for Frigate to use the external drive! This is because it\u0026rsquo;s the hard-coded location Frigate uses to store its content to. The mp0 stands for Mount Point 0, this can be any number, but let\u0026rsquo;s start at the top. Set the permissions for the drive. 1 2 chown -R 1000:1000 /\u0026lt;location\u0026gt;/\u0026lt;of\u0026gt;/\u0026lt;mount\u0026gt; \u0026amp;\u0026amp; chmod -R 775 /\u0026lt;location\u0026gt;/\u0026lt;of\u0026gt;/\u0026lt;mount\u0026gt; Restart the container. 1 pct start \u0026lt;container_id\u0026gt; And that\u0026rsquo;s it. Without needing to adjust anything else in the UI, Frigate will now store all content on the dedicated external drive.\n","permalink":"https://jorisvandijk.com/posts/frigate-on-proxmox/","summary":"\u003cp\u003eI have a \u003cem\u003ehomelab\u003c/em\u003e, or more simply a personal server I run at home. It\u0026rsquo;s a small square black box that sits in my office, humming away. This server runs \u003ca href=\"https://www.proxmox.com/en/products/proxmox-virtual-environment/overview\"\u003eProxmox VE\u003c/a\u003e, a \u003cem\u003ehypervisor\u003c/em\u003e. This controls pretty much everything that goes on, on this server. It has the ability to spin up containers, which it calls \u003cem\u003eLXC\u003c/em\u003e\u0026rsquo;s. These are somewhat akin to \u003cem\u003eDocker containers\u003c/em\u003e. Anyway, the process of spinning one of these up is super simple. Click a few buttons, allocate some space and there\u0026rsquo;s your \u0026lsquo;container\u0026rsquo;.\u003c/p\u003e","title":"Using external drive as data directory in a Proxmox LXC"},{"content":"According to the Hugo Quick Start documentation, the right way to start a new post is by issuing the following command in a terminal: hugo new content content/posts/my-post-name.md. This works fine and yields a new Hugo post with basic frontmatter. I\u0026rsquo;ve found issuing hugo new posts/my-new-post.md works fine as well. It\u0026rsquo;s shorter, so I prefer it. This is not the point however. The point is the frontmatter. This is a few lines of text above the content of the Markdown file you\u0026rsquo;ve created by a hugo new command. The Quick Start shows the following as an example of front matter that it generates:\n1 2 3 4 5 +++ title = \u0026#39;My First Post\u0026#39; date = 2024-01-14T07:07:07+01:00 draft = true +++ As can be seen, three fields are created, namely: title, date and draft. The first two speak for themselves. The latter is set to false when it is time to post this post. This is all the front matter you get by default. So where\u0026rsquo;s the author\u0026rsquo;s name? Or how about some tags? I\u0026rsquo;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?\nHell no. It is time to set up Archetypes. The idea is simple - a new default template for a post will be made and all the front matter deemed needed is added there.\nFirst a new directory is to be added to the root of the project directory.\n1 mkdir -p archetypes Next a file named default.md should be added in this directory.\n1 touch archetypes/default.md Then in this file the front matter can be set for any post. The example front matter as shown in the Quick Start is in toml, I prefer yaml so the following example is in yaml. This is just a personal preference. Feel free to use toml if you\u0026rsquo;d like. Anyway, this is what my default.md currently looks like.\n1 2 3 4 5 6 7 8 9 10 --- title: \u0026#34;{{ replace .Name \u0026#34;-\u0026#34; \u0026#34; \u0026#34; | title }}\u0026#34; date: {{ .Date }} author: \u0026#34;Joris\u0026#34; draft: true tags: [] cover: image: \u0026#34;/img/add-image-name-here.png\u0026#34; alt: \u0026#34;This is the image\u0026#39;s alt text\u0026#34; --- The title and date will be autofilled if left like this, that is probably what you\u0026rsquo;d want. Added are the tags and cover options. Many more options are available to you as can be found in the Hugo Quick Start, under Frontmatter. After the default.md file is saved, starting a new post with hugo new posts/my-new-post.md will give you a brand new post, which includes all the frontmatter you added.\n","permalink":"https://jorisvandijk.com/posts/new-hugo-post/","summary":"\u003cp\u003eAccording to the \u003ca href=\"https://gohugo.io/getting-started/quick-start/\"\u003eHugo Quick Start\u003c/a\u003e documentation, the right way to start a new post is by issuing the following command in a terminal: \u003ccode\u003ehugo new content content/posts/my-post-name.md\u003c/code\u003e. This works fine and yields a new Hugo post with basic \u003cem\u003efrontmatter\u003c/em\u003e. I\u0026rsquo;ve found issuing \u003ccode\u003ehugo new posts/my-new-post.md\u003c/code\u003e works fine as well. It\u0026rsquo;s shorter, so I prefer it. This is not the point however. The point is the \u003cem\u003efrontmatter\u003c/em\u003e. This is a few lines of text above the content of the Markdown file you\u0026rsquo;ve created by a \u003ccode\u003ehugo new\u003c/code\u003e command. The Quick Start shows the following as an example of front matter that it generates:\u003c/p\u003e","title":"Making a new post in Hugo"},{"content":"Thank you for taking an interest in helping make this site better, I really appreciate any feedback or contributions you might have.\nFound an issue? If you spot any issues while reading through the posts or pages here, I\u0026rsquo;d love to hear about it. Whether it\u0026rsquo;s a typo that slipped through, a factual error I missed, a broken link, or just something that doesn\u0026rsquo;t quite make sense, please let me know.\nYou can report issues through whichever Git platform you prefer:\nGitHub: https://github.com/jorisvandijk/website/issues/new GitLab: https://gitlab.com/jorisvandijk/website/-/issues/new Codeberg: https://codeberg.org/jorisvandijk/website/issues/new Don\u0026rsquo;t worry about being too formal when reporting something - just tell me what you found and where you found it. Even a quick \u0026ldquo;hey, there\u0026rsquo;s a typo in paragraph 3 of your post about X\u0026rdquo; is incredibly helpful.\nQuestions? If you have questions about any of the content on the site, want clarification on something I\u0026rsquo;ve written, or are curious about my thoughts on a particular topic, feel free to reach out via email or on Discord. Contact information can be found on the here.\n","permalink":"https://jorisvandijk.com/contributing/","summary":"\u003cp\u003eThank you for taking an interest in helping make this site better, I really appreciate any feedback or contributions you might have.\u003c/p\u003e\n\u003ch1 id=\"found-an-issue\"\u003eFound an issue?\u003c/h1\u003e\n\u003cp\u003eIf you spot any issues while reading through the posts or pages here, I\u0026rsquo;d love to hear about it. Whether it\u0026rsquo;s a typo that slipped through, a factual error I missed, a broken link, or just something that doesn\u0026rsquo;t quite make sense, please let me know.\u003c/p\u003e","title":"Contributing to this website"},{"content":"Hi again. My name is Joris van Dijk, this is my website. I am interested in Linux, anything technical be it physical or software. This site is a hobby project where I document my discoveries and technical notes. I like to share what I\u0026rsquo;ve learned, and it gives me a convenient place to reference things later. Hopefully it can help someone else too.\nAt any rate, if you\u0026rsquo;d like to contact me you can do so via email or on Discord.\nEmail: joris at this domain Discord username: jorisvandijk You can find my personal stuff stored on git here:\nGitHub: https://github.com/jorisvandijk/ GitLab: https://gitlab.com/jorisvandijk/ Codeberg: https://codeberg.org/jorisvandijk/ ","permalink":"https://jorisvandijk.com/joris/","summary":"\u003cp\u003eHi again. My name is Joris van Dijk, this is my website. I am interested in Linux, anything technical be it physical or software. This site is a hobby project where I document my discoveries and technical notes. I like to share what I\u0026rsquo;ve learned, and it gives me a convenient place to reference things later. Hopefully it can help someone else too.\u003c/p\u003e\n\u003cp\u003eAt any rate, if you\u0026rsquo;d like to contact me you can do so via email or on Discord.\u003c/p\u003e","title":"Joris"},{"content":"And once again a new Hello World 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\u0026rsquo;t.\nThe last version of this site placed the content into a more documentation-like website format. I thought I\u0026rsquo;d like that more than a blog — mainly for organizational purposes. A bit more structured than the throw it at a wall and see what sticks blog approach.\nTurns out, I hate structure. I also didn\u0026rsquo;t like the look of the site at all. So as with many before it, it got nuked.\nSo, now we\u0026rsquo;re here. After running everything from Drupal, WordPress, plain HTML, Eleventy, Docusaurus, and who-can-remember what else, we\u0026rsquo;re on Hugo now. The reasoning behind this is simple: I\u0026rsquo;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 Markdown, building on GitHub Pages, good theming possibilities, no dependencies and fast build times. I\u0026rsquo;ve even got a self-reliant search function.\nWorking 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\u0026rsquo;ve stuck to the Everforest theme and I\u0026rsquo;ve even included a light version for those who like that sort of thing. The font I am using right now is called Caskaydia Cove Nerd Font. I like the look of the font in my terminal, but am not totally sold on it as a website font yet.\nSo. Here we are. A new website which will need to be filled again. What\u0026rsquo;s the plan? Well, I suppose I\u0026rsquo;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\u0026rsquo;ve switched from Arch Linux to NixOS, which has forced me to learn and discover new things. I\u0026rsquo;ve gotten more into cyber security due to school and I\u0026rsquo;ve been improving my homelab. I\u0026rsquo;ll probably also pepper in the occasional personal post, thought or babble — we\u0026rsquo;ll see.\nFor now, welcome to my new website.\n","permalink":"https://jorisvandijk.com/posts/hello-world/","summary":"\u003cp\u003eAnd once again a new \u003cem\u003eHello World\u003c/em\u003e 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\u0026rsquo;t.\u003c/p\u003e\n\u003cp\u003eThe last version of this site placed the content into a more documentation-like website format. I thought I\u0026rsquo;d like that more than a blog — mainly for organizational purposes. A bit more structured than the \u003cem\u003ethrow it at a wall and see what sticks\u003c/em\u003e blog approach.\u003c/p\u003e","title":"Hello World"}]