<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.notmyhostna.me</title>
    <subtitle>Latests posts on blog.notmyhostna.me</subtitle>
    <link href="https://blog.notmyhostna.me"/>
    <link href="https://blog.notmyhostna.me/feed/" rel="self" type="application/atom+xml"/>
    <updated>2026-03-27T20:21:32+00:00</updated>
    <id>https://blog.notmyhostna.me/feed/</id>
    <author>
        <name>Philipp Defner</name>
        <email>mail@notmyhostna.me</email>
    </author>
        <entry>
        <title>Beets Importer</title>
        <link href="https://blog.notmyhostna.me/posts/beets-importer/"/>
        <id>https://blog.notmyhostna.me/posts/beets-importer/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-03-27T20:15:00+00:00</published>
        <updated>2026-03-27T20:15:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>For managing my music I rely on <a href="https://beets.io">beets</a> to keep my library tidy. Over the years I've built up a big pile of unsorted music that often contains albums or artists I don't really want to import any more, but keep for other reasons. That always made beets import a bit of a hassle as it had to analyse each album before I could hit "Skip". That could take some time, as it also does audio fingerprinting in my case.</p>
<p>A second use case is the quality upgrade of existing albums in my library. I sometimes have a lossless version available in my source directory but to find out which album in my library had such an equivalent was a challenge.</p>
<p>To solve that I've built <a href="https://github.com/dewey/beets-importer">beets-importer</a> over the past days. It's a small TUI that makes it easy to select + import or upgrade entries from your library by giving it both the path to your library, and a source folder full of albums.</p>
<p>You can easily install it via Homebrew if you are curious: <a href="https://github.com/dewey/beets-importer">https://github.com/dewey/beets-importer</a></p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="909">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e01caf9244-1774642633/screenshot-2026-03-26-at-22.05.35@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1135">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/beets-importer/e109d9786c-1774642633/screenshot-2026-03-26-at-22.08.28@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Building my own Swarm / Foursquare / Gowalla on OSM</title>
        <link href="https://blog.notmyhostna.me/posts/building-my-own-swarm-foursquare-gowalla-on-osm/"/>
        <id>https://blog.notmyhostna.me/posts/building-my-own-swarm-foursquare-gowalla-on-osm/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-03-08T17:45:00+00:00</published>
        <updated>2026-03-08T17:45:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>I've been using Swarm / Foursquare and previously also Gowalla (The original and the sadly failed relaunch a few years ago) since 2012. The history that I have in the app is my main reason for using it. While I'm not a check-in maximalist that checks into every subway station or the office, I do it regularly enough to have all important place collected in there. Sometimes it's also just fun to see when you were at a specific place the last time.</p>
<p>A week ago I had the idea of building the same for myself, but based on Open Street Map data. I started with a Rails app running on Postgres and <a href="https://blog.lewagon.com/skills/how-to-turn-your-rails-app-into-a-native-mobile-app/">Hotwire Native</a> which worked very well. As code is cheap these days I wanted to see how building it natively with Swift + Swift UI would work. I added some Open API Swagger documentation to the Rails backend and let Claude take a stab at it.</p>
<p>It did a pretty good job and I've spend the past few days tweaking pieces and adding Sentry so I can track errors. Pretty early on I just started using it as a replacement for Swarm every day. If I encountered some issue I fixed it when I was back at home and gradually it became a stable and full replacement of Swarm. The main difference is that all the data is from open sources (OSM) and all my checkins are in my local Postgres database. I've also built an importer for my Swarm data that I exported directly from Foursquare and mapped all the places that I couldn't match automatically through Latitude and Longitude manually (A handful) through a simple web interface I've added.</p>
<p>For now I'd declare it feature complete but there's some things that might be interesting to add:</p>
<ul>
<li>Make it public so people can sign up too</li>
<li>Publish app on TestFlight, but I'm unsure if that requires a paid account</li>
<li>More charts and insights</li>
<li>Add a light "Follow" system, but that would require some real friends to use it</li>
</ul>
<p>If you are interested in using it, let me know and I'll let you know once there's something to test publicly. That might never happen, but it might. It's just a fun project after all.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/bb99ca1123-1772992713/4891c694-29ec-48a4-9241-7447ce5c6255_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/ed84012a5b-1772992713/9d46f550-8e56-4335-bf9a-80d1576cf36a_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/d16717a57f-1772992713/31e1256a-d92c-4bea-a4e9-05858097a0e7_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/28c67581b7-1772992713/0b182ddc-76ad-4f07-987f-77cc53a4c83c_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/3d7374124c-1772992713/64902415-de0e-4790-9cad-c4c3ddf3760f_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-1800x.webp" class="gallery-item-url" data-pswp-width="1179" data-pswp-height="2556">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/da17f9d76a-1772992713/f9b159d1-eb47-4bfa-a276-d82758d0d0d5_1_102_o-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
<p>After lots of back and forth with Claude I already built some internal landing page, just for fun but I kinda like the look of it. Building frontend code with AI that doesn't scream "AI" is much more complicated than backend work though.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1010">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/900fbb0bfb-1772992967/screenshot-2026-03-08-at-19.01.51@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="970">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/cb6f46112d-1772992967/screenshot-2026-03-08-at-19.02.02@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="919">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-my-own-swarm-foursquare-gowalla-on-osm/5633170c45-1772992967/screenshot-2026-03-08-at-19.02.08@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Grafana Dashboards in git (Git Sync)</title>
        <link href="https://blog.notmyhostna.me/posts/grafana-dashboards-in-git-git-sync/"/>
        <id>https://blog.notmyhostna.me/posts/grafana-dashboards-in-git-git-sync/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-03-06T21:40:00+00:00</published>
        <updated>2026-03-06T21:40:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>Editing Grafana dashboards ~is~ was always such a hassle, if you decide to edit the JSON you'll have to do the "Delete" / "Import" dance in the Grafana UI, or if you decide to edit in the UI you have outdated files in your repository and you'd have to download them periodically.</p>
<p>Recently they released a new feature in preview called <a href="https://grafana.com/docs/grafana/latest/as-code/observability-as-code/git-sync/">Git Sync</a> which solves all of these issues. You set up a repositor on GitHub, link it in the Grafana UI (after enabling this experimental feature on your Grafana container through an environment flag if you self-host it) and you are done.</p>
<p>After you set it up you'll see a new folder with a "Sync" icon next to it, but it will be empty. It seems like there's no great way to just "move" existing dashboards into the new synced folder so you'll have to export them, then check them into the repo and wait a few seconds until they are synced in the UI.</p>
<p>I just had to run this in the checked out repository on my local machine:</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">brew install grafanactl
</span></span><span class="line" data-line="2"><span class="token">grafanactl config set contexts.default.grafana.server http://notmyhostna-me:3001
</span></span><span class="line" data-line="3"><span class="token">grafanactl config set contexts.default.grafana.token glsa_restofyourtoken
</span></span><span class="line" data-line="4"><span class="token">grafanactl config set contexts.default.grafana.org-id 1
</span></span><span class="line" data-line="5"><span class="token">grafanactl resources pull dashboards --path ./dashboards/
</span></span></code></pre>
<p>Then commit the resulting files and wait until they show up in the UI. Took around 30 seconds in my case.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="542">
        <img src="https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/grafana-dashboards-in-git-git-sync/e835314a08-1772833763/screenshot-2026-03-06-at-22.48.42@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Alfred workflow to access my selfhosted tools</title>
        <link href="https://blog.notmyhostna.me/posts/alfred-workflow-to-access-my-selfhosted-tools/"/>
        <id>https://blog.notmyhostna.me/posts/alfred-workflow-to-access-my-selfhosted-tools/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-02-13T21:55:00+00:00</published>
        <updated>2026-02-13T21:55:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>Over the past years I've accumulated a bunch of self-hosted software on my server (Miniflux, Plex, Radarr, Sonarr and the usual suspects). Since Tailscale became a thing I don't expose them on subdomains any more like and usually just access them through a bookmarked "Server" folder in Safari. This folder became crowded over time and also required...clicks so today I decided to improve that.</p><p>I'm already using <a href="https://alfred.app">Alfred.app</a> as my clipboard manager and partially as an app launcher (Mostly Spotlight though), today I've added a new custom Alfred Workflow that allows me to open my self-hosted tools in the browser through Alfred. I've added a tiny API on my Intranet that returns the list of web interfaces that are available on my server and now by just opening Alfred, typing "s" and then fuzzy searching through all of them I can launch them instantly.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="646">
        <img src="https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/alfred-workflow-to-access-my-selfhosted-tools/f59022bfb9-1771020001/screenshot-2026-02-13-at-15.57.15.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<p>On the server side it's just returning a simple list like the following, so the Alfred workflow is always up to date.</p>
