<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Start at the beginning on East of the Sun, West of the Moon</title>
    <link>https://is-here.com/</link>
    <description>Recent content in Start at the beginning on East of the Sun, West of the Moon</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Erwin Harte</copyright>
    <lastBuildDate>Mon, 13 Nov 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://is-here.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Mastodon server</title>
      <link>https://is-here.com/project/mastodon/</link>
      <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>AWS</category><category>Mastodon</category><category>Terraform</category><guid>https://is-here.com/project/mastodon/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since December 2022.&lt;/p&gt;
&lt;p&gt;
Moved from AWS to Hetzner in November 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;My personal &lt;a href=&#34;https://joinmastodon.org/&#34;&gt;Mastodon&lt;/a&gt; server. The accounts on there are all &lt;em&gt;me&lt;/em&gt;, at this time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://strangeweb.page/&#34;&gt;https://strangeweb.page/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
I wanted to keep this relatively separate from other projects, so I registered a &lt;code class=&#34;verbatim&#34;&gt;.page&lt;/code&gt; domain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;When I migrated to Hetzner, I simplified the setup a bit:&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A single VM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
More than enough CPU, RAM, storage, and of course an IPv4 and an IPv6 address.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Access via &lt;code class=&#34;verbatim&#34;&gt;ssh&lt;/code&gt; locked down&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Only my home IP address can get in. Easily updated when that changes (which is rare).&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The other ports available&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Port 80 (&lt;code class=&#34;verbatim&#34;&gt;http&lt;/code&gt;, in practice really only for LetsEncrypt, but also the classic &lt;code class=&#34;verbatim&#34;&gt;http&lt;/code&gt; to &lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt; redirect), and of course 443 (&lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt;) for the main attraction.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Still using the S3 bucket&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
I plan to migrate that to different object storage in the near future.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Terraform code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
It creates the VM, updates the DNS (A and AAAA records which now live at &lt;a href=&#34;https://desec.io/&#34;&gt;deSEC.io&lt;/a&gt;), as well as reverse DNS managed by Hetzner, then throws &lt;code class=&#34;verbatim&#34;&gt;cloud-init&lt;/code&gt; at it.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The &lt;code class=&#34;verbatim&#34;&gt;cloud-init&lt;/code&gt; setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This takes care of basic conveniences (things like &lt;code class=&#34;verbatim&#34;&gt;emacs&lt;/code&gt;, &lt;code class=&#34;verbatim&#34;&gt;jq&lt;/code&gt;, &lt;code class=&#34;verbatim&#34;&gt;rsync&lt;/code&gt;, and others) but also installs dependencies for Mastodon and prepare it most of the way (skipping the interactive configuration of Mastodon itself).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Code and related things
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Mastodon &lt;a href=&#34;https://docs.joinmastodon.org/user/run-your-own/&#34;&gt;instructions&lt;/a&gt; for setting up your own server&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://codeberg.org/jochie/strangeweb.page/&#34;&gt;Infrastructure as Code&lt;/a&gt; at &lt;a href=&#34;https://codeberg.org/.&#34;&gt;https://codeberg.org/.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Previously
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;The setup in AWS (from 2022-2025) was as follows:&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Basic Virtual Private Cloud (VPC)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Pretty standard setup. A subnet for public facing things (which is the only things in here right now), and one for resources that don&amp;#39;t connect out to the internet. Right now there aren&amp;#39;t any of the latter, but it is good to be prepared&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A bastion server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
A locked down instance that is intended to be the only way to get into the VPC with &lt;code class=&#34;verbatim&#34;&gt;ssh&lt;/code&gt;, with an IP address that is separate from the actual service.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The actual Mastodon server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;An S3 bucket&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This is where Mastodon stores media associated with posts (in the timeline of my accounts, or my own), with a CloudFront shield in front of it&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Terraform code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This managed all of the above.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;For Mastodon upgrades&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
I created &lt;a href=&#34;https://codeberg.org/jochie/misc/src/branch/master/AWS/upscale-downscale.sh&#34;&gt;a script&lt;/a&gt; to temporarily bump up the instance size, because it was unhappy for some of those steps but perfectly content running in a smaller instance during normal operations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>RSS feed fix</title>
      <link>https://is-here.com/post/2025/12/rss-feed-fix/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>Hugo</category><category>Meta</category><comments>https://strangeweb.page/@jochie/115800891782824872</comments><guid>https://is-here.com/post/2025/12/rss-feed-fix/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Looks may be deceiving
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;When I set up a static website my focus around the RSS feed was that I wanted to have the full content, so once I had that, I moved on.&lt;/p&gt;
&lt;p&gt;
Today I noticed that the links back to the posts in the RSS feed (or the link for the site itself) didn&amp;#39;t actually work, they were missing the &lt;code class=&#34;verbatim&#34;&gt;https://is-here.com/&lt;/code&gt; prefix. 🤔&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Thankfully this was a simple fix
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;All that was missing was a &lt;code class=&#34;verbatim&#34;&gt;baseURL&lt;/code&gt; parameter in my &lt;code class=&#34;verbatim&#34;&gt;config.yaml&lt;/code&gt; file. It &lt;em&gt;was&lt;/em&gt; there originally, but it got lost when I migrated from the S3 bucket to &lt;a href=&#34;https://statichost.eu/&#34;&gt;statichost.eu&lt;/a&gt; and revamped my &lt;code class=&#34;verbatim&#34;&gt;config.yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;
Running the local hugo preview with &lt;code class=&#34;verbatim&#34;&gt;--baseURL http://localhost:1313/&lt;/code&gt; to override that, and all is well again in this part of the world.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Teletekst Bot</title>
      <link>https://is-here.com/project/teletekst/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>Mastodon</category><category>Python</category><comments>https://strangeweb.page/@jochie/115805471217337649</comments><guid>https://is-here.com/project/teletekst/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since July 2024&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Monitor the news (&amp;#34;Nieuws&amp;#34; in Dutch) such as it is shared by the &lt;a href=&#34;https://nos.nl/teletekst&#34;&gt;NOS Teletekst&lt;/a&gt;, by checking the references from the index pages at 101, 102, and 103, and then scan for any other pages from 104 to 199.&lt;/p&gt;
&lt;p&gt;
When a new page is found, or an existing page is updated (using a relatively basic heuristic), post the new or updated page to the Mastodon account. It also attempts to detect when a page is moved around.&lt;/p&gt;
&lt;p&gt;
Because occasionally pages are included for sport (in general) or soccer (voetbal), it will use an appropriate &lt;code class=&#34;verbatim&#34;&gt;#TeletekstXYZ&lt;/code&gt; hashtag for that, so people can mute that. The same goes for the content updates, which can be a bit much especially for emerging stories, and get tagged with &lt;code class=&#34;verbatim&#34;&gt;#TeletekstUpdate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
For content updates the posts also includes comparison of the previous and current version with color-coding for words or lines that have been removed, were added, or stayed the same. It&amp;#39;s similar to &lt;code class=&#34;verbatim&#34;&gt;git diff&lt;/code&gt; but has been adapted to make more sense in this text context.&lt;/p&gt;
&lt;p&gt;
If the content was unchanged and only the page number or title changed, the existing Mastodon post is updated in place.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://mstdn.social/@teletekst&#34;&gt;https://mstdn.social/@teletekst&lt;/a&gt; (originally at &lt;a href=&#34;https://botsin.space/@teletekst,&#34;&gt;https://botsin.space/@teletekst,&lt;/a&gt; but that server shut down at the end of 2024).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;There are two Cron jobs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Every 5 minutes a program &lt;em&gt;walks&lt;/em&gt; all the pages from 101 to 199, using the &lt;code class=&#34;verbatim&#34;&gt;next page&lt;/code&gt; references. If all pages are exactly identical, discard the results.

It needs to gracefully handle broken &lt;code class=&#34;verbatim&#34;&gt;next page&lt;/code&gt; links and other quirks.&lt;/li&gt;
&lt;li&gt;Also every 5 minutes, but a minute later, a second program checks if changes were found. If so, look for new pages, deletes pages, moved pages, and modified pages.

Two pages are treated differently, namely the &amp;#34;Kort nieuws binnenland&amp;#34; and &amp;#34;Kort nieuws buitenland&amp;#34;, where one or two short national or international news items are dumped.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Disclaimer
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; an (official or endorsed) &lt;a href=&#34;https://nos.nl/&#34;&gt;NOS.nl&lt;/a&gt; service!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Code
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://codeberg.org/jochie/Teletekst&#34;&gt;https://codeberg.org/jochie/Teletekst&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Backups, What a Concept</title>
      <link>https://is-here.com/post/2025/12/backups-what-a-concept/</link>
      <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>Mastodon</category><category>Backups</category><category>Shell</category><category>Scaleway</category><category>Hetzner</category><comments>https://strangeweb.page/@jochie/115794830473439348</comments><guid>https://is-here.com/post/2025/12/backups-what-a-concept/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
How it started
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For about three years I ran a single-user Mastodon instance at &lt;a href=&#34;https://strangeweb.page/&#34;&gt;strangeweb.page&lt;/a&gt; in AWS, where the non-IaC bits were mostly manually put together. It was also a big example of &amp;#34;Do as I say, don&amp;#39;t do as I do&amp;#34; because I wasn&amp;#39;t maintaining any backups.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
How it&amp;#39;s going
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Recently I moved that instance from AWS EC2 to a Hetzner VM, which meant I had to actually go through the steps of taking the configuration and data from one host to another. As part of that exercise I cobbled together a small shell script that takes those vital bits and copies them to a safe place.&lt;/p&gt;
&lt;p&gt;
In my case that&amp;#39;s object storage at a different provider, avoiding a single point of failure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
The script
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  . &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$0&lt;span style=&#34;color:#e6db74&#34;&gt;.env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Creating a DB snapshot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Create a backup of the mastodon tables:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  sudo -u mastodon &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     pg_dump &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     -Fc mastodon_production &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     -f /home/mastodon/backup.dump
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Creating a Redis snapshot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Create a snapshot of the redis data:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  redis-cli SAVE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; src in &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /home/mastodon/live/.env.production &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /var/lib/redis/dump.rdb &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /home/mastodon/backup.dump; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Backing up &lt;/span&gt;$src&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      aws s3 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          --endpoint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://&lt;/span&gt;$ENDPOINT&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          cp &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          --quiet &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$src&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s3://&lt;/span&gt;$BUCKET&lt;span style=&#34;color:#e6db74&#34;&gt;/snapshot/mastodon/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Done&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The &lt;code class=&#34;verbatim&#34;&gt;.env&lt;/code&gt; file contains two settings: &lt;code class=&#34;verbatim&#34;&gt;ENDPOINT&lt;/code&gt; and &lt;code class=&#34;verbatim&#34;&gt;BUCKET&lt;/code&gt;. The &lt;code class=&#34;verbatim&#34;&gt;ENDPOINT&lt;/code&gt; is necessary because the slightly older &lt;code class=&#34;verbatim&#34;&gt;awscli&lt;/code&gt; version on the host was ignoring the &lt;code class=&#34;verbatim&#34;&gt;endpoint_url&lt;/code&gt; directive in &lt;code class=&#34;verbatim&#34;&gt;~/.aws/config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s a fairly simple file, pointing to an object storage bucket at Scaleway:&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[default]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;region = nl-ams
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output = json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;services = scw-nl-ams&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The other missing piece is &lt;code class=&#34;verbatim&#34;&gt;~/.aws/credentials&lt;/code&gt; with credentials for that bucket/account.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Disclaimer
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Going back to that &amp;#34;Do as I say, don&amp;#39;t do as I do&amp;#34; bit, I have not yet performed the ultimate test of restoring a test-server from the backed up data. So if I&amp;#39;m missing something, maybe let me know so I can fix it before it&amp;#39;s too late? 😅&lt;/p&gt;
&lt;p&gt;
I also know that this only maintains a single snapshot unless the object storage has version support and it&amp;#39;s enabled.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Moving to Europe (part 2)</title>
      <link>https://is-here.com/post/2025/07/moving-to-europe-part-2/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      
      <category>Terraform</category><category>Self-hosting</category><category>LetsEncrypt</category><category>Hetzner</category><category>Scaleway</category><comments>https://strangeweb.page/@jochie/115794020313176152</comments><guid>https://is-here.com/post/2025/07/moving-to-europe-part-2/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
The saga continues
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;After I moved my (three) domains, most of the DNS, and my static websites to Europe I got side-tracked. An interaction with a former colleague nudged me to pick that back up.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Services
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;When I last wrote about it I thought I would land on UpCloud or Scaleway for a virtual server (or two), but now I&amp;#39;m actually working with a virtual server at Hetzner. They do things a little bit differently, so I&amp;#39;m still getting used to that. Both have &lt;em&gt;projects&lt;/em&gt;, which feels like the mental model equivalent of AWS VPCs? Hetzner has performance/usage graphs integrated into their web UI, whereas Scaleway has a hosted Grafana service (for which you need to create a dedicated user). Hetzner&amp;#39;s virtual servers seem more generous with their root volumes, but then it may not be as easy to change that out later, so choose wisely?&lt;/p&gt;
&lt;p&gt;
That said, for something that mostly needs to be compute, storage, and a web presence, Hetzner&amp;#39;s offerings seem quite nice.&lt;/p&gt;
&lt;p&gt;
Currently I&amp;#39;m putting together a &amp;#34;services&amp;#34; instance that will host things like webmail (Roundcube), bookmarks (Readeck), passwords (Vaultwarden, or something along those lines), etc. This would be the same Services project hinted at in the &lt;a href=&#34;https://is-here.com/project/read-later/&#34;&gt;Read Later&lt;/a&gt; project page. The goal here will be to make it relatively painless to blow it away and spin it up elsewhere, so a layer of Terraform, some cloud-init fun, and automatically generated and managed LetsEncrypt certificates are going to be part of that.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Object Storage
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For this, Scaleway still seems to be the most reasonable price, in particular for buckets with not a lot of content. Hetzner &lt;em&gt;starts&lt;/em&gt; at 4.99 Euro for even an empty bucket (which then gets you 1TB of storage and traffic), by comparison. That&amp;#39;s a non-starter for a bucket where I expect to have just a few dozen GB of data. For completeness, UpCloud&amp;#39;s buckets also start at 5 Euros which then includes 250GB of storage, and states there are no data transfer fees, period?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Open questions
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For moving my mail server I still need to do some &lt;em&gt;research&lt;/em&gt; to find out which of these 3 (or some alternative I&amp;#39;ve overlooked or discarded unfairly) is the better pick in terms of IP reputation, or spam abuse complaint handling. Anyone know?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Previously
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://is-here.com/post/2025/04/moving-to-europe/&#34;&gt;Moving to Europe&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Read Later</title>
      <link>https://is-here.com/project/read-later/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      
      <category>Self-hosting</category><category>Docker</category><category>Python</category><comments>https://strangeweb.page/@@jochie/114848668662470733</comments><guid>https://is-here.com/project/read-later/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since July 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;A self-hosted bookmark/read-later service&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://readeck.is-here.com/&#34;&gt;https://readeck.is-here.com/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;This service is setup as one of several virtual hosts on a virtual machine that is dedicated to a couple of these self-hosted things (the project page for is still WIP/AWOL for now).&lt;/p&gt;
&lt;p&gt;
To try and keep the maintenance requirements relatively low I used the docker approach, only sharing the data with the host system so that it is preserved over restarts and can be backed up regularly:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  docker run &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;         --detach &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;         --rm -ti &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;         -p 6080:8000 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;         -v /var/www/readeck:/readeck &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;         codeberg.org/readeck/readeck:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
A fragment of the Apache configuration file:&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ProxyPreserveHost On
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ProxyPass / http://0.0.0.0:6080/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ProxyPassReverse / http://0.0.0.0:6080/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  RequestHeader set X-Forwarded-Proto https&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Disclaimer: I don&amp;#39;t have a lot of experience with the &lt;code class=&#34;verbatim&#34;&gt;proxy&lt;/code&gt; or &lt;code class=&#34;verbatim&#34;&gt;proxy_http&lt;/code&gt; modules, so it&amp;#39;s possible that could be done better. There are more complete instructions on the Readeck &lt;a href=&#34;https://readeck.org/en/docs/deploy&#34;&gt;Deployment&lt;/a&gt; documentation page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Integrating it:
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;ul&gt;
&lt;li&gt;For Firefox I use this &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/user/18046494/&#34;&gt;Readeck add-on&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There is no iOS (or Android, for that matter) app but the (self-hosted) website can be added as a pseudo-app on iOS by using Safari&amp;#39;s &amp;#34;Add to Home Screen&amp;#34;.&lt;/li&gt;
&lt;li&gt;That pseudo-app doesn&amp;#39;t get you a &amp;#34;Share to …&amp;#34; entry, but thankfully there are acceptable workarounds (listed in the &lt;a href=&#34;https://readeck.org/en/docs/faq#is-there-an-android-or-ios-application&#34;&gt;FAQ&lt;/a&gt;) in the form of shortcuts.
It took a little bit of fidgeting to figure out how to configure the shortcut, but after that it was relatively smooth sailing.&lt;/li&gt;
&lt;li&gt;Although it&amp;#39;s somewhat redundant, I also created a script to check my Mastodon bookmarks and import new ones into Readeck. So if I&amp;#39;m in a hurry, I&amp;#39;ll quickly bookmark a &lt;del&gt;post&lt;/del&gt; toot, otherwise I&amp;#39;ll use the &amp;#34;Send Page + Tags To Readeck&amp;#34; shortcut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Code and related things
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Originally I had planned to migrate from Instapaper (the read-later service I used for ~15 years) to a self-hosted &lt;a href=&#34;https://wallabag.it/en/&#34;&gt;Wallabag&lt;/a&gt; instance, but before the dust had even settled on that (meaning figuring out what browser add-on to use or how to integrate it on my phone) &lt;a href=&#34;https://shom.dev/posts/20250629_bookmarking-i-mean-omnivoring-no-hoarding-no-bagging-dot-dot-dot-wait-decking/&#34;&gt;this post&lt;/a&gt; by Shom pointed me towards &lt;a href=&#34;https://readeck.org/en/&#34;&gt;Readeck&lt;/a&gt;. That&amp;#39;s why the scripts below have a migration path from Instapaper -&amp;gt; Wallabag -&amp;gt; Readeck, and not Instapaper -&amp;gt; Readeck.&lt;/p&gt;
&lt;p&gt;
My collection of scripts in this &lt;a href=&#34;https://codeberg.org/jochie/read-later&#34;&gt;read-later repository&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;wallabag_import.py&lt;/code&gt;: Iterate over the Instapaper entries and add them one by one to my (also self-hosted) Wallabag service. For the ~17k bookmarks that I had that took multiple hours and possibly got my IP in trouble with a few websites.&lt;/li&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;readeck_wallabag.py&lt;/code&gt;: Initiate a migration from Wallabag to Readeck (handled entirely by Readeck after that).&lt;/li&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;reprocess_readeck.py&lt;/code&gt;: Loop over all bookmarks in a Readeck collection, re-adding them and deleting the original ones as it goes.&lt;/li&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;bookmark_readeck.py&lt;/code&gt;: Check my Mastodon bookmarks and add any new ones to Readeck&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>WARN Act Bot</title>
      <link>https://is-here.com/project/warn-act/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      
      <category>AWS</category><category>Terraform</category><category>Mastodon</category><comments>https://strangeweb.page/@@jochie/114849277939604707</comments><guid>https://is-here.com/project/warn-act/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since around April 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;As I understand it, there are WARN Acts in most states (maybe all) that require employers of companies over a certain size to give a heads-up to the state when they plan to let go for one reason or another. This could be for permanent closure of a place of business, redundancies for whatever reason, and some other reasons I can&amp;#39;t think of right now. Many states make the notices available in some form on the web. Sadly they don&amp;#39;t seem to have considered standardizing that, so automation based on the content found online is a challenge.&lt;/p&gt;
&lt;p&gt;
In my case, I decided to automate checking the notices for the &lt;a href=&#34;https://edd.ca.gov/en/jobs_and_training/Layoff_Services_WARN&#34;&gt;California EDD&lt;/a&gt;, and post the incremental changes (summarized where possible) on the Fediverse.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://sfba.social/@warn_act_ca&#34;&gt;https://sfba.social/@warn_act_ca&lt;/a&gt; (originally at &lt;a href=&#34;https://botsin.space/@warn_act_ca,&#34;&gt;https://botsin.space/@warn_act_ca,&lt;/a&gt; but that server shut down at the end of 2024).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;The setup (in AWS) is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An S3 bucket to maintain state from one run to another&lt;/li&gt;
&lt;li&gt;A few Systems Manager Parameter Store entries for the knowledge of where the bot is and the token to post to its timeline&lt;/li&gt;
&lt;li&gt;A Lambda that is triggered from EventBridge on a regular basis that checks the California website&lt;/li&gt;
&lt;li&gt;An SQS queue through which to manage the posts to the bot account, with a Lambda consumer that does that work&lt;/li&gt;
&lt;li&gt;Terraform code to create these resources and some tangentially related ones&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Cost
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;$0.00!&lt;/p&gt;
&lt;p&gt;
Actually, the dedicated AWS account in which this runs had a bill for (literally) a few pennies one time, apparently related to AWS Cost Explorer of all things, but otherwise the monthly bills have been $0.00 since I started.&lt;/p&gt;
&lt;p&gt;
The reason is that all of the service usage (S3, Lambda, SNS, SQS, CloudWatch, and data transfer) are all flying well under the limits of the permanent AWS free tiers. The biggest risk is probably S3 where the it&amp;#39;s running up a bill of about $0.005 per month, so each month that is rounded down to $0.00 but when you request an annual total it lists that as ~$0.05. 😁&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Code
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://codeberg.org/jochie/WARN&#34;&gt;https://codeberg.org/jochie/WARN&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>New search engine, who dis?</title>
      <link>https://is-here.com/post/2025/04/new-search-engine-who-dis/</link>
      <pubDate>Tue, 29 Apr 2025 00:00:00 +0000</pubDate>
      
      <category>Search</category><comments>https://strangeweb.page/@jochie/114425002728954497</comments><guid>https://is-here.com/post/2025/04/new-search-engine-who-dis/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Anything but Google
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Like many others I&amp;#39;ve become disenchanted with Google search. So many, in fact, that its dominance is &lt;a href=&#34;https://tuta.com/blog/google-search-dominance-drops&#34;&gt;starting to decline&lt;/a&gt;! Instead, I&amp;#39;ve been using &lt;a href=&#34;https://duckduckgo.com/&#34;&gt;DuckDuckGo&lt;/a&gt; as my default search for the last several years, on desktop and on my phone (with its dedicated application).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
A new player enters the field
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Several posts (the &lt;a href=&#34;https://daringfireball.net/2025/04/try_switching_to_kagi&#34;&gt;Daring Fireball&lt;/a&gt; blog, &lt;a href=&#34;https://mastodon.well.com/@ianb/114417088408207167&#34;&gt;Ian Betteridge&lt;/a&gt; and &lt;a href=&#34;https://mstdn.social/@bbusschots/114417323819643936&#34;&gt;Bart Busschots&lt;/a&gt; in the Fediverse) recently nudged me to try out &lt;a href=&#34;https://help.kagi.com/kagi/company/&#34;&gt;Kagi&lt;/a&gt;. The idea behind their offering is that aside from a 100 searches/month free tier you pay a monthly fee and in return their interface is clean, sparse, and lacks ads.&lt;/p&gt;
&lt;p&gt;
Of course if you&amp;#39;re paying, you need to have an account. Their &lt;a href=&#34;https://help.kagi.com/kagi/faq/faq.html#what-data-does-kagi-collect&#34;&gt;FAQ states&lt;/a&gt; that they only collect the bare minimum of data to run the service and for now I&amp;#39;m giving them the benefit of the doubt on that. Hypothetically it also allows you to set some personal preferences, but I haven&amp;#39;t looked into that yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
The first few searches
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;My usual first searches are vanity searches. That may seem silly, but I would hope that I know reasonably well what to expect there.&lt;/p&gt;
&lt;p&gt;
Kagi did not disappoint:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My LinkedIn profile&lt;/li&gt;
&lt;li&gt;Several Facebook profiles with similar names (my own isn&amp;#39;t public, and covered in dust)&lt;/li&gt;
&lt;li&gt;Some references to the time that I contributed to the &lt;a href=&#34;https://en.wikipedia.org/wiki/Dworkin%27s_Game_Driver&#34;&gt;DGD&lt;/a&gt; ecosystem (parts of the KernelLib, maintaining the network package)&lt;/li&gt;
&lt;li&gt;A YouTube account with all of 2 playlists (Dutch artists, and 80s/90s music, unsurprising)&lt;/li&gt;
&lt;li&gt;A reference to the &lt;a href=&#34;https://sfba.social/@warn_act_ca&#34;&gt;WARN ACT&lt;/a&gt; bot, one of the two that I run on the Fediverse&lt;/li&gt;
&lt;li&gt;Some currently inactive static websites with my name on it still&lt;/li&gt;
&lt;li&gt;A reference to one of few mailing lists that I still vaguely read or contribute to&lt;/li&gt;
&lt;li&gt;My name in a list of Patreon contributors of the &lt;a href=&#34;https://www.patreon.com/dtns/&#34;&gt;DTNS&lt;/a&gt; podcast&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unexpected blasts from the past:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An ancient SourceForge.net profile that I had long since forgotten about (created in 2004)&lt;/li&gt;
&lt;li&gt;A reference to the time that I created a WordPress plugin (not sure I still have that file, and I doubt it still works)&lt;/li&gt;
&lt;li&gt;A name credit in &lt;a href=&#34;https://www.manning.com/books/iphone-in-action&#34;&gt;iPhone in Action&lt;/a&gt; (2008) as found in part on &lt;a href=&#34;https://livebook.manning.com/book/iphone-in-action/about-this-book/&#34;&gt;this website&lt;/a&gt; for a modified bookmarklet to show the source of a web page on the iPhone? I honestly don&amp;#39;t remember that, but seeing as the two authors were the people I worked with at &lt;a href=&#34;https://www.skotos.net/&#34;&gt;Skotos&lt;/a&gt; that makes perfect sense&lt;/li&gt;
&lt;li&gt;And on that note, it found an archived version of that Skotos website as well, and some related pages&lt;/li&gt;
&lt;li&gt;An obscure reference to a &lt;a href=&#34;https://metacpan.org/release/FIREDRAKE/Mail-SpamTest-Bayesian-0.01/view/Bayesian.pm&#34;&gt;Perl module&lt;/a&gt; from 2002 where I contributed some testing and a snippet of code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Weirdest find:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My name in &lt;a href=&#34;https://www.engadget.com/2007-10-10-rumor-apple-to-launch-webapp-consolidation-portal.html&#34;&gt;an Engadget post&lt;/a&gt; from October 2007 by Erica Sadun around an iPhone rumor. This predates my Twitter account, so I have no recollection how I might have passed on the link to that The Register article to her?!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, some interesting finds and I hope it will prove to be equally useful with other types of searches. Fingers crossed!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Moving to Europe</title>
      <link>https://is-here.com/post/2025/04/moving-to-europe/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      
      <category>Hugo</category><category>Mastodon</category><category>Terraform</category><comments>https://strangeweb.page/@jochie/114333655533283802</comments><guid>https://is-here.com/post/2025/04/moving-to-europe/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Shifting things around
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For &lt;em&gt;reasons&lt;/em&gt;, I am slowly but surely moving most of my online resources to European providers. This has meant a journey of discovery, finding suitable ones for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain registration&lt;/li&gt;
&lt;li&gt;DNS hosting&lt;/li&gt;
&lt;li&gt;Some place for a few static (placeholder) websites&lt;/li&gt;
&lt;li&gt;Virtual servers of some kind&lt;/li&gt;
&lt;li&gt;Object storage or something similar&lt;/li&gt;
&lt;li&gt;Git repository hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Resources that helped
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Most of my information has come from &lt;a href=&#34;https://european-alternatives.eu/&#34;&gt;european-alternatives.eu&lt;/a&gt;. Some test accounts were needed here and there because it isn&amp;#39;t necessarily obvious how well they may cooperate with automation tools like Terraform and how much click-ops will be required, and how well does their web UI work in that case.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Obstacles I encountered
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;There were some hiccups with getting the European companies to play nice with my US credit cards.&lt;/p&gt;
&lt;p&gt;
One disappointment was because the company (Infomaniak 🇨🇭) seems to be incapable of sending SMS to US phone numbers. Pity, because they looked promising otherwise.&lt;/p&gt;
&lt;p&gt;
Another &lt;em&gt;Nope&lt;/em&gt; was finding out that OVH 🇫🇷 pushes you to &lt;a href=&#34;https://us.ovhcloud.com/about/&#34;&gt;OVH US&lt;/a&gt; if you&amp;#39;re in the US or Canada, a &lt;em&gt;wholly owned subsidiary of OVH Group&lt;/em&gt;, defeating the purpose of going with European companies.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Choices/solutions
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;My Pick&lt;/th&gt;
&lt;th&gt;Based in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain registration&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.openprovider.com/&#34;&gt;https://www.openprovider.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇳🇱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://desec.io/&#34;&gt;https://desec.io/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇩🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static websites&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.statichost.eu/&#34;&gt;https://www.statichost.eu/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇸🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git repository hosting&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://codeberg.org/&#34;&gt;https://codeberg.org/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇩🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Of these, &lt;a href=&#34;https://www.statichost.eu/&#34;&gt;statichost.eu&lt;/a&gt; was a nice find, because it will let you point to a git repository (public or private), and run with it, with support for either fully static content, or one of several static site generators, and even pick a specific version to avoid surprises.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Still to do
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;That leaves virtual servers, for my self-hosted mail-server and the one-person-Mastodon instance. Most likely I&amp;#39;ll pick one of UpCloud (🇫🇮) or Scaleway (🇫🇷), after sitting down again to do a side-by-side comparison.&lt;/p&gt;
&lt;p&gt;
For object storage Scaleway seems to have a reasonably priced solution, but that also needs another look.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Hello again, world?</title>
      <link>https://is-here.com/post/2023/11/hello-again-world/</link>
      <pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate>
      
      <category>Hugo</category><category>Mastodon</category><category>Meta</category><comments>https://strangeweb.page/@jochie/111407198734333719</comments><guid>https://is-here.com/post/2023/11/hello-again-world/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
From Twitter to Mastodon
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For many years Twitter was my main social media account. My Facebook account has not been visited in many months and Instagram has mostly been kept alive to follow some friends and family&amp;#39;s postings. Though I originally did post from time to time, the last few years it had turned mostly into a read-only account.&lt;/p&gt;
&lt;p&gt;
Then last year around the time of the change in ownership, I gave up on it and began an effort to migrate my 
&lt;em&gt;network&lt;/em&gt; to Mastodon or, more accurately the &lt;a href=&#34;https://en.wikipedia.org/wiki/Fediverse&#34;&gt;Fediverse&lt;/a&gt;. Initially at &lt;a href=&#34;https://mastodon.social/@jochie&#34;&gt;mastodon.social&lt;/a&gt;, the flagship server for the Mastodon software, with an account that I had created in May 2022 but began using in earnest in October. Later I migrated to an account on a &lt;a href=&#34;https://strangeweb.page/@jochie&#34;&gt;personal server&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Starting to feel an itch
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;As I was posting on my Mastodon account, I regularly found myself writing more than was going to fit in the space of the default 500 characters. Sure I could change that default (although it is a &lt;em&gt;little&lt;/em&gt; bit more work than just changing a configuration file entry), but that felt wrong. To me, the fact that I was bumping against that ceiling suggested I was looking for a different medium for those posts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Static Site Generator to the rescue
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;While I did feel the itch to write some longer form things, the idea of running (potentially vulnerable) infrastructure for this that would need to be maintained did not appeal to me.&lt;/p&gt;
&lt;p&gt;
Comes along &lt;a href=&#34;https://en.wikipedia.org/wiki/Hugo_(software)&#34;&gt;Hugo&lt;/a&gt; (docs, themes, etc at the &lt;a href=&#34;https://gohugo.io/&#34;&gt;official website&lt;/a&gt;) which comes with a generous set of themes that can be tweaked as needed, allows me to write posts and other pages in &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org Mode&lt;/a&gt; syntax, and has built-in support for deploying its output into an AWS S3 bucket.&lt;/p&gt;
&lt;p&gt;
More details on the &lt;a href=&#34;https://is-here.com/project/website/&#34;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Website</title>
      <link>https://is-here.com/project/website/</link>
      <pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate>
      
      <category>AWS</category><category>Hugo</category><category>Docker</category><guid>https://is-here.com/project/website/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active in its current form since November 2023 and its current location since March 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;My personal website.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Right &lt;a href=&#34;https://is-here.com/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Content
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Everything on here has been generated once by a so-called &lt;a href=&#34;https://en.wikipedia.org/wiki/Static_site_generator&#34;&gt;SSG&lt;/a&gt; and then dropped in place.&lt;/p&gt;
&lt;p&gt;
The content is generated with &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;. I picked the &lt;a href=&#34;https://themes.gohugo.io/themes/gohugo-theme-ananke/&#34;&gt;Ananke&lt;/a&gt; theme, and made some minor modifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modified the default Hugo RSS template (&lt;code class=&#34;verbatim&#34;&gt;layouts/_default/rss.xml&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the feed to include full posts instead of just the summary&lt;/li&gt;
&lt;li&gt;Add &lt;code class=&#34;verbatim&#34;&gt;&amp;lt;category&amp;gt;&lt;/code&gt; tag(s)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copied and modified the default single (post/project) page (&lt;code class=&#34;verbatim&#34;&gt;layouts/_default/single.html&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Include an optional &amp;#34;Updated …&amp;#34; bit after the original post date&lt;/li&gt;
&lt;li&gt;Move the context menu (with the table of contents and related posts) before the content, which places it to the left of the text, or at the top of page instead of at the bottom in a small screen situation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copied and adapted the main page (&lt;code class=&#34;verbatim&#34;&gt;layouts/index.html&lt;/code&gt;) just to make the text there &lt;em&gt;not&lt;/em&gt; be centered.&lt;/li&gt;
&lt;li&gt;Copied and adapted the footer (&lt;code class=&#34;verbatim&#34;&gt;layouts/partials/site-footer.html&lt;/code&gt;) just so I could make the copyright years be a range instead of just the current year. I tried to put the beginning of the range in the &lt;code class=&#34;verbatim&#34;&gt;copyright&lt;/code&gt; configuration setting but then that ended up looking funny in the RSS source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond that, I&amp;#39;ve left the theme as-is and I&amp;#39;m taking advantage of its (and Hugo&amp;#39;s) features.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Hosting
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Until March 2025 the static site was hosted in an &lt;a href=&#34;https://aws.amazon.com/&#34;&gt;AWS&lt;/a&gt; S3 bucket, made available through a Cloudfront distribution to make it available via &lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
At that point, I moved it to &lt;a href=&#34;https://www.statichost.eu/&#34;&gt;statichost.eu&lt;/a&gt;, which specializes in hosting SSGs, directly from Git repositories, and hosting it with &lt;code class=&#34;verbatim&#34;&gt;http&lt;/code&gt; and &lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Keeping up with the Joneses?
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;As so often happens, I looked away for one minute (alright, closer to 4-5 months) and the version of Hugo that I get when I do a fresh install (from &lt;a href=&#34;https://brew.sh/&#34;&gt;Brew&lt;/a&gt;) is a &lt;em&gt;bit&lt;/em&gt; different than what I started with, and that is going to break some things.&lt;/p&gt;
&lt;p&gt;
To give myself a stable work environment and breathing space I decided to run the &lt;code class=&#34;verbatim&#34;&gt;hugo&lt;/code&gt; command inside a quick&amp;#39;n&amp;#39;dirty container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code class=&#34;verbatim&#34;&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  FROM cibuilds/hugo:0.119.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  EXPOSE 1313&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A super simple &lt;code class=&#34;verbatim&#34;&gt;Makefile&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hugo-docker:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          docker build --tag myhugo .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  server-beta:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          docker-helper server --bind 0.0.0.0 --environment beta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  server-live:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ./docker-helper server --bind 0.0.0.0 --environment live
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  deploy-beta:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ./docker-helper --environment beta &amp;amp;&amp;amp; ./docker-helper deploy --environment beta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  deploy-live:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ./docker-helper --environment live &amp;amp;&amp;amp; ./docker-helper deploy --environment live&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And a shell script to glue it all together:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; $# -eq &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Usage: &lt;/span&gt;$0&lt;span style=&#34;color:#e6db74&#34;&gt; &amp;lt;hugo-arguments&amp;gt;&amp;#34;&lt;/span&gt; 1&amp;gt;&amp;amp;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  DIR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;git rev-parse --show-toplevel&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  docker run -v $HOME/.aws:/home/circleci/.aws -v $DIR:$DIR -p 1313:1313 -w &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;pwd&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -it myhugo hugo $*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That script fires up the container with only the current Git repo exposed within the container, and starting off at the current working directory as well, then running the &lt;code class=&#34;verbatim&#34;&gt;hugo&lt;/code&gt; version that I grabbed. It also shares &lt;code class=&#34;verbatim&#34;&gt;~/.aws&lt;/code&gt; for the deployment steps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I can run a command like this and I can sanity check that the site is going to look ok with that particular version, and then later figure out what needs to be fixed as I nudge the version along at my own pace:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make server-beta&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
And then deploy when I&amp;#39;m happy:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make deploy-live&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Noting that now that I&amp;#39;ve moved to &lt;a href=&#34;https://www.statichost.eu/&#34;&gt;statichost.eu&lt;/a&gt; the &lt;code class=&#34;verbatim&#34;&gt;deploy-*&lt;/code&gt; targets are obsolete, but it&amp;#39;s still useful to test locally with &lt;code class=&#34;verbatim&#34;&gt;server-*&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>About All This</title>
      <link>https://is-here.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://is-here.com/about/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
The Person
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Erwin is a Dutch citizen, living in the United States of America. He considers himself a coder, a programmer, a software engineer, whatever title gets the point across.&lt;/p&gt;
&lt;p&gt;
Most of his &lt;a href=&#34;https://github.com/jochie&#34;&gt;Github&lt;/a&gt; (and a few of the &lt;a href=&#34;https://codeberg.org/jochie&#34;&gt;Codeberg&lt;/a&gt;) repositories are private, but he shares a few scripts written over the years, for fun or for practical purposes.&lt;/p&gt;
&lt;p&gt;
His time on &lt;del&gt;Twitter&lt;/del&gt; &amp;#34;X&amp;#34; has come to an end and instead you can find him hang out &lt;a href=&#34;https://strangeweb.page/@jochie&#34;&gt;on the Fediverse&lt;/a&gt; which, for all its own flaws, has been a much more attractive and friendly alternative.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
This Domain
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;The &lt;code class=&#34;verbatim&#34;&gt;is-here.com&lt;/code&gt; domain was registered a long time ago, for reasons mostly forgotten. Domains and email addresses with it can be funny wordplay, until you find yourself needing to spell out your email address to people that had no idea that domain names can have dashes in them, and that they are actually significant.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
The Disclaimer
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Any opinions on this website are Erwin&amp;#39;s, not those of his employers, past or present.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Contacting Erwin</title>
      <link>https://is-here.com/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://is-here.com/contact/</guid>
      <description>&lt;p&gt;
If you want to contact Erwin, you are invited to reach out via the Fediverse (Mastodon, e.a.). You can find a link to his active account at the top or bottom of all pages. Other options may work as well, but as they tend to involve email in some form or another, you will find that the response time is a bit &lt;em&gt;lacking&lt;/em&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
