[{"content":"A little indicator on my prompt tells me the state of the git repo I\u0026rsquo;m in, if I\u0026rsquo;m in one. It\u0026rsquo;s quite minimal. Green tick: repo is clean; yellow cross: there are changes; red dot: there are merge conflicts. It\u0026rsquo;s a nice visual cue and for the longest time and the following code in my ~/.zshrc file made it possible.\n1 2 3 4 5 6 7 8 9 10 git_status_prompt() { git rev-parse --git-dir \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || return if git diff --name-only --diff-filter=U 2\u0026gt;/dev/null | grep -q .; then echo \u0026#34; %F{red}●%f\u0026#34; elif git status --porcelain 2\u0026gt;/dev/null | grep -q .; then echo \u0026#34; %F{yellow}✘%f\u0026#34; else echo \u0026#34; %F{green}✓%f\u0026#34; fi } This works fine. It does what it\u0026rsquo;s supposed to\u0026hellip; It\u0026rsquo;s ugly though.\nTime to take a long hard look at this function. There\u0026rsquo;s an if-else with three branches and I don\u0026rsquo;t much like an if-else past two. A case is better for that. I\u0026rsquo;m also grepping twice there. That\u0026rsquo;s two calls to an outside program, which case can do itself - and it\u0026rsquo;s even a shell built-in. Then I realised the worst part\u0026hellip; Am I really calling git three times in here? Hang on. Three times for every prompt inside a git repo? That\u0026rsquo;s bonkers!\nThere must be a better way to tackle this. Isn\u0026rsquo;t there a way to call git once and derive the information I need from that one call? There is. It\u0026rsquo;s even in the function already! The git status --porcelain on its own basically has all the information I need. It returns line-separated file with a two-letter code in front of them, denoting the status of that one file. There\u0026rsquo;s no output if there are no changes. That solves the green tick. The red dot could be gotten from the letter code. A little google later and DD, AU, UD, UA, DU, AA, and UU are the codes that denote merge conflicts. That means that the yellow cross is also checked, as that\u0026rsquo;s all other possible outputs. That makes the following my new git function.\n1 2 3 4 5 6 7 8 9 git_status_prompt() { local st st=$(git status --porcelain 2\u0026gt;/dev/null) || return case $st in (\u0026#39;\u0026#39;) echo \u0026#34; %F{green}✓%f\u0026#34; ;; ((|*$\u0026#39;\\n\u0026#39;)(DD|AU|UD|UA|DU|AA|UU)*) echo \u0026#34; %F{red}●%f\u0026#34; ;; (*) echo \u0026#34; %F{yellow}✘%f\u0026#34; ;; esac } A few things worth pointing out:\ngit status --porcelain is git’s machine-readable output. The format is fixed and won’t change between git versions, so it’s safe to match against. || return covers being outside a repo. There git status fails, the function returns nothing, and the indicator isn’t printed. That alone replaces the old rev-parse guard from the top of the function. The case checks three things in order. Empty output is a clean repo, green tick. A conflict code means a merge is in progress, red dot. Anything else means there are changes, yellow cross. The check that looks the most impressive, ((|*$'\\n')(DD|AU|UD|UA|DU|AA|UU)*), is not as hard as it appears. (|*$'\\n') matches the start of a line: either the very beginning of the output, or anything ending in a newline. (DD|AU|UD|UA|DU|AA|UU) are the codes I found and * matches the rest. case compares against the whole string, so without it the pattern would only match if the entire output were exactly two characters long. Adding to prompt The function hands back a string, so it slots into a prompt with PROMPT_SUBST turned on:\n1 2 3 4 setopt PROMPT_SUBST PROMPT=\u0026#39; %F{green}┌──(%f%F{135}%~%F{green})%f$(git_status_prompt) %F{green}└─%f%(?,%F{135}λ%f,%F{red}✘%f) \u0026#39; The box-drawing and the colors are mine, swap those for whatever you like. The part that matters is the $(git_status_prompt) in the middle.\nAnd that\u0026rsquo;s what it looks like on my system. You\u0026rsquo;ll have to try the function to see the other two indicators.\n","permalink":"https://jorisvandijk.com/posts/porcelain/","summary":"\u003cp\u003eA little indicator on my prompt tells me the state of the git repo I\u0026rsquo;m in, if I\u0026rsquo;m in one. It\u0026rsquo;s quite minimal. Green tick: repo is clean; yellow cross: there are changes; red dot: there are merge conflicts. It\u0026rsquo;s a nice visual cue and for the longest time and the following code in my \u003cem\u003e~/.zshrc\u003c/em\u003e file made it possible.\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\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\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-zsh\" data-lang=\"zsh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit_status_prompt\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  git rev-parse --git-dir \u0026gt;/dev/null 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e git diff --name-only --diff-filter\u003cspan class=\"o\"\u003e=\u003c/span\u003eU 2\u0026gt;/dev/null \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -q .\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; %F{red}●%f\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eelif\u003c/span\u003e git status --porcelain 2\u0026gt;/dev/null \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -q .\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; %F{yellow}✘%f\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; %F{green}✓%f\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\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\u003eThis works fine. It does what it\u0026rsquo;s supposed to\u0026hellip; It\u0026rsquo;s ugly though.\u003c/p\u003e","title":"Porcelain"},{"content":"When moving around in my terminal, I use two commands in sequence all the time. You\u0026rsquo;ll know them, they are cd and ls. Change directory, then list the contents of that directory. I decided this was getting annoying. Why is there not a single command to do this? Why not make one? I first thought an alias might work, but then I realised you cannot call an alias, hand it a variable and have it do something after that variable. \u0026lt;alias\u0026gt; \u0026lt;user variable\u0026gt; \u0026lt;second action\u0026gt; is just not possible.\nA function then. A simple one at that. In your ~/.zshrc or ~/.bashrc add the following.\n1 2 3 cl() { cd \u0026#34;$@\u0026#34; \u0026amp;\u0026amp; ls; } Type cl \u0026lt;directory\u0026gt; and it changes to that directory, then runs ls right after. Exactly what I wanted.\nA few small details in there are worth pointing out:\nThe semicolon before the closing brace matters. zsh is happy to accept it without one, but bash reads that trailing } as an argument to ls and bails out with syntax error: unexpected end of file. The semicolon (or a newline) is what actually closes the function, and it does so in both shells. \u0026quot;$@\u0026quot; forwards everything, including nothing. Passing \u0026quot;$@\u0026quot; hands cd all the arguments. This is important if you use zoxide (see below), as it allows more than one argument. Zoxide I am a zoxide user. Zoxide is a cd replacement and \u0026ldquo;remembers which directories you use most frequently, so you can \u0026lsquo;jump\u0026rsquo; to them in just a few keystrokes\u0026rdquo;, according to their git. I have eval \u0026quot;$(zoxide init zsh --cmd cd)\u0026quot; set in my .zshrc, which means that my normal cd command is replaced with zoxide\u0026rsquo;s behavior. My cl command works flawlessly with this, without needing adjustments.\nThe zsh-native way If you\u0026rsquo;re on zsh there\u0026rsquo;s an even cleaner option, which I only found after writing the function above. zsh has a chpwd hook that fires every single time the working directory changes. That includes cd, cd .., pushd/popd, and zoxide too. Define it like this:\n1 chpwd() ls Now you never type a separate ls again, no matter how you got there. The tradeoff is that it is no longer opt-in. It lists on every directory change. I personally do not want this, as I do not want an ls after every cd, but you might like it. I\u0026rsquo;ll stick to my own function.\n","permalink":"https://jorisvandijk.com/posts/change-directory-list/","summary":"\u003cp\u003eWhen moving around in my terminal, I use two commands in sequence all the time. You\u0026rsquo;ll know them, they are \u003ccode\u003ecd\u003c/code\u003e and \u003ccode\u003els\u003c/code\u003e. \u003cem\u003eChange directory\u003c/em\u003e, then \u003cem\u003elist\u003c/em\u003e the contents of that directory. I decided this was getting annoying. Why is there not a single command to do this? Why not make one? I first thought an alias might work, but then I realised you cannot call an alias, hand it a variable and have it do something after that variable. \u003ccode\u003e\u0026lt;alias\u0026gt; \u0026lt;user variable\u0026gt; \u0026lt;second action\u0026gt;\u003c/code\u003e is just not possible.\u003c/p\u003e","title":"Change Directory, List"},{"content":"It\u0026rsquo;s great that your OS tries to protect you from yourself, because let\u0026rsquo;s face it, you don\u0026rsquo;t always make the best decisions. When you download an app macOS slaps a com.apple.quarantine extended attribute on it. This is what triggers Gatekeeper\u0026rsquo;s super duper handy popup asking you if you are really, truly sure you want to open a thing you just deliberately downloaded. If you could just click OK on this and move on, that\u0026rsquo;d be fine. It\u0026rsquo;s a little reminder that \u0026ldquo;hey, you did a thing you might not want to do\u0026rdquo;. And it does this sometimes. Other times it will flat out deny you running it. You\u0026rsquo;d have to go into settings and click through menus to allow the application in order to actually launch it. This is going too far. Luckily a single terminal command will handle it in one fell swoop.\n1 xattr -d com.apple.quarantine /path/to/app ⚠️ WARNING This is obviously dangerous and if the application contains malicious content, it will be able to infect your machine. ","permalink":"https://jorisvandijk.com/posts/unquarantine/","summary":"\u003cp\u003eIt\u0026rsquo;s great that your OS tries to protect you from yourself, because let\u0026rsquo;s face it, you don\u0026rsquo;t always make the best decisions. When you download an app macOS slaps a \u003ccode\u003ecom.apple.quarantine\u003c/code\u003e extended attribute on it. This is what triggers Gatekeeper\u0026rsquo;s super duper handy popup asking you if you are really, truly sure you want to open a thing you just deliberately downloaded. If you could just click \u003cem\u003eOK\u003c/em\u003e on this and move on, that\u0026rsquo;d be fine. It\u0026rsquo;s a little reminder that \u0026ldquo;hey, you did a thing you might not want to do\u0026rdquo;. And it does this sometimes. Other times it will flat out deny you running it. You\u0026rsquo;d have to go into settings and click through menus to allow the application in order to actually launch it. This is going too far. Luckily a single terminal command will handle it in one fell swoop.\u003c/p\u003e","title":"Unquarantine"},{"content":"So you\u0026rsquo;ve now got yourself a dumb phone. You bought an e-reader for reading and an old iPod for them tunes. You\u0026rsquo;ve deleted Candy Crush - I worry that reference is old as fuck now - and instead you\u0026rsquo;ve gotten yourself a small gaming handheld, be it a vintage Game Boy or one of those cool new AliExpress ones. You jot down whatever\u0026rsquo;s important on trusty old paper, in that little book you\u0026rsquo;ve got in your back pocket. Along with it you obviously got a pen. A special pen, perhaps one you meticulously picked out. It might even be a fountain pen.\nGranted, doing this has made your phone more minimal. But you\u0026rsquo;re now toting around a ton of crap in your pockets, or you\u0026rsquo;ve picked up a sling, because all that weight in your pants was kind of unpleasant.\nI get it, because I\u0026rsquo;ve been tempted by all of it. Many hours have been spent watching content and comparing dumb phones. I never pulled the trigger on one, though. I do own a little Game Boy-like device. When it\u0026rsquo;s not in a drawer somewhere, it lives in the bathroom. I also own an e-reader. Books are heavy and reading on e-ink is way easier on the eyes than a phone screen. I never bring it along with me. I wouldn’t want to carry more. I already resent the objects I\u0026rsquo;m required to carry. A wallet for my ID and keys for the car and the house.\nUltimately I came to the conclusion that this whole digital minimalism thing is just a way to get you to buy more crap. I have a single device in my pocket that does everything. That\u0026rsquo;s minimalism. As for losing yourself on that one device, here\u0026rsquo;s what actually worked for me: get off social media. Just quit it all, delete the apps, and stop caring about it. All it takes is a little self-control. Only ever open your phone for a proper reason, and be aware of why you’re opening it. You wanted to make a note. So you ignore the texts, open the notes app, take the note, press the power button, and put the phone back in your pocket.\n","permalink":"https://jorisvandijk.com/posts/digital-minimalism/","summary":"\u003cp\u003eSo you\u0026rsquo;ve now got yourself a dumb phone. You bought an e-reader for reading and an old iPod for \u003cem\u003ethem tunes\u003c/em\u003e. You\u0026rsquo;ve deleted Candy Crush - I worry that reference is old as fuck now - and instead you\u0026rsquo;ve gotten yourself a small gaming handheld, be it a vintage Game Boy or one of those cool new AliExpress ones. You jot down whatever\u0026rsquo;s important on trusty old paper, in that little book you\u0026rsquo;ve got in your back pocket. Along with it you obviously got a pen. A special pen, perhaps one you meticulously picked out. It might even be a fountain pen.\u003c/p\u003e","title":"(Digital) Minimalism"},{"content":"When you see one, it\u0026rsquo;s AI. In any text, if there\u0026rsquo;s a dash anywhere, AI wrote it. It\u0026rsquo;s a guarantee. Except, it is not. I recently dove into my old websites in my This Domain post. I noticed something. All the way back in 2004 I used dashes in my writing. They show up in the screenshot I took of my site in 2012 as well. Twice even! Both the first and the second post have one. There\u0026rsquo;s three of them in the first post of this website even.\nI\u0026rsquo;ve noticed that the rise of AI has had an effect on my writing. I actively try not to write with dashes anymore. I think I fear people think it\u0026rsquo;s AI. It is not. What\u0026rsquo;s the point of writing a personal blog, if it\u0026rsquo;s not written by you? I notice myself writing a dash when making a blog post and it\u0026rsquo;ll break my flow. I\u0026rsquo;ll stop, back up and see if I can write it another way just so it\u0026rsquo;s human, not AI. This is insane. I should be able to write any way I like. I mean, it\u0026rsquo;s been part of my writing style since forever.\nCome to think of it\u0026hellip; AI has learned to use the dash. How did it learn? From online data. Maybe, just maybe I am partly responsible for AI\u0026rsquo;s love of the dash. And because I am actively trying not to use it anymore, maybe future AI will stop using it too, which means I can get back to using it again\u0026hellip;\n","permalink":"https://jorisvandijk.com/posts/em-dash/","summary":"\u003cp\u003eWhen you see one, it\u0026rsquo;s AI. In any text, if there\u0026rsquo;s a dash anywhere, AI wrote it. It\u0026rsquo;s a guarantee. Except, it is not. I recently dove into my old websites in my \u003ca href=\"/posts/this-domain/\"\u003eThis Domain\u003c/a\u003e post. I noticed something. All the way back in \u003ca href=\"/img/website-2004-04-14.png\"\u003e2004\u003c/a\u003e I used dashes in my writing. They show up in the screenshot I took of my site in \u003ca href=\"/img/website-2012-06-02.png\"\u003e2012\u003c/a\u003e as well. Twice even! Both the first and the second post have one. There\u0026rsquo;s three of them in the \u003ca href=\"/posts/hello-world/\"\u003efirst\u003c/a\u003e post of this website even.\u003c/p\u003e","title":"Em Dash"},{"content":"The Jorisvandijk.com domain goes back quite a while. Using any whois tool, you can discover it\u0026rsquo;s been registered 17 years, 3 months and 26 days ago on January 31st 2009. It first appears in the Wayback Machine on the 13th of July 2003. Have a look at it in all its glory.\nJuly 13th 2003 As you can see it\u0026rsquo;s not completely cached. The iframe on the left got lost. If you read the text you\u0026rsquo;ll notice this is not the first iteration of this site either. I upgraded from using tables for the UI, to using div elements. Cool. 2003 is six years older than 2009. But looking at the footer of the site in the image, you can see the real date it was once registered. 1997. That\u0026rsquo;s 29 years ago! This address is ancient. It predates the likes of YouTube and even Google (by a year, give or take).\nI think that\u0026rsquo;s pretty cool. Then in 2004 I lost interest in working on and maintaining the site at the domain, so it became a placeholder. This won\u0026rsquo;t be the last time it\u0026rsquo;ll be subjected to this cruel fate. It kept the same styling though.\nApril 14th 2004 This dragged on until sometime around April, when I eventually let go of the domain. Google had launched Gmail a year prior and I jumped on that ship. No need to keep my own domain.\nApril 6th 2005 More than five years passed until something sparked my love for building and maintaining websites again. I remember damned near praying my domain was still available. Luckily it was. No other Joris van Dijk had decided to pick up webdevving as a hobby. I remember letting out a sigh of relief and I got to work on a new version of the site. This time around I wanted it to have a couple of functions. Firstly as a blog. Not just my own, no, for family members too. The site was in Dutch this time around, as we\u0026rsquo;re from the Netherlands. The second function was to host my projects. I don\u0026rsquo;t remember what those were though. The site, powered by the Drupal CMS (Content Management System), also hosted family pictures and videos I ripped from old video tapes and encoded, then uploaded and shared with my family.\nFebruary 8th 2011 I still really like the logo I made. I was super proud of it at the time. Anyway, this version of the site didn\u0026rsquo;t last. My relationship had ended and I didn\u0026rsquo;t want to deal with everything written by her and her family on my site. I also had gotten into Linux a year prior, so I poured my spare time into building the Bodhi Linux website. And for the second time, the poor domain was a placeholder again.\nNovember 24th 2011 Not for long this time. I decided I still loved the looks of the old site, so after some reworking and minor edits, it got reused. This time as a personal blog in English. The type of content wasn\u0026rsquo;t all personal, it also started to include technology and Linux related posts and even some technical tutorials.\nJune 2nd 2012 But as always, shiny new things are more interesting than dull old ones. I discovered WordPress. This site got a completely new look and had some proper responsive design even. The type of content stayed the same, though. I found my niche and I was (and still am) enjoying blogging about these things a lot. I also just now realized that this is the first time the Wayback Machine has cached most of the actual content for my site, not just the home page. One could still browse it over there as long as they keep it up.\nJune 3rd 2013 Then in a post, dated November 17 2014, I stated: \u0026ldquo;And yet again I grew tired of the way the website looked. This time it’s because of my recent work on the Bodhi Linux webite. A server crash kicked me in high gear and I found myself once again building a website. What’s more, I enjoyed it. So much so that I couldn’t help myself and had to tinker with my own site again as well.\u0026rdquo; Unfortunately it seems that for some reason the Wayback Machine did not back up the CSS for this site, leaving it looking rather sad.\nFebruary 21st 2015 It took five months for the Wayback Machine to get a capture with proper CSS and apparently I settled on a very different look. Honestly I don\u0026rsquo;t recall this version of the site at all.\nAugust 1st 2015 While it remained looking like this, no new post were made on the site for months. I had met my now wife at this time. And wouldn\u0026rsquo;t you know it, the poor domain got relegated to being a placeholder for the fourth time in its life. The capture of it isn\u0026rsquo;t quite right as the text \u0026ldquo;Joris van Dijk\u0026rdquo; would have been on one line and not overlapping the URL. Anyway, life got too busy and I just didn\u0026rsquo;t have the time to be playing around with websites. I also recall work was hectic as well at the time. I spent many days abroad at this time.\nSeptember 21st 2016 Almost a year later it seems I got sassy and decided on an\u0026hellip; interesting revamp. Still a placeholder website.\nAugust 3rd 2017 I regretted this some two months later, and left the place looking like this.\nOctober 4th 2017 The next change to the site is an important one. A milestone and a huge leap forward for my personal wellbeing and happiness. Can you spot what happened?\nApril 18th 2018 And more than a year later, I decided I didn\u0026rsquo;t just want Facebook gone, I don\u0026rsquo;t need anyone emailing me either!\nJuly 17th 2019 Then out of nowhere, nearly two whole years later, I decide the placeholder needs a new coat of paint. So we get the following.\nMay 8th 2021 A year later, nearly to the day, I post a Hello World post on my new website. As I put it at the time: \u0026ldquo;This is the first post made on the new version of this website. I am making it to commemorate the occasion. As of yet there obviously isn\u0026rsquo;t much content, but that may change in the future. This site used to be a lot of things over the years, but for the past few it has been nothing more than a placeholder.\u0026rdquo; Unfortunately the first decent snapshot takes a few months, but when it does, the site looks like this. After six years there\u0026rsquo;s finally a real website at this domain again. This website is using Eleventy as its backend.\nJune 26th 2022 The website mostly remains the same. Some slight tweaks like a bit more width for the content and a new tagline. Apart from that, I do a lot of writing for this place during this time. I have rekindled my love for blogging and wouldn\u0026rsquo;t you know, the topic remains the same. Unfortunately for some reason I stop blogging after November 3rd 2023.\nApril 2nd 2023 After a long lull of not actually posting any new blogs to the site, come 2025 I decide a new look is what I need to start writing again. This time around, I thought let\u0026rsquo;s do this like a documentation website. I used Docusaurus for this one.\nMarch 30th 2025 It\u0026rsquo;s not long lived though as within a couple of months I have a completely new website. Based on Hugo now. This site first pops up on the Wayback Machine in August and it\u0026rsquo;s close to the current iteration of this website. The one you\u0026rsquo;re looking at now. Sure the font is different and it still sports cover images, but it is this website.\nAugust 26th 2025 The latest snapshot the Wayback Machine took was from today. But as we\u0026rsquo;ve seen, things change all the time and the snapshot they took is already outdated as it does not reflect the current state of the website.\nMay 27th 2026 And this is what the website looks like right now, before posting this blog. It\u0026rsquo;s been a long journey, but it\u0026rsquo;s fun to look back on things and remember what they were like. This post is like a scrapbook, a thing to look back on and remember. And it shows that nothing stays the same.\nThis domain has been around. It\u0026rsquo;s been lost and found. It\u0026rsquo;s been loved and neglected. It\u0026rsquo;s had many faces and uses. I hope it\u0026rsquo;s with me for some time to come.\nMay 27th 2026 but live ","permalink":"https://jorisvandijk.com/posts/this-domain/","summary":"\u003cp\u003eThe \u003cem\u003eJorisvandijk.com\u003c/em\u003e domain goes back quite a while. Using any \u003cem\u003ewhois\u003c/em\u003e tool, you can discover it\u0026rsquo;s been registered 17 years, 3 months and 26 days ago on \u003cstrong\u003eJanuary 31st 2009\u003c/strong\u003e. It first appears in the \u003ca href=\"https://web.archive.org/web/20030715000000*/jorisvandijk.com\"\u003eWayback Machine\u003c/a\u003e on the 13th of July 2003. Have a look at it in all its glory.\u003c/p\u003e\n\u003ch2 id=\"july-13th-2003\"\u003eJuly 13th 2003\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"/img/website-2003-07-13.png\"\u003e\u003cimg alt=\"July 13th 2003\" loading=\"lazy\" src=\"/img/website-2003-07-13.png#center\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAs you can see it\u0026rsquo;s not completely cached. The iframe on the left got lost. If you read the text you\u0026rsquo;ll notice this is not the first iteration of this site either. I upgraded from using tables for the UI, to using div elements. Cool. 2003 is six years older than 2009. But looking at the footer of the site in the image, you can see the real date it was once registered. 1997. That\u0026rsquo;s 29 years ago! This address is ancient. It predates the likes of YouTube and even Google (by a year, give or take).\u003c/p\u003e","title":"This Domain"},{"content":"I have been switching browsers a lot these last few months. The new CEO of Mozilla, Anthony Enzor-DeMeo, stated in his post that \u0026ldquo;It [Firefox] will evolve into a modern AI browser\u0026rdquo;. This rubbed me the wrong way. Granted, Mozilla has been adding junk to their browser for a while now and none of it is good. He floated the idea of blocking ad-blockers in an interview. The Verge wrote: \u0026ldquo;He says he could begin to block ad blockers in Firefox and estimates that’d bring in another $150 million, but he doesn’t want to do that. It feels off-mission\u0026rdquo;.\nThis prompted me to find a new browser after more than 20 years of using Firefox. I tried many different ones, all with the same end result. I hate them all.\nI was going to do a full writeup of all of the ones I tried and exactly what it was that rubbed me the wrong way, but really- who cares? They\u0026rsquo;re just worse than Firefox in some way or another to me. So where does that leave me? Back on Firefox\u0026hellip; well, a port of it. I\u0026rsquo;ve landed on LibreWolf, \u0026ldquo;A custom version of Firefox, focused on privacy, security and freedom\u0026rdquo;. It\u0026rsquo;s basically Firefox with the shit ripped out. So far I\u0026rsquo;m really enjoying it. It\u0026rsquo;s Firefox from before Pocket and the deluge of crap that followed.\nThere are a few things I did want to write down though, in case I have to reinstall.\nDark mode By default \u0026ldquo;Enable ResistFingerprinting\u0026rdquo; is on (in Settings \u0026gt; LibreWolf \u0026gt; Fingerprinting). This breaks websites\u0026rsquo; ability to detect that I like dark mode by default. Most users use the DarkReader extension to fix this. I hate the way that extension colors things, so I disable this option. And I know, I know, this is not a good idea and against the idea behind this browser, but their core values are not the reason I use their browser.\nBackspace I like to be able to press backspace to go back a page. Firefox disabled this behavior years ago, so users didn\u0026rsquo;t lose their filled in forms by accident. I like to live dangerously, so I reenable it. In about:config search for browser.backspace_action and set that to 0.\nExtensions I have a small list of must have extensions I use:\nuBlock Origin. This is the non-negotiable one. It\u0026rsquo;s the best ad blocker out there. Period. SponsorBlock. I am trying to curb my YouTube addiction. Meanwhile though, blocking in-video sponsor segments is a huge quality of life improvement. If you get this one, make sure you go into the settings and also check skipping of intros, outros and self-promotion segments. I Still Don\u0026rsquo;t Care About Cookies. Clicking agree on all those GDPR consent things is a pain in the rear, especially as on browser close those cookies get nuked anyway. This extension auto accepts all of them. Install As I am on a Mac now, I needed to pick how to install this. Homebrew has an annoying issue with LibreWolf: \u0026ldquo;Warning: librewolf has been deprecated because it does not pass the macOS Gatekeeper check! It will be disabled on 2026-09-01.\u0026rdquo;. Apparently this is due to the developers not wanting to shell out 99 bucks a year for an Apple Developer certificate, which I agree- they shouldn\u0026rsquo;t. So best bet is installing straight from their website. Do note that this means you\u0026rsquo;ll have to manually update the browser.\n","permalink":"https://jorisvandijk.com/posts/firefox/","summary":"\u003cp\u003eI have been switching browsers a lot these last few months. The new CEO of Mozilla, Anthony Enzor-DeMeo, stated in \u003ca href=\"https://blog.mozilla.org/en/mozilla/leadership/mozillas-next-chapter-anthony-enzor-demeo-new-ceo/\"\u003ehis post\u003c/a\u003e that \u003cem\u003e\u0026ldquo;It [Firefox] will evolve into a modern AI browser\u0026rdquo;\u003c/em\u003e. This rubbed me the wrong way. Granted, Mozilla has been adding junk to their browser for a while now and none of it is good. He floated the idea of blocking ad-blockers in an interview. \u003ca href=\"https://archive.is/75FjT\"\u003eThe Verge\u003c/a\u003e wrote: \u003cem\u003e\u0026ldquo;He says he could begin to block ad blockers in Firefox and estimates that’d bring in another $150 million, but he doesn’t want to do that. It feels off-mission\u0026rdquo;\u003c/em\u003e.\u003c/p\u003e","title":"Firefox"},{"content":"On an Apple Macbook, there\u0026rsquo;s a file browser. It\u0026rsquo;s always \u0026ldquo;open\u0026rdquo; and always in the program switcher, which bugs the heck out of me. It\u0026rsquo;s called Finder and I need it to go away when I am not using it. By default it\u0026rsquo;s impossible to actually quit Finder due to it being such a large part of the OS. It even handles the desktop, for example. I personally don\u0026rsquo;t use macOS in the intended way. I don\u0026rsquo;t have a launcher bar, all my applications are launched through shortcuts. I do not use, or really ever see the desktop. I do use the application switcher. A lot. Having that stupid face icon there is one thing. Having to tab over it to get from one app to the next is too much.\nLet\u0026rsquo;s use a command to disable it!\n1 defaults write com.apple.finder QuitMenuItem -bool true Followed by killall Finder will make the darn thing vanish! Hooray! Problem solved.\nThough not quite. Now to get a Finder window I have to press my usual keybinding, but if Finder was completely closed, that only starts the Finder process. It won\u0026rsquo;t pop the actual window. To get that, I\u0026rsquo;d have to follow up my keybinding with a CMD+N. This won\u0026rsquo;t do. This won\u0026rsquo;t do at all!\nI ended up with three possible ways of tackling this. One was to write a small .app file, which would be called by Raycast (the app that handles all my shortcuts), which would switch to Finder and if no window was running, would launch one. This \u0026ldquo;app\u0026rdquo; is super simple, consisting of only:\n1 2 3 4 5 6 tell application \u0026#34;Finder\u0026#34; activate if (count of Finder windows) is 0 then make new Finder window to home end if end tell And this works\u0026hellip; mostly. Once in a while it\u0026rsquo;d decide to not directly switch to Finder, but surprise me with a popup:\nInconsistency in workflow is a big no-no to me. Two options remain. One is handling it through Hammerspoon, which would mean splitting where keybindings are set. This I don\u0026rsquo;t like as it can cause confusion for future Joris. That guy\u0026rsquo;s got enough to deal with, so let\u0026rsquo;s not. The last option is to set up a \u0026ldquo;Raycast Script Command\u0026rdquo;. This basically means writing a little script, placing it in my script folder with a .applescript extension and calling it from Raycast. Luckily the content of this script is basically the same as the .app solution above, just with a Raycast metadata header on top.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/osascript # @raycast.schemaVersion 1 # @raycast.title Open Finder # @raycast.mode silent # @raycast.packageName Navigation # @raycast.description Activate Finder and ensure a window at ~/ exists tell application \u0026#34;Finder\u0026#34; activate if (count of Finder windows) is 0 then make new Finder window to home end if end tell Make sure it\u0026rsquo;s executable and open Raycast. It will magically pop up under Settings \u0026gt; Extensions \u0026gt; Script Commands. Set the keybinding and we\u0026rsquo;re done. (One heads-up: the first run will trigger a macOS Automation prompt. Grant it to Raycast, not Terminal.)\nShould you regret implementing this, you can revert the quit behavior of finder with defaults write com.apple.finder QuitMenuItem -bool false, followed by a killall Finder.\n","permalink":"https://jorisvandijk.com/posts/finder/","summary":"\u003cp\u003eOn an Apple Macbook, there\u0026rsquo;s a file browser. It\u0026rsquo;s always \u0026ldquo;open\u0026rdquo; and always in the program switcher, which bugs the heck out of me. It\u0026rsquo;s called \u003cstrong\u003eFinder\u003c/strong\u003e and I need it to go away when I am not using it. By default it\u0026rsquo;s impossible to actually quit Finder due to it being such a large part of the OS. It even handles the desktop, for example. I personally don\u0026rsquo;t use macOS in the intended way. I don\u0026rsquo;t have a launcher bar, all my applications are launched through shortcuts. I do not use, or really ever see the desktop. I do use the application switcher. A lot. Having that stupid face icon there is one thing. Having to tab over it to get from one app to the next is too much.\u003c/p\u003e","title":"Finder"},{"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. 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. 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 closet 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 closet 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":" 📝 NOTE This post is not up to date anymore. All slash pages have been dropped. I didn\u0026rsquo;t feel like keeping them updated. 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 was located under my domain, Jorisvandijk.com, then a forward slash / and then the name 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.\n","permalink":"https://jorisvandijk.com/posts/slash/","summary":"\u003cdiv class=\"note-banner\"\u003e\n  \u003cdiv class=\"note-header\"\u003e\n    \u003cspan class=\"note-icon\"\u003e📝\u003c/span\u003e\n    \u003cspan class=\"note-title\"\u003eNOTE\u003c/span\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"note-content\"\u003e\n    This post is not up to date anymore. All \u003cem\u003eslash\u003c/em\u003e pages have been dropped. I didn\u0026rsquo;t feel like keeping them updated.\n  \u003c/div\u003e\n\u003c/div\u003e\n\n\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=\"/#\"\u003eblogroll\u003c/a\u003e page where I list some of the ones I enjoy reading. This particular page, the \u003cem\u003eblogroll\u003c/em\u003e, \u003cdel\u003eis\u003c/del\u003e was 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. 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":"External Drive As LXC Data Directory"},{"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. I also yell at clouds here.\nIf 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 GitLab Codeberg I am part of a number of webrings:\nIndieWeb Webring Hotline Webring No AI Webring And on the IndieWeb wiki I have an wiki user page.\n","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. I also yell at clouds here.\u003c/p\u003e\n\u003cp\u003eIf 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"},{"content":"Subscribe via RSS:\nBlog posts — full articles and write-ups Microblog — short notes and microblog posts ","permalink":"https://jorisvandijk.com/feeds/","summary":"\u003cp\u003eSubscribe via RSS:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/index.xml\"\u003eBlog posts\u003c/a\u003e — full articles and write-ups\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/microblog/index.xml\"\u003eMicroblog\u003c/a\u003e — short notes and microblog posts\u003c/li\u003e\n\u003c/ul\u003e","title":"Feeds"}]