<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">[
</span></span><span class="line" data-line="2"><span class="token">  {
</span></span><span class="line" data-line="3"><span class="token">    &quot;id&quot;: &quot;grafana&quot;,
</span></span><span class="line" data-line="4"><span class="token">    &quot;title&quot;: &quot;Grafana&quot;,
</span></span><span class="line" data-line="5"><span class="token">    &quot;description&quot;: &quot;Metrics visualization and dashboarding&quot;,
</span></span><span class="line" data-line="6"><span class="token">    &quot;url&quot;: &quot;http://notmyhostna-me:3001&quot;,
</span></span><span class="line" data-line="7"><span class="token">    &quot;category&quot;: &quot;monitoring&quot;,
</span></span><span class="line" data-line="8"><span class="token">    &quot;type&quot;: &quot;docker&quot;,
</span></span><span class="line" data-line="9"><span class="token">    &quot;icon&quot;: &quot;https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/grafana.png&quot;
</span></span><span class="line" data-line="10"><span class="token">  },
</span></span><span class="line" data-line="11"><span class="token">  {
</span></span><span class="line" data-line="12"><span class="token">    &quot;id&quot;: &quot;birdhomie&quot;,
</span></span><span class="line" data-line="13"><span class="token">    &quot;title&quot;: &quot;Birdhomie&quot;,
</span></span><span class="line" data-line="14"><span class="token">    &quot;description&quot;: &quot;Bird identification service (Dokku app)&quot;,
</span></span><span class="line" data-line="15"><span class="token">    &quot;url&quot;: &quot;http://notmyhostna-me:5000&quot;,
</span></span><span class="line" data-line="16"><span class="token">    &quot;category&quot;: &quot;applications&quot;,
</span></span><span class="line" data-line="17"><span class="token">    &quot;type&quot;: &quot;dokku&quot;,
</span></span><span class="line" data-line="18"><span class="token">    &quot;icon&quot;: &quot;http://notmyhostna-me:5000/favicon.ico&quot;
</span></span><span class="line" data-line="19"><span class="token">  }
</span></span><span class="line" data-line="20"><span class="token">]
</span></span></code></pre>                ]]>
        </content>
    </entry>
        <entry>
        <title>Another rabbit hole: Paperless-ngx</title>
        <link href="https://blog.notmyhostna.me/posts/another-rabbit-hole-paperless-ngx/"/>
        <id>https://blog.notmyhostna.me/posts/another-rabbit-hole-paperless-ngx/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-01-25T20:25:00+00:00</published>
        <updated>2026-01-25T20:25:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>As part of my quest to make things in my daily life more complicated I stumbled upon <a href="https://docs.paperless-ngx.com">Paperless-ngx</a> a few times already. This weekend I finally went ahead and set it up on my Synology NAS (In Docker and with sqlite as the database) and was pleasently surprised. It was very simple to set up and with Tailscale and <a href="https://swift-paperless.gessinger.dev">Swift Paperless</a> for iOS I now have access to all my documents that are safely stored at home, from anywhere.</p>
<p>Until now I've used <a href="https://c-command.com/eaglefiler/">EagleFiler</a> which I really liked, but had the downside that there was no easy way to access all my documents when I'm not in front of my computer. Sometimes it's good to be able to pull up a scan of some important document while you are out and about.</p>
<h2>What works well</h2>
<ul>
<li>UI: Simple and powerful. Very good multi-selects and ways to apply tags and flag documents to easily put everything in the right categories</li>
<li>Responsive maintainers on Github and big community on Matrix</li>
<li>Lots of neat little features, well structured</li>
<li>Integrates with <a href="https://www.home-assistant.io/integrations/paperless_ngx/">Home Assistant</a>, so I can get a push notification if there's a new document to review</li>
<li>Imports file attachments directly from multiple Email accounts</li>
<li>Potentially possible to contribute code myself, I got the development setup up and running locally and was able to add a small feature ("Retry" button on tasks) for myself.</li>
<li>"Saved views" are a great and well implemented feature</li>
</ul>
<h2>What didn't work so well</h2>
<ul>
<li>Matching: Matching the documents to "Correspondants" didn't work very reliably and often times picked random ones. This might get better over time as it's ML powered and in theory learns from your assigned documents.</li>
<li>Some parts are still a bit rough (Duplicate handling, logs having stack traces for expected events like dupliates)</li>
<li>Many settings are applied via the environment variables instead of in the UI so not that discoverable</li>
<li>Import tasks ("Consumer") don't feel super stable. I had many errors like <a href="https://github.com/paperless-ngx/paperless-ngx/discussions/10213">&quot;Database is locked&quot;</a> or <a href="https://github.com/paperless-ngx/paperless-ngx/discussions/2682">&quot;File not found&quot;</a> that needed to be fixed by restarting Paperless completely. Annoyingly there's no auto-retry on  these transitive errors.</li>
</ul>
<p>It looks like they are currently <a href="https://github.com/paperless-ngx/paperless-ngx/pulls?q=is%3Aopen+is%3Apr+milestone%3Av3.0.0">working on v3</a> so some of my points above might already be resolved there.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="823">
        <img src="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/553c00d5c5-1769373308/screenshot-2026-01-25-at-21.31.30@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-1800x.webp" class="block-image-url" data-pswp-width="1720" data-pswp-height="1298">
        <img src="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/another-rabbit-hole-paperless-ngx/9bde54fc83-1769374185/screenshot-2026-01-25-at-21.47.03@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    Push notification if there's a new document. Paperless integration for Home Assistant.  </figcaption>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Tailscale Subnet routers</title>
        <link href="https://blog.notmyhostna.me/posts/tailscale-subnet-routers/"/>
        <id>https://blog.notmyhostna.me/posts/tailscale-subnet-routers/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-01-24T22:00:00+00:00</published>
        <updated>2026-01-24T22:00:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>Recently I had the use case that I needed to access a device which was located in the local network of my home A, from my computer located in the home B. If this would be a server or some kind of computer where I could install the Tailscale client that would be easily solvable.</p>
<p>In this case it was a UniFi webcam (Upcoming blogpost alert!) that I needed to access from the other network. The only Tailscale node I had in the network of home A was an Apple TV running Tailscale. I was investigating how I could use this as some kind of "jumpbox" into the network and learned about a Tailscale feature I wasn't familiar with: <a href="https://tailscale.com/kb/1019/subnets">Subnet routers</a></p>
<p>In short, after you enable it (A checkbox in the Tailscale client on the Apple TV in this case) you can reach IPs distributed by the DHCP server in the network at home A, just like if they would be connected to your local network in home B. This doesn't just apply to devices running Tailscale clients, but every device (Webcam, light bulbs etc.).</p>
<p>The only requirement is that the networks don't overlap. That makes sense, so that if I run "ping 192.168.0.2" while being connected to home B's network it's clear which one to reach.</p>
<ul>
<li>Home A: 192.168.0.*</li>
<li>Home B: 192.168.1.*</li>
</ul>
<p>That there's a Tailscale app for tvOS was surprising when I first found out about it when I started with Tailscale, but it has enabled a lot of great use cases like a personal residential proxy and now a Tailscale jumpbox without running a server with fans and spinning disks.</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>I found the perfect yearly calendar (for me)</title>
        <link href="https://blog.notmyhostna.me/posts/i-found-the-perfect-yearly-calendar-for-me/"/>
        <id>https://blog.notmyhostna.me/posts/i-found-the-perfect-yearly-calendar-for-me/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-01-21T23:05:00+00:00</published>
        <updated>2026-01-21T23:05:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>The new year has started and I was once again looking for a simple calendar to do some yearly planning. I've tried to find something for this use case for <a href="https://x.com/tehwey/status/1614201251356463106">a while now</a> and all the apps or templates I've tried didn't have all the features I wanted:</p>
