From 93c711ef6c9add4b0c6153943366c94d5d6b3a52 Mon Sep 17 00:00:00 2001
From: Phil Bajsicki <phil@bajsicki.com>
Date: Mon, 21 Apr 2025 13:51:34 +0200
Subject: [PATCH] Update

---
 content/_index.md                             |   2 +-
 content/blog/I-love-emacs.md                  |   4 +-
 content/blog/LLM-Note.md                      |   4 +-
 content/blog/_index.md                        | 101 ++++++++++++++++--
 content/blog/a-kind-view-of-business.md       |   2 +-
 content/blog/a-new-look.md                    |   4 +-
 content/blog/avoidance-in-business.md         |   4 +-
 content/blog/brain-lube-2.md                  |   2 +-
 content/blog/brain-lube-3.md                  |   2 +-
 content/blog/brain-lube.md                    |   2 +-
 content/blog/call-it-a-day.md                 |   2 +-
 content/blog/democracy.md                     |   2 +-
 content/blog/efficiency-typing.md             |   4 +-
 content/blog/elisp-neat-tree.md               |  99 +++++++++++++++++
 content/blog/foss-subscription-model.md       |   4 +-
 content/blog/games-yakuza.md                  |   4 +-
 content/blog/haxe-vscode.md                   |   4 +-
 content/blog/hugo-setup-improvements.md       |   4 +-
 content/blog/lists-self-promotion.md          |   2 +-
 content/blog/loops-video-terms.md             |   6 +-
 content/blog/mastering-emacs.md               |   2 +-
 .../blog/misskey-resetting-admin-password.md  |   4 +-
 content/blog/moving-to-hugo.md                |   4 +-
 content/blog/my-favorite-factorio-mods.md     |   4 +-
 .../blog/new-keyboard-layout-colemak-dh.md    |   2 +-
 content/blog/on-llms.md                       |   4 +-
 content/blog/on-problems.md                   |   2 +-
 content/blog/overcoming-rsi.md                |   2 +-
 content/blog/realistic-deadlines.md           |   2 +-
 content/blog/saas-business-foss.md            |   2 +-
 content/blog/shared-hosting-scam.md           |   4 +-
 content/blog/shiny-objects-and-learning.md    |   4 +-
 content/blog/vps-is-my-new-friend.md          |   4 +-
 content/blog/vps-setup.md                     |   4 +-
 content/blog/wisdom-from-a-satyr.md           |   2 +-
 content/blog/words-in-a-moment-of-peace.md    |   2 +-
 content/blog/zucc-may-be-lying.md             |   4 +-
 content/contact/index.md                      |   2 +-
 38 files changed, 240 insertions(+), 72 deletions(-)
 create mode 100644 content/blog/elisp-neat-tree.md

diff --git a/content/_index.md b/content/_index.md
index f5bb929..b18253a 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,7 +1,7 @@
 +++
 title = "Home"
 layout = "index"
-lastmod = 2025-04-04T13:28:41+02:00
+lastmod = 2025-04-21T13:51:26+02:00
 draft = false
 [menu]
   [menu.nav]
