summaryrefslogtreecommitdiffstats
path: root/content/posts
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2026-01-05 21:15:44 +0200
committerJan Tuomi <jan@jantuomi.fi>2026-01-05 21:39:06 +0200
commit09e410b21358e1475261499ccf6a75fac2da12d4 (patch)
tree26bde85dbe6be7502d1eca29263e404e92633f94 /content/posts
parentb2b9388f789c58a5b6ee1cbf9edfe88013d3fc63 (diff)
Refactor and colocate assets
Diffstat (limited to 'content/posts')
-rw-r--r--content/posts/atk16-my-homegrown-computer/atk16-text-mode.pngbin0 -> 427840 bytes
-rw-r--r--content/posts/atk16-my-homegrown-computer/index.md (renamed from content/posts/atk16-my-homegrown-computer.md)2
-rw-r--r--content/posts/cassettes/cassette_player.jpegbin0 -> 3747638 bytes
-rw-r--r--content/posts/cassettes/index.md (renamed from content/posts/cassettes.md)2
-rw-r--r--content/posts/deploying-the-garden/index.md (renamed from content/posts/deploying-the-garden.md)2
-rw-r--r--content/posts/deploying-the-garden/repo_langs.pngbin0 -> 25064 bytes
-rw-r--r--content/posts/diddle-event-scheduler/diddle_screenshot.pngbin0 -> 100453 bytes
-rw-r--r--content/posts/diddle-event-scheduler/index.md (renamed from content/posts/diddle-event-scheduler.md)2
-rw-r--r--content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_binders.jpegbin0 -> 3375983 bytes
-rw-r--r--content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_cevapi.jpegbin0 -> 3111850 bytes
-rw-r--r--content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_group.jpegbin0 -> 621216 bytes
-rw-r--r--content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_hallway.jpegbin0 -> 4168772 bytes
-rw-r--r--content/posts/eurobsdcon-2025-conf-notes/index.md (renamed from content/posts/eurobsdcon-2025-conf-notes.md)8
-rw-r--r--content/posts/home-server-part-1/3-2-1-Backup-Rule.pngbin0 -> 34158 bytes
-rw-r--r--content/posts/home-server-part-1/aliexpress_minipc.pngbin0 -> 793558 bytes
-rw-r--r--content/posts/home-server-part-1/do-june-billing.pngbin0 -> 133566 bytes
-rw-r--r--content/posts/home-server-part-1/index.md (renamed from content/posts/home-server-part-1.md)8
-rw-r--r--content/posts/home-server-part-1/old-man-yells-at-cloud.pngbin0 -> 1059057 bytes
-rw-r--r--content/posts/home-server-part-2/aliexpress_minipc.pngbin0 -> 793558 bytes
-rw-r--r--content/posts/home-server-part-2/aliexpress_minipc_results.pngbin0 -> 1360509 bytes
-rw-r--r--content/posts/home-server-part-2/index.md (renamed from content/posts/home-server-part-2.md)4
-rw-r--r--content/posts/home-server-part-3/index.md (renamed from content/posts/home-server-part-3.md)4
-rw-r--r--content/posts/home-server-part-3/pursotin_fastfetch.pngbin0 -> 285448 bytes
-rw-r--r--content/posts/home-server-part-3/pursotin_raidz.svg1
-rw-r--r--content/posts/home-server-part-4/index.md (renamed from content/posts/home-server-part-4.md)10
-rw-r--r--content/posts/home-server-part-4/pursotin_network.svg1
-rw-r--r--content/posts/it-doesnt-mean-that/index.md (renamed from content/posts/it-doesnt-mean-that.md)6
-rw-r--r--content/posts/it-doesnt-mean-that/wikimedia_monad.svg1
-rw-r--r--content/posts/now-2024-fall/diffuser_1.jpgbin0 -> 3447758 bytes
-rw-r--r--content/posts/now-2024-fall/diffuser_2.jpgbin0 -> 3239064 bytes
-rw-r--r--content/posts/now-2024-fall/diffuser_3.jpgbin0 -> 3723759 bytes
-rw-r--r--content/posts/now-2024-fall/index.md (renamed from content/posts/now-2024-fall.md)6
-rw-r--r--content/posts/now-2024-spring/index.md (renamed from content/posts/now-2024-spring.md)2
-rw-r--r--content/posts/now-2024-spring/jojo-in-snow.webmbin0 -> 1508041 bytes
-rw-r--r--content/posts/now-2024-summer/2024-wines.jpgbin0 -> 3095038 bytes
-rw-r--r--content/posts/now-2024-summer/aws-exam-drink.jpegbin0 -> 2606811 bytes
-rw-r--r--content/posts/now-2024-summer/index.md (renamed from content/posts/now-2024-summer.md)4
-rw-r--r--content/posts/now-2025-fall/index.md (renamed from content/posts/now-2025-fall.md)6
-rw-r--r--content/posts/now-2025-fall/valokate_1.jpgbin0 -> 3726158 bytes
-rw-r--r--content/posts/now-2025-fall/valokate_2.jpgbin0 -> 1931666 bytes
-rw-r--r--content/posts/now-2025-fall/villa.jpegbin0 -> 2572301 bytes
-rw-r--r--content/posts/now-2025-summer/index.md (renamed from content/posts/now-2025-summer.md)6
-rw-r--r--content/posts/now-2025-summer/kenrokuen.jpgbin0 -> 8081996 bytes
-rw-r--r--content/posts/now-2025-summer/samurai_garden.jpegbin0 -> 6622434 bytes
-rw-r--r--content/posts/now-2025-summer/wagyu_grill.jpegbin0 -> 3270292 bytes
-rw-r--r--content/posts/now-2025-winter/2025_wrapped_genres.jpegbin0 -> 173496 bytes
-rw-r--r--content/posts/now-2025-winter/backdoor_feature_done.jpegbin0 -> 3525718 bytes
-rw-r--r--content/posts/now-2025-winter/backdoor_feature_wip.jpegbin0 -> 3340312 bytes
-rw-r--r--content/posts/now-2025-winter/dopamine_office.jpegbin0 -> 3272619 bytes
-rw-r--r--content/posts/now-2025-winter/index.md (renamed from content/posts/now-2025-winter.md)12
-rw-r--r--content/posts/now-2025-winter/muumimusiikkia.jpegbin0 -> 2951215 bytes
-rw-r--r--content/posts/now-2025-winter/taulu_koira.jpegbin0 -> 2778093 bytes
-rw-r--r--content/posts/qcon-london-2024-takeaways/fish-and-chips-duke-of-argyll.jpgbin0 -> 2997683 bytes
-rw-r--r--content/posts/qcon-london-2024-takeaways/index.md (renamed from content/posts/qcon-london-2024-takeaways.md)4
-rw-r--r--content/posts/qcon-london-2024-takeaways/london-from-above.jpgbin0 -> 3041148 bytes
-rw-r--r--content/posts/subjective-review-miru/hinokodo-static-abyss.pngbin0 -> 2457949 bytes
-rw-r--r--content/posts/subjective-review-miru/index.md (renamed from content/posts/subjective-review-miru.md)6
-rw-r--r--content/posts/subjective-review-miru/miru_gameplay.jpegbin0 -> 2317180 bytes
-rw-r--r--content/posts/subjective-review-miru/miru_time_to_kill_triple.jpgbin0 -> 1559052 bytes
-rw-r--r--content/posts/theres-an-rss-feed-now/index.md (renamed from content/posts/theres-an-rss-feed-now.md)2
-rw-r--r--content/posts/theres-an-rss-feed-now/internet_surf.pngbin0 -> 394047 bytes
-rw-r--r--content/posts/unfold/index.md (renamed from content/posts/unfold.md)4
-rw-r--r--content/posts/unfold/indieweb_presentation.pngbin0 -> 333070 bytes
-rw-r--r--content/posts/unfold/reveal-js-logo.pngbin0 -> 85023 bytes
64 files changed, 52 insertions, 51 deletions
diff --git a/content/posts/atk16-my-homegrown-computer/atk16-text-mode.png b/content/posts/atk16-my-homegrown-computer/atk16-text-mode.png
new file mode 100644
index 0000000..93c2752
--- /dev/null
+++ b/content/posts/atk16-my-homegrown-computer/atk16-text-mode.png
Binary files differ
diff --git a/content/posts/atk16-my-homegrown-computer.md b/content/posts/atk16-my-homegrown-computer/index.md
index 6b9f583..ba8bf84 100644
--- a/content/posts/atk16-my-homegrown-computer.md
+++ b/content/posts/atk16-my-homegrown-computer/index.md
@@ -5,7 +5,7 @@ extra:
kind: project
---
-![A screenshot of a text mode program displaying a work-in-progress hardware monitor](/files/atk16-text-mode.png)
+![A screenshot of a text mode program displaying a work-in-progress hardware monitor](atk16-text-mode.png)
**ATK16** is a learning project I've been working on for some time. It started off as a 16-bit, reduced instruction set computer (RISC) CPU design but evolved into an entire computer with peripherals and software.
diff --git a/content/posts/cassettes/cassette_player.jpeg b/content/posts/cassettes/cassette_player.jpeg
new file mode 100644
index 0000000..6591cc4
--- /dev/null
+++ b/content/posts/cassettes/cassette_player.jpeg
Binary files differ
diff --git a/content/posts/cassettes.md b/content/posts/cassettes/index.md
index 5b8f6b6..92d3887 100644
--- a/content/posts/cassettes.md
+++ b/content/posts/cassettes/index.md
@@ -11,7 +11,7 @@ They feel much more approachable than vinyls. I dislike snobbery.
## So I bought a cassette player
-{{ fig(src="/files/cassette_player.jpeg", alt="A Sony cassette recorder next to a pile of cassettes") }}
+{{ fig(src="cassette_player.jpeg", alt="A Sony cassette recorder next to a pile of cassettes") }}
It’s a Sony TCM-459V and it’s only a bit noisy and wobbly. It can record too.
diff --git a/content/posts/deploying-the-garden.md b/content/posts/deploying-the-garden/index.md
index 105bfb7..cdb5caf 100644
--- a/content/posts/deploying-the-garden.md
+++ b/content/posts/deploying-the-garden/index.md
@@ -31,7 +31,7 @@ Making changes to the build process itself, or the HTML template, requires a com
Most of the heavy lifting is done by `pandoc`. The glue parts use an obscure and ancient language with many curved sigils. Give it a try.
-{{ fig(src="/files/repo_langs.png", alt="A GitHub repository language breakdown showing that most of the code is written in Scheme.") }}
+{{ fig(src="repo_langs.png", alt="A GitHub repository language breakdown showing that most of the code is written in Scheme.") }}
## Hosting
diff --git a/content/posts/deploying-the-garden/repo_langs.png b/content/posts/deploying-the-garden/repo_langs.png
new file mode 100644
index 0000000..9c85b3b
--- /dev/null
+++ b/content/posts/deploying-the-garden/repo_langs.png
Binary files differ
diff --git a/content/posts/diddle-event-scheduler/diddle_screenshot.png b/content/posts/diddle-event-scheduler/diddle_screenshot.png
new file mode 100644
index 0000000..437567e
--- /dev/null
+++ b/content/posts/diddle-event-scheduler/diddle_screenshot.png
Binary files differ
diff --git a/content/posts/diddle-event-scheduler.md b/content/posts/diddle-event-scheduler/index.md
index 701e252..033a352 100644
--- a/content/posts/diddle-event-scheduler.md
+++ b/content/posts/diddle-event-scheduler/index.md
@@ -13,7 +13,7 @@ Diddle ([live instance](https://diddle.jan.systems/), [Github](https://github.co
**Note**: The instance hosted on my domain might go down any second. Use it at your own discretion.
-{{ fig(src="/files/diddle_screenshot.png", alt="Diddle screenshot showing an answerable poll") }}
+{{ fig(src="diddle_screenshot.png", alt="Diddle screenshot showing an answerable poll") }}
The first 80% of the project was done in two evenings. The last 80% was done during the next week. The tech stack is the _get-shit-done_ stack: **Python** + **Flask** + **PostgreSQL**. There is no required client side javascript: all client side logic is strictly for [progressive enhancement](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). You can use "dumb" browsers like w3m or lynx to enjoy Diddle just fine.
diff --git a/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_binders.jpeg b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_binders.jpeg
new file mode 100644
index 0000000..ee02077
--- /dev/null
+++ b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_binders.jpeg
Binary files differ
diff --git a/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_cevapi.jpeg b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_cevapi.jpeg
new file mode 100644
index 0000000..67595b4
--- /dev/null
+++ b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_cevapi.jpeg
Binary files differ
diff --git a/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_group.jpeg b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_group.jpeg
new file mode 100644
index 0000000..b94c739
--- /dev/null
+++ b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_group.jpeg
Binary files differ
diff --git a/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_hallway.jpeg b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_hallway.jpeg
new file mode 100644
index 0000000..f15217a
--- /dev/null
+++ b/content/posts/eurobsdcon-2025-conf-notes/eurobsdcon_2025_hallway.jpeg
Binary files differ
diff --git a/content/posts/eurobsdcon-2025-conf-notes.md b/content/posts/eurobsdcon-2025-conf-notes/index.md
index f10c781..33a0f7d 100644
--- a/content/posts/eurobsdcon-2025-conf-notes.md
+++ b/content/posts/eurobsdcon-2025-conf-notes/index.md
@@ -11,7 +11,7 @@ My event experience consisted of two days of "trainings", sometimes also referre
The event was held at the Faculty of Electrical Engineering and Computing (University of Zagreb). The venue was nostalgic in a way since it reminded me a lot of the building where I started my studies in Aalto University. Functional.
-{{ fig(src="/files/eurobsdcon_2025_hallway.jpeg", alt="A photo of a stairway in the conference venue") }}
+{{ fig(src="eurobsdcon_2025_hallway.jpeg", alt="A photo of a stairway in the conference venue") }}
Recordings from the presentation rooms can be found on [Youtube](https://www.youtube.com/playlist?list=PLskKNopggjc6bnhXOX5MQbaPKEvohzjYH). You might have to check the talk schedule to find the timestamp of a given talk.
@@ -23,7 +23,7 @@ I attended a two day lab by Prof. Kirk McKusick, who is a well known figure in t
You see, I'm not a huge kernel guy (at least not yet) so I was a bit worried that the lab content would go over my head. What happened though surprised me: I understood something like 90% of the material. Apparently I had the necessary prerequisite knowledge after all, or maybe Kirk was just so good at teaching. Maybe both.
-{{ fig(src="/files/eurobsdcon_2025_binders.jpeg", alt="Two spiral notebooks of lecture notes, one for each day") }}
+{{ fig(src="eurobsdcon_2025_binders.jpeg", alt="Two spiral notebooks of lecture notes, one for each day") }}
## Favorite talks
@@ -61,7 +61,7 @@ I noticed that there was very little "hierarchy" at the event. Speakers, sponsor
Since the event, I have familiarised myself with BSD community channels such as the [FreeBSD IRC channels](https://wiki.freebsd.org/IRC/Channels) on Libera.Chat and the various forums of [BSD Cafe](https://wiki.bsd.cafe/), hosted by Stefano Marinelli, who was also speaking at the conference.
-{{ fig(src="/files/eurobsdcon_2025_group.jpeg", alt="A group photo was taken on the final day") }}
+{{ fig(src="eurobsdcon_2025_group.jpeg", alt="A group photo was taken on the final day") }}
## There and back again, and the touristy bits
@@ -74,7 +74,7 @@ Traditional & local foods were my primary target when looking for restaurants. M
- **ćevapi** at _Plac_ ([Tripadvisor](https://www.tripadvisor.com/Restaurant_Review-g294454-d7075337-Reviews-Plac-Zagreb_Central_Croatia.html)), pictured below
- **štrukli** at _La Štruk_ ([Website](https://www.lastruk.com/))
-{{ fig(src="/files/eurobsdcon_2025_cevapi.jpeg", alt="A serving of ćevapi with cream cheese and paprika spread") }}
+{{ fig(src="eurobsdcon_2025_cevapi.jpeg", alt="A serving of ćevapi with cream cheese and paprika spread") }}
The return trip was more eventful. The plane didn't start boarding until it was more than an hour late. We were never told the reason. That delay caused me to miss my connecting flight 😑
diff --git a/content/posts/home-server-part-1/3-2-1-Backup-Rule.png b/content/posts/home-server-part-1/3-2-1-Backup-Rule.png
new file mode 100644
index 0000000..ed6b675
--- /dev/null
+++ b/content/posts/home-server-part-1/3-2-1-Backup-Rule.png
Binary files differ
diff --git a/content/posts/home-server-part-1/aliexpress_minipc.png b/content/posts/home-server-part-1/aliexpress_minipc.png
new file mode 100644
index 0000000..0cb57a4
--- /dev/null
+++ b/content/posts/home-server-part-1/aliexpress_minipc.png
Binary files differ
diff --git a/content/posts/home-server-part-1/do-june-billing.png b/content/posts/home-server-part-1/do-june-billing.png
new file mode 100644
index 0000000..a38f71c
--- /dev/null
+++ b/content/posts/home-server-part-1/do-june-billing.png
Binary files differ
diff --git a/content/posts/home-server-part-1.md b/content/posts/home-server-part-1/index.md
index 28bfbb4..6d859cc 100644
--- a/content/posts/home-server-part-1.md
+++ b/content/posts/home-server-part-1/index.md
@@ -11,7 +11,7 @@ This is the first post in a blog series chronicling my progress with designing a
{{ toc() }}
-{{ fig(src="/files/aliexpress_minipc.png", alt="A promotional image portraying the mini-PC I ended up getting") }}
+{{ fig(src="aliexpress_minipc.png", alt="A promotional image portraying the mini-PC I ended up getting") }}
## I need a place to run code and store files
@@ -21,13 +21,13 @@ I also need to store files somewhere, like everyone that partakes in the modern
I have a trusty Ubuntu server, chugging away in some rack in a DigitalOcean datacenter in Amsterdam. Even though DigitalOcean pricing is pretty reasonable for individuals in general, my monthly price tag is around ~35€, after taxes. That sum is based on the cost of running a medium sized x86-64 instance and storing some backup snapshots from that machine. Times twelve, that comes to around 420€ per year. To me, that is a sizeable amount of money.
-{{ fig(src="/files/do-june-billing.png", alt="DigitalOcean is charging $36.14 this month") }}
+{{ fig(src="do-june-billing.png", alt="DigitalOcean is charging $36.14 this month") }}
> 🤔 I would like to run a smaller instance, but I needed a certain level of RAM to reliably run Obsidian Sync. For whatever reason, less memory would have the app crash intermittently.
Having upgraded to instance to the current size, it is hard to downscale back to a smaller machine. It is possible, of course. But instead of doing that, I started to consider an alternative: maybe I could save some coins and get some hardware of my own, like in the prehistoric times, before cloud services became the de-facto way to run anything. With one year's cloud costs, I could surely get a capable small machine.
-{{ fig(src="/files/old-man-yells-at-cloud.png", alt="Old man yells at Cloud (FFVII)") }}
+{{ fig(src="old-man-yells-at-cloud.png", alt="Old man yells at Cloud (FFVII)") }}
## Ownership and control
@@ -43,7 +43,7 @@ I could provide these capabilities to myself, by managing my own hardware and ne
To replace something as generally trusted and widely used as Google Drive requires some proper thinking. I haven't previously set up any redundant disk storage. My systems have never followed the [3-2-1 backup rule](https://en.wikipedia.org/wiki/Backup#3-2-1_Backup_Rule).
-{{ fig(src="/files/3-2-1-Backup-Rule.png", alt="Maintain at least 3 copies of your data, keep 2 copies stored at separate locations, store at least 1 copy at an off-site location. Source: msp360.com") }}
+{{ fig(src="3-2-1-Backup-Rule.png", alt="Maintain at least 3 copies of your data, keep 2 copies stored at separate locations, store at least 1 copy at an off-site location. Source: msp360.com") }}
Reaching for full ownership and control is not solely an objective aim. It is in part psychological, an attempt to get back control in a world of weakening privacy and walled content gardens. It is driven by emotion. And this is completely fine: humans are allowed to be motivated by emotion, especially when it comes to personal, hobby-adjacent things. To claim otherwise would be dishonest.
diff --git a/content/posts/home-server-part-1/old-man-yells-at-cloud.png b/content/posts/home-server-part-1/old-man-yells-at-cloud.png
new file mode 100644
index 0000000..bf6a0f3
--- /dev/null
+++ b/content/posts/home-server-part-1/old-man-yells-at-cloud.png
Binary files differ
diff --git a/content/posts/home-server-part-2/aliexpress_minipc.png b/content/posts/home-server-part-2/aliexpress_minipc.png
new file mode 100644
index 0000000..0cb57a4
--- /dev/null
+++ b/content/posts/home-server-part-2/aliexpress_minipc.png
Binary files differ
diff --git a/content/posts/home-server-part-2/aliexpress_minipc_results.png b/content/posts/home-server-part-2/aliexpress_minipc_results.png
new file mode 100644
index 0000000..9242e3e
--- /dev/null
+++ b/content/posts/home-server-part-2/aliexpress_minipc_results.png
Binary files differ
diff --git a/content/posts/home-server-part-2.md b/content/posts/home-server-part-2/index.md
index 3030d62..7cd5300 100644
--- a/content/posts/home-server-part-2.md
+++ b/content/posts/home-server-part-2/index.md
@@ -58,7 +58,7 @@ Turns out that there simply aren't any reasonably priced machines based on chips
AliExpress, an online retailer based in China, is nice since they have a huge variety of devices at prices that would never be profitable if sold in a western shop. I would prefer to buy European in this current political atmosphere, but I'm working off a budget, and limiting my options to reputable and ethical vendors would force me to relax my requirements a lot or stop the project in its tracks altogether.
-{{ fig(src="/files/aliexpress_minipc_results.png", alt='Some of the results of a "mini pc" search query') }}
+{{ fig(src="aliexpress_minipc_results.png", alt='Some of the results of a "mini pc" search query') }}
I'm happy to notice that there is a varied selection of devices at the ~200€ price point. Some are designed to be network devices, with a bunch of physical interfaces and limited storage options, while some are clearly NAS oriented, with SATA 3.5" drive bays capable of housing two or four disks, most commonly.
@@ -68,7 +68,7 @@ I'm looking for something in the middle ground: I need two physical interfaces (
> AliExpress tends to have multiple layers of ‼️ LIMITED SALE ‼️ and 🤑 TOP DEAL COUPON 🤑 going on at the same time. In the mobile app they also have a bunch of connect-four-type games that can score you big AliExpress Coins©. Please continue consuming.
-{{ fig(src="/files/aliexpress_minipc.png", alt="A promotional image of the mini PC I picked, hosted here in case the product page goes poof. Please enjoy the broken English.") }}
+{{ fig(src="aliexpress_minipc.png", alt="A promotional image of the mini PC I picked, hosted here in case the product page goes poof. Please enjoy the broken English.") }}
Regarding disks, I think I want to buy them locally, just in case there are issues with them. It's way less stressful to handle returns and such with a local vendor than with an overseas megacorp. I feel that stuff like RAM is pretty often OK even if bought from less reputable sources, but with disks I don't want to test my luck.
diff --git a/content/posts/home-server-part-3.md b/content/posts/home-server-part-3/index.md
index 456ee2a..0b553ba 100644
--- a/content/posts/home-server-part-3.md
+++ b/content/posts/home-server-part-3/index.md
@@ -31,13 +31,13 @@ The initial idea is this:
Using the install wizard, I set up the system following my rough plan. And here we go, all up and running:
-{{ fig(src="/files/pursotin_fastfetch.png", alt="Fastfetch output showing the machine specs. Disregard the uptime (I took the screenshot way later)") }}
+{{ fig(src="pursotin_fastfetch.png", alt="Fastfetch output showing the machine specs. Disregard the uptime (I took the screenshot way later)") }}
### RAIDZ
You might notice that I bought 4 x 1 TB of NVMe disks, but `fastfetch` is only showing ~2TB. That's because I set up the disks into a "RAID 1+0" configuration:
-{{ fig(src="/files/pursotin_raidz.svg", alt='A "RAID 1+0" configuration') }}
+{{ fig(src="pursotin_raidz.svg", alt='A "RAID 1+0" configuration') }}
RAID 1+0 is a combination of two RAID levels. RAID 1, or _mirror_, consumes two disks to produce one virtual disk that has the capacity of only one physical disk but can withstand the loss of either one. ZFS can automatically heal missing data in a member of a mirror by copying it over from the healthy member. RAID 0, or _stripe_, consumes two disks to produce a disk that has the capacity of the sum of its member capacities as well as double I/O speed, but fails if either member disk fails. The combination of these is a useful way to get increased speed and increased durability at the price of half your raw capacity.
diff --git a/content/posts/home-server-part-3/pursotin_fastfetch.png b/content/posts/home-server-part-3/pursotin_fastfetch.png
new file mode 100644
index 0000000..241f5e9
--- /dev/null
+++ b/content/posts/home-server-part-3/pursotin_fastfetch.png
Binary files differ
diff --git a/content/posts/home-server-part-3/pursotin_raidz.svg b/content/posts/home-server-part-3/pursotin_raidz.svg
new file mode 100644
index 0000000..d2942ac
--- /dev/null
+++ b/content/posts/home-server-part-3/pursotin_raidz.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="592" height="289.33"><g transform="translate(-889.0000000000001 -251.66666666666669)" lucid:page-tab-id="jJFWJm6nolyj"><path d="M890 473.33a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6V534a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,895.0000000000001,472.33333333333337) translate(19.19753086419753 37.46527777777778)"/><use xlink:href="#b" transform="matrix(1,0,0,1,895.0000000000001,472.33333333333337) translate(68.45679012345678 37.46527777777778)"/><path d="M1040 473.33a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6V534a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,1045,472.33333333333337) translate(19.19753086419753 37.46527777777778)"/><use xlink:href="#c" transform="matrix(1,0,0,1,1045,472.33333333333337) translate(68.45679012345678 37.46527777777778)"/><path d="M1220 473.33a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6V534a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,1225,472.3333333333333) translate(19.19753086419753 37.46527777777778)"/><use xlink:href="#d" transform="matrix(1,0,0,1,1225,472.3333333333333) translate(68.45679012345678 37.46527777777778)"/><path d="M1370 473.33a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6V534a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,1375,472.3333333333333) translate(19.19753086419753 37.46527777777778)"/><use xlink:href="#e" transform="matrix(1,0,0,1,1375,472.3333333333333) translate(68.45679012345678 37.46527777777778)"/><path d="M890 366a6 6 0 0 1 6-6h248a6 6 0 0 1 6 6v68a6 6 0 0 1-6 6H896a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#f" transform="matrix(1,0,0,1,895.0000000000001,365) translate(86.88271604938272 39.65277777777778)"/><use xlink:href="#b" transform="matrix(1,0,0,1,895.0000000000001,365) translate(150.7716049382716 39.65277777777778)"/><path d="M1220 366a6 6 0 0 1 6-6h248a6 6 0 0 1 6 6v68a6 6 0 0 1-6 6h-248a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#f" transform="matrix(1,0,0,1,1225,365) translate(86.88271604938272 39.65277777777778)"/><use xlink:href="#c" transform="matrix(1,0,0,1,1225,365) translate(150.7716049382716 39.65277777777778)"/><path d="M890 258.67a6 6 0 0 1 6-6h578a6 6 0 0 1 6 6v68a6 6 0 0 1-6 6H896a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,895.0000000000001,257.6666666666667) translate(261.04938271604937 39.65277777777778)"/><path d="M945 465.83v-8.45" stroke="#3a414a" fill="none"/><path d="M945.48 466.33h-.96v-.5h.96z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M945 442.62l4.63 14.26h-9.26z" stroke="#3a414a" fill="#3a414a"/><path d="M1095 465.83v-8.45" stroke="#3a414a" fill="none"/><path d="M1095.47 466.33h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1095 442.62l4.63 14.26h-9.27z" stroke="#3a414a" fill="#3a414a"/><path d="M1275 465.83v-8.45" stroke="#3a414a" fill="none"/><path d="M1275.47 466.33h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1275 442.62l4.63 14.26h-9.27z" stroke="#3a414a" fill="#3a414a"/><path d="M1425 465.83v-8.45" stroke="#3a414a" fill="none"/><path d="M1425.47 466.33h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1425 442.62l4.63 14.26h-9.27z" stroke="#3a414a" fill="#3a414a"/><path d="M1020 358.5v-8.45" stroke="#3a414a" fill="none"/><path d="M1020.48 359h-.96v-.5h.96z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1020 335.3l4.63 14.25h-9.27z" stroke="#3a414a" fill="#3a414a"/><path d="M1350 358.5v-8.45" stroke="#3a414a" fill="none"/><path d="M1350.47 359h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1350 335.3l4.63 14.25h-9.27z" stroke="#3a414a" fill="#3a414a"/><defs><path fill="#3a414a" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="h"/><path fill="#3a414a" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="i"/><path fill="#3a414a" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="j"/><path fill="#3a414a" d="M143 0L79-87 56-68V0H24v-261h32v163l83-92h37l-77 82L181 0h-38" id="k"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#h"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#i"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.864197530864196,0)" xlink:href="#j"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,31.975308641975307,0)" xlink:href="#k"/></g><path fill="#3a414a" d="M101-251c68 0 85 55 85 127S166 4 100 4C33 4 14-52 14-124c0-73 17-127 87-127zm-1 229c47 0 54-49 54-102s-4-102-53-102c-51 0-55 48-55 102 0 53 5 102 54 102" id="l"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#l" id="b"/><path fill="#3a414a" d="M27 0v-27h64v-190l-56 39v-29l58-41h29v221h61V0H27" id="m"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#m" id="c"/><path fill="#3a414a" d="M101-251c82-7 93 87 43 132L82-64C71-53 59-42 53-27h129V0H18c2-99 128-94 128-182 0-28-16-43-45-43s-46 15-49 41l-32-3c6-41 34-60 81-64" id="n"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#n" id="d"/><path fill="#3a414a" d="M126-127c33 6 58 20 58 59 0 88-139 92-164 29-3-8-5-16-6-25l32-3c6 27 21 44 54 44 32 0 52-15 52-46 0-38-36-46-79-43v-28c39 1 72-4 72-42 0-27-17-43-46-43-28 0-47 15-49 41l-32-3c6-42 35-63 81-64 48-1 79 21 79 65 0 36-21 52-52 59" id="o"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#o" id="e"/><path fill="#3a414a" d="M240 0l2-218c-23 76-54 145-80 218h-23L58-218 59 0H30v-248h44l77 211c21-75 51-140 76-211h43V0h-30" id="p"/><path fill="#3a414a" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="q"/><path fill="#3a414a" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="r"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#p"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#i"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.33333333333333,0)" xlink:href="#q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.679012345679006,0)" xlink:href="#q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.02469135802468,0)" xlink:href="#r"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.37037037037036,0)" xlink:href="#q"/></g><path fill="#3a414a" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="s"/><path fill="#3a414a" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="t"/><path fill="#3a414a" d="M115-194c55 1 70 41 70 98S169 2 115 4C84 4 66-9 55-30l1 105H24l-1-265h31l2 30c10-21 28-34 59-34zm-8 174c40 0 45-34 45-75s-6-73-45-74c-42 0-51 32-51 76 0 43 10 73 51 73" id="u"/><path fill="#3a414a" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="v"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#t"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.33333333333333,0)" xlink:href="#i"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.20987654320987,0)" xlink:href="#u"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.55555555555555,0)" xlink:href="#v"/></g></defs></g></svg> \ No newline at end of file
diff --git a/content/posts/home-server-part-4.md b/content/posts/home-server-part-4/index.md
index 1eff36f..bb44702 100644
--- a/content/posts/home-server-part-4.md
+++ b/content/posts/home-server-part-4/index.md
@@ -1,13 +1,13 @@
---
-title: "A home server journey, part 4: Network"
-date: 2025-12-25
+title: "A home server journey, part 4: Networking"
+date: 2025-12-24
description: |
- This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're setting up the networking.
+ This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're looking at networking.
extra:
kind: note
---
-This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're setting up the networking.
+This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're looking at networking.
Check out episodes [1](/posts/home-server-part-1), [2](/posts/home-server-part-2), [3](/posts/home-server-part-3).
@@ -19,7 +19,7 @@ I already have a private network (`192.168.0.0/16`) that uses my pfSense router
The host will also be connected directly to the ISP's network using its second interface (`wan0`). This interface will get its IP using DHCP. Packets to the internet, as well as packets to public services running on the FreeBSD host go through this interface.
-{{ fig(src="/files/pursotin_network.svg", alt="A simplified diagram showing the two interfaces") }}
+{{ fig(src="pursotin_network.svg", alt="A simplified diagram showing the two interfaces") }}
A dual interface set up like this is simple in theory, but there are important nuances, e.g. regarding return traffic routing and DNS.
diff --git a/content/posts/home-server-part-4/pursotin_network.svg b/content/posts/home-server-part-4/pursotin_network.svg
new file mode 100644
index 0000000..79d1dea
--- /dev/null
+++ b/content/posts/home-server-part-4/pursotin_network.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="975" height="327"><g transform="translate(-872 -724)" lucid:page-tab-id="jJFWJm6nolyj"><path d="M500 0h1500v1500H500z" fill="#fff"/><path d="M900 786a6 6 0 0 1 6-6h88a6 6 0 0 1 6 6v208a6 6 0 0 1-6 6h-88a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,905,785) translate(-0.5864197530864175 96.11111111111111)"/><use xlink:href="#b" transform="matrix(1,0,0,1,905,785) translate(24.012345679012345 122.7777777777778)"/><path d="M1000 786a6 6 0 0 1 6-6h58a6 6 0 0 1 6 6v48a6 6 0 0 1-6 6h-58a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#c" transform="matrix(1,0,0,1,1005,785) translate(9.043209876543212 30.27777777777778)"/><path d="M1000 946a6 6 0 0 1 6-6h58a6 6 0 0 1 6 6v48a6 6 0 0 1-6 6h-58a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#d" transform="matrix(1,0,0,1,1005,945) translate(3.487654320987655 30.27777777777778)"/><path d="M1330 784.67a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6v50.66a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#e" transform="matrix(1,0,0,1,1335,783.6666666666667) translate(16.728395061728392 31.02777777777778)"/><path d="M1540 784.67a6 6 0 0 1 6-6h68a6 6 0 0 1 6 6v208a6 6 0 0 1-6 6h-68a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#f" transform="matrix(1,0,0,1,1545,783.6666666666667) translate(17.598765432098766 109.65277777777777)"/><path d="M1780 848.67c22.1 0 40 17.9 40 40s-17.9 40-40 40h-80c-22.1 0-40-17.9-40-40s17.9-40 40-40z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,1665,853.6666666666667) translate(38.0246913580247 39.65277777777778)"/><path d="M1621.5 888.67h37" stroke="#3a414a" fill="none"/><path d="M1621.5 889.14h-.5v-.95h.5zM1659 888.65l.02.5h-.53v-.96h.53z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1441.5 810h97" stroke="#3a414a" fill="none"/><path d="M1441.5 810.48h-.5v-.96h.5zM1539 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1145 784.67a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6v50.66a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#h" transform="matrix(1,0,0,1,1150,783.6666666666667) translate(28.425925925925927 21.09027777777778)"/><use xlink:href="#i" transform="matrix(1,0,0,1,1150,783.6666666666667) translate(19.197530864197528 47.75694444444444)"/><path d="M1256.5 810h72" stroke="#3a414a" fill="none"/><path d="M1256.5 810.48h-.5v-.96h.5zM1329 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1143.5 810h-72" stroke="#3a414a" fill="none"/><path d="M1144 810.48h-.5v-.96h.5zM1071.5 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1071.5 970h467" stroke="#3a414a" fill="none"/><path d="M1071.5 970.48h-.5v-.96h.5zM1539 970.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1200 842.83v16.67" stroke="#3a414a" fill="none"/><path d="M1200.47 842.85h-.94v-.52h.94zM1200.47 860h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1135.74 866a6 6 0 0 1 6-6h116.52a6 6 0 0 1 6 6v40.68a6 6 0 0 1-6 6h-116.52a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#j" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(0 14.388888888888888)"/><use xlink:href="#k" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(45.38271604938272 14.388888888888888)"/><use xlink:href="#l" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(92.79012345679013 14.388888888888888)"/><use xlink:href="#m" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(0 35.72222222222222)"/><path d="M1072.2 986a6 6 0 0 1 6-6h48.24a6 6 0 0 1 6 6v19.34a6 6 0 0 1-6 6h-48.23a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#n" transform="matrix(1,0,0,1,1077.2122222222222,985) translate(0 14.555555555555555)"/><path d="M1000.5 754.66a6 6 0 0 1 6-6h101.72a6 6 0 0 1 6 6V774a6 6 0 0 1-6 6h-101.7a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#o" transform="matrix(1,0,0,1,1005.5096913580246,753.6566666666666) translate(0 14.555555555555555)"/><path d="M1440 823.32a6 6 0 0 1 6-6h48.23a6 6 0 0 1 6 6v19.35a6 6 0 0 1-6 6H1446a6 6 0 0 1-6-6z" fill="none"/><g><use xlink:href="#n" transform="matrix(1,0,0,1,1445,822.3233333333334) translate(0 14.555555555555555)"/></g><path d="M1266.16 754.66a6 6 0 0 1 6-6H1364a6 6 0 0 1 6 6V774a6 6 0 0 1-6 6h-91.84a6 6 0 0 1-6-6z" fill="none"/><g><use xlink:href="#p" transform="matrix(1,0,0,1,1271.1628395061728,753.6566666666666) translate(0 14.555555555555555)"/></g><defs><path fill="#3a414a" d="M63-220v92h138v28H63V0H30v-248h175v28H63" id="q"/><path fill="#3a414a" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="r"/><path fill="#3a414a" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="s"/><path fill="#3a414a" d="M160-131c35 5 61 23 61 61C221 17 115-2 30 0v-248c76 3 177-17 177 60 0 33-19 50-47 57zm-97-11c50-1 110 9 110-42 0-47-63-36-110-37v79zm0 115c55-2 124 14 124-45 0-56-70-42-124-44v89" id="t"/><path fill="#3a414a" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="u"/><path fill="#3a414a" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="v"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#r"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.864197530864196,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.20987654320987,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.55555555555555,0)" xlink:href="#t"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.37037037037037,0)" xlink:href="#u"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,75.18518518518518,0)" xlink:href="#v"/></g><path fill="#3a414a" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="w"/><path fill="#3a414a" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="x"/><path fill="#3a414a" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="y"/><path fill="#3a414a" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="z"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#w"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#z"/></g><path fill="#3a414a" d="M24 0v-261h32V0H24" id="A"/><path fill="#3a414a" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="B"/><path fill="#3a414a" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="C"/><path fill="#3a414a" d="M101-251c68 0 85 55 85 127S166 4 100 4C33 4 14-52 14-124c0-73 17-127 87-127zm-1 229c47 0 54-49 54-102s-4-102-53-102c-51 0-55 48-55 102 0 53 5 102 54 102" id="D"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.22222222222222,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.5679012345679,0)" xlink:href="#D"/></g><path fill="#3a414a" d="M206 0h-36l-40-164L89 0H53L-1-190h32L70-26l43-164h34l41 164 42-164h31" id="E"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#D"/></g><path fill="#3a414a" d="M233-177c-1 41-23 64-60 70L243 0h-38l-65-103H63V0H30v-248c88 3 205-21 203 71zM63-129c60-2 137 13 137-47 0-61-80-42-137-45v92" id="F"/><path fill="#3a414a" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="G"/><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#F"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.851851851851855,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,59.19753086419753,0)" xlink:href="#r"/></g><path fill="#3a414a" d="M33 0v-248h34V0H33" id="H"/><path fill="#3a414a" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="I"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#u"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#I"/></g><path fill="#3a414a" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="J"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.22222222222222,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.39506172839506,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074074,0)" xlink:href="#r"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.08641975308642,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.432098765432094,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.77777777777777,0)" xlink:href="#z"/></g><path fill="#3a414a" d="M30 0v-248h33v221h125V0H30" id="K"/><path fill="#3a414a" d="M205 0l-28-72H64L36 0H1l101-248h38L239 0h-34zm-38-99l-47-123c-12 45-31 82-46 123h93" id="L"/><path fill="#3a414a" d="M190 0L58-211 59 0H30v-248h39L202-35l-2-213h31V0h-41" id="M"/><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#M"/></g><path fill="#3a414a" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="N"/><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.098765432098766,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,31.975308641975307,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.14814814814815,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925927,0)" xlink:href="#w"/></g><path fill="#635dff" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="O"/><path fill="#635dff" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="P"/><path fill="#635dff" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="Q"/><path fill="#635dff" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="R"/><path fill="#635dff" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="S"/><g id="j"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#O"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#P"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,14.814814814814817,0)" xlink:href="#Q"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,24.69135802469136,0)" xlink:href="#R"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#S"/></g><path fill="#635dff" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="T"/><g id="k"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#Q"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#O"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#T"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,28.641975308641978,0)" xlink:href="#P"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,33.580246913580254,0)" xlink:href="#T"/></g><path fill="#635dff" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="U"/><path fill="#635dff" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="V"/><g id="l"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#U"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,3.901234567901235,0)" xlink:href="#V"/></g><path fill="#635dff" d="M27 0v-27h64v-190l-56 39v-29l58-41h29v221h61V0H27" id="W"/><path fill="#635dff" d="M99-251c64 0 84 50 84 122C183-37 130 33 47-8c-14-7-20-23-25-40l30-5c6 39 69 39 84 7 9-19 16-44 16-74-10 22-31 35-62 35-49 0-73-33-73-83 0-54 28-83 82-83zm-1 141c31-1 51-18 51-49 0-36-14-67-51-67-34 0-49 23-49 58 0 34 15 58 49 58" id="X"/><path fill="#635dff" d="M101-251c82-7 93 87 43 132L82-64C71-53 59-42 53-27h129V0H18c2-99 128-94 128-182 0-28-16-43-45-43s-46 15-49 41l-32-3c6-41 34-60 81-64" id="Y"/><path fill="#635dff" d="M33 0v-38h34V0H33" id="Z"/><path fill="#635dff" d="M110-160c48 1 74 30 74 79 0 53-28 85-80 85-65 0-83-55-86-122-5-90 50-162 133-122 14 7 22 21 27 39l-31 6c-5-40-67-38-82-6-9 19-15 44-15 74 11-20 30-34 60-33zm-7 138c34 0 49-23 49-58s-16-56-50-56c-29 0-50 16-49 49 1 36 15 65 50 65" id="aa"/><path fill="#635dff" d="M134-131c28 9 52 24 51 62-1 50-34 73-85 73S17-19 16-69c0-36 21-54 49-61-75-25-45-126 34-121 46 3 78 18 79 63 0 33-17 51-44 57zm-34-11c31 1 46-15 46-44 0-28-17-43-47-42-29 0-46 13-45 42 1 28 16 44 46 44zm1 122c35 0 51-18 51-52 0-30-18-46-53-46-33 0-51 17-51 47 0 34 19 51 53 51" id="ab"/><path fill="#635dff" d="M101-251c68 0 85 55 85 127S166 4 100 4C33 4 14-52 14-124c0-73 17-127 87-127zm-1 229c47 0 54-49 54-102s-4-102-53-102c-51 0-55 48-55 102 0 53 5 102 54 102" id="ac"/><path fill="#635dff" d="M0 4l72-265h28L28 4H0" id="ad"/><g id="m"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,93.82716049382718,0)" xlink:href="#ad"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,98.76543209876544,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,108.64197530864199,0)" xlink:href="#aa"/></g><path fill="#e81313" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="ae"/><path fill="#e81313" d="M197 0v-115H63V0H30v-248h33v105h134v-105h34V0h-34" id="af"/><path fill="#e81313" d="M212-179c-10-28-35-45-73-45-59 0-87 40-87 99 0 60 29 101 89 101 43 0 62-24 78-52l27 14C228-24 195 4 139 4 59 4 22-46 18-125c-6-104 99-153 187-111 19 9 31 26 39 46" id="ag"/><path fill="#e81313" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="ah"/><g id="n"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#ae"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,12.790123456790125,0)" xlink:href="#af"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,25.58024691358025,0)" xlink:href="#ag"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,38.370370370370374,0)" xlink:href="#ah"/></g><g id="o"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,93.82716049382718,0)" xlink:href="#ac"/></g><g id="p"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#W"/></g></defs></g></svg> \ No newline at end of file
diff --git a/content/posts/it-doesnt-mean-that.md b/content/posts/it-doesnt-mean-that/index.md
index adf171f..0fb2988 100644
--- a/content/posts/it-doesnt-mean-that.md
+++ b/content/posts/it-doesnt-mean-that/index.md
@@ -1,11 +1,9 @@
---
title: It doesn't mean that
-date: 2024-03-31
-extra:
- kind: note
+date: 2024-05-16
---
-<img src="/files/wikimedia_monad.svg" alt="A plain circle with a small dot in the center" style="max-height: 200px; margin-bottom: 0px" />
+<img src="wikimedia_monad.svg" alt="A plain circle with a small dot in the center" style="max-height: 200px; margin-bottom: 0px" />
## When I learned my first programming language
diff --git a/content/posts/it-doesnt-mean-that/wikimedia_monad.svg b/content/posts/it-doesnt-mean-that/wikimedia_monad.svg
new file mode 100644
index 0000000..887c3c6
--- /dev/null
+++ b/content/posts/it-doesnt-mean-that/wikimedia_monad.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-custom-link"/><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-general-link"/><style xmlns="" lang="en" type="text/css" id="dark-mode-custom-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-sheet"/><path fill="#fff" stroke="#000" stroke-width="2" d="M254 128a126 126 0 1 1-252 0 126 126 0 1 1 252 0z"/><path d="M138 128a10 10 0 1 1-20 0 10 10 0 1 1 20 0z"/><script xmlns="" id="bw-fido2-page-script"/></svg> \ No newline at end of file
diff --git a/content/posts/now-2024-fall/diffuser_1.jpg b/content/posts/now-2024-fall/diffuser_1.jpg
new file mode 100644
index 0000000..d5e6693
--- /dev/null
+++ b/content/posts/now-2024-fall/diffuser_1.jpg
Binary files differ
diff --git a/content/posts/now-2024-fall/diffuser_2.jpg b/content/posts/now-2024-fall/diffuser_2.jpg
new file mode 100644
index 0000000..f8c8b84
--- /dev/null
+++ b/content/posts/now-2024-fall/diffuser_2.jpg
Binary files differ
diff --git a/content/posts/now-2024-fall/diffuser_3.jpg b/content/posts/now-2024-fall/diffuser_3.jpg
new file mode 100644
index 0000000..5efa8ab
--- /dev/null
+++ b/content/posts/now-2024-fall/diffuser_3.jpg
Binary files differ
diff --git a/content/posts/now-2024-fall.md b/content/posts/now-2024-fall/index.md
index b71de95..1946eda 100644
--- a/content/posts/now-2024-fall.md
+++ b/content/posts/now-2024-fall/index.md
@@ -35,9 +35,9 @@ extra:
}
</style>
<p class="gallery">
-<a href="/files/diffuser_1.jpg"><img src="/files/diffuser_1.jpg" alt="Sawed and varnished wooden pegs waiting for assembly."></a>
-<a href="/files/diffuser_2.jpg"><img src="/files/diffuser_2.jpg" alt="A plywood board with a single row and column of pegs assembled on top."></a>
-<a href="/files/diffuser_3.jpg"><img src="/files/diffuser_3.jpg" alt="A complete sound diffuser, comprising a sizeable grid of differently angled pegs."></a>
+<a href="diffuser_1.jpg"><img src="diffuser_1.jpg" alt="Sawed and varnished wooden pegs waiting for assembly."></a>
+<a href="diffuser_2.jpg"><img src="diffuser_2.jpg" alt="A plywood board with a single row and column of pegs assembled on top."></a>
+<a href="diffuser_3.jpg"><img src="diffuser_3.jpg" alt="A complete sound diffuser, comprising a sizeable grid of differently angled pegs."></a>
<label>The sound diffuser being built.</label>
</p>
diff --git a/content/posts/now-2024-spring.md b/content/posts/now-2024-spring/index.md
index aa1fe1f..ad10fe5 100644
--- a/content/posts/now-2024-spring.md
+++ b/content/posts/now-2024-spring/index.md
@@ -9,7 +9,7 @@ extra:
Inches of snow are falling on the yard, covering any new green growths. The dog likes it, I don't.
<video width="100%" controls>
-  <source src="/files/jojo-in-snow.webm" type="video/webm">
+  <source src="jojo-in-snow.webm" type="video/webm">
Your browser does not support the video tag.
</video>
diff --git a/content/posts/now-2024-spring/jojo-in-snow.webm b/content/posts/now-2024-spring/jojo-in-snow.webm
new file mode 100644
index 0000000..19047e5
--- /dev/null
+++ b/content/posts/now-2024-spring/jojo-in-snow.webm
Binary files differ
diff --git a/content/posts/now-2024-summer/2024-wines.jpg b/content/posts/now-2024-summer/2024-wines.jpg
new file mode 100644
index 0000000..81cddef
--- /dev/null
+++ b/content/posts/now-2024-summer/2024-wines.jpg
Binary files differ
diff --git a/content/posts/now-2024-summer/aws-exam-drink.jpeg b/content/posts/now-2024-summer/aws-exam-drink.jpeg
new file mode 100644
index 0000000..16f8933
--- /dev/null
+++ b/content/posts/now-2024-summer/aws-exam-drink.jpeg
Binary files differ
diff --git a/content/posts/now-2024-summer.md b/content/posts/now-2024-summer/index.md
index cc7bb74..d716e4a 100644
--- a/content/posts/now-2024-summer.md
+++ b/content/posts/now-2024-summer/index.md
@@ -16,13 +16,13 @@ extra:
- Started learning about wines. Organized a wine tasting. My top pick: Domaine Laroche Chablis 1er Cru Les Vaudevey 2022.
-{{ fig(src="/files/2024-wines.jpg", alt="Wines from the tasting") }}
+{{ fig(src="2024-wines.jpg", alt="Wines from the tasting") }}
### Career
- I passed the **AWS Certified Developer Associate** certificate exam! A celebratory espresso martini was in order. Planning to do **Solutions Architect Associate** next.
-{{ fig(src="/files/aws-exam-drink.jpeg", alt="My hand holding an espresso martini outside in sunny weather") }}
+{{ fig(src="aws-exam-drink.jpeg", alt="My hand holding an espresso martini outside in sunny weather") }}
## Played games
diff --git a/content/posts/now-2025-fall.md b/content/posts/now-2025-fall/index.md
index fe0d1f2..0c21cd6 100644
--- a/content/posts/now-2025-fall.md
+++ b/content/posts/now-2025-fall/index.md
@@ -20,11 +20,11 @@ We've also been planning the wedding that's taking place in 2026. In many ways I
A lot of renovations this summer. One of the biggest ones was the translucent roofing installation:
-{{ fig(src="/files/valokate_1.jpg", alt="Installing the sunroof") }}
+{{ fig(src="valokate_1.jpg", alt="Installing the sunroof") }}
After around six hours (including breaks), it's all done! Just in time for rain.
-{{ fig(src="/files/valokate_2.jpg", alt="Complete sunroof") }}
+{{ fig(src="valokate_2.jpg", alt="Complete sunroof") }}
You can see the gnarly reddish wall in the picture. That and a bunch of other grime and residue was cleaned off as part of a neighborhood exterior painting project. The place is looking a lot nicer now from the outside (no pictures of this I'm afraid).
@@ -73,7 +73,7 @@ I late August I went on a company trip to Krakow, Poland for one weekend. A nice
In September we had booked a trip to Italy with a group of friends. We stayed in Rome for a couple of days, enjoying the 30C heat and sights such as the Villa Borghese. We had already visited the Colosseum and the Vatican on earlier trips so we decided to avoid the queues and visit less popular places. It was the Jubileum year so many sights were jam-packed. After that we got a rental and drove ~500km south to Calabria, where we spent the next week at a really nice villa overlooking the sea.
-{{ fig(src="/files/villa.jpeg", alt="The view from the villa") }}
+{{ fig(src="villa.jpeg", alt="The view from the villa") }}
Later in September I attended EuroBSDCon 2025 in Zagreb, Croatia. A lot of great talks and lab sessions! I might write a conference notes post about the trip.
diff --git a/content/posts/now-2025-fall/valokate_1.jpg b/content/posts/now-2025-fall/valokate_1.jpg
new file mode 100644
index 0000000..1ddccf2
--- /dev/null
+++ b/content/posts/now-2025-fall/valokate_1.jpg
Binary files differ
diff --git a/content/posts/now-2025-fall/valokate_2.jpg b/content/posts/now-2025-fall/valokate_2.jpg
new file mode 100644
index 0000000..3d66088
--- /dev/null
+++ b/content/posts/now-2025-fall/valokate_2.jpg
Binary files differ
diff --git a/content/posts/now-2025-fall/villa.jpeg b/content/posts/now-2025-fall/villa.jpeg
new file mode 100644
index 0000000..51cc84b
--- /dev/null
+++ b/content/posts/now-2025-fall/villa.jpeg
Binary files differ
diff --git a/content/posts/now-2025-summer.md b/content/posts/now-2025-summer/index.md
index 81293ca..d3bbaa5 100644
--- a/content/posts/now-2025-summer.md
+++ b/content/posts/now-2025-summer/index.md
@@ -7,7 +7,7 @@ extra:
kind: now
---
-{{ fig(src="/files/kenrokuen.jpg", alt="A torii gate in the Kenroku-en garden") }}
+{{ fig(src="kenrokuen.jpg", alt="A torii gate in the Kenroku-en garden") }}
Here's three seasons of updates in one package.
@@ -41,7 +41,7 @@ Me and my fiancée made a long-awaited trip to Japan in the spring. We landed in
We traveled the central island, Honshū, for three weeks. Mostly by train, but also by bus. We visited Ōsaka, Nara, Kyōto, Gifu-Takayama, Kanazawa and finally Tōkyō. This route skips the popular south-coast bullet train connection, instead going north through the mountains.
-{{ fig(src="/files/samurai_garden.jpeg", alt="The garden of a preserved samurai family home, with a koi fish pond and stone lantern") }}
+{{ fig(src="samurai_garden.jpeg", alt="The garden of a preserved samurai family home, with a koi fish pond and stone lantern") }}
I got to finally test my Japanese. Speaking was very laborious at first, but it got way easier the more I got to practise. My vocabulary didn't improve that much, but what improved were things like _cadence_, _[aizuchi](https://en.wikipedia.org/wiki/Aizuchi)_, and ability to respond with more natural word choices. Big up to active listening and copying native speakers.
@@ -49,7 +49,7 @@ We ate and drank well. We mostly gravitated towards traditional-style, or _washo
Something to note: pickled veggies go great with meat-centered, hearty meals. We were eager to implement this in our home cooking as soon as we got home.
-{{ fig(src="/files/wagyu_grill.jpeg", alt="Wagyu beef, mushroom and peppers on a tabletop charcoal grill") }}
+{{ fig(src="wagyu_grill.jpeg", alt="Wagyu beef, mushroom and peppers on a tabletop charcoal grill") }}
We visited the obligatory tourist spots, like the _Thousand torī gates_ in Kyōto, and the _Dōtonbori shopping street_ in Ōsaka. We like seeing sights, but we know that our most memorable experiences have always come naturally from exploration and keeping an open mind. That's why we spent only a fraction of our time visiting Tripadvisor locations and most of the time wandering around, following local recommendations and keeping our eyes, ears and nostrils peeled.
diff --git a/content/posts/now-2025-summer/kenrokuen.jpg b/content/posts/now-2025-summer/kenrokuen.jpg
new file mode 100644
index 0000000..f739d82
--- /dev/null
+++ b/content/posts/now-2025-summer/kenrokuen.jpg
Binary files differ
diff --git a/content/posts/now-2025-summer/samurai_garden.jpeg b/content/posts/now-2025-summer/samurai_garden.jpeg
new file mode 100644
index 0000000..f6637b0
--- /dev/null
+++ b/content/posts/now-2025-summer/samurai_garden.jpeg
Binary files differ
diff --git a/content/posts/now-2025-summer/wagyu_grill.jpeg b/content/posts/now-2025-summer/wagyu_grill.jpeg
new file mode 100644
index 0000000..0e835bc
--- /dev/null
+++ b/content/posts/now-2025-summer/wagyu_grill.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter/2025_wrapped_genres.jpeg b/content/posts/now-2025-winter/2025_wrapped_genres.jpeg
new file mode 100644
index 0000000..630be8a
--- /dev/null
+++ b/content/posts/now-2025-winter/2025_wrapped_genres.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter/backdoor_feature_done.jpeg b/content/posts/now-2025-winter/backdoor_feature_done.jpeg
new file mode 100644
index 0000000..a9c71d5
--- /dev/null
+++ b/content/posts/now-2025-winter/backdoor_feature_done.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter/backdoor_feature_wip.jpeg b/content/posts/now-2025-winter/backdoor_feature_wip.jpeg
new file mode 100644
index 0000000..2f381d1
--- /dev/null
+++ b/content/posts/now-2025-winter/backdoor_feature_wip.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter/dopamine_office.jpeg b/content/posts/now-2025-winter/dopamine_office.jpeg
new file mode 100644
index 0000000..aad4e65
--- /dev/null
+++ b/content/posts/now-2025-winter/dopamine_office.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter.md b/content/posts/now-2025-winter/index.md
index 0462760..2fae6f8 100644
--- a/content/posts/now-2025-winter.md
+++ b/content/posts/now-2025-winter/index.md
@@ -64,7 +64,7 @@ In fact, it might be possible to design this in a way that completely does away
Office room number one is now pretty much complete. We tried to combine some of pastel colors and fun patterns, while keeping it smart and tidy.
-{{ fig(src="/files/dopamine_office.jpeg", alt="The dopamine office") }}
+{{ fig(src="dopamine_office.jpeg", alt="The dopamine office") }}
### Backdoor clothes rack and wall feature
@@ -74,17 +74,17 @@ Until now, there has been nowhere to really hang our outdoor clothes nicely. The
So we got the idea to repurpose the empty space in the corner, adding some visual interest with acoustic paneling as well as utility with some colorful "knobs" that you can hang coats and scarves on.
-{{ fig(src="/files/backdoor_feature_wip.jpeg", alt="Install in progress") }}
+{{ fig(src="backdoor_feature_wip.jpeg", alt="Install in progress") }}
And the final product (in completely different lighting):
-{{ fig(src="/files/backdoor_feature_done.jpeg", alt="An installed wood paneling with some coats hanging off of colored knobs") }}
+{{ fig(src="backdoor_feature_done.jpeg", alt="An installed wood paneling with some coats hanging off of colored knobs") }}
The white box is an IKEA shoebox. We keep some dog gear in there.
### Cool dog print
-{{ fig(src="/files/taulu_koira.jpeg", alt="Cool dog") }}
+{{ fig(src="taulu_koira.jpeg", alt="Cool dog") }}
## Games
@@ -116,13 +116,13 @@ The white box is an IKEA shoebox. We keep some dog gear in there.
Mostly [Moomin music](https://youtu.be/Bf1pR4rkPK8). I went to see the _Muumimusiikkia_ show in Musiikkitalo (Helsinki) in November, and after that I haven't been able to get Shiratori's melodies out of my head. This is a positive problem.
-{{ fig(src="/files/muumimusiikkia.jpeg", alt="A photo from our seats at Musiikkitalo, showing the brochure") }}
+{{ fig(src="muumimusiikkia.jpeg", alt="A photo from our seats at Musiikkitalo, showing the brochure") }}
### Spotify Wrapped
I feel like I'm using Spotify less and less. Might drop the subscription in the near future. I really don't like the policies they are driving.
-{{ fig(src="/files/2025_wrapped_genres.jpeg", alt="My top genres, all over the place") }}
+{{ fig(src="2025_wrapped_genres.jpeg", alt="My top genres, all over the place") }}
## Previous update
diff --git a/content/posts/now-2025-winter/muumimusiikkia.jpeg b/content/posts/now-2025-winter/muumimusiikkia.jpeg
new file mode 100644
index 0000000..a99d8f6
--- /dev/null
+++ b/content/posts/now-2025-winter/muumimusiikkia.jpeg
Binary files differ
diff --git a/content/posts/now-2025-winter/taulu_koira.jpeg b/content/posts/now-2025-winter/taulu_koira.jpeg
new file mode 100644
index 0000000..11c4f32
--- /dev/null
+++ b/content/posts/now-2025-winter/taulu_koira.jpeg
Binary files differ
diff --git a/content/posts/qcon-london-2024-takeaways/fish-and-chips-duke-of-argyll.jpg b/content/posts/qcon-london-2024-takeaways/fish-and-chips-duke-of-argyll.jpg
new file mode 100644
index 0000000..a9fefc8
--- /dev/null
+++ b/content/posts/qcon-london-2024-takeaways/fish-and-chips-duke-of-argyll.jpg
Binary files differ
diff --git a/content/posts/qcon-london-2024-takeaways.md b/content/posts/qcon-london-2024-takeaways/index.md
index 17d8b3b..4c644e7 100644
--- a/content/posts/qcon-london-2024-takeaways.md
+++ b/content/posts/qcon-london-2024-takeaways/index.md
@@ -9,7 +9,7 @@ QCon London 2024 was a multidisciplinary software engineering conference in the
This was also my first time in the UK so I had to do some touristing. The weather was a bit chilly, half-cloudy with some intermittent drizzle.
-{{ fig(src="/files/london-from-above.jpg", alt="London from above in the late evening") }}
+{{ fig(src="london-from-above.jpg", alt="London from above in the late evening") }}
## Common themes
@@ -109,4 +109,4 @@ Nothing mindblowing, just good ale and a comfy vibe. A good place to sit out the
I had to eat fish & chips at least once just to check it off my bucket list. I don't know if theirs is the best or even proper, but I enjoyed it a lot.
-{{ fig(src="/files/fish-and-chips-duke-of-argyll.jpg", alt="Fish and chips at the Duke of Argyll") }}
+{{ fig(src="fish-and-chips-duke-of-argyll.jpg", alt="Fish and chips at the Duke of Argyll") }}
diff --git a/content/posts/qcon-london-2024-takeaways/london-from-above.jpg b/content/posts/qcon-london-2024-takeaways/london-from-above.jpg
new file mode 100644
index 0000000..a7762ed
--- /dev/null
+++ b/content/posts/qcon-london-2024-takeaways/london-from-above.jpg
Binary files differ
diff --git a/content/posts/subjective-review-miru/hinokodo-static-abyss.png b/content/posts/subjective-review-miru/hinokodo-static-abyss.png
new file mode 100644
index 0000000..edfac67
--- /dev/null
+++ b/content/posts/subjective-review-miru/hinokodo-static-abyss.png
Binary files differ
diff --git a/content/posts/subjective-review-miru.md b/content/posts/subjective-review-miru/index.md
index d728a45..59ec7e4 100644
--- a/content/posts/subjective-review-miru.md
+++ b/content/posts/subjective-review-miru/index.md
@@ -5,7 +5,7 @@ extra:
kind: note
---
-{{ fig(src="/files/miru_time_to_kill_triple.jpg", alt="A graphic from the first pages of the Miru zine with the text ”Time to kill a god” overlaid on an imposing four-eyed figure.") }}
+{{ fig(src="miru_time_to_kill_triple.jpg", alt="A graphic from the first pages of the Miru zine with the text ”Time to kill a god” overlaid on an imposing four-eyed figure.") }}
## TL;DR
@@ -31,7 +31,7 @@ With definitions out of the way, let me start by saying that _Miru is the best s
## First look
-{{ fig(src="/files/miru_gameplay.jpeg", alt="The Miru zine, polyhedral dice, various stationery and other items strewn across a dining table.") }}
+{{ fig(src="miru_gameplay.jpeg", alt="The Miru zine, polyhedral dice, various stationery and other items strewn across a dining table.") }}
Miru paints a picture of a dystopian, post-metropolitan society future where humans begrudgingly coexist with humanoid and animal-like robots. The story is kicked off in a scene where a farm worker robot kills a relative of the main character in an act of self defense when it evaluates their drunken hooliganism to be a threat. Stricken, the main character vows revenge and sets off to find out the truth about the machines’ origins.
@@ -69,5 +69,5 @@ With that in mind, the designer has released an official soundtrack called [Stat
The concept of a soundtrack for a physical game is badass. I own one physical release of such a thing, the Mörk Borg adventure [Putrescence Regnant](https://jnohr.itch.io/putrescence-regnant), which takes the form of a highly stylized LP disc and sleeve. Very cool.
-{{ fig(src="/files/hinokodo-static-abyss.png", alt="A photo of the Static Abyss minidisk in its enclosure") }}
+{{ fig(src="hinokodo-static-abyss.png", alt="A photo of the Static Abyss minidisk in its enclosure") }}
Photo attribution: [Hinokodo](https://hinokodo.itch.io/static-abyss)
diff --git a/content/posts/subjective-review-miru/miru_gameplay.jpeg b/content/posts/subjective-review-miru/miru_gameplay.jpeg
new file mode 100644
index 0000000..51d8d44
--- /dev/null
+++ b/content/posts/subjective-review-miru/miru_gameplay.jpeg
Binary files differ
diff --git a/content/posts/subjective-review-miru/miru_time_to_kill_triple.jpg b/content/posts/subjective-review-miru/miru_time_to_kill_triple.jpg
new file mode 100644
index 0000000..97be7fe
--- /dev/null
+++ b/content/posts/subjective-review-miru/miru_time_to_kill_triple.jpg
Binary files differ
diff --git a/content/posts/theres-an-rss-feed-now.md b/content/posts/theres-an-rss-feed-now/index.md
index 8ec5448..e52db1a 100644
--- a/content/posts/theres-an-rss-feed-now.md
+++ b/content/posts/theres-an-rss-feed-now/index.md
@@ -7,4 +7,4 @@ extra:
As part of the site build process, I use [`pandoc-rss`](https://github.com/chambln/pandoc-rss) to automatically build an RSS feed of my posts.
-![](https://jan.systems/files/internet_surf.png)
+![](internet_surf.png)
diff --git a/content/posts/theres-an-rss-feed-now/internet_surf.png b/content/posts/theres-an-rss-feed-now/internet_surf.png
new file mode 100644
index 0000000..7787770
--- /dev/null
+++ b/content/posts/theres-an-rss-feed-now/internet_surf.png
Binary files differ
diff --git a/content/posts/unfold.md b/content/posts/unfold/index.md
index 241703a..8ab3b89 100644
--- a/content/posts/unfold.md
+++ b/content/posts/unfold/index.md
@@ -12,7 +12,7 @@ extra:
I recently presented a lightning talk about the IndieWeb and personal websites to my colleagues at the office. Even though I don't normally enjoy presenting, speaking about things I'm passionate about always turns out to be rather easy. The talk and the presentation that I used to support the talk were well received.
</p>
-{{ fig(src="/files/indieweb_presentation.png", alt="A slide from the PowerPoint presentation") }}
+{{ fig(src="indieweb_presentation.png", alt="A slide from the PowerPoint presentation") }}
---
@@ -25,7 +25,7 @@ Later, when I shared my PowerPoint slides in the IndieWeb chat, I was asked if I
So curious in fact, that I decided to study up on the ”HTML slideshow landscape”: what kind of tools there are, how do they work on a static site, things like that. Turns out that a tool called `reveal.js` is very popular and often recommended. An idea entered my mind: what if I could turn an HTML note (like this one that you’re reading) into an HTML slideshow, in a somewhat automated fashion?
</p>
-{{ fig(src="/files/reveal-js-logo.png", alt="Reveal.js logo") }}
+{{ fig(src="reveal-js-logo.png", alt="Reveal.js logo") }}
---
diff --git a/content/posts/unfold/indieweb_presentation.png b/content/posts/unfold/indieweb_presentation.png
new file mode 100644
index 0000000..e9d0096
--- /dev/null
+++ b/content/posts/unfold/indieweb_presentation.png
Binary files differ
diff --git a/content/posts/unfold/reveal-js-logo.png b/content/posts/unfold/reveal-js-logo.png
new file mode 100644
index 0000000..f7b671f
--- /dev/null
+++ b/content/posts/unfold/reveal-js-logo.png
Binary files differ