<ol>
<li>See every day of the year, with enough space to add something</li>
<li>Make it easy to mark "ranges" for periods where I might want to stay abroad or go on vacation</li>
<li>See important calendar events like birthdays</li>
<li>See public holidays / weekends</li>
</ol>
<p>A digital solution mostly compromised on visibility. In Apple Calendar it's not possible to see the full year, and still have some visibility into which events are happening on the individual days. You'd only see that there's <em>something</em> happening.</p>
<p>Analog, paper based calendars or dedicated yearly planners didn't have my personal calendar events, unless I'd manually transcribe all birthdays or other important events every year.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-1800x.webp" class="block-image-url" data-pswp-width="1194" data-pswp-height="1142">
        <img src="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c830d47418-1769036739/screenshot-2026-01-22-at-00.04.21@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<p>A few days ago I finally found a way to do that through a small company from Norway called <a href="https://www.timeanddate.com/company/">Time and Date</a>. They check all the boxes. The "Multi Month" calendar without their logo requires a small fee of 15$ / year for their <a href="https://www.timeanddate.com/services/supporter.html">Supporter</a> plan.</p>
<p>After I configured everything I noticed one small but important missing feature. While they offer a way to add multiple lists of events (For example for yourself, and another one for a partner), they don't offer an ics (Calendar files, like you can export from Calendar.app) import. Without that you'd need to enter all events one by one through their web interface.</p>
<p>After observing some requests on their website on doing some digging into their internal API I gave that task to Claude and within 15 minutes I had a working userscript that I could use with <a href="https://www.tampermonkey.net/index.php?browser=safari&amp;locale=en">Tampermonkey</a> in Safari to quickly import all birthdays I've exported from Calendar.app on my Mac with one click.</p>
<p>If you are interested in the script, it's all here and should work out of the box: <a href="https://github.com/dewey/userscript-timeanddate-ics-importer">https://github.com/dewey/userscript-timeanddate-ics-importer</a></p>
<p>I then generated the calendar with the settings I wanted and downloaded the PDF. A quick stop at my local copy shop where I printed it in A2 and I had a nice calendar to tape to my door.</p>
<p>During the year I'll add additional birthdays and events I forgot, and transcribe them into my digital calendar at the end of the year, to be imported again on the 2027 version.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1017">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/60196423a8-1769038312/screenshot-2026-01-22-at-00.09.38@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1359">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/0f6961172b-1769038312/screenshot-2026-01-22-at-00.10.01@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1350">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/892b6eded0-1769208776/img_7910-2-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1350">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/i-found-the-perfect-yearly-calendar-for-me/c54e00d987-1769208760/img_7907-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Impressed by Synology Support</title>
        <link href="https://blog.notmyhostna.me/posts/impressed-by-synology-support/"/>
        <id>https://blog.notmyhostna.me/posts/impressed-by-synology-support/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2026-01-11T17:50:00+00:00</published>
        <updated>2026-01-11T17:50:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>I've <a href="https://blog.notmyhostna.me/posts/synology-drive-spawning-too-many-connections">recently written about an issue</a> that I have been experiencing with Synology Drive on macOS for many months.</p>
<p>These days when you are running into an issue with some app or any paid(!) or unpaid service of a big tech company you are usually already prepared to just find another solution as support is generally non existant. If you are blessed with a response they will usually just feed you basic throubleshooting steps like "Have you tried to wipe your NAS and re-install everything?" or telling you to go away with some variation of "Thanks for the feedback, we'll take that into consideration for future product updates".</p>
<p>With that in mind I was opening a support request through Synology's website and provided some debug information I have collected, fully prepared to never hear from them again. Especially as my NAS is already many years old and I'm not paying for any current services of Synology.</p>
<h1>Timeline</h1>
<p>On the next day I've already heard back from them with some instructions on how to submit standardized debug logs from the Synology Drive client and server. I chalked this up to the usual automated process and didn't think much of it. I submitted the logs and a few days later, to my surprise, the ticket got escalated to a developer.</p>
<p>In the next ticket I was asked to give them access to my NAS through some temporary support account that you can easily create right through the interface. Through that they were hoping to reproduce this specific issue with my NAS and their lab setup directly.</p>
<p>I've then provided detailed timestamps and graphs of connection counts on my machine after starting Synology Drive with the following commands:</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">~ ❯❯❯ watch -n 5 'echo "$(date +%s),$(netstat -an | grep TIME_WAIT | wc -l)" &gt;&gt; time_wait_2025-12-31.csv'                                                                                                                                                                
</span></span><span class="line" data-line="2"><span class="token">~ ❯❯❯ gnuplot -e "                                                                                                                                                                                                                                                     
</span></span><span class="line" data-line="3"><span class="token">set terminal pngcairo size 1200,600;
</span></span><span class="line" data-line="4"><span class="token">set output 'time_wait_2025-12-31.png';
</span></span><span class="line" data-line="5"><span class="token">set datafile separator ',';
</span></span><span class="line" data-line="6"><span class="token">set xdata time;
</span></span><span class="line" data-line="7"><span class="token">set timefmt '%s';
</span></span><span class="line" data-line="8"><span class="token">set format x '%H:%M';
</span></span><span class="line" data-line="9"><span class="token">set title 'TIME_WAIT sockets over time';
</span></span><span class="line" data-line="10"><span class="token">set xlabel 'Time';
</span></span><span class="line" data-line="11"><span class="token">set ylabel 'Count';
</span></span><span class="line" data-line="12"><span class="token">plot 'time_wait_2025-12-31.csv' using 1:2 with lines title 'TIME_WAIT';
</span></span><span class="line" data-line="13"><span class="token">"
</span></span></code></pre>
<p>To my surprise I received a message from Synology a few days later. <strong>They were able to identify the issue and even prepared a patched version</strong> that I was asked to run.</p>
<blockquote>
<p>We found that during a reindex process, the Drive Client may trigger a large number of file change notifications at once. In this scenario, those notifications were sent in a single burst, which can result in a very high number of short-lived TCP connections in some scenarios. </p>
<p>To address this, our team has prepared a patch that changes this behavior so that notifications are sent in batches instead of all at once, reducing the number of concurrent connections created during reindexing.</p>
<p>Please install the attached(on the left side of this ticket) Synology Drive Client patch on your Mac and observe whether the TIME_WAIT connection count and network behavior improve.</p>
</blockquote>
<p>This version fixes the issue and it will be released for all customers soon. I'll be watching the <a href="https://www.synology.com/releaseNote/SynologyDriveClient">changelog</a> closely to know when I can switch back to the main update path and not running a patched version.</p>
<p><strong>Update 2026-01-14</strong>: A new version containing that fix <a href="https://www.synology.com/de-de/releaseNote/SynologyDriveClient">was just published</a> with the changelog quoted below. That was even faster than expected.</p>
<blockquote>
<p>macOS: Fixed an issue where syncing a large number of files in macOS On-demand Sync tasks could cause the computer to slow down or temporarily lose its internet connection.</p>
</blockquote><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1079">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/738478943d-1768155185/screenshot-2026-01-11-at-18.55.04@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-1800x.webp" class="gallery-item-url" data-pswp-width="1200" data-pswp-height="600">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/impressed-by-synology-support/df18c52422-1768155195/time_wait_2025-12-31-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>What I wish existed for self-hosted databases</title>
        <link href="https://blog.notmyhostna.me/posts/what-i-wish-existed-for-self-hosted-databases/"/>
        <id>https://blog.notmyhostna.me/posts/what-i-wish-existed-for-self-hosted-databases/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-12-06T20:10:00+00:00</published>
        <updated>2025-12-06T20:10:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>In a recent discussion on HN I've mentioned that self-hosting databases is still a bit of a pain compared to running one on a cloud hoster. Someone asked "why" so I thought I'll just quickly write it down here.</p>
