summaryrefslogtreecommitdiff
path: root/gemfeed
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-08-14 23:24:11 +0300
committerPaul Buetow <paul@buetow.org>2025-08-14 23:24:11 +0300
commit7da73dd0006d167620868b421ddc3b1ca612c3d5 (patch)
tree3dfd1b358002080424a6a2744777271f4920a1bb /gemfeed
parent7cc3590e56183defa5d050a30190b83cef381970 (diff)
Update content for md
Diffstat (limited to 'gemfeed')
-rw-r--r--gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md219
-rw-r--r--gemfeed/2024-07-05-random-weird-things.md1
-rw-r--r--gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md226
-rw-r--r--gemfeed/2025-01-01-posts-from-october-to-december-2024.md60
-rw-r--r--gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md376
-rw-r--r--gemfeed/2025-02-08-random-weird-things-ii.md1
-rw-r--r--gemfeed/2025-05-11-f3s-kubernetes-with-freebsd-part-5.md91
-rw-r--r--gemfeed/2025-07-01-posts-from-january-to-june-2025.md52
-rw-r--r--gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md52
-rw-r--r--gemfeed/2025-08-05-local-coding-llm-with-ollama.md157
-rw-r--r--gemfeed/2025-08-15-random-weird-things-iii.md116
-rw-r--r--gemfeed/DRAFT-kubernetes-with-freebsd-part-7.md564
-rw-r--r--gemfeed/DRAFT-totalrecall.md271
-rw-r--r--gemfeed/index.md1
14 files changed, 2187 insertions, 0 deletions
diff --git a/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md
index 8badb762..e71adedf 100644
--- a/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md
+++ b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md
@@ -217,6 +217,225 @@ I am abandoning this project because my workplace has stopped the annual pet pro
I value privacy. It would be great to run my own Matrix server for communication within my family. I have yet to have time to look into this more closely.
+# Projects I currently don't have time for
+
+> Published at 2024-05-03T16:23:03+03:00
+
+Over the years, I have collected many ideas for my personal projects and noted them down. I am currently in the process of cleaning up all my notes and reviewing those ideas. I don’t have time for the ones listed here and won’t have any soon due to other commitments and personal projects. So, in order to "get rid of them" from my notes folder, I decided to simply put them in this blog post so that those ideas don't get lost. Maybe I will pick up one or another idea someday in the future, but for now, they are all put on ice in favor of other personal projects or family time.
+
+```
+Art by Laura Brown
+
+.'`~~~~~~~~~~~`'.
+( .'11 12 1'. )
+| :10 \ 2: |
+| :9 @-> 3: |
+| :8 4; |
+'. '..7 6 5..' .'
+ ~-------------~ ldb
+
+```
+
+## Table of Contents
+
+* [⇢ Projects I currently don't have time for](#projects-i-currently-don-t-have-time-for)
+* [⇢ ⇢ Hardware projects I don't have time for](#hardware-projects-i-don-t-have-time-for)
+* [⇢ ⇢ ⇢ I use Arch, btw!](#i-use-arch-btw)
+* [⇢ ⇢ ⇢ OpenBSD home router](#openbsd-home-router)
+* [⇢ ⇢ ⇢ Pi-Hole server](#pi-hole-server)
+* [⇢ ⇢ ⇢ Infodash](#infodash)
+* [⇢ ⇢ ⇢ Reading station](#reading-station)
+* [⇢ ⇢ ⇢ Retro station](#retro-station)
+* [⇢ ⇢ ⇢ Sound server](#sound-server)
+* [⇢ ⇢ ⇢ Project Freekat](#project-freekat)
+* [⇢ ⇢ Programming projects I don't have time for](#programming-projects-i-don-t-have-time-for)
+* [⇢ ⇢ ⇢ CLI-HIVE](#cli-hive)
+* [⇢ ⇢ ⇢ Enhanced KISS home photo albums](#enhanced-kiss-home-photo-albums)
+* [⇢ ⇢ ⇢ KISS file sync server with end-to-end encryption](#kiss-file-sync-server-with-end-to-end-encryption)
+* [⇢ ⇢ ⇢ A language that compiles to `bash`](#a-language-that-compiles-to-bash)
+* [⇢ ⇢ ⇢ A language that compiles to `sed`](#a-language-that-compiles-to-sed)
+* [⇢ ⇢ ⇢ Renovate VS-Sim](#renovate-vs-sim)
+* [⇢ ⇢ ⇢ KISS ticketing system](#kiss-ticketing-system)
+* [⇢ ⇢ ⇢ A domain-specific language (DSL) for work](#a-domain-specific-language-dsl-for-work)
+* [⇢ ⇢ Self-hosting projects I don't have time for](#self-hosting-projects-i-don-t-have-time-for)
+* [⇢ ⇢ ⇢ My own Matrix server](#my-own-matrix-server)
+* [⇢ ⇢ ⇢ Ampache music server](#ampache-music-server)
+* [⇢ ⇢ ⇢ Librum eBook reader](#librum-ebook-reader)
+* [⇢ ⇢ ⇢ Memos - Note-taking service](#memos---note-taking-service)
+* [⇢ ⇢ ⇢ Bepasty server](#bepasty-server)
+* [⇢ ⇢ Books I don't have time to read](#books-i-don-t-have-time-to-read)
+* [⇢ ⇢ ⇢ Fluent Python](#fluent-python)
+* [⇢ ⇢ ⇢ Programming Ruby](#programming-ruby)
+* [⇢ ⇢ ⇢ Peter F. Hamilton science fiction books](#peter-f-hamilton-science-fiction-books)
+* [⇢ ⇢ New websites I don't have time for](#new-websites-i-don-t-have-time-for)
+* [⇢ ⇢ ⇢ Create a "Why Raku Rox" site](#create-a-why-raku-rox-site)
+* [⇢ ⇢ Research projects I don't have time for](#research-projects-i-don-t-have-time-for)
+* [⇢ ⇢ ⇢ Project secure](#project-secure)
+* [⇢ ⇢ ⇢ CPU utilisation is all wrong](#cpu-utilisation-is-all-wrong)
+
+## Hardware projects I don't have time for
+
+### I use Arch, btw!
+
+The idea was to build the ultimate Arch Linux setup on an old ThinkPad X200 booting with the open-source LibreBoot firmware, complete with a tiling window manager, dmenu, and all the elite tools. This is mainly for fun, as I am pretty happy (and productive) with my Fedora Linux setup. I ran EndeavourOS (close enough to Arch) on an old ThinkPad for a while, but then I switched back to Fedora because the rolling releases were annoying (there were too many updates).
+
+### OpenBSD home router
+
+In my student days, I operated a 486DX PC with OpenBSD as my home DSL internet router. I bought the setup from my brother back then. The router's hostname was `fishbone`, and it performed very well until it became too slow for larger broadband bandwidth after a few years of use.
+
+I had the idea to revive this concept, implement `fishbone2`, and place it in front of my proprietary ISP router to add an extra layer of security and control in my home LAN. It would serve as the default gateway for all of my devices, including a Wi-Fi access point, would run a DNS server, Pi-hole proxy, VPN client, and DynDNS client. I would also implement high availability using OpenBSD's CARP protocol.
+
+[https://openbsdrouterguide.net](https://openbsdrouterguide.net)
+[https://pi-hole.net/](https://pi-hole.net/)
+[https://www.OpenBSD.org](https://www.OpenBSD.org)
+[https://www.OpenBSD.org/faq/pf/carp.html](https://www.OpenBSD.org/faq/pf/carp.html)
+
+However, I am putting this on hold as I have opted for an OpenWRT-based solution, which was much quicker to set up and runs well enough.
+
+[https://OpenWRT.org/](https://OpenWRT.org/)
+
+### Pi-Hole server
+
+Install Pi-hole on one of my Pis or run it in a container on Freekat. For now, I am putting this on hold as the primary use for this would be ad-blocking, and I am avoiding surfing ad-heavy sites anyway. So there's no significant use for me personally at the moment.
+
+[https://pi-hole.net/](https://pi-hole.net/)
+
+### Infodash
+
+The idea was to implement my smart info screen using purely open-source software. It would display information such as the health status of my personal infrastructure, my current work tracker balance (I track how much I work to prevent overworking), and my sports balance (I track my workouts to stay within my quotas for general health). The information would be displayed on a small screen in my home office, on my Pine watch, or remotely from any terminal window.
+
+I don't have this, and I haven't missed having it, so I guess it would have been nice to have it but not provide any value other than the "fun of tinkering."
+
+### Reading station
+
+I wanted to create the most comfortable setup possible for reading digital notes, articles, and books. This would include a comfy armchair, a silent barebone PC or Raspberry Pi computer running either Linux or *BSD, and an e-Ink display mounted on a flexible arm/stand. There would also be a small table for my paper journal for occasional note-taking. There are a bunch of open-source software available for PDF and ePub reading. It would have been neat, but I am currently using the most straightforward solution: a Kobo Elipsa 2E, which I can use on my sofa.
+
+### Retro station
+
+I had an idea to build a computer infused with retro elements. It wouldn't use actual retro hardware but would look and feel like a retro machine. I would call this machine HAL or Retron.
+
+I would use an old ThinkPad laptop placed on a horizontal stand, running NetBSD, and attaching a keyboard from ModelFkeyboards. I use WindowMaker as a window manager and run terminal applications through Retro Term. For the monitor, I would use an older (black) EIZO model with large bezels.
+
+[https://www.NetBSD.org](https://www.NetBSD.org)
+[https://www.modelfkeyboards.com](https://www.modelfkeyboards.com)
+[https://github.com/Swordfish90/cool-retro-term)](https://github.com/Swordfish90/cool-retro-term))
+
+The computer would occasionally be used to surf the Gemini space, take notes, blog, or do light coding. However, I have abandoned the project for now because there isn't enough space in my apartment, as my daughter will have a room for herself.
+
+### Sound server
+
+My idea involved using a barebone mini PC running FreeBSD with the Navidrome sound server software. I could remotely connect to it from my phone, workstation/laptop to listen to my music collection. The storage would be based on ZFS with at least two drives for redundancy. The app would run in a Linux Docker container under FreeBSD via Bhyve.
+
+[https://github.com/navidrome/navidrome](https://github.com/navidrome/navidrome)
+[https://wiki.freebsd.org/bhyve](https://wiki.freebsd.org/bhyve)
+
+### Project Freekat
+
+My idea involved purchasing the Meerkat mini PC from System76 and installing FreeBSD. Like the sound-server idea (see previous idea), it would run Linux Docker through Bhyve. I would self-host a bunch of applications on it:
+
+* Wallabag
+* Ankidroid
+* Miniflux & Postgres
+* Audiobookshelf
+* ...
+
+All of this would be within my LAN, but the services would also be accessible from the internet through either Wireguard or SSH reverse tunnels to one of my OpenBSD VMs, for example:
+
+* `wallabag.awesome.buetow.org`
+* `ankidroid.awesome.buetow.org`
+* `miniflux.awesome.buetow.org`
+* `audiobookshelf.awesome.buetow.org`
+* ...
+
+I am abandoning this project for now, as I am currently hosting my apps on AWS ECS Fargate under `*.cool.buetow.org`, which is "good enough" for the time being and also offers the benefit of learning to use AWS and Terraform, knowledge that can be applied at work.
+
+[My personal AWS setup](./2024-02-04-from-babylon5.buetow.org-to-.cloud.md)
+
+## Programming projects I don't have time for
+
+### CLI-HIVE
+
+This was a pet project idea that my brother and I had. The concept was to collect all shell history of all servers at work in a central place, apply ML/AI, and return suggestions for commands to type or allow a fuzzy search on all the commands in the history. The recommendations for the commands on a server could be context-based (e.g., past occurrences on the same server type).
+
+You could decide whether to share your command history with others so they would receive better suggestions depending on which server they are on, or you could keep all the history private and secure. The plan was to add hooks into zsh and bash shells so that all commands typed would be pushed to the central location for data mining.
+
+### Enhanced KISS home photo albums
+
+I don't use third-party cloud providers such as Google Photos to store/archive my photos. Instead, they are all on a ZFS volume on my home NAS, with regular offsite backups taken. Thus, my project would involve implementing the features I miss most or finding a solution simple enough to host on my LAN:
+
+* A feature I miss presents me with a random day from the past and some photos from that day. This project would randomly select a day and generate a photo album for me to view and reminisce about memories.
+* Another feature I miss is the ability to automatically deduplicate all the photos, as I am sure there are tons of duplicates on my NAS.
+* Auto-enhancing the photos (perhaps using ImageMagick?)
+* I already have a simple `photoalbum.sh` script that generates an album based on an input directory. However, it would be great also to have a timeline feature to enable browsing through different dates.
+
+[KISS static web photo albums with `photoalbum.sh`](./2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md)
+
+### KISS file sync server with end-to-end encryption
+
+I aimed to have a simple server to which I could sync notes and other documents, ensuring that the data is fully end-to-end encrypted. This way, only the clients could decrypt the data, while an encrypted copy of all the data would be stored on the server side. There are a few solutions (e.g., NextCloud), but they are bloated or complex to set up.
+
+I currently use Syncthing for encrypted file sync across all my devices; however, the data is not end-to-end encrypted. It's a good-enough setup, though, as my Syncthing server is in my home LAN on an encrypted file system.
+
+[https://syncthing.net](https://syncthing.net)
+
+I also had the idea of using this as a pet project for work and naming it `Cryptolake`, utilizing post-quantum-safe encryption algorithms and a distributed data store.
+
+### A language that compiles to `bash`
+
+I had an idea to implement a higher-level language with strong typing that could be compiled into native Bash code. This would make all resulting Bash scripts more robust and secure by default. The project would involve developing a parser, lexer, and a Bash code generator. I planned to implement this in Go.
+
+I had previously implemented a tiny scripting language called Fype (For Your Program Execution), which could have served as inspiration.
+
+[The Fype Programming Language](./2010-05-09-the-fype-programming-language.md)
+
+### A language that compiles to `sed`
+
+This is similar to the previous idea, but the difference is that the language would compile into a sed script. Sed has many features, but the brief syntax makes scripts challenging to read. The higher-level language would mimic sed but in a form that is easier for humans to read.
+
+### Renovate VS-Sim
+
+VS-Sim is an open-source simulator programmed in Java for distributed systems. VS-Sim stands for "Verteilte Systeme Simulator," the German translation for "Distributed Systems Simulator." The VS-Sim project was my diploma thesis at Aachen University of Applied Sciences.
+
+[https://codeberg.org/snonux/vs-sim](https://codeberg.org/snonux/vs-sim)
+
+The ideas I had was:
+
+* Translate the project into English.
+* Modernise the Java codebase to be compatible with the latest JDK.
+* Make it compile to native binaries using GraalVM.
+* Distribute the project using AppImages.
+
+I have put this project on hold for now, as I want to do more things in Go and fewer in Java in my personal time.
+
+### KISS ticketing system
+
+My idea was to program a KISS (Keep It Simple, Stupid) ticketing system for my personal use. However, I am abandoning this project because I now use the excellent Taskwarrior software. You can learn more about it at:
+
+[https://taskwarrior.org/](https://taskwarrior.org/)
+
+### A domain-specific language (DSL) for work
+
+At work, an internal service allocates storage space for our customers on our storage clusters. It automates many tasks, but many tweaks are accessible through APIs. I had the idea to implement a Ruby-based DSL that would make using all those APIs for ad-hoc changes effortless, e.g.:
+
+```ruby
+Cluster :UK, :uk01 do
+ Customer.C1A1.segments.volumes.each do |volume|
+ puts volume.usage_stats
+ volume.move_off! if volume.over_subscribed?
+ end
+end
+```
+
+I am abandoning this project because my workplace has stopped the annual pet project competition, and I have other more important projects to work on at the moment.
+
+[Creative universe (Work pet project contests)](./2022-04-10-creative-universe.md)
+
+## Self-hosting projects I don't have time for
+
+### My own Matrix server
+
+I value privacy. It would be great to run my own Matrix server for communication within my family. I have yet to have time to look into this more closely.
+
[https://matrix.org](https://matrix.org)
### Ampache music server
diff --git a/gemfeed/2024-07-05-random-weird-things.md b/gemfeed/2024-07-05-random-weird-things.md
index 13cb0faf..9d2b5aee 100644
--- a/gemfeed/2024-07-05-random-weird-things.md
+++ b/gemfeed/2024-07-05-random-weird-things.md
@@ -6,6 +6,7 @@ Every so often, I come across random, weird, and unexpected things on the intern
[2024-07-05 Random Weird Things - Part Ⅰ (You are currently reading this)](./2024-07-05-random-weird-things.md)
[2025-02-08 Random Weird Things - Part Ⅱ](./2025-02-08-random-weird-things-ii.md)
+[2025-08-15 Random Weird Things - Part Ⅲ](./2025-08-15-random-weird-things-iii.md)
```
/\_/\
diff --git a/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md b/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md
index 1cc803ed..afd68911 100644
--- a/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md
+++ b/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md
@@ -224,6 +224,232 @@ NewRec 0 days, 00:07:33 | since Mon Dec 2 12:21:44 2024
```
This is how I track the uptimes for all of my host:
+# f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation
+
+> Published at 2024-12-02T23:48:21+02:00
+
+This is the second blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution I will use on FreeBSD-based physical machines.
+
+We set the stage last time; this time, we will set up the hardware for this project.
+
+These are all the posts so far:
+
+[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md)
+[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation (You are currently reading this)](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md)
+[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md)
+[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md)
+[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md)
+[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md)
+
+[![f3s logo](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png "f3s logo")](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png)
+
+> ChatGPT generated logo..
+
+Let's continue...
+
+## Table of Contents
+
+* [⇢ f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](#f3s-kubernetes-with-freebsd---part-2-hardware-and-base-installation)
+* [⇢ Deciding on the hardware](#deciding-on-the-hardware)
+* [⇢ ⇢ Not ARM but Intel N100 ](#not-arm-but-intel-n100-)
+* [⇢ ⇢ Beelink unboxing](#beelink-unboxing)
+* [⇢ ⇢ Network switch](#network-switch)
+* [⇢ Installing FreeBSD](#installing-freebsd)
+* [⇢ ⇢ Base install](#base-install)
+* [⇢ ⇢ Latest patch level and customizing `/etc/hosts`](#latest-patch-level-and-customizing-etchosts)
+* [⇢ ⇢ After install](#after-install)
+* [⇢ ⇢ ⇢ Helix editor](#helix-editor)
+* [⇢ ⇢ ⇢ `doas`](#doas)
+* [⇢ ⇢ ⇢ Periodic ZFS snapshotting](#periodic-zfs-snapshotting)
+* [⇢ ⇢ ⇢ Uptime tracking](#uptime-tracking)
+* [⇢ Hardware check](#hardware-check)
+* [⇢ ⇢ Ethernet](#ethernet)
+* [⇢ ⇢ RAM](#ram)
+* [⇢ ⇢ CPUs](#cpus)
+* [⇢ ⇢ CPU throttling](#cpu-throttling)
+* [⇢ Conclusion](#conclusion)
+
+# Deciding on the hardware
+
+Note that the OpenBSD VMs included in the f3s setup (which will be used later in this blog series for internet ingress - as you know from the first part of this blog series) are already there. These are virtual machines that I rent at OpenBSD Amsterdam and Hetzner.
+
+[https://openbsd.amsterdam](https://openbsd.amsterdam)
+[https://hetzner.cloud](https://hetzner.cloud)
+
+This means that the FreeBSD boxes need to be covered, which will later be running k3s in Linux VMs via bhyve hypervisor.
+
+I've been considering whether to use Raspberry Pis or look for alternatives. It turns out that complete N100-based mini-computers aren't much more expensive than Raspberry Pi 5s, and they don't require assembly. Furthermore, I like that they are AMD64 and not ARM-based, which increases compatibility with some applications (e.g., I might want to virtualize Windows (via bhyve) on one of those, though that's out of scope for this blog series).
+
+## Not ARM but Intel N100
+
+I needed something compact, efficient, and capable enough to handle the demands of a small-scale Kubernetes cluster and preferably something I don't have to assemble a lot. After researching, I decided on the Beelink S12 Pro with Intel N100 CPUs.
+
+[Beelink Mini S12 Pro N100 official page](https://www.bee-link.com/products/beelink-mini-s12-pro-n100)
+
+The Intel N100 CPUs are built on the "Alder Lake-N" architecture. These chips are designed to balance performance and energy efficiency well. With four cores, they're more than capable of running multiple containers, even with moderate workloads. Plus, they consume only around 8W of power (ok, that's more than the Pis...), keeping the electricity bill low enough and the setup quiet - perfect for 24/7 operation.
+
+[![Beelink preparation](./f3s-kubernetes-with-freebsd-part-2/f3s-collage1.jpg "Beelink preparation")](./f3s-kubernetes-with-freebsd-part-2/f3s-collage1.jpg)
+
+The Beelink comes with the following specs:
+
+* 12th Gen Intel N100 processor, with four cores and four threads, and a maximum frequency of up to 3.4 GHz.
+* 16 GB of DDR4 RAM, with a maximum (official) size of 16 GB (but people could install 32 GB on it).
+* 500 GB M.2 SSD, with the option to install a 2nd 2.5 SSD drive (which I want to make use of later in this blog series).
+* GBit ethernet
+* Four USB 3.2 Gen2 ports (maybe I want to mount something externally at some point)
+* Dimensions and weight: 115*102*39mm, 280g
+* Silent cooling system.
+* HDMI output (needed only for the initial installation and maybe for troubleshooting later)
+* Auto power on via WoL (may make use of it)
+* Wi-Fi (not going to use it)
+
+I bought three (3) of them for the cluster I intend to build.
+
+## Beelink unboxing
+
+Unboxing was uneventful. Every Beelink PC came with:
+
+* An AC power adapter
+* An HDMI cable
+* A VESA mount with screws (not using it as of now)
+* Some manuals
+* The pre-assembled Beelink PC itself.
+* A "Hello" post card (??)
+
+Overall, I love the small form factor.
+
+## Network switch
+
+I went with the tp-link mini 5-port switch, as I had a spare one available. That switch will be plugged into my wall ethernet port, which connects directly to my fiber internet router with 100 Mbit/s down and 50 Mbit/s upload speed.
+
+[![Switch](./f3s-kubernetes-with-freebsd-part-2/switch.jpg "Switch")](./f3s-kubernetes-with-freebsd-part-2/switch.jpg)
+
+# Installing FreeBSD
+
+## Base install
+
+First, I downloaded the boot-only ISO of the latest FreeBSD release and dumped it on a USB stick via my Fedora laptop:
+
+```sh
+[paul@earth]~/Downloads% sudo dd \
+ if=FreeBSD-14.1-RELEASE-amd64-bootonly.iso \
+ of=/dev/sda conv=sync
+```
+
+Next, I plugged the Beelinks (one after another) into my monitor via HDMI (the resolution of the FreeBSD text console seems strangely stretched, as I am using the LG Dual Up monitor), connected Ethernet, an external USB keyboard, and the FreeBSD USB stick, and booted the devices up. With F7, I entered the boot menu and selected the USB stick for the FreeBSD installation.
+
+The installation was uneventful. I selected:
+
+* Guided ZFS on root (pool `zroot`)
+* Unencrypted ZFS (I will encrypt separate datasets later; I want it to be able to boot without manual interaction)
+* Static IP configuration (to ensure that the boxes always have the same IPs, even after switching the router/DHCP server)
+* I decided to enable the SSH daemon, NTP server, and NTP time synchronization at boot, and I also enabled `powerd` for automatic CPU frequency scaling.
+* In addition to `root,` I added a personal user, `paul,` whom I placed in the `wheel` group.
+
+After doing all that three times (once for each Beelink PC), I had three ready-to-use FreeBSD boxes! Their hostnames are `f0`, `f1` and `f2`!
+
+[![Beelink installation](./f3s-kubernetes-with-freebsd-part-2/f3s-collage2.jpg "Beelink installation")](./f3s-kubernetes-with-freebsd-part-2/f3s-collage2.jpg)
+
+## Latest patch level and customizing `/etc/hosts`
+
+After the first boot, I upgraded to the latest FreeBSD patch level as follows:
+
+```sh
+root@f0:~ # freebsd-update fetch
+root@f0:~ # freebsd-update install
+root@f0:~ # freebsd-update reboot
+```
+
+I also added the following entries for the three FreeBSD boxes to the `/etc/hosts` file:
+
+```sh
+root@f0:~ # cat <<END >>/etc/hosts
+192.168.1.130 f0 f0.lan f0.lan.buetow.org
+192.168.1.131 f1 f1.lan f1.lan.buetow.org
+192.168.1.132 f2 f2.lan f2.lan.buetow.org
+END
+```
+
+You might wonder why bother using the hosts file? Why not use DNS properly? The reason is simplicity. I don't manage 100 hosts, only a few here and there. Having an OpenWRT router in my home, I could also configure everything there, but maybe I'll do that later. For now, keep it simple and straightforward.
+
+## After install
+
+After that, I installed the following additional packages:
+
+```sh
+root@f0:~ # pkg install helix doas zfs-periodic uptimed
+```
+
+### Helix editor
+
+Helix? It's my favourite text editor. I have nothing against `vi` but like `hx` (Helix) more!
+
+[https://helix-editor.com/](https://helix-editor.com/)
+
+### `doas`
+
+`doas`? It's a pretty neat (and KISS) replacement for `sudo`. It has far fewer features than `sudo`, which is supposed to make it more secure. Its origin is the OpenBSD project. For `doas`, I accepted the default configuration (where users in the `wheel` group are allowed to run commands as `root`):
+
+```sh
+root@f0:~ # cp /usr/local/etc/doas.conf.sample /usr/local/etc/doas.conf
+```
+
+[https://man.openbsd.org/doas](https://man.openbsd.org/doas)
+
+### Periodic ZFS snapshotting
+
+`zfs-periodic` is a nifty tool for automatically creating ZFS snapshots. I decided to go with the following configuration here:
+
+```sh
+root@f0:~ # cat <<END >>/etc/periodic.conf
+daily_zfs_snapshot_enable="YES"
+daily_zfs_snapshot_pools="zroot,zdata"
+daily_zfs_snapshot_keep="7"
+weekly_zfs_snapshot_enable="YES"
+weekly_zfs_snapshot_pools="zroot,zdata"
+weekly_zfs_snapshot_keep="5"
+monthly_zfs_snapshot_enable="YES"
+monthly_zfs_snapshot_pools="zroot,zdata"
+monthly_zfs_snapshot_keep="6"
+END
+```
+
+[https://github.com/ross/zfs-periodic](https://github.com/ross/zfs-periodic)
+
+Note: We have also added `zdata` to the list of snapshot pools. Currently, this pool does not exist yet, but it will be created later in this blog series.
+
+### Uptime tracking
+
+`uptimed`? I like to track my uptimes. This is how I configured the daemon:
+
+```sh
+root@f0:~ # cp /usr/local/mimecast/etc/uptimed.conf-dist \
+ /usr/local/mimecast/etc/uptimed.conf
+root@f0:~ # hx /usr/local/mimecast/etc/uptimed.conf
+```
+
+In the Helix editor session, I changed `LOG_MAXIMUM_ENTRIES` to `0` to keep all uptime entries forever and not cut off at 50 (the default config). After that, I enabled and started `uptimed`:
+
+```sh
+root@f0:~ # service uptimed enable
+root@f0:~ # service uptimed start
+```
+
+To check the current uptime stats, I can now run `uprecords`:
+
+```sh
+ root@f0:~ # uprecords
+ # Uptime | System Boot up
+----------------------------+---------------------------------------------------
+-> 1 0 days, 00:07:34 | FreeBSD 14.1-RELEASE Mon Dec 2 12:21:44 2024
+----------------------------+---------------------------------------------------
+NewRec 0 days, 00:07:33 | since Mon Dec 2 12:21:44 2024
+ up 0 days, 00:07:34 | since Mon Dec 2 12:21:44 2024
+ down 0 days, 00:00:00 | since Mon Dec 2 12:21:44 2024
+ %up 100.000 | since Mon Dec 2 12:21:44 2024
+```
+
+This is how I track the uptimes for all of my host:
[Unveiling `guprecords.raku`: Global Uptime Records with Raku-](./2023-05-01-unveiling-guprecords:-uptime-records-with-raku.md)
[https://github.com/rpodgorny/uptimed](https://github.com/rpodgorny/uptimed)
diff --git a/gemfeed/2025-01-01-posts-from-october-to-december-2024.md b/gemfeed/2025-01-01-posts-from-october-to-december-2024.md
index a44041ee..f9ea7bd7 100644
--- a/gemfeed/2025-01-01-posts-from-october-to-december-2024.md
+++ b/gemfeed/2025-01-01-posts-from-october-to-december-2024.md
@@ -58,6 +58,66 @@ These are from Mastodon and LinkedIn. Have a look at my about page for my social
* [⇢ ⇢ ⇢ Excellent article about your dream Product ...](#excellent-article-about-your-dream-product-)
* [⇢ ⇢ ⇢ I just finished reading all chapters of CPU ...](#i-just-finished-reading-all-chapters-of-cpu-)
* [⇢ ⇢ ⇢ Indeed, useful to know this stuff! `#sre` ...](#indeed-useful-to-know-this-stuff-sre-)
+* # Posts from October to December 2024
+
+> Published at 2024-12-31T18:09:58+02:00
+
+Happy new year!
+
+These are my social media posts from the last three months. I keep them here to reflect on them and also to not lose them. Social media networks come and go and are not under my control, but my domain is here to stay.
+
+These are from Mastodon and LinkedIn. Have a look at my about page for my social media profiles. This list is generated with Gos, my social media platform sharing tool.
+
+[My about page](../about/index.md)
+[https://codeberg.org/snonux/gos](https://codeberg.org/snonux/gos)
+
+## Table of Contents
+
+* [⇢ Posts from October to December 2024](#posts-from-october-to-december-2024)
+* [⇢ ⇢ October 2024](#october-2024)
+* [⇢ ⇢ ⇢ First on-call experience in a startup. Doesn't ...](#first-on-call-experience-in-a-startup-doesn-t-)
+* [⇢ ⇢ ⇢ Reviewing your own PR or MR before asking ...](#reviewing-your-own-pr-or-mr-before-asking-)
+* [⇢ ⇢ ⇢ Fun with defer in `#golang`, I did't know, that ...](#fun-with-defer-in-golang-i-did-t-know-that-)
+* [⇢ ⇢ ⇢ I have been in incidents. Understandably, ...](#i-have-been-in-incidents-understandably-)
+* [⇢ ⇢ ⇢ Little tips using strings in `#golang` and I ...](#little-tips-using-strings-in-golang-and-i-)
+* [⇢ ⇢ ⇢ Reading this post about `#rust` (especially the ...](#reading-this-post-about-rust-especially-the-)
+* [⇢ ⇢ ⇢ The opposite of `#ChaosMonkey` ... ...](#the-opposite-of-chaosmonkey--)
+* [⇢ ⇢ November 2024](#november-2024)
+* [⇢ ⇢ ⇢ I just became a Silver Patreon for OSnews. What ...](#i-just-became-a-silver-patreon-for-osnews-what-)
+* [⇢ ⇢ ⇢ Until now, I wasn't aware, that Go is under a ...](#until-now-i-wasn-t-aware-that-go-is-under-a-)
+* [⇢ ⇢ ⇢ These are some book notes from "Staff Engineer" ...](#these-are-some-book-notes-from-staff-engineer-)
+* [⇢ ⇢ ⇢ Looking at `#Kubernetes`, it's pretty much ...](#looking-at-kubernetes-it-s-pretty-much-)
+* [⇢ ⇢ ⇢ There has been an outage at the upstream ...](#there-has-been-an-outage-at-the-upstream-)
+* [⇢ ⇢ ⇢ One of the more confusing parts in Go, nil ...](#one-of-the-more-confusing-parts-in-go-nil-)
+* [⇢ ⇢ ⇢ Agreeably, writing down with Diagrams helps you ...](#agreeably-writing-down-with-diagrams-helps-you-)
+* [⇢ ⇢ ⇢ I like the idea of types in Ruby. Raku is ...](#i-like-the-idea-of-types-in-ruby-raku-is-)
+* [⇢ ⇢ ⇢ So, `#Haskell` is better suited for general ...](#so-haskell-is-better-suited-for-general-)
+* [⇢ ⇢ ⇢ At first, functional options add a bit of ...](#at-first-functional-options-add-a-bit-of-)
+* [⇢ ⇢ ⇢ Revamping my home lab a little bit. `#freebsd` ...](#revamping-my-home-lab-a-little-bit-freebsd-)
+* [⇢ ⇢ ⇢ Wondering to which `#web` `#browser` I should ...](#wondering-to-which-web-browser-i-should-)
+* [⇢ ⇢ ⇢ eks-node-viewer is a nifty tool, showing the ...](#eks-node-viewer-is-a-nifty-tool-showing-the-)
+* [⇢ ⇢ ⇢ Have put more Photos on - On my static photo ...](#have-put-more-photos-on---on-my-static-photo-)
+* [⇢ ⇢ ⇢ In Go, passing pointers are not automatically ...](#in-go-passing-pointers-are-not-automatically-)
+* [⇢ ⇢ ⇢ Myself being part of an on-call rotations over ...](#myself-being-part-of-an-on-call-rotations-over-)
+* [⇢ ⇢ ⇢ Feels good to code in my old love `#Perl` again ...](#feels-good-to-code-in-my-old-love-perl-again-)
+* [⇢ ⇢ ⇢ This is an interactive summary of the Go ...](#this-is-an-interactive-summary-of-the-go-)
+* [⇢ ⇢ December 2024](#december-2024)
+* [⇢ ⇢ ⇢ Thats unexpected, you cant remove a NaN key ...](#thats-unexpected-you-cant-remove-a-nan-key-)
+* [⇢ ⇢ ⇢ My second blog post about revamping my home lab ...](#my-second-blog-post-about-revamping-my-home-lab-)
+* [⇢ ⇢ ⇢ Very insightful article about tech hiring in ...](#very-insightful-article-about-tech-hiring-in-)
+* [⇢ ⇢ ⇢ for `#bpf` `#ebpf` performance debugging, have ...](#for-bpf-ebpf-performance-debugging-have-)
+* [⇢ ⇢ ⇢ 89 things he/she knows about Git commits is a ...](#89-things-heshe-knows-about-git-commits-is-a-)
+* [⇢ ⇢ ⇢ I found that working on multiple side projects ...](#i-found-that-working-on-multiple-side-projects-)
+* [⇢ ⇢ ⇢ Agreed? Agreed. Besides `#Ruby`, I would also ...](#agreed-agreed-besides-ruby-i-would-also-)
+* [⇢ ⇢ ⇢ Plan9 assembly format in Go, but wait, it's not ...](#plan9-assembly-format-in-go-but-wait-it-s-not-)
+* [⇢ ⇢ ⇢ This is a neat blog post about the Helix text ...](#this-is-a-neat-blog-post-about-the-helix-text-)
+* [⇢ ⇢ ⇢ This blog post is basically a rant against ...](#this-blog-post-is-basically-a-rant-against-)
+* [⇢ ⇢ ⇢ Quick trick to get Helix themes selected ...](#quick-trick-to-get-helix-themes-selected-)
+* [⇢ ⇢ ⇢ Example where complexity attacks you from ...](#example-where-complexity-attacks-you-from-)
+* [⇢ ⇢ ⇢ LLMs for Ops? Summaries of logs, probabilities ...](#llms-for-ops-summaries-of-logs-probabilities-)
+* [⇢ ⇢ ⇢ Excellent article about your dream Product ...](#excellent-article-about-your-dream-product-)
+* [⇢ ⇢ ⇢ I just finished reading all chapters of CPU ...](#i-just-finished-reading-all-chapters-of-cpu-)
+* [⇢ ⇢ ⇢ Indeed, useful to know this stuff! `#sre` ...](#indeed-useful-to-know-this-stuff-sre-)
* [⇢ ⇢ ⇢ It's the small things, which make Unix like ...](#it-s-the-small-things-which-make-unix-like-)
* [⇢ ⇢ ⇢ My New Year's resolution is not to start any ...](#my-new-year-s-resolution-is-not-to-start-any-)
diff --git a/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md b/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md
index f11a637f..9942e524 100644
--- a/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md
+++ b/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md
@@ -374,6 +374,382 @@ Other BSD related posts are:
[2024-01-13 One reason why I love OpenBSD](./2024-01-13-one-reason-why-i-love-openbsd.md)
[2022-10-30 Installing DTail on OpenBSD](./2022-10-30-installing-dtail-on-openbsd.md)
[2022-07-30 Let's Encrypt with OpenBSD and Rex](./2022-07-30-lets-encrypt-with-openbsd-and-rex.md)
+# f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts
+
+> Published at 2025-01-30T09:22:06+02:00
+
+This is the third blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution we will use on FreeBSD-based physical machines.
+
+[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md)
+[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md)
+[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts (You are currently reading this)](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md)
+[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md)
+[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md)
+[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md)
+
+[![f3s logo](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png "f3s logo")](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png)
+
+## Table of Contents
+
+* [⇢ f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](#f3s-kubernetes-with-freebsd---part-3-protecting-from-power-cuts)
+* [⇢ ⇢ Introduction](#introduction)
+* [⇢ ⇢ Changes since last time](#changes-since-last-time)
+* [⇢ ⇢ ⇢ FreeBSD upgrade from 14.1 to 14.2](#freebsd-upgrade-from-141-to-142)
+* [⇢ ⇢ ⇢ A new home (behind the TV)](#a-new-home-behind-the-tv)
+* [⇢ ⇢ The UPS hardware](#the-ups-hardware)
+* [⇢ ⇢ Configuring FreeBSD to Work with the UPS](#configuring-freebsd-to-work-with-the-ups)
+* [⇢ ⇢ ⇢ USB Device Detection](#usb-device-detection)
+* [⇢ ⇢ ⇢ `apcupsd` Installation](#apcupsd-installation)
+* [⇢ ⇢ ⇢ UPS Connectivity Test](#ups-connectivity-test)
+* [⇢ ⇢ APC Info on Partner Nodes:](#apc-info-on-partner-nodes)
+* [⇢ ⇢ ⇢ Installation on partners](#installation-on-partners)
+* [⇢ ⇢ Power outage simulation](#power-outage-simulation)
+* [⇢ ⇢ ⇢ Pulling the plug](#pulling-the-plug)
+* [⇢ ⇢ ⇢ Restoring power](#restoring-power)
+* [⇢ ⇢ Conclusion](#conclusion)
+
+## Introduction
+
+In this blog post, we are setting up the UPS for the cluster. A UPS, or Uninterruptible Power Supply, safeguards my cluster from unexpected power outages and surges. It acts as a backup battery that kicks in when the electricity cuts out—especially useful in my area, where power cuts are frequent—allowing for a graceful system shutdown and preventing data loss and corruption. This is especially important since I will also store some of my data on the f3s nodes.
+
+## Changes since last time
+
+### FreeBSD upgrade from 14.1 to 14.2
+
+There has been a new release since the last blog post in this series. The upgrade from 14.1 was as easy as:
+
+```sh
+paul@f0: ~ % doas freebsd-update fetch
+paul@f0: ~ % doas freebsd-update install
+paul@f0: ~ % doas freebsd-update -r 14.2-RELEASE upgrade
+paul@f0: ~ % doas freebsd-update install
+paul@f0: ~ % doas shutdown -r now
+```
+
+And after rebooting, I ran:
+
+```sh
+paul@f0: ~ % doas freebsd-update install
+paul@f0: ~ % doas pkg update
+paul@f0: ~ %