diff --git a/content/blog/I-love-emacs.md b/content/blog/I-love-emacs.md
index 9b8374b..7ad045e 100644
--- a/content/blog/I-love-emacs.md
+++ b/content/blog/I-love-emacs.md
@@ -1,7 +1,7 @@
 +++
 title = "I really, really like Emacs"
 publishDate = 2022-10-01T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["orgmode"]
 categories = ["emacs", "tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3011
+    weight = 3012
     identifier = "i-really-really-like-emacs"
 +++
 
diff --git a/content/blog/LLM-Note.md b/content/blog/LLM-Note.md
index 8f909ea..618e55d 100644
--- a/content/blog/LLM-Note.md
+++ b/content/blog/LLM-Note.md
@@ -1,7 +1,7 @@
 +++
 title = "Note about LLM's and training data"
 publishDate = 2023-03-09T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["copyright", "thieves"]
 categories = ["llm", "tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3006
+    weight = 3007
     identifier = "note-about-llm-s-and-training-data"
 +++
 
diff --git a/content/blog/_index.md b/content/blog/_index.md
index fb1b2e2..22e8818 100644
--- a/content/blog/_index.md
+++ b/content/blog/_index.md
@@ -1,6 +1,6 @@
 +++
 title = "Blog"
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:29+02:00
 draft = false
 meta = true
 type = "list"
@@ -16,6 +16,95 @@ type = "list"
 ## Tech <span class="tag"><span class="_tech">@tech</span></span> {#tech}
 
 
+### Neat trees from org-ql to org-mode <span class="tag"><span class="_emacs">@emacs</span><span class="orgmode">orgmode</span><span class="elisp">elisp</span></span> {#elisp-neat-tree}
+
+Over the past few weeks I've been working on a rather large inventory of items stored and held in org-mode.
+
+For the purposes of this example, let's use the current buffer, `bajsicki.com.org`
+
+I started using org-ql to grab the data I need, in the form of:
+
+```elisp
+(let ((org-ql-cache (make-hash-table)))
+(org-ql-select "bajsicki.com.org"
+  '(tags-local "@emacs")
+  :action (lambda () (org-get-outline-path t))))
+```
+
+So, this is neat. But notice how it's a list of lists, and there's a lot of repetition.
+
+Suppose you wanted to see this in a more pleasant form, maybe even one that you can interact with in org-mode directly.
+
+To that end, I ended up writing two functions.
+
+1.  Turn the list of lists we get from org-ql into a tree.
+
+<!--listend-->
+
+```elisp
+(defun phil/make-tree-from-nested-lists (lists)
+  (if (not lists) ;; been an issue, isn't any more
+      nil
+    (let ((grouped-lists
+	   (seq-group-by #'car
+			 (cl-remove-if nil lists))))
+      ;;would occasionally return (nil nil) conses, so we filter them out
+      (mapcar (lambda (group)
+                (let ((key (car group))
+                      (sublists (mapcar #'cdr (cdr group))))
+                  (cons key (if (not (every #'null sublists))
+                                (phil/make-tree-from-nested-lists sublists)
+                              sublists))))
+              grouped-lists))))
+```
+
+1.  Format and output that tree into org-mode.
+
+<!--listend-->
+
+```elisp
+(defun phil/org-list-from-tree (tree &optional indent)
+  (let ((indent (or indent "")))
+    (mapconcat (lambda (item) ;; actual org-mode indentation on output? In MY Emacs?
+		 (unless (eq item (cons nil nil))
+		   (when (consp item)
+		     (format "%s- %s\n%s" indent (car item)
+			     (phil/org-list-from-tree (cdr item) (concat indent "  ")))
+		     (format "%s- %s\n" indent item))))
+    tree "")))
+```
+
+Example:
+
+```elisp
+(let ((tree (phil/make-tree-from-nested-lists
+	     (let ((org-ql-cache (make-hash-table)))
+	       (org-ql-select (get-buffer "bajsicki.com.org") ;;the file I write my blog in
+		 '(and (tags-local "@emacs"))
+		 :action (lambda ()
+			   (-snoc ;;this gets the tag list as well, on top of the heading text itself
+			    (org-get-outline-path)
+			    (replace-regexp-in-string
+			     "^*+\s" "" ;; remove initial asterisks, since we're already indenting
+			     (buffer-substring-no-properties
+			      (line-beginning-position)
+			      (line-end-position))))))))))
+
+  (phil/org-list-from-tree tree))
+```
+
+Pretty neat.
+
+Now, this isn't ideal or even close to good. Here's known issues:
+
+1.  It's jank. I'm sure there's a cleaner way of doing this.
+2.  It gets tags. If you don't want them, replace the entire `dash.el` `-snoc` form with just `(org-get-outline-path t)`.
+3.  Sometimes `nil` would slip in, and so I'm just removing all nils to start with. This may cause unintended issues.
+4.  This hasn't been extensively tested, and I only tested it with the `tags-local` org-ql predicate.
+
+So yeah. There. I may end up wrapping these in a function of some sort, but for the time being this is entirely sufficient for my purposes. We'll see.
+
+
 ### On LLMs <span class="tag"><span class="_llm">@llm</span><span class="_tech">@tech</span><span class="_mind">@mind</span><span class="ethics">ethics</span><span class="communication">communication</span><span class="avoidance">avoidance</span><span class="work">work</span></span> {#on-llms}
 
 This topic [came up on Fedi](https://infosec.exchange/@david_chisnall/114278564411985648), and I thought it would be interesting to bring it up here to avoid my thinking getting lost in the sea.
@@ -304,8 +393,6 @@ So here's my request:
 
 Anyway. What a freaking mess.
 
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
-
 
 ### On Mark Zuckerberg's recent claims <span class="tag"><span class="copyright">copyright</span><span class="_llm">@llm</span><span class="zuckerberg">zuckerberg</span></span> {#zucc-may-be-lying}
 
@@ -1472,8 +1559,6 @@ a drive to learn and understand the world around us.
 
 There. Rant over.
 
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
-
 
 ### A kind view of business <span class="tag"><span class="mindset">mindset</span><span class="rant">rant</span><span class="_business">@business</span></span> {#a-kind-view-of-business}
 
@@ -1740,8 +1825,6 @@ In any case. I hope this has been helpful.
 
 Thanks!
 
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
-
 
 ### [Happy Holidays!] On posting lists for self-promotion <span class="tag"><span class="badmarketing">badmarketing</span><span class="linkedin">linkedin</span><span class="_business">@business</span></span> {#lists-self-promotion}
 
@@ -2657,8 +2740,6 @@ For most, this is likely to be entirely overkill. The purpose of the vast majori
 
 In any case! I may revisit this list in the future if I find something worth noting.
 
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
-
 
 ### Heaps of fun (Yakuza) <span class="tag"><span class="yakuza">yakuza</span><span class="review">review</span><span class="_videogames">@videogames</span></span> {#games-yakuza}
 
@@ -2683,5 +2764,3 @@ My only criticism is that at no point (well, we see this at ONE point at the beg
 Otherwise, I have nothing but good things to say about these games. The only other games I can say this about are _Metal Gear Solid 3: Snake Eater_, _Splinter Cell: Chaos Theory_, and _Deus Ex: Mankind Divided_. Off the top of my head, at least.
 
 _Yakuza Kiwami 2_ is by far the best of the PC titles - the developers paid attention and introduced a number of quality of life changes that truly make it a joy to play.
-
-[Join the FSF.](https://my.fsf.org/join)
diff --git a/content/blog/a-kind-view-of-business.md b/content/blog/a-kind-view-of-business.md
index 9560ac2..998b628 100644
--- a/content/blog/a-kind-view-of-business.md
+++ b/content/blog/a-kind-view-of-business.md
@@ -1,7 +1,7 @@
 +++
 title = "A kind view of business"
 publishDate = 2024-01-25T00:00:00+01:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["mindset", "rant"]
 categories = ["business"]
 draft = false
diff --git a/content/blog/a-new-look.md b/content/blog/a-new-look.md
index 8ac6366..fc5e594 100644
--- a/content/blog/a-new-look.md
+++ b/content/blog/a-new-look.md
@@ -1,7 +1,7 @@
 +++
 title = "A new look: ox-tufte"
 publishDate = 2023-10-23T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["orgmode", "web", "css", "tufte"]
 categories = ["emacs", "tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3012
+    weight = 3013
     identifier = "a-new-look-ox-tufte"
 +++
 
diff --git a/content/blog/avoidance-in-business.md b/content/blog/avoidance-in-business.md
index b9e3962..d9915cf 100644
--- a/content/blog/avoidance-in-business.md
+++ b/content/blog/avoidance-in-business.md
@@ -1,7 +1,7 @@
 +++
 title = "On Avoidance in Business"
 publishDate = 2023-05-04T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["psychology", "riskmanagement", "avoidance", "fear"]
 categories = ["business"]
 draft = false
@@ -104,5 +104,3 @@ It's an excellent way to start your day, or to take a break between tasks to rec
 In any case. I hope this has been helpful.
 
 Thanks!
-
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
diff --git a/content/blog/brain-lube-2.md b/content/blog/brain-lube-2.md
index e1ceffe..fcd725c 100644
--- a/content/blog/brain-lube-2.md
+++ b/content/blog/brain-lube-2.md
@@ -1,7 +1,7 @@
 +++
 title = "Trying out some brain supplements, pt. 2"
 publishDate = 2022-11-20T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["supplements", "nootropics"]
 categories = ["mind"]
 draft = false
diff --git a/content/blog/brain-lube-3.md b/content/blog/brain-lube-3.md
index ba1564e..a2e9c95 100644
--- a/content/blog/brain-lube-3.md
+++ b/content/blog/brain-lube-3.md
@@ -1,7 +1,7 @@
 +++
 title = "Brain supplements: A two month summary"
 publishDate = 2023-01-06T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["supplements", "nootropics"]
 categories = ["mind"]
 draft = false
diff --git a/content/blog/brain-lube.md b/content/blog/brain-lube.md
index d6420d3..1c41264 100644
--- a/content/blog/brain-lube.md
+++ b/content/blog/brain-lube.md
@@ -1,7 +1,7 @@
 +++
 title = "Trying out some brain supplements"
 publishDate = 2022-11-18T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["supplements", "nootropics"]
 categories = ["mind"]
 draft = false
diff --git a/content/blog/call-it-a-day.md b/content/blog/call-it-a-day.md
index b6e7a8a..3823d82 100644
--- a/content/blog/call-it-a-day.md
+++ b/content/blog/call-it-a-day.md
@@ -1,7 +1,7 @@
 +++
 title = "On the value of calling it a day (and how to get there)"
 publishDate = 2022-09-30T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:29+02:00
 tags = ["psychology", "work", "projectmanagement"]
 categories = ["business"]
 draft = false
diff --git a/content/blog/democracy.md b/content/blog/democracy.md
index d6c8242..3257211 100644
--- a/content/blog/democracy.md
+++ b/content/blog/democracy.md
@@ -1,7 +1,7 @@
 +++
 title = "Democracy"
 publishDate = 2024-12-07T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 draft = false
 meta = true
 type = "list"
diff --git a/content/blog/efficiency-typing.md b/content/blog/efficiency-typing.md
index 6d2788c..8842e42 100644
--- a/content/blog/efficiency-typing.md
+++ b/content/blog/efficiency-typing.md
@@ -1,7 +1,7 @@
 +++
 title = "Efficient computer use"
 publishDate = 2022-11-12T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["ergonomics", "keyboards", "typing", "speed", "efficency"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3010
+    weight = 3011
     identifier = "efficient-computer-use"
 +++
 
diff --git a/content/blog/elisp-neat-tree.md b/content/blog/elisp-neat-tree.md
new file mode 100644
index 0000000..61a08cd
--- /dev/null
+++ b/content/blog/elisp-neat-tree.md
@@ -0,0 +1,99 @@
++++
+title = "Neat trees from org-ql to org-mode"
+lastmod = 2025-04-21T13:51:27+02:00
+tags = ["orgmode", "elisp"]
+categories = ["tech", "emacs"]
+draft = false
+meta = true
+type = "list"
+[menu]
+  [menu.posts]
+    weight = 3001
+    identifier = "neat-trees-from-org-ql-to-org-mode"
++++
+
+Over the past few weeks I've been working on a rather large inventory of items stored and held in org-mode.
+
+For the purposes of this example, let's use the current buffer, `bajsicki.com.org`
+
+I started using org-ql to grab the data I need, in the form of:
+
+```elisp
+(let ((org-ql-cache (make-hash-table)))
+(org-ql-select "bajsicki.com.org"
+  '(tags-local "@emacs")
+  :action (lambda () (org-get-outline-path t))))
+```
+
+So, this is neat. But notice how it's a list of lists, and there's a lot of repetition.
+
+Suppose you wanted to see this in a more pleasant form, maybe even one that you can interact with in org-mode directly.
+
+To that end, I ended up writing two functions.
+
+1.  Turn the list of lists we get from org-ql into a tree.
+
+<!--listend-->
+
+```elisp
+(defun phil/make-tree-from-nested-lists (lists)
+  (if (not lists) ;; been an issue, isn't any more
+      nil
+    (let ((grouped-lists
+	   (seq-group-by #'car
+			 (cl-remove-if nil lists))))
+      ;;would occasionally return (nil nil) conses, so we filter them out
+      (mapcar (lambda (group)
+                (let ((key (car group))
+                      (sublists (mapcar #'cdr (cdr group))))
+                  (cons key (if (not (every #'null sublists))
+                                (phil/make-tree-from-nested-lists sublists)
+                              sublists))))
+              grouped-lists))))
+```
+
+1.  Format and output that tree into org-mode.
+
+<!--listend-->
+
+```elisp
+(defun phil/org-list-from-tree (tree &optional indent)
+  (let ((indent (or indent "")))
+    (mapconcat (lambda (item) ;; actual org-mode indentation on output? In MY Emacs?
+		 (unless (eq item (cons nil nil))
+		   (when (consp item)
+		     (format "%s- %s\n%s" indent (car item)
+			     (phil/org-list-from-tree (cdr item) (concat indent "  ")))
+		     (format "%s- %s\n" indent item))))
+    tree "")))
+```
+
+Example:
+
+```elisp
+(let ((tree (phil/make-tree-from-nested-lists
+	     (let ((org-ql-cache (make-hash-table)))
+	       (org-ql-select (get-buffer "bajsicki.com.org") ;;the file I write my blog in
+		 '(and (tags-local "@emacs"))
+		 :action (lambda ()
+			   (-snoc ;;this gets the tag list as well, on top of the heading text itself
+			    (org-get-outline-path)
+			    (replace-regexp-in-string
+			     "^*+\s" "" ;; remove initial asterisks, since we're already indenting
+			     (buffer-substring-no-properties
+			      (line-beginning-position)
+			      (line-end-position))))))))))
+
+  (phil/org-list-from-tree tree))
+```
+
+Pretty neat.
+
+Now, this isn't ideal or even close to good. Here's known issues:
+
+1.  It's jank. I'm sure there's a cleaner way of doing this.
+2.  It gets tags. If you don't want them, replace the entire `dash.el` `-snoc` form with just `(org-get-outline-path t)`.
+3.  Sometimes `nil` would slip in, and so I'm just removing all nils to start with. This may cause unintended issues.
+4.  This hasn't been extensively tested, and I only tested it with the `tags-local` org-ql predicate.
+
+So yeah. There. I may end up wrapping these in a function of some sort, but for the time being this is entirely sufficient for my purposes. We'll see.
diff --git a/content/blog/foss-subscription-model.md b/content/blog/foss-subscription-model.md
index 317673b..d346381 100644
--- a/content/blog/foss-subscription-model.md
+++ b/content/blog/foss-subscription-model.md
@@ -1,7 +1,7 @@
 +++
 title = "Considerations on FOSS and subscription models"
 publishDate = 2022-10-02T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["business", "foss", "vendorlock", "proprietary", "saas", "scam"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3009
+    weight = 3010
     identifier = "considerations-on-foss-and-subscription-models"
 +++
 
diff --git a/content/blog/games-yakuza.md b/content/blog/games-yakuza.md
index ab40a01..b4d8249 100644
--- a/content/blog/games-yakuza.md
+++ b/content/blog/games-yakuza.md
@@ -1,7 +1,7 @@
 +++
 title = "Heaps of fun (Yakuza)"
 publishDate = 2022-10-17T00:00:00+02:00
-lastmod = 2025-04-04T13:28:48+02:00
+lastmod = 2025-04-21T13:51:34+02:00
 tags = ["yakuza", "review"]
 categories = ["videogames"]
 draft = false
@@ -34,5 +34,3 @@ My only criticism is that at no point (well, we see this at ONE point at the beg
 Otherwise, I have nothing but good things to say about these games. The only other games I can say this about are _Metal Gear Solid 3: Snake Eater_, _Splinter Cell: Chaos Theory_, and _Deus Ex: Mankind Divided_. Off the top of my head, at least.
 
 _Yakuza Kiwami 2_ is by far the best of the PC titles - the developers paid attention and introduced a number of quality of life changes that truly make it a joy to play.
-
-[Join the FSF.](https://my.fsf.org/join)
diff --git a/content/blog/haxe-vscode.md b/content/blog/haxe-vscode.md
index 57e7638..bac933b 100644
--- a/content/blog/haxe-vscode.md
+++ b/content/blog/haxe-vscode.md
@@ -1,7 +1,7 @@
 +++
 title = "Haxe, heaps, and VSCode (small rant)"
 publishDate = 2022-10-10T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["proprietary", "vscode", "vendorlock"]
 categories = ["software", "tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3007
+    weight = 3008
     identifier = "haxe-heaps-and-vscode-small-rant"
 +++
 
diff --git a/content/blog/hugo-setup-improvements.md b/content/blog/hugo-setup-improvements.md
index ce01c55..3ff2fc6 100644
--- a/content/blog/hugo-setup-improvements.md
+++ b/content/blog/hugo-setup-improvements.md
@@ -1,7 +1,7 @@
 +++
 title = "Some improvements for my ox-hugo set-up"
 publishDate = 2024-11-18T19:37:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["hugo", "web", "orgmode"]
 categories = ["tech", "emacs"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3015
+    weight = 3016
     identifier = "some-improvements-for-my-ox-hugo-set-up"
 +++
 
diff --git a/content/blog/lists-self-promotion.md b/content/blog/lists-self-promotion.md
index 4ad1116..5c39395 100644
--- a/content/blog/lists-self-promotion.md
+++ b/content/blog/lists-self-promotion.md
@@ -1,7 +1,7 @@
 +++
 title = "[Happy Holidays!] On posting lists for self-promotion"
 publishDate = 2022-12-25T00:00:00+01:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["badmarketing", "linkedin"]
 categories = ["business"]
 draft = false
diff --git a/content/blog/loops-video-terms.md b/content/blog/loops-video-terms.md
index c52160f..831d78a 100644
--- a/content/blog/loops-video-terms.md
+++ b/content/blog/loops-video-terms.md
@@ -1,7 +1,7 @@
 +++
 title = "loops.video"
 publishDate = 2025-01-17T00:00:00+01:00
-lastmod = 2025-04-04T13:28:41+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["loopsvideo", "tos"]
 categories = ["legal", "tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3002
+    weight = 3003
     identifier = "loops-dot-video"
 +++
 
@@ -244,5 +244,3 @@ So here's my request:
 -   If you're @dansup, get your stuff together. Your [personal page](https://dansup.com/) says that PixelFed is ethical. Why can't loops.video be? User consent and letting users own their person, data and media is such a fundamental, easy thing to address, yet everything in your ToS screams 'give me more data to exploit at no cost.' FFS.
 
 Anyway. What a freaking mess.
-
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
diff --git a/content/blog/mastering-emacs.md b/content/blog/mastering-emacs.md
index 97a9885..33ecdc5 100644
--- a/content/blog/mastering-emacs.md
+++ b/content/blog/mastering-emacs.md
@@ -1,7 +1,7 @@
 +++
 title = "Weekend thoughts - Mastering Emacs by Mickey Petersen"
 publishDate = 2022-10-08T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["emacs", "review"]
 categories = ["books"]
 draft = false
diff --git a/content/blog/misskey-resetting-admin-password.md b/content/blog/misskey-resetting-admin-password.md
index 57c85e7..f81d6bc 100644
--- a/content/blog/misskey-resetting-admin-password.md
+++ b/content/blog/misskey-resetting-admin-password.md
@@ -1,7 +1,7 @@
 +++
 title = "MissKey: Resetting Admin Password"
 publishDate = 2023-08-11T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["misskey", "admin", "postgres"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3004
+    weight = 3005
     identifier = "misskey-resetting-admin-password"
 +++
 
diff --git a/content/blog/moving-to-hugo.md b/content/blog/moving-to-hugo.md
index 169a8f8..9912742 100644
--- a/content/blog/moving-to-hugo.md
+++ b/content/blog/moving-to-hugo.md
@@ -1,7 +1,7 @@
 +++
 title = "Moving to Hugo"
 publishDate = 2024-09-28T00:54:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["hugo", "web", "orgmode", "css", "tufte"]
 categories = ["tech", "emacs"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3014
+    weight = 3015
     identifier = "moving-to-hugo"
 +++
 
diff --git a/content/blog/my-favorite-factorio-mods.md b/content/blog/my-favorite-factorio-mods.md
index 93b6575..8e71d82 100644
--- a/content/blog/my-favorite-factorio-mods.md
+++ b/content/blog/my-favorite-factorio-mods.md
@@ -1,7 +1,7 @@
 +++
 title = "My favorite Factorio mods"
 publishDate = 2023-07-24T00:00:00+02:00
-lastmod = 2025-04-04T13:28:48+02:00
+lastmod = 2025-04-21T13:51:34+02:00
 tags = ["factorio", "mods"]
 categories = ["videogames"]
 draft = false
@@ -614,5 +614,3 @@ This is a more-or-less complete list of mods that I regularly play Factorio with
 For most, this is likely to be entirely overkill. The purpose of the vast majority of these mods is to save time and help me focus more on design and process, instead of spending vast amounts of time placing individual inserters, or waiting for sufficient belts to be produced.
 
 In any case! I may revisit this list in the future if I find something worth noting.
-
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
diff --git a/content/blog/new-keyboard-layout-colemak-dh.md b/content/blog/new-keyboard-layout-colemak-dh.md
index e4b5183..a7c9673 100644
--- a/content/blog/new-keyboard-layout-colemak-dh.md
+++ b/content/blog/new-keyboard-layout-colemak-dh.md
@@ -1,7 +1,7 @@
 +++
 title = "Learning a new keyboard layout"
 publishDate = 2022-08-18T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["ergonomics", "keyboard", "colemak", "typing"]
 categories = ["body"]
 draft = false
diff --git a/content/blog/on-llms.md b/content/blog/on-llms.md
index 6cc79db..d226846 100644
--- a/content/blog/on-llms.md
+++ b/content/blog/on-llms.md
@@ -1,7 +1,7 @@
 +++
 title = "On LLMs"
 publishDate = 2025-04-04T13:21:00+02:00
-lastmod = 2025-04-04T13:28:41+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["ethics", "communication", "avoidance", "work"]
 categories = ["llm", "tech", "mind"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3001
+    weight = 3002
     identifier = "on-llms"
 +++
 
diff --git a/content/blog/on-problems.md b/content/blog/on-problems.md
index fb74575..76f7692 100644
--- a/content/blog/on-problems.md
+++ b/content/blog/on-problems.md
@@ -1,7 +1,7 @@
 +++
 title = "On Problems"
 publishDate = 2022-11-21T00:00:00+01:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["psychology", "problems"]
 categories = ["mind"]
 draft = false
diff --git a/content/blog/overcoming-rsi.md b/content/blog/overcoming-rsi.md
index d1a08d5..75026c6 100644
--- a/content/blog/overcoming-rsi.md
+++ b/content/blog/overcoming-rsi.md
@@ -1,7 +1,7 @@
 +++
 title = "Overcoming typing-related RSI"
 publishDate = 2022-09-22T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["ergonomics", "keyboard", "typing", "rsi", "health"]
 categories = ["body"]
 draft = false
diff --git a/content/blog/realistic-deadlines.md b/content/blog/realistic-deadlines.md
index 0e6a000..984e23c 100644
--- a/content/blog/realistic-deadlines.md
+++ b/content/blog/realistic-deadlines.md
@@ -1,7 +1,7 @@
 +++
 title = "Realistic deadlines"
 publishDate = 2022-09-30T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["projectmanagement", "work"]
 categories = ["business"]
 draft = false
diff --git a/content/blog/saas-business-foss.md b/content/blog/saas-business-foss.md
index 08ee63b..1172700 100644
--- a/content/blog/saas-business-foss.md
+++ b/content/blog/saas-business-foss.md
@@ -1,7 +1,7 @@
 +++
 title = "Some thoughts on SaaS and business applications of Free Software"
 publishDate = 2022-09-28T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["saas", "scam", "vendorlock", "interoperability"]
 categories = ["business"]
 draft = false
diff --git a/content/blog/shared-hosting-scam.md b/content/blog/shared-hosting-scam.md
index 4eed292..a3bddb8 100644
--- a/content/blog/shared-hosting-scam.md
+++ b/content/blog/shared-hosting-scam.md
@@ -1,7 +1,7 @@
 +++
 title = "Shared hosting is a scam"
 publishDate = 2023-03-29T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["sharedhosting", "saas", "scam"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3005
+    weight = 3006
     identifier = "shared-hosting-is-a-scam"
 +++
 
diff --git a/content/blog/shiny-objects-and-learning.md b/content/blog/shiny-objects-and-learning.md
index f2cbc9f..788d665 100644
--- a/content/blog/shiny-objects-and-learning.md
+++ b/content/blog/shiny-objects-and-learning.md
@@ -1,7 +1,7 @@
 +++
 title = "Shiny objects, and learning"
 publishDate = 2024-04-24T00:00:00+02:00
-lastmod = 2025-04-04T13:28:43+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["mindset", "attitude", "rant"]
 categories = ["business"]
 draft = false
@@ -91,5 +91,3 @@ I personally don't believe so. The only cure to ignorance is self-awareness, and
 a drive to learn and understand the world around us.
 
 There. Rant over.
-
-<span class="underline">[Join the FSF.](https://my.fsf.org/join)</span>
diff --git a/content/blog/vps-is-my-new-friend.md b/content/blog/vps-is-my-new-friend.md
index 5a7668d..40fc7d1 100644
--- a/content/blog/vps-is-my-new-friend.md
+++ b/content/blog/vps-is-my-new-friend.md
@@ -1,7 +1,7 @@
 +++
 title = "VPS is my new friend"
 publishDate = 2022-10-07T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["vps", "sysadmin", "servers", "ssh", "sshfs", "foss", "vendorlock"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3008
+    weight = 3009
     identifier = "vps-is-my-new-friend"
 +++
 
diff --git a/content/blog/vps-setup.md b/content/blog/vps-setup.md
index 015dbd9..5aab461 100644
--- a/content/blog/vps-setup.md
+++ b/content/blog/vps-setup.md
@@ -1,7 +1,7 @@
 +++
 title = "VPS set-up"
 publishDate = 2022-08-18T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["vps", "sysadmin", "servers"]
 categories = ["tech"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3013
+    weight = 3014
     identifier = "vps-set-up"
 +++
 
diff --git a/content/blog/wisdom-from-a-satyr.md b/content/blog/wisdom-from-a-satyr.md
index 08a117f..508a734 100644
--- a/content/blog/wisdom-from-a-satyr.md
+++ b/content/blog/wisdom-from-a-satyr.md
@@ -1,7 +1,7 @@
 +++
 title = "Wisdom from a Satyr"
 publishDate = 2023-03-30T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:28+02:00
 tags = ["ethics", "suffering", "buddhism"]
 categories = ["wisdom", "mind"]
 draft = false
diff --git a/content/blog/words-in-a-moment-of-peace.md b/content/blog/words-in-a-moment-of-peace.md
index 090ef5c..6518718 100644
--- a/content/blog/words-in-a-moment-of-peace.md
+++ b/content/blog/words-in-a-moment-of-peace.md
@@ -1,7 +1,7 @@
 +++
 title = "Some words in a moment of peace"
 publishDate = 2023-04-04T00:00:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["language", "words", "meaning", "clarity", "communication"]
 categories = ["mind"]
 draft = false
diff --git a/content/blog/zucc-may-be-lying.md b/content/blog/zucc-may-be-lying.md
index 2b259df..493cb6b 100644
--- a/content/blog/zucc-may-be-lying.md
+++ b/content/blog/zucc-may-be-lying.md
@@ -1,7 +1,7 @@
 +++
 title = "On Mark Zuckerberg's recent claims"
 publishDate = 2024-09-27T12:02:00+02:00
-lastmod = 2025-04-04T13:28:42+02:00
+lastmod = 2025-04-21T13:51:27+02:00
 tags = ["copyright", "zuckerberg"]
 categories = ["tech", "llm"]
 draft = false
@@ -9,7 +9,7 @@ meta = true
 type = "list"
 [menu]
   [menu.posts]
-    weight = 3003
+    weight = 3004
     identifier = "on-mark-zuckerberg-s-recent-claims"
 +++
 
diff --git a/content/contact/index.md b/content/contact/index.md
index fd4d8dc..8ddb86b 100644
--- a/content/contact/index.md
+++ b/content/contact/index.md
@@ -1,7 +1,7 @@
 +++
 title = "Contact"
 publishDate = 2023-06-20T00:35:00+02:00
-lastmod = 2025-04-04T13:28:41+02:00
+lastmod = 2025-04-21T13:51:26+02:00
 draft = false
 hidefromhome = true
 meta = false