<p>Running something like Postgres on a server is easy. You either install some package and start the service, or you run it in Docker. This is just a small part of the task though, after that you'll have to research the right script for your backup cron jobs and figure out how to get alerted on failed backups. In the future you'll have to figure out how to restore a backup, upgrade your database or see what you have to do to create a read-only standby instance that receives replication events from your main database.</p>
<p>On a cloud hoster this is usually a few clicks away where you just select what kind of database you want and how many resources you think you'll need. You can be certain that backups work and you just have to select which point in time you want to restore to. This is something that, to my knowledge, doesn't exist yet.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/a40e3aa38b-1765220986/screenshot-2025-12-06-at-21.09.54@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1576" data-pswp-height="1344">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/44ce8244b4-1765220986/screenshot-2025-12-06-at-21.10.24@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
<p>There's a project that I've recently found that covers the "backup" use case, including webhooks being sent on successful or failed backups. It's called <a href="https://github.com/eduardolat/pgbackweb">pgbackweb</a>  and seems to work fine so far.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="1005">
        <img src="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/what-i-wish-existed-for-self-hosted-databases/8ed7e5694f-1765221169/screenshot-2025-12-08-at-20.12.28@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<p>I'm still looking for something that is closer to a cloud provider and includes provisioning, backups and other maintenance tasks like setting up replicas. Ideally it would not be exclusively for Postgres but also include other data stores.</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>Synology Drive spawning too many connections</title>
        <link href="https://blog.notmyhostna.me/posts/synology-drive-spawning-too-many-connections/"/>
        <id>https://blog.notmyhostna.me/posts/synology-drive-spawning-too-many-connections/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-11-17T19:10:00+00:00</published>
        <updated>2025-11-17T19:10:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p><strong>Update January 2026: This issue is being fixed in a future version of Synology Drive for macOS, <a href="https://blog.notmyhostna.me/posts/impressed-by-synology-support">see more details in this blog post</a>.</strong></p>
<p>In the past few months I had a lot of weird issues with my new (and with a clean install of macOS) computer. I especially noticed that while running <code>brew update</code>. It would just have issues connecting to the internet and immediately re-running the command usually fixed the issue right away. This was also noticeable in other tasks like updating Ruby gems. It was annoying, but not annoying enough to drop everything and start investigating.</p>
<p>It usually looked like this:</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">==&gt; Updating Homebrew...
</span></span><span class="line" data-line="2"><span class="token">fatal: unable to access 'https://github.com/Homebrew/brew/': Failed to connect to github.com port 443 after 1 ms: Couldn't connect to server
</span></span><span class="line" data-line="3"><span class="token">fatal: unable to access 'https://github.com/shopify/homebrew-shopify/': Failed to connect to github.com port 443 after 1 ms: Couldn't connect to server
</span></span><span class="line" data-line="4"><span class="token">fatal: unable to access 'https://github.com/stripe/homebrew-stripe-cli/': Failed to connect to github.com port 443 after 1 ms: Couldn't connect to server
</span></span><span class="line" data-line="5"><span class="token">Error: Fetching /opt/homebrew failed!
</span></span><span class="line" data-line="6"><span class="token">Fetching /opt/homebrew/Library/Taps/shopify/homebrew-shopify failed!
</span></span><span class="line" data-line="7"><span class="token">Fetching /opt/homebrew/Library/Taps/stripe/homebrew-stripe-cli failed!
</span></span></code></pre>
<p>Problems like these are very hard to debug as it could be anything from something being wrong in your Wifi Access Point, a faulty Ethernet cable, buggy IPv6 or so some obscure DNS issue at your ISP (Usually it's just your local PiHole, but not in this case).</p>
<p>After not being able to fix it over months I gave <a href="https://www.warp.dev">Warp.app</a> that task to debug. It's basically Terminal.app with built-in AI, so it can debug this much quicker and run all kinds of debug commands that I would otherwise have to piece together for hours.</p>
<p>It found two issues over a few sessions:</p>
<ol>
<li>Stale network interfaces from Tailscale (I guess some buggy old version that didn't clean up after itself), but sadly cleaning that up didn't fix the issue.</li>
<li>Synology Drive was hogging all my open ports and that was the reason why new connections could not be established unless some of the stale connections expire. That's why it usually started working after a few seconds.</li>
</ol>
<p>From then on I always had a Terminal window running the following command open.</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">watch -n 5 'netstat -an | grep TIME_WAIT | wc -l'
</span></span></code></pre>
<p>Sure enough it always hovered around 15k when Synology Drive was running. Quitting it immediately made that number drop down to &lt; 5 connection attempts with the <code>TIME_WAIT</code> status. With these new search terms I was also able to track down <a href="https://community.synology.com/enu/forum/1/post/146044?reply=456875">a thread on the Synology forum</a> that mentions this issue, sadly with no responses. Even with the right search terms I was not able to track down other uses with that issue.</p>
<p>The directory I'm syncing has 30k image files, which doesn't seem like an unusual amount. If anyone else runs into that and finds this through a search engine, let me know how you fixed it!</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1265">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/dc9aed4052-1763407223/screenshot-2025-11-14-at-23.06.36@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1267">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/synology-drive-spawning-too-many-connections/114b545ded-1763407223/screenshot-2025-11-14-at-23.06.28@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Cleaning up Amazon Glacier</title>
        <link href="https://blog.notmyhostna.me/posts/cleaning-up-amazon-glacier/"/>
        <id>https://blog.notmyhostna.me/posts/cleaning-up-amazon-glacier/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-11-15T12:00:00+00:00</published>
        <updated>2025-11-15T12:00:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>I've switched all my backups to Backblaze a while ago but I was pushing back the task of removing the old backups from Amazon Glacier. These were done through <a href="https://www.arqbackup.com">Arq Backup</a> a while ago, from a different machine.</p>
<p>I had a monthly reminder for that task (The Amazon billing notification) so I finally set out to do that, dug up my old credentials and logged in. To my surprise I realized that you can't just delete the archive via the Amazon interface, even if there's a "Delete" button.</p>
<p>You also can't just delete it through the <code>aws</code> command line tools. You have to write custom code to generate a list of files (It's an async job, that takes ~4 hours), then delete them one by one (Following strict rate limitings from Amazon's side) and then 24 hours later the count on Amazon will update and you can finally use the "Delete" button on the empty archive in the interface.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-1800x.webp" class="block-image-url" data-pswp-width="1460" data-pswp-height="762">
        <img src="https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/cleaning-up-amazon-glacier/e1064a4247-1763208142/screenshot-2025-11-13-at-21.01.02@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<p>There's <a href="https://repost.aws/questions/QUyId6AQw6S9OZNy5D9rb-Gw/how-to-delete-s3-glacier-vault-with-archive">many</a> <a href="https://gist.github.com/veuncent/ac21ae8131f24d3971a621fac0d95be5">projects</a> and <a href="https://github.com/leeroybrun/glacier-vault-remove">scripts</a> online to do that already but they didn't immediately work for me, so I just vibe coded my own which ran over night and finished successfully.</p>
<p>Maybe it's helpful for someone else too.</p>
<h2>Step 1</h2>
<p>Create an inventory of files:</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">   aws glacier initiate-job \
</span></span><span class="line" data-line="2"><span class="token">     --job-parameters '{"Type": "inventory-retrieval"}' \
</span></span><span class="line" data-line="3"><span class="token">     --account-id 1234 \
</span></span><span class="line" data-line="4"><span class="token">     --region eu-west-1 \
</span></span><span class="line" data-line="5"><span class="token">     --vault-name arq_123
</span></span></code></pre>
<p>You can check the progress with the following command, but expect it to take up to 4 hours.</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">aws glacier list-jobs \
</span></span><span class="line" data-line="2"><span class="token">  --account-id 123 \
</span></span><span class="line" data-line="3"><span class="token">  --region eu-west-1 \
</span></span><span class="line" data-line="4"><span class="token">  --vault-name arq_123
</span></span></code></pre>
<h2>Step 2</h2>
<p>Download the list of files in the inventory, once above tells you the job is finished.</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">aws glacier get-job-output \
</span></span><span class="line" data-line="2"><span class="token">  --account-id 534475282219 \
</span></span><span class="line" data-line="3"><span class="token">  --region eu-west-1 \
</span></span><span class="line" data-line="4"><span class="token">  --vault-name arq_123 \
</span></span><span class="line" data-line="5"><span class="token">  --job-id YOUR_JOB_ID \
</span></span><span class="line" data-line="6"><span class="token">  output.json
</span></span></code></pre>
<p>Then run the following Go script: <a href="https://gist.github.com/dewey/c402354c33e31cdd6e1f53d5a9e82f05">https://gist.github.com/dewey/c402354c33e31cdd6e1f53d5a9e82f05</a></p>
<p>The output looks like the following, make sure you are logged into <code>aws</code> in your command line through something like: <code>aws sts get-caller-identity</code>.</p>
<h2>Step 3</h2>
<p>After 24 hours this should be reflected in the AWS interface and you should be able to delete the bucket.</p>
<pre class="phiki language-bash github-light-default" style="background-color: #ffffff;color: #1f2328;" data-language="bash"><code><span class="line" data-line="1"><span class="token" style="color: #cf222e;">~</span><span class="token">/m/g/d/aws-glacier-cleanup ❯❯❯ ./glacier-cleanup -account-id 123 -region eu-west-1 -vault-name arq_123 -input output-archive-ids.txt
</span></span><span class="line" data-line="2"><span class="token">2025/11/14 22:54:39 Starting AWS Glacier cleanup at 2025-11-14T22:54:39+01:00
</span></span><span class="line" data-line="3"><span class="token">2025/11/14 22:54:39 Account ID: 123, Region: eu-west-1, Vault: arq_123
</span></span><span class="line" data-line="4"><span class="token">2025/11/14 22:54:39 Using existing archive ID list from output-archive-ids.txt
</span></span><span class="line" data-line="5"><span class="token">2025/11/14 22:54:39 Total archives to delete: 756033
</span></span><span class="line" data-line="6"><span class="token">2025/11/14 22:54:39 Archives already deleted: 43965
</span></span><span class="line" data-line="7"><span class="token">2025/11/14 22:54:39 Archives remaining: 712068
</span></span><span class="line" data-line="8"><span class="token">2025/11/14 23:30:48 Progress: 35603/712068 deleted, 0 failed (5.0% complete) - 2025-11-14T23:30:48+01:00
</span></span><span class="line" data-line="9"><span class="token">2025/11/15 00:07:21 Progress: 71206/712068 deleted, 0 failed (10.0% complete) - 2025-11-15T00:07:21+01:00
</span></span><span class="line" data-line="10"><span class="token">2025/11/15 00:43:12 Progress: 106809/712068 deleted, 0 failed (15.0% complete) - 2025-11-15T00:43:12+01:00
</span></span><span class="line" data-line="11"><span class="token">2025/11/15 01:20:38 Progress: 142412/712068 deleted, 0 failed (20.0% complete) - 2025-11-15T01:20:38+01:00
</span></span><span class="line" data-line="12"><span class="token">2025/11/15 01:57:09 Progress: 178015/712068 deleted, 0 failed (25.0% complete) - 2025-11-15T01:57:09+01:00
</span></span><span class="line" data-line="13"><span class="token">2025/11/15 02:33:46 Progress: 213618/712068 deleted, 0 failed (30.0% complete) - 2025-11-15T02:33:46+01:00
</span></span><span class="line" data-line="14"><span class="token">2025/11/15 03:10:03 Progress: 249221/712068 deleted, 0 failed (35.0% complete) - 2025-11-15T03:10:03+01:00
</span></span><span class="line" data-line="15"><span class="token">2025/11/15 03:46:19 Progress: 284824/712068 deleted, 0 failed (40.0% complete) - 2025-11-15T03:46:19+01:00
</span></span><span class="line" data-line="16"><span class="token">2025/11/15 04:23:31 Progress: 320427/712068 deleted, 0 failed (45.0% complete) - 2025-11-15T04:23:31+01:00
</span></span><span class="line" data-line="17"><span class="token">2025/11/15 05:00:23 Progress: 356030/712068 deleted, 0 failed (50.0% complete) - 2025-11-15T05:00:23+01:00
</span></span><span class="line" data-line="18"><span class="token">2025/11/15 05:37:04 Progress: 391633/712068 deleted, 0 failed (55.0% complete) - 2025-11-15T05:37:04+01:00
</span></span><span class="line" data-line="19"><span class="token">2025/11/15 06:14:31 Progress: 427236/712068 deleted, 0 failed (60.0% complete) - 2025-11-15T06:14:31+01:00
</span></span><span class="line" data-line="20"><span class="token">2025/11/15 06:52:02 Progress: 462839/712068 deleted, 0 failed (65.0% complete) - 2025-11-15T06:52:02+01:00
</span></span><span class="line" data-line="21"><span class="token">2025/11/15 07:29:00 Progress: 498442/712068 deleted, 0 failed (70.0% complete) - 2025-11-15T07:29:00+01:00
</span></span><span class="line" data-line="22"><span class="token">2025/11/15 08:05:51 Progress: 534045/712068 deleted, 0 failed (75.0% complete) - 2025-11-15T08:05:51+01:00
</span></span><span class="line" data-line="23"><span class="token">2025/11/15 08:43:49 Progress: 569648/712068 deleted, 0 failed (80.0% complete) - 2025-11-15T08:43:49+01:00
</span></span><span class="line" data-line="24"><span class="token">2025/11/15 09:20:09 Progress: 605251/712068 deleted, 0 failed (85.0% complete) - 2025-11-15T09:20:09+01:00
</span></span><span class="line" data-line="25"><span class="token">2025/11/15 09:57:57 Progress: 640854/712068 deleted, 0 failed (90.0% complete) - 2025-11-15T09:57:57+01:00
</span></span><span class="line" data-line="26"><span class="token">2025/11/15 10:35:28 Progress: 676457/712068 deleted, 0 failed (95.0% complete) - 2025-11-15T10:35:28+01:00
</span></span><span class="line" data-line="27"><span class="token">2025/11/15 11:13:42 Progress: 712060/712068 deleted, 0 failed (100.0% complete) - 2025-11-15T11:13:42+01:00
</span></span><span class="line" data-line="28"><span class="token">2025/11/15 11:13:42 Finished at 2025-11-15T11:13:42+01:00
</span></span><span class="line" data-line="29"><span class="token">2025/11/15 11:13:42 Total deleted: 712068, Failed: 0
</span></span><span class="line" data-line="30"><span class="token">2025/11/15 11:13:42 Deleted archive IDs are in deleted-archive-ids.txt
</span></span></code></pre>                ]]>
        </content>
    </entry>
        <entry>
        <title>5 useful things in Postgres</title>
        <link href="https://blog.notmyhostna.me/posts/5-useful-things-in-postgres/"/>
        <id>https://blog.notmyhostna.me/posts/5-useful-things-in-postgres/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-08-27T18:25:00+00:00</published>
        <updated>2025-08-27T18:25:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>I've had these snippets in <a href="https://tot.rocks">Tot</a> for a while now, but then reminded myself that I've set up this blog to quickly share things for future-me too. Maybe they are useful for someone else stumbling upon them.</p>
<ol>
<li>Quickly get an <strong>approximate count of a large table</strong> by using the index:</li>
</ol>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">SELECT reltuples::bigint AS estimate FROM pg_class where relname = 'bigtable';
</span></span></code></pre>
<ol start="2">
<li>
<p>Explanation why splitting off a frequently updated column into a new table is useful: <a href="https://dba.stackexchange.com/a/318548">https://dba.stackexchange.com/a/318548</a></p>
</li>
<li>
<p>Reviewing frequently used triggers and functions</p>
</li>
</ol>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">alter system set track_functions to 'all';
</span></span><span class="line" data-line="2"><span class="token">select pg_reload_conf();
</span></span><span class="line" data-line="3"><span class="token">select * from pg_stat_user_functions order by calls desc;
</span></span></code></pre>
<p>The results of that can be exported as a CSV and then analyised in a spreadsheet.</p>
<ol start="4">
<li>
<p>Inspecting the differences between two versions of Postgres on <a href="https://why-upgrade.depesz.com/show?from=17&amp;to=17.6&amp;keywords=">depesz.com</a>.</p>
</li>
<li>
<p>Generate curl commands to run batch requests.</p>
</li>
</ol>
<p>This one sounds a bit silly but it has saved me countless hours over the years, sometimes it's very quick to just generate a long list of curl commands, put them in run.sh, chmod +x run.sh and ./run.sh it instead of writing scripts, or doing things directly in the database which might be riskier.</p>

<pre class="phiki language-text github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="text"><code><span class="line" data-line="1"><span class="token">select 'curl -H "Authorization: Bearer test-token-123" http://localhost:8090/movie/' || m.id || '/update'
</span></span><span class="line" data-line="2"><span class="token">from movie m
</span></span><span class="line" data-line="3"><span class="token">where m.release_year = 2026
</span></span><span class="line" data-line="4"><span class="token">;
</span></span></code></pre>                ]]>
        </content>
    </entry>
        <entry>
        <title>Building a custom GUI app for my Hugo blog with Tauri</title>
        <link href="https://blog.notmyhostna.me/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/"/>
        <id>https://blog.notmyhostna.me/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-07-24T20:00:00+00:00</published>
        <updated>2025-07-24T20:00:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>Additionally to this blog I'm also contributing to another blog that I'm running with <a href="https://mastodon.social/@manu_faktur">Manu</a> called <a href="https://annoying.technology">Annoying.Technology</a>. It's based on Hugo, a static site generator, which makes it very easy to deploy and automate.</p>
<p>The downside is, that writing a blog post with images is always a hassle as you have to manually adjust file paths and write your text in an editor which is usually not optimized for writing prose. That editor then usually doesn't preview the images correctly as the paths are set to work within Hugo. In short: It's annoying (haha).</p>
<p>In times of AI it should be relatively simple to <em>just</em> build a custom GUI app just for this task and in the style of the blog. This turned out to be true, even though it would still take a bit of work and extra prompting to make everything work a bit smoother.</p>
<p>I've used <a href="https://tauri.app">Tauri</a> and you can see some screenshots below. It worked really well to just tell Cursor things like "Make the app look like <a href="https://annoying.technology">https://annoying.technology</a>, get inspired by the stylesheet") and I think it worked out pretty well.</p>
<p>Overall it took me two short evenings to get everything working without writing a single line of Rust or CSS / HTML myself. I've first tried another Go based framework called <a href="https://fyne.io">fyne.io</a>, but the results were much worse.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="1172">
        <img src="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/7808e6b979-1753387433/screenshot-2025-07-24-at-21.44.01@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
  </figure>
<figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1165">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/aac42d5d04-1753387363/screenshot-2025-07-24-at-21.32.35@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1195">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/building-a-custom-gui-app-for-my-hugo-blog-with-tauri/f92a775ccf-1753387363/screenshot-2025-07-24-at-21.54.50@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Visiting Penang: A few places I liked</title>
        <link href="https://blog.notmyhostna.me/posts/visiting-penang/"/>
        <id>https://blog.notmyhostna.me/posts/visiting-penang/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-07-09T06:35:00+00:00</published>
        <updated>2025-07-09T06:35:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>A few weeks ago I visited Penang Island, a Malaysian island in the Strait of Malacca. I collected a few places that I've really enjoyed below.</p>
<ul>
<li><a href="https://maps.app.goo.gl/75Bcs5pimEUxu8d59">Penang Hill</a>, fun to go up by the <a href="https://en.wikipedia.org/wiki/Penang_Hill_Railway">funicular</a>. Explore the "Habitat", a bit cooler air up there and nice views + monkeys.</li>
<li><a href="https://maps.app.goo.gl/7oTCQottkU8bZVTSA">Ferringhi Bay</a>, lots of little restaurants on that beach or close by if you keep walking along the coast.</li>
<li><a href="https://maps.app.goo.gl/xxYtt2z2gm3gFNAo7">Yong Pin Restaurant</a>, one of my favorite Dim Sum places anywhere. A new discovery!</li>
<li><a href="https://maps.app.goo.gl/7UbofxnKik4A4cZY9">Narrow Marrow</a>, a nice bar</li>
<li><a href="https://maps.app.goo.gl/8CCZc64R68ZXMTmp7">Le Petit Four P&acirc;tisserie</a></li>
<li><a href="https://maps.app.goo.gl/vc1r8cUx7zbtB94r5">Your Local Club</a>, good coffee and a good escape from the heat. In a very busy area of the town with lots of stores, restaurants around.</li>
</ul>
<p>I took a lot of pictures in Penang, a small selection below or in the <a href="https://blog.notmyhostna.me/photos/1752693518">Photos section</a>.</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>SSD upgrade for Mac Mini M4</title>
        <link href="https://blog.notmyhostna.me/posts/ssd-upgrade-for-mac-mini-m4/"/>
        <id>https://blog.notmyhostna.me/posts/ssd-upgrade-for-mac-mini-m4/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-06-15T19:45:00+00:00</published>
        <updated>2025-06-15T19:45:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>After rendering my latest video I realized that my trusted Intel Mac Mini from 2018 is slowly getting closer to retirement. I've decided to upgrade to a new Mac Mini but after already being familiar with the markup on the storage upgrades I've decided to do it myself.</p><p>As usual the good people from iFixit have a detailed walkthrough, it's a very simple operation and in the end if you upgrade from 265GB to 2TB yourself you are saving almost 500 Euros compared to doing it through Apple directly.</p><figure>
  <iframe allow="fullscreen" allowfullscreen src="https://www.youtube.com/embed/O2tzy6T3Gm0"></iframe>  </figure>
<p>The tools I bought from iFixit directly, the Mac from Apple and the SSD I ordered on <a href="https://m4-ssd.com">M4 SSD</a>. Everything arrived after a few days, and only then realized that M4 SSD already included some tools and Torx bits that I've bought separately from iFixit. Never hurts to have some more of these lying around I guess.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/34f5f4ad39-1750017257/dscf2374-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/98efc058a7-1750017259/dscf2379-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/fa0266adcc-1750017259/dscf2376-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/6b8459da07-1750017258/dscf2380-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/aab5398976-1750017259/dscf2387-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e85a4681b4-1750017259/dscf2382-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-1800x.webp" class="gallery-item-url" data-pswp-width="1800" data-pswp-height="1200">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/ssd-upgrade-for-mac-mini-m4/e9216d2acd-1750017259/dscf2384-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Infrequent Updates: A new video from Shanghai</title>
        <link href="https://blog.notmyhostna.me/posts/infrequent-updates-a-new-video-from-shanghai/"/>
        <id>https://blog.notmyhostna.me/posts/infrequent-updates-a-new-video-from-shanghai/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-06-09T10:55:00+00:00</published>
        <updated>2025-06-09T10:55:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>This weekend I've finally sat down to create a new video for my YouTube channel <a href="https://www.youtube.com/@infrequentupdates">Infrequent Updates</a> again. I collected a lot of videos over the past months so it took me a while to get started. As you can see the video is also a bit longer than usual and as always finding the music turned out to be the most time consuming part again.</p><p>In the end there's a lot of things that could be a bit better but I also already spent way too many hours on it already. Part of that was related to me switching from <em>Final Cut Pro</em> to <em>Davinci Resolve</em>, as the free version is already very powerful and does everything I need. After some hours of usage I already feel right at home and the interface to add titles / subtitles is much easier to use than in Final Cut.</p><p>If you have a spare 7 minutes in your day, feel free to watch, like and subscribe!</p><figure>
  <iframe allow="fullscreen" allowfullscreen src="https://www.youtube.com/embed/62IbfBzIkt8"></iframe>  </figure>
                ]]>
        </content>
    </entry>
        <entry>
        <title>Walking around Columbia Circle, Shanghai</title>
        <link href="https://blog.notmyhostna.me/posts/walking-around-columbia-circle-shanghai/"/>
        <id>https://blog.notmyhostna.me/posts/walking-around-columbia-circle-shanghai/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-06-07T17:20:00+00:00</published>
        <updated>2025-06-07T17:20:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>A few months ago I bookmarked <a href="https://arun.is/blog/shanghai-walk/">Arun's post about Shanghai</a>. Then a few weeks ago I stayed there myself for a bit and had the chance of exploring the city on my own feet. One place I especially enjoyed was the area around <a href="https://english.shanghai.gov.cn/en-SpecialtyShoppingAreas/20231217/5e5702d0882c44249166a0471a4541c8.html">Columbia Circle</a> that is also featured in the blog post, lots of small stores, coffee shops and shaded streets to explore.</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>Kirby plugin: POSSE - Syndicate posts to other platforms.</title>
        <link href="https://blog.notmyhostna.me/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/"/>
        <id>https://blog.notmyhostna.me/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-05-17T15:20:00+00:00</published>
        <updated>2025-05-17T15:20:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>The past week I have been working on my first real plugin for <a href="https://getkirby.com">Kirby</a> that is not just a helper function. The main goal is already stated by the name and comes from the indie web scene: <a href="https://indieweb.org/POSSE">Publish (on your) Own Site, Syndicate Elsewhere</a>. </p>
<p>For now I'm mostly active on Mastodon, but I was also aiming at making my dormant Bluesky account look a little bit more active without always having to manually cross-post my posts to both services myself. </p>
<p>There's already another promising plugin called <a href="https://plugins.getkirby.com/mauricerenck/indieconnector">IndieConnector</a> that I've been following on GitHub for a while. It does that but also a bunch of features on top of that that I was not so interested in.</p>
<p>Here's how it looks like in the Kirby panel, it has a setting screen where you can configure everything and some instructions on how to set up a cronjob that acts as the scheduler.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="1148">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/65a90d7a5a-1747495547/screenshot-2025-05-17-at-23.16.58.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    The POSSE Settings screen  </figcaption>
  </figure>
<p>The main interface lists the the posts that are in the queue to be syndicated (cross posted), and a list of posts that were already shared. If you post something new on your site it will automatically get added to the queue and will be posted after a (user configurable) delay. It always only posts one entry every hour to not spam your accounts.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="889">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/e2a60c56cd-1747495779/screenshot-2025-05-17-at-23.18.34.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    The POSSE queue interface  </figcaption>
  </figure>
<figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1044" data-pswp-height="1020">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/8d83fecd48-1747497053/screenshot-2025-05-17-at-23.50.12.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    Once uploaded, we also store the syndicated urls on every Kirby page so they could in theory be shown on the site too.  </figcaption>
  </figure>
<p>I still have to find a way to make it more generic, as right now it still depends a bit on pages having a certain format (title, images, cover image) before I share it on GitHub and the plugin directory but that's coming soon.</p>
<p><strong>Update: I've <a href="https://github.com/dewey/kirby-posse">shared it on GitHub</a>, give it a try and open an issue if something is unclear or doesn't work</strong></p>
<p>Here's how the posts shared on <a href="https://bsky.app/profile/did:plc:oojogyi3ynkfhgtnrf5caot3/post/3lpetopgdzr2n">Bluesky</a> and <a href="https://mastodon.social/@dewey/114523943326972500">Mastodon</a> currently look like.</p><figure data-ratio="auto">
  <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-0">
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1196" data-pswp-height="1252">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/6b4811b697-1747496760/screenshot-2025-05-17-at-23.39.59.png@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
        <div class="overflow-hidden  shadow-">
            <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-1800x.webp" class="gallery-item-url" data-pswp-width="1184" data-pswp-height="1260">
        <img
          class="w-full h-auto object-cover min-h-full"
          src="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-600x.webp"
          srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-plugin-posse-syndicate-posts-to-other-platforms/a3d19fe624-1747496760/screenshot-2025-05-17-at-23.45.01.png@2x-1800x.webp 1800w"
          sizes="(max-width: 600px) 300px, (max-width: 1200px) 600px, (max-width: 1800px) 1200px, 1800px"
          alt=""
        >
      </a>
    </div>
      </div>
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    Screenshot of the posts shared on Mastodon and Bluesky  </figcaption>
  </figure>
<p>Let me know if you are interested in giving it a try!</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>Kirby: Build your own custom block</title>
        <link href="https://blog.notmyhostna.me/posts/kirby-build-your-own-custom-block/"/>
        <id>https://blog.notmyhostna.me/posts/kirby-build-your-own-custom-block/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-05-08T15:55:00+00:00</published>
        <updated>2025-05-08T15:55:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>For the new "Photo Post" entries I've recently added here I wanted to have a way to reference them from my text posts. Ideally there would be a preview of the images and an easy way to open the full photo post directly from that inline module.</p>
<p>Here's an example of the final result:</p><p>It turns out this is all relatively easy with Kirby. All we need are the following bits:</p>
<p><strong>site/blueprints/blocks/photopost.yml</strong></p>
<p>Here we create a new block type, the query prepopulates the select field with our list of photo posts.</p>

<pre class="phiki language-yml github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="yml"><code><span class="line" data-line="1"><span class="token" style="color: #7ee787;">n</span><span class="token" style="color: #7ee787;">ame</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">P</span><span class="token" style="color: #a5d6ff;">hoto Post</span><span class="token">
</span></span><span class="line" data-line="2"><span class="token" style="color: #7ee787;">l</span><span class="token" style="color: #7ee787;">abel</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">"</span><span class="token" style="color: #a5d6ff;">Select a photo post to inline a preview of the post.</span><span class="token" style="color: #a5d6ff;">"</span><span class="token">
</span></span><span class="line" data-line="3"><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">ype</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">p</span><span class="token" style="color: #a5d6ff;">hotopost</span><span class="token">
</span></span><span class="line" data-line="4"><span class="token" style="color: #7ee787;">p</span><span class="token" style="color: #7ee787;">review</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">f</span><span class="token" style="color: #a5d6ff;">ields</span><span class="token">
</span></span><span class="line" data-line="5"><span class="token" style="color: #7ee787;">f</span><span class="token" style="color: #7ee787;">ields</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="6"><span class="token">  </span><span class="token" style="color: #7ee787;">p</span><span class="token" style="color: #7ee787;">hotopost</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="7"><span class="token">    </span><span class="token" style="color: #7ee787;">l</span><span class="token" style="color: #7ee787;">abel</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">S</span><span class="token" style="color: #a5d6ff;">elected Photo Post</span><span class="token">
</span></span><span class="line" data-line="8"><span class="token">    </span><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">ype</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">p</span><span class="token" style="color: #a5d6ff;">ages</span><span class="token">
</span></span><span class="line" data-line="9"><span class="token">    </span><span class="token" style="color: #7ee787;">q</span><span class="token" style="color: #7ee787;">uery</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">s</span><span class="token" style="color: #a5d6ff;">ite.find("photos").children().listed().sortBy("date", "desc")</span><span class="token">
</span></span><span class="line" data-line="10"><span class="token">    </span><span class="token" style="color: #7ee787;">m</span><span class="token" style="color: #7ee787;">ultiple</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #79c0ff;">false</span><span class="token">
</span></span><span class="line" data-line="11"><span class="token">    </span><span class="token" style="color: #7ee787;">r</span><span class="token" style="color: #7ee787;">equired</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #79c0ff;">true</span><span class="token">
</span></span></code></pre>
<p>In our regular post template we need to add that new block type to the selection, an excerpt from that looks like this. The important part is the <code>photopost</code> block in the fieldset.</p>
<p><strong>site/blueprints/pages/post.yml</strong></p>

<pre class="phiki language-yml github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="yml"><code><span class="line" data-line="1"><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">itle</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">P</span><span class="token" style="color: #a5d6ff;">ost</span><span class="token">
</span></span><span class="line" data-line="2"><span class="token">
</span></span><span class="line" data-line="3"><span class="token" style="color: #7ee787;">c</span><span class="token" style="color: #7ee787;">olumns</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="4"><span class="token">  </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #7ee787;">w</span><span class="token" style="color: #7ee787;">idth</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">2</span><span class="token" style="color: #a5d6ff;">/3</span><span class="token">
</span></span><span class="line" data-line="5"><span class="token">    </span><span class="token" style="color: #7ee787;">f</span><span class="token" style="color: #7ee787;">ields</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="6"><span class="token">      </span><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">itle</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="7"><span class="token">        </span><span class="token" style="color: #7ee787;">l</span><span class="token" style="color: #7ee787;">abel</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">T</span><span class="token" style="color: #a5d6ff;">itle</span><span class="token">
</span></span><span class="line" data-line="8"><span class="token">        </span><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">ype</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">t</span><span class="token" style="color: #a5d6ff;">ext</span><span class="token">
</span></span><span class="line" data-line="9"><span class="token">      </span><span class="token" style="color: #7ee787;">b</span><span class="token" style="color: #7ee787;">locks</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="10"><span class="token">        </span><span class="token" style="color: #7ee787;">l</span><span class="token" style="color: #7ee787;">abel</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">C</span><span class="token" style="color: #a5d6ff;">ontent</span><span class="token">
</span></span><span class="line" data-line="11"><span class="token">        </span><span class="token" style="color: #7ee787;">t</span><span class="token" style="color: #7ee787;">ype</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">b</span><span class="token" style="color: #a5d6ff;">locks</span><span class="token">
</span></span><span class="line" data-line="12"><span class="token">        </span><span class="token" style="color: #7ee787;">h</span><span class="token" style="color: #7ee787;">elp</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">B</span><span class="token" style="color: #a5d6ff;">uild your post content using blocks.</span><span class="token">
</span></span><span class="line" data-line="13"><span class="token">        </span><span class="token" style="color: #7ee787;">f</span><span class="token" style="color: #7ee787;">ieldsets</span><span class="token">:</span><span class="token">
</span></span><span class="line" data-line="14"><span class="token">          </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #79c0ff;">...</span><span class="token">
</span></span><span class="line" data-line="15"><span class="token">          </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #a5d6ff;">p</span><span class="token" style="color: #a5d6ff;">hotopost</span><span class="token">
</span></span></code></pre>
<p><strong>site/snippets/blocks/photopost.php</strong></p>
<p>The last part is the template that will help us render this inline photo post. In my case I put some of that logic into another snippet just to make it cleaner. The photo_entry_inline will just iterate over the images in the photo post and output them with some styling.</p>

<pre class="phiki language-php github-dark-default" style="background-color: #0d1117;color: #e6edf3;" data-language="php"><code><span class="line" data-line="1"><span class="token" style="color: #ff7b72;">&lt;</span><span class="token" style="color: #ff7b72;">?</span><span class="token" style="color: #79c0ff;">php</span><span class="token">
</span></span><span class="line" data-line="2"><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPages</span><span class="token"> </span><span class="token" style="color: #ff7b72;">=</span><span class="token"> </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">block</span><span class="token" style="color: #ff7b72;">-&gt;</span><span class="token" style="color: #d2a8ff;">photopost</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line" data-line="3"><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPagesArray</span><span class="token"> </span><span class="token" style="color: #ff7b72;">=</span><span class="token"> </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPages</span><span class="token" style="color: #ff7b72;">-&gt;</span><span class="token" style="color: #d2a8ff;">value</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line" data-line="4"><span class="token" style="color: #ff7b72;">foreach</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPagesArray</span><span class="token"> </span><span class="token" style="color: #ff7b72;">as</span><span class="token"> </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">pageUuid</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line" data-line="5"><span class="token">    </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPage</span><span class="token"> </span><span class="token" style="color: #ff7b72;">=</span><span class="token"> </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">site</span><span class="token" style="color: #ff7b72;">-&gt;</span><span class="token" style="color: #d2a8ff;">find</span><span class="token">(</span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">pageUuid</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line" data-line="6"><span class="token">    </span><span class="token" style="color: #d2a8ff;">snippet</span><span class="token">(</span><span class="token" style="color: #a5d6ff;">'</span><span class="token" style="color: #a5d6ff;">photo_entry_inline</span><span class="token" style="color: #a5d6ff;">'</span><span class="token">,</span><span class="token"> </span><span class="token">[</span><span class="token" style="color: #a5d6ff;">'</span><span class="token" style="color: #a5d6ff;">photo</span><span class="token" style="color: #a5d6ff;">'</span><span class="token"> </span><span class="token" style="color: #ff7b72;">=&gt;</span><span class="token"> </span><span class="token" style="color: #e6edf3;">$</span><span class="token" style="color: #e6edf3;">photoPage</span><span class="token">]</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line" data-line="7"><span class="token">}</span><span class="token">
</span></span></code></pre>
<p>That's all we need to get it our custom block up and running.</p><figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1246" data-pswp-height="1320">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/88d9e002cc-1746721441/screenshot-2025-05-08-at-23.57.46.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    New block type in the selection on a new post  </figcaption>
  </figure>
<figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="990">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/8ecc6af830-1746721446/screenshot-2025-05-08-at-23.58.13.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    Selecting the photo post to reference  </figcaption>
  </figure>
<figure data-ratio="auto">
                  <a href="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-1800x.webp" class="block-image-url" data-pswp-width="1800" data-pswp-height="1496">
        <img src="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-600x.webp" alt="" srcset="https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-300x.webp 300w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-600x.webp 600w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-900x.webp 900w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-1200x.webp 1200w, https://blog.notmyhostna.me/media/pages/posts/kirby-build-your-own-custom-block/1993b59939-1746721449/screenshot-2025-05-09-at-00.13.32.png@2x-1800x.webp 1800w" sizes="(max-width: 600px) 300px, (max-width: 1200px) 900px, 1800px">
      </a>
      
    <figcaption class="mt-4 text-center text-sm text-gray-600">
    How it looks in the editor  </figcaption>
  </figure>
<p>There's great resources from Kirby itself too (of course), like <a href="https://www.youtube.com/watch?v=XbFoF92ZoyY">this video</a> on the YouTube channel and the <a href="https://getkirby.com/docs/guide/page-builder/custom-blocks">Custom Blocks Documentation</a>.</p>                ]]>
        </content>
    </entry>
        <entry>
        <title>Sharing photos on my blog</title>
        <link href="https://blog.notmyhostna.me/posts/sharing-photos-on-my-blog/"/>
        <id>https://blog.notmyhostna.me/posts/sharing-photos-on-my-blog/</id>
        <author>
            <name>Philipp Defner</name>
            <email>mail@notmyhostna.me</email>
        </author>
        <published>2025-05-04T16:15:00+00:00</published>
        <updated>2025-05-04T16:15:00+00:00</updated>
        <content type="html" xml:lang="en">
        <![CDATA[
                    <p>Over the past weeks I silently rebuild this blog, still in Kirby but now without the theme I originally bought when I switched to Kirby.</p>
<p>The goal was to simplify the setup so it is much easier to add new  features. The first one is the dedicated <a href="https://blog.notmyhostna.me/photos">Photos</a> section which is now also linked in the navigation bar. I'll use this to have a centralized place where I can just upload some photos, later I'll work on making this automatically get posted on Mastodon, and maybe Bluesky (<a href="https://indieweb.org/POSSE">POSSE</a>!).</p>
<p>I'm pretty happy how the Exif display turned out, I got inspired by <a href="https://github.com/sambecker/exif-photo-blog">Sam Becker&#039;s photo blog project</a>, but went with a much simpler version and some Kirby hooks that store the Exif information (What a fragmented format!) in the Kirby metadata based on the Blueprint.</p>
<p>While doing that I also organized my feed (No worries, redirects are in place). The new feeds can be found in the header, or here:</p>
<p>Posts: <code>https://blog.notmyhostna.me/posts/feed.xml</code><br />
Photos: <code>https://blog.notmyhostna.me/photos/feed.xml</code></p>
<p>Let me know how you like it!</p>                ]]>
        </content>
    </entry>
    </feed>