<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://kiko.io/</id>
  <title>kiko.io Posts</title>
  <subtitle>Memorable (Tech) Stuff</subtitle>
  <icon>https://kiko.io/images/favicon-32x32.png</icon>
  <logo>https://kiko.io/images/icon-72x72.png</logo>
  <link href="https://kiko.io" />
  <link href="https://kiko.io/atom.xml" rel="self" type="application/rss+xml" />
  <updated>2026-04-11T01:22:48.206Z</updated>
  <author>
    <name>Kristof Zerbe</name>
    <email>mail@kristofz.me</email>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <category term="Tools" scheme="https://kiko.io/archives/categories/Tools/" />
  <category term="Coding" scheme="https://kiko.io/archives/categories/Coding/" />
  <category term="Collection" scheme="https://kiko.io/archives/categories/Collection/" />
  <category term="Photo" scheme="https://kiko.io/archives/categories/Photo/" />
  <category term="UI/UX" scheme="https://kiko.io/archives/categories/UI-UX/" />
  <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
  <category term="Football" scheme="https://kiko.io/archives/categories/Football/" />
  <category term="Event" scheme="https://kiko.io/archives/categories/Event/" />
  <category term="Note" scheme="https://kiko.io/notes" />
  <category term="VSCode" scheme="https://kiko.io/archives/tags/VSCode/" />
  <category term="Hexo" scheme="https://kiko.io/archives/tags/Hexo/" />
  <category term="GitHub" scheme="https://kiko.io/archives/tags/GitHub/" />
  <category term="JavaScript" scheme="https://kiko.io/archives/tags/JavaScript/" />
  <category term="jQuery" scheme="https://kiko.io/archives/tags/jQuery/" />
  <category term="CSS" scheme="https://kiko.io/archives/tags/CSS/" />
  <category term="Stylus" scheme="https://kiko.io/archives/tags/Stylus/" />
  <category term="Dark Mode" scheme="https://kiko.io/archives/tags/Dark-Mode/" />
  <category term="Error" scheme="https://kiko.io/archives/tags/Error/" />
  <category term="Trello" scheme="https://kiko.io/archives/tags/Trello/" />
  <category term="Browser" scheme="https://kiko.io/archives/tags/Browser/" />
  <category term="SQL" scheme="https://kiko.io/archives/tags/SQL/" />
  <category term="ADSI" scheme="https://kiko.io/archives/tags/ADSI/" />
  <category term="Visual Studio" scheme="https://kiko.io/archives/tags/Visual-Studio/" />
  <category term="Database" scheme="https://kiko.io/archives/tags/Database/" />
  <category term="PWA" scheme="https://kiko.io/archives/tags/PWA/" />
  <category term="Tutorial" scheme="https://kiko.io/archives/tags/Tutorial/" />
  <category term=".NET" scheme="https://kiko.io/archives/tags/NET/" />
  <category term="UI" scheme="https://kiko.io/archives/tags/UI/" />
  <category term="Windows" scheme="https://kiko.io/archives/tags/Windows/" />
  <category term="Audio" scheme="https://kiko.io/archives/tags/Audio/" />
  <category term="Lightroom" scheme="https://kiko.io/archives/tags/Lightroom/" />
  <category term="Publishing" scheme="https://kiko.io/archives/tags/Publishing/" />
  <category term="Plugin" scheme="https://kiko.io/archives/tags/Plugin/" />
  <category term="SPA" scheme="https://kiko.io/archives/tags/SPA/" />
  <category term="Bundling" scheme="https://kiko.io/archives/tags/Bundling/" />
  <category term="Presets" scheme="https://kiko.io/archives/tags/Presets/" />
  <category term="Resource" scheme="https://kiko.io/archives/tags/Resource/" />
  <category term="Localization" scheme="https://kiko.io/archives/tags/Localization/" />
  <category term="Versioning" scheme="https://kiko.io/archives/tags/Versioning/" />
  <category term="T4" scheme="https://kiko.io/archives/tags/T4/" />
  <category term="Share" scheme="https://kiko.io/archives/tags/Share/" />
  <category term="TFS/DevOps" scheme="https://kiko.io/archives/tags/TFS-DevOps/" />
  <category term="Mail" scheme="https://kiko.io/archives/tags/Mail/" />
  <category term="SVG" scheme="https://kiko.io/archives/tags/SVG/" />
  <category term="Font" scheme="https://kiko.io/archives/tags/Font/" />
  <category term="Hosting" scheme="https://kiko.io/archives/tags/Hosting/" />
  <category term="Social Media" scheme="https://kiko.io/archives/tags/Social-Media/" />
  <category term="Mastodon" scheme="https://kiko.io/archives/tags/Mastodon/" />
  <category term="Remote" scheme="https://kiko.io/archives/tags/Remote/" />
  <category term="Office" scheme="https://kiko.io/archives/tags/Office/" />
  <category term="Workflow" scheme="https://kiko.io/archives/tags/Workflow/" />
  <category term="Rant" scheme="https://kiko.io/archives/tags/Rant/" />
  <category term="Logging" scheme="https://kiko.io/archives/tags/Logging/" />
  <category term="Android" scheme="https://kiko.io/archives/tags/Android/" />
  <category term="Imaging" scheme="https://kiko.io/archives/tags/Imaging/" />
  <category term="DOM" scheme="https://kiko.io/archives/tags/DOM/" />
  <category term="WebAPI" scheme="https://kiko.io/archives/tags/WebAPI/" />
  <category term="Authentication" scheme="https://kiko.io/archives/tags/Authentication/" />
  <category term="Webmention" scheme="https://kiko.io/archives/tags/Webmention/" />
  <category term="Events" scheme="https://kiko.io/archives/tags/Events/" />
  <category term="Templating" scheme="https://kiko.io/archives/tags/Templating/" />
  <category term="Node.js" scheme="https://kiko.io/archives/tags/Node-js/" />
  <category term="Debugging" scheme="https://kiko.io/archives/tags/Debugging/" />
  <category term="Theming" scheme="https://kiko.io/archives/tags/Theming/" />
  <category term="PowerShell" scheme="https://kiko.io/archives/tags/PowerShell/" />
  <category term="Usability" scheme="https://kiko.io/archives/tags/Usability/" />
  <category term="AI" scheme="https://kiko.io/archives/tags/AI/" />
  <category term="Metadata" scheme="https://kiko.io/archives/tags/Metadata/" />
  <category term="Contributing" scheme="https://kiko.io/archives/tags/Contributing/" />
  <category term="Fediverse" scheme="https://kiko.io/archives/tags/Fediverse/" />
  <category term="IndieWeb" scheme="https://kiko.io/archives/tags/IndieWeb/" />
  <category term="Identity" scheme="https://kiko.io/archives/tags/Identity/" />
  <category term="Photography" scheme="https://kiko.io/archives/tags/Photography/" />
  <category term="Search" scheme="https://kiko.io/archives/tags/Search/" />
  <category term="SVWW" scheme="https://kiko.io/archives/tags/SVWW/" />
  <category term="2. Bundesliga" scheme="https://kiko.io/archives/tags/2-Bundesliga/" />
  <category term="JSON-LD" scheme="https://kiko.io/archives/tags/JSON-LD/" />
  <category term="Eintracht" scheme="https://kiko.io/archives/tags/Eintracht/" />
  <category term="Visualization" scheme="https://kiko.io/archives/tags/Visualization/" />
  <category term="HTML" scheme="https://kiko.io/archives/tags/HTML/" />
  <category term="Concert" scheme="https://kiko.io/archives/tags/Concert/" />
  <category term="Life" scheme="https://kiko.io/archives/tags/Life/" />
  <category term="Sticker" scheme="https://kiko.io/archives/tags/Sticker/" />
  <category term="Fun" scheme="https://kiko.io/archives/tags/Fun/" />
  <category term="DFB-Pokal" scheme="https://kiko.io/archives/tags/DFB-Pokal/" />
  <category term="Flora" scheme="https://kiko.io/archives/tags/Flora/" />
  <category term="Lemmy" scheme="https://kiko.io/archives/tags/Lemmy/" />
  <category term="Accessibility" scheme="https://kiko.io/archives/tags/Accessibility/" />
  <category term="Euro2024" scheme="https://kiko.io/archives/tags/Euro2024/" />
  <category term="Syndication" scheme="https://kiko.io/archives/tags/Syndication/" />
  <category term="Society" scheme="https://kiko.io/archives/tags/Society/" />
  <category term="Meta" scheme="https://kiko.io/archives/tags/Meta/" />
  <category term="Geo-Tagging" scheme="https://kiko.io/archives/tags/Geo-Tagging/" />
  <category term="Organization" scheme="https://kiko.io/archives/tags/Organization/" />
  <category term="Johnny.Decimal" scheme="https://kiko.io/archives/tags/Johnny-Decimal/" />
  <category term="Obsidian" scheme="https://kiko.io/archives/tags/Obsidian/" />
  <category term="Interactions" scheme="https://kiko.io/archives/tags/Interactions/" />
  <category term="Feeds" scheme="https://kiko.io/archives/tags/Feeds/" />
  <category term="Career" scheme="https://kiko.io/archives/tags/Career/" />
  <category term="3. Bundesliga" scheme="https://kiko.io/archives/tags/3-Bundesliga/" />
  <category term="WebComponents" scheme="https://kiko.io/archives/tags/WebComponents/" />
  <category term="Peertube" scheme="https://kiko.io/archives/tags/Peertube/" />
  <category term="Engagement" scheme="https://kiko.io/archives/tags/Engagement/" />
  <category term="Politics" scheme="https://kiko.io/archives/tags/Politics/" />
  <category term="API" scheme="https://kiko.io/archives/tags/API/" />
  <category term="Maps" scheme="https://kiko.io/archives/tags/Maps/" />
  <category term="Music" scheme="https://kiko.io/archives/tags/Music/" />
  <category term="Vernissage" scheme="https://kiko.io/archives/tags/Vernissage/" />
  <category term="Pixelfed" scheme="https://kiko.io/archives/tags/Pixelfed/" />
  <entry>
    <id>https://kiko.io/post/Stickers/</id>
    <title>Stickers</title>
    <published>2026-04-05T16:29:20.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/Stickers/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/Stickers.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/Stickers.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;I’m 57 and currently hooked on stickers, and &lt;a href=&#34;/ai&#34;&gt;AI&lt;/a&gt; isn’t entirely innocent in this, combined with a bit of a guilty conscience - but it’s a lot of fun.&lt;/p&gt;
&lt;p&gt;I recently “retired” my old business laptop after just two short years, with a battery life of 28 minutes after a full charge, and somehow I felt sorry, because the best thing about that otherwise junk of a Dell laptop was the lid with the stickers (see header image). Everything started with the “truck” in the middle, which ended up on my desk one day and seemed to be yelling, “Stick me on your laptop!”&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;


    &lt;div class=&#34;alertbox alertbox-info&#34;&gt;
      &lt;p&gt;&lt;strong&gt;A Brief Detour&lt;/strong&gt;&lt;br&gt;This chubby, red guy with wheels instead of feet, known as &lt;a href=&#34;https://www.brummi.de/brummi-geschichte&#34;&gt;Brummi&lt;/a&gt;, is a marketing mascot from 1971 that the German transport industry created to give road freight transport a new image. Every German of my generation knows him, and to this day he remains a symbolic figure for a wide variety of projects in the industry, where I’ve been working as an IT manager for a few years now.&lt;/p&gt;

    &lt;/div&gt;
  

&lt;p&gt;Next came a few stickers from my favorite soccer club, SV Wehen-Wiesbaden, a few from fundraising campaigns, and some I still had lying around somewhere.&lt;/p&gt;
&lt;p&gt;One day, I had the idea to turn one of my wife’s sayings into a sticker, because it’s so typical of the region she comes from (Sauerland, east of Dortmund) and it’s already become a running joke between us…&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stickers/sticker-jakuck.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can’t really translate this into English, because literally it would mean “Yeah, look” or “See,” but that doesn’t capture the essence of the saying at all. Imagine your wife or someone else telling you how to do something, but you do it differently at first, until you come around and have to admit that it works. Then you get the ironic version of “Ja kuck” But it’s always meant positively - to briefly comment on an action that produces something positive or interesting.&lt;/p&gt;
&lt;p&gt;Now, I’m not artistically gifted, so I threw a quick prompt at ChatGPT, and it surprised me with a nice graphic, which I immediately uploaded to StickerApp to have nearly 80 4x4 cm stickers made. A few days later, it ended up on my laptop (and now also on various public signs and poles across Europe ;)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The next sticker that found its way onto the lid comes from a funny conversation about coworkers and other enemies, and translates to “It’s escalating anyway”. No matter what you do, trouble is bound to happen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stickers/sticker-eseskalierteh.png&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;One evening, my wife came home from work and told me that she and her colleagues had been coming up with new perfume names all day long after one of them used the laminator and a strong plastic smell lingered in the air for a moment - something like “Lamination, a fragrance by Ralf Laurel”. My favorite creation was “Echauffage” (pronounced in French), the perfume you put on when you’re really pissed off 😂 Of course, with ChatGPT’s help, I had to put that on my laptop. In the meantime, the sticker has spread among my coworkers, and recently I was having trouble hiding my anger about something and was asked if I was wearing THAT perfume.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stickers/sticker-echauffage.png&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There are two types of people: Larks, who cheerfully jump out of bed early in the morning and go to bed early at night, and Owls, who you’re better off not talking to before 9 a.m. but who are fit and alert well into the night. I’m an Owl, and so that everyone knows right away, I had to turn this postcard saying into a sticker.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stickers/sticker-idontlikemorningpoeple.png&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Germans love to make fun of their own language, which allows them to form wonderfully long words like “Donaudampfschiffartskapitänsmütze.” People who have only a limited grasp of English add to the fun by trying to translate such a German word one-to-one into English.&lt;/p&gt;
&lt;p&gt;The biggest hit I’ve come across lately is “onewallfree,” the direct and hilariously incorrect translation of the German “einwandfrei,” meaning “flawless.” I just HAD to get that as a sticker…&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stickers/sticker-onewallfree.png&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’ve since switched to the Swedish sticker printer PrettyGoodStickers, because they can produce even very small batches of 5 to 10 stickers for a low price and ship them to you. It’s perfect for all the silly ideas in my head - though I’ll eventually run out of space on my laptop lid.&lt;/p&gt;
</content>
    <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
    <category term="Sticker" scheme="https://kiko.io/archives/tags/Sticker/" />
    <category term="Fun" scheme="https://kiko.io/archives/tags/Fun/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/IndieWeb-Carnival-Museum-Memories/</id>
    <title>IndieWeb Carnival: Museum Memories</title>
    <published>2026-03-16T18:17:38.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/IndieWeb-Carnival-Museum-Memories/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/IndieWeb-Carnival-Museum-Memories.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/IndieWeb-Carnival-Museum-Memories.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;It seems like fate that &lt;a href=&#34;https://jamesg.blog/&#34;&gt;James&lt;/a&gt; chose &lt;a href=&#34;https://jamesg.blog/2026/03/01/indieweb-carnival-museum-memories&#34;&gt;Museum Memories&lt;/a&gt; as topic of this month’s &lt;a href=&#34;https://indieweb.org/IndieWeb_Carnival&#34;&gt;Indieweb Carnival&lt;/a&gt;, because just recently, by chance, I visited one of the most impressive places from my childhood after more than 40 years: the &lt;strong&gt;Deutsches Museum in Munich&lt;/strong&gt;. My wife and I had traveled to the Bavarian capital for a &lt;a href=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/&#34;&gt;rock concert by the band Alter Bridge&lt;/a&gt; and actually planned to spend the rest of the weekend enjoying the city’s atmosphere, but as February in Germany sometimes goes, the weather was, to put it mildly, lousy, and my wife came up with the idea of going to the museum.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Deutsches-Museum-Munich&#34;&gt;&lt;a href=&#34;#Deutsches-Museum-Munich&#34; class=&#34;headerlink&#34; title=&#34;Deutsches Museum, Munich&#34;&gt;&lt;/a&gt;Deutsches Museum, Munich&lt;/h2&gt;&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://www.deutsches-museum.de/en/&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;deutsches-museum.de&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;Home&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://www.deutsches-museum.de/en/&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;www.deutsches-museum.de&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://www.deutsches-museum.de/assets/_processed_/5/b/csm_Deutsches_Museum_100_Jahre_Kampagne_9ddac1357d.png)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The idea for a purely technical museum had already been conceived in Munich as early as 1903, but after years of making do with make-shift solutions for the collection and exhibitions, it finally opened in 1925 on a small island in the Isar, following 20 years of construction.&lt;/p&gt;
&lt;p&gt;I can’t remember exactly when it was, but like pretty much every child in West Germany in the 1970s, I too went on a school trip there at some point and caught the postwar German enthusiasm for technology. Huge halls with airplanes hanging from the ceiling, rows of old cars and trucks, and a complete submarine that you could crawl inside to experience the cramped quarters where soldiers had to spend weeks in the middle of the ocean.&lt;/p&gt;
&lt;p&gt;The museum today is a different place, and I didn’t feel that sense of familiarity. The submarine is gone, and the much larger exhibition space is thoughtfully filled with both old and modern technology that showcases what humanity is capable of. But exploring the museum through the eyes of an older man is just as fascinating as it is for a young person. Meanwhile, the legendary museum in Munich has opened branches in Bonn, Nuremberg, and at the old Schleißheim Airfield, and I’ve made it a point to visit these as well in the near future.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/photos/D50_7059_2602&#34; class=&#34;no-break&#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;/shed/D50_7059_2602/normal.jpg&#34; style=&#34;max-width: 90%;&#34;&gt;
  &lt;/a&gt;
  &lt;figcaption style=&#34;text-align:center; font-size:0.8rem;&#34;&gt;Museum Lighting&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;No-Trip-Without-a-Museum&#34;&gt;&lt;a href=&#34;#No-Trip-Without-a-Museum&#34; class=&#34;headerlink&#34; title=&#34;No Trip Without a Museum&#34;&gt;&lt;/a&gt;No Trip Without a Museum&lt;/h2&gt;&lt;p&gt;My wife and I travel because we want to leave our daily routine and familiar surroundings behind for a while and immerse ourselves in a different culture. And where better to do that than at a local heritage museum, historical museum, or open-air museum? That’s why no trip of ours is complete without a visit to a museum. Let others lie on the beach. On our last trip to Sweden, we visited four different and very distinct places to learn more about the country and its history: &lt;a href=&#34;https://www.kungligaslotten.se/english/royal-palaces-and-sites/the-royal-palace.html&#34;&gt;Royal Palace of Stockholm&lt;/a&gt;, &lt;a href=&#34;https://www.kungligaslotten.se/english/royal-palaces-and-sites/drottningholm-palace.html&#34;&gt;Drottningholm Palace&lt;/a&gt;, &lt;a href=&#34;https://www.vasamuseet.se/en&#34;&gt;Vasa Museum in Stockholm&lt;/a&gt;, &lt;a href=&#34;https://www.vaxholmsfastning.se/english/&#34;&gt;Military Museum in Vaxholm&lt;/a&gt; and the &lt;a href=&#34;https://www.birkavikingastaden.se/en/&#34;&gt;open-air museum in Birka&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/photos/25-07-Schweden-468-D50&#34; class=&#34;no-break&#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;/shed/25-07-Schweden-468-D50/normal.jpg&#34; style=&#34;max-width: 90%;&#34;&gt;
  &lt;/a&gt;
  &lt;figcaption style=&#34;text-align:center; font-size:0.8rem;&#34;&gt;Birka Harbour&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Yad-Vashem-Jerusalem&#34;&gt;&lt;a href=&#34;#Yad-Vashem-Jerusalem&#34; class=&#34;headerlink&#34; title=&#34;Yad Vashem, Jerusalem&#34;&gt;&lt;/a&gt;Yad Vashem, Jerusalem&lt;/h2&gt;&lt;p&gt;In May 2019, I visited Israel with my wife and friends. Based at a wonderful apartment in Tel Aviv, which the equally wonderful Elie makes available to guests as a vacation home, we spent eight days trying to see and experience as much of the country as possible. In addition to a nighttime drive to &lt;a href=&#34;https://en.wikipedia.org/wiki/Masada&#34;&gt;Masada&lt;/a&gt;, 140 kilometers away, including a climb just before sunrise that absolutely pushed us to our physical limits, we also also had day trips to Jerusalem on our schedule. On the one hand, of course, to see the Old City with the Western Wall and the completely overcrowded Church of the Holy Sepulchre, but on the other hand also to visit what is arguably the most impressive museum in the world:&lt;/p&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://www.yadvashem.org&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;Yad Vashem - The World Holocaust Remembrance Center&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;Established in 1953 by an act of the Knesset (Israeli Parliament), Yad Vashem, the World Holocaust Remembrance Center, is entrusted with Holocaust commemoration, documentation, research and education: remembering the six million Jews murdered by the German Nazis and their collaborators; commemorating the destroyed Jewish communities, the ghetto and resistance fighters; and honoring the Righteous Among the Nations who risked their lives to rescue Jews during the Holocaust.&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://www.yadvashem.org&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;www.yadvashem.org&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://assets.yadvashem.org/image/upload/s--pAsEa-Qt--/v1/yadvashem_site/drupal10/2025-03/kalka4?_a&amp;#x3D;BAAAV6E0)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Every child in Germany is confronted with the Nazi era (1933-1945) in history class at school. As a result, I was familiar with the harrowing black-and-white images and films of concentration camps, transports in cattle cars, emaciated people, piles of corpses, and finally, German cities in ruins. Nothing a child wants to see, but must. The memory of what happened must be kept alive to try to prevent something like this from ever happening again. No institution in the world does this as effectively as Yad Vashem. Built in 1953 specifically for the purpose of remembrance, but also for research, documentation, and education, the museum shows visitors in many ways just how cruel human beings can be.&lt;/p&gt;
&lt;p&gt;This museum leaves no one unmoved, but what struck me deeply in retrospect is the fact that my language and my familiar culture were visible in the pictures. Beautiful facades of German cities… with corpses lying in the streets in front of them. Beautiful German landscapes… with barbed wire, half-dead people, and the headline “Arbeit macht frei”. The culture of my ancestors was visible everywhere. MY damn culture! I felt shame because my people were the perpetrators. I felt anger because my people were the victims.&lt;/p&gt;
&lt;p&gt;Judaism has been an integral part of German culture for centuries. And by that I don’t mean any religious rites or customs, which, as a self-proclaimed atheist, are foreign to me anyway. I mean the people themselves, their ideas, views, and dreams. Albert Einstein, Heinrich Heine, Felix Mendelssohn Bartholdy, Jacques Offenbach, Max Liebermann, Kurt Weill, Walter Rathenau, Ludwig Borchardt, and Paul Ehrlich are just a few famous names from the recent past who have shaped our country in their own way. Then there are the many, many others who have enriched the country culturally. How could anyone believe that their contribution was worthless and had to be eradicated? How could anyone believe that killing 6 million of their own countrymen would make the country better?&lt;/p&gt;
&lt;p&gt;To me, culture is like fruit juice: a lot of apple juice, with some orange and peach juice, plus passion fruit, pear, cherry, pineapple, banana, grapefruit, strawberry, blueberry, with a splash of pomegranate and papaya, but also sour lemon and sweet grapes, and a whole lot more. A multitude of different ingredients that combine to create a unique flavor. How could anyone possibly believe they could remove a single flavor without spoiling the entire juice and making it inedible? How could anyone even dare to think such a thing!?&lt;/p&gt;
&lt;p&gt;At the end of my tour of the museum, I was overcome by an indescribable sadness. I started to cry and felt a pressing need to ask the Israeli security guard at the exit for forgiveness for something I, as a child of ‘68, had absolutely no responsibility for. The collective guilt weighed heavily on me and still does to this day. That is why I always react with extreme aversion to any attempt to downplay the events of that time or dismiss them as a “minor blip in history.” To somehow defend the perpetrators of that era or even celebrate them as heroes — which currently seems to be in vogue in the U.S. and elsewhere — is nothing short of repulsive. All these people should be required to visit this museum in Jerusalem to understand the danger they are exposing humanity to.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/photos/19-05-Israel-0724&#34; class=&#34;no-break&#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;/photos/normal/19-05-Israel-0724.jpg&#34; style=&#34;max-width: 90%;&#34;&gt;
  &lt;/a&gt;
  &lt;figcaption style=&#34;text-align:center; font-size:0.8rem;&#34;&gt;Jad Vashem Vista&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
    <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
    <category term="IndieWeb" scheme="https://kiko.io/archives/tags/IndieWeb/" />
    <category term="Life" scheme="https://kiko.io/archives/tags/Life/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/</id>
    <title>Alter Bridge &amp; Deutsches Museum, Munich @ 2026-02-20</title>
    <published>2026-03-01T15:00:33.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/Alter-Bridge-Deutsches-Musuem-Munich-2026-02-20.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/Alter-Bridge-Deutsches-Musuem-Munich-2026-02-20.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;It’s not every day that one of our favourite bands tours Germany and brings along guests that we like just as much. We last saw &lt;a href=&#34;https://www.last.fm/music/Alter+Bridge&#34;&gt;&lt;strong&gt;Alter Bridge&lt;/strong&gt;&lt;/a&gt; in Frankfurt 2016 and had never seen &lt;a href=&#34;https://www.last.fm/music/Daughtry&#34;&gt;&lt;strong&gt;Daughtry&lt;/strong&gt;&lt;/a&gt; before. So there was no question about whether we would go to Munich. Of course we would. And since the concert was on Friday evening, it was also the perfect opportunity to enjoy beautiful Munich for a weekend.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Zenith-Concert-Hall&#34;&gt;&lt;a href=&#34;#Zenith-Concert-Hall&#34; class=&#34;headerlink&#34; title=&#34;Zenith Concert Hall&#34;&gt;&lt;/a&gt;Zenith Concert Hall&lt;/h2&gt;&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-lwv5ic&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_185017622&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_185017622.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_185017622.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_185311930&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_185311930.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_185311930.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_193101791&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_193101791.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_193101791.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_193752866&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_193752866.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_193752866.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_201711101&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_201711101.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_201711101.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_203310627&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_203310627.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_203310627.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_205821845.NIGHT&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_205821845.NIGHT.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_205821845.NIGHT.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_210635800&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_210635800.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_210635800.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;PXL_20260220_213713880&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_213713880.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/PXL_20260220_213713880.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/PXL_20260220_212703728&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/PXL_20260220_212703728&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Alter Bridge 26&#34;
          data-description=&#34;photo&#34;
          data-src=&#34;/photos/normal/PXL_20260220_212703728.jpg&#34;&gt;
        &lt;img src=&#34;/photos/mobile/PXL_20260220_212703728.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;



    &lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe src=&#34;https://clip.place/videos/embed/6thMLbJfyUbijDUS7U9WbT&#34; title=&#34;Daughtry#PXL_20260220_191118005&#34; frameborder=&#34;0&#34; allowfullscreen loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  


    &lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe src=&#34;https://clip.place/videos/embed/6Wt6i2sRkSYWFtUUj9kAAc&#34; title=&#34;Alter-Bridge#PXL_20260220_203907832&#34; frameborder=&#34;0&#34; allowfullscreen loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  

&lt;p&gt;&lt;span style=&#34;font-size: 2.5rem&#34;&gt;🤘&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Deutsches-Museum&#34;&gt;&lt;a href=&#34;#Deutsches-Museum&#34; class=&#34;headerlink&#34; title=&#34;Deutsches Museum&#34;&gt;&lt;/a&gt;Deutsches Museum&lt;/h2&gt;&lt;p&gt;Enjoy Munich, my foot… It only rained once this weekend, but it rained from Friday morning until Sunday, when we packed up and headed home. February in Germany can be so dreary.&lt;/p&gt;
&lt;p&gt;But since the hotel was booked and paid, we seized the opportunity and went to THE most famous technology museum in Germany: the &lt;a href=&#34;https://www.deutsches-museum.de/en/&#34;&gt;&lt;strong&gt;Deutsches Museum&lt;/strong&gt;&lt;/a&gt;. The last time I was there was when I was 16 or 17, and all I remember is this huge submarine, which must have been removed at some point in the last 40 years.&lt;/p&gt;
&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-4qliqg&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_6970_2602&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_6970_2602.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_6970_2602.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6971_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6971_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Copper Pipes&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_6971_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_6971_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6974_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6974_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Cockpit Controls&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_6974_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_6974_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6978_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6978_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_6978_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6978_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6978_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_6980_2602&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_6980_2602.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_6980_2602.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6982_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6982_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_6982_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6982_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6982_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6985_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6985_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_6985_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6985_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6985_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6989_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6989_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_6989_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6989_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6989_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6990_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6990_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_6990_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6990_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6990_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7007_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7007_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7007_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7007_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7007_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7008_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7008_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7008_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7008_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7008_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7012_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7012_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7012_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7012_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7012_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7013_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7013_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7013_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7013_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7013_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7014_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7014_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7014_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7014_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7014_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7018_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7018_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;German Keys&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7018_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7018_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7023_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7023_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Modern Keys&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7023_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7023_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_7025_2602&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7025_2602.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7025_2602.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7030_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7030_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Nikon Legend&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7030_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7030_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7031_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7031_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7031_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7031_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7031_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7032_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7032_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Triple Lens&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7032_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7032_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7036_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7036_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Blue Flash&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7036_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7036_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7037_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7037_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7037_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7037_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7037_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7040_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7040_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Scrap Tornado&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7040_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7040_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_7045_2602&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7045_2602.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7045_2602.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7059_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7059_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Museum Lighting&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7059_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7059_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7061_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7061_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7061_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7061_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7061_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7067_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7067_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;L&amp;#x27;Harmoniflute&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7067_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7067_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7070_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7070_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;D50_7070_2602&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_7070_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_7070_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7071_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7071_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Gretsch Pickup&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7071_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7071_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_7073_2602&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_7073_2602&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;960 Sequential Controller&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_7073_2602/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_7073_2602/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_7085_2602&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7085_2602.jpg&#34;&gt;
        &lt;img src=&#34;/post/Alter-Bridge-Deutsches-Museum-Munich-2026-02-20/D50_7085_2602.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;

</content>
    <category term="Event" scheme="https://kiko.io/archives/categories/Event/" />
    <category term="Concert" scheme="https://kiko.io/archives/tags/Concert/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/IndieWeb-Carnival-Intersecting-Interests/</id>
    <title>IndieWeb Carnival: Intersecting Interests</title>
    <published>2026-02-26T17:56:52.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/IndieWeb-Carnival-Intersecting-Interests/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/IndieWeb-Carnival-Intersecting-Interests.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/IndieWeb-Carnival-Intersecting-Interests.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;When I read about this month’s &lt;a href=&#34;https://indieweb.org/IndieWeb_Carnival&#34;&gt;Indieweb Carnival&lt;/a&gt; topic (&lt;a href=&#34;https://zacharykai.net/notes/icfeb26&#34;&gt;Intersecting Interests&lt;/a&gt; by &lt;a href=&#34;https://zacharykai.net/&#34;&gt;Zachary Kai&lt;/a&gt;), I initially misunderstood ‘intersecting’ as interests that cross paths and thus get in the way, but what is meant is rather overlapping interests. As a non-native English speaker, I lack a feel for the nuances of the language. But basically, it doesn’t matter, because I knew immediately what I wanted to write about, and my interests actually include both aspects: contrary and complementary.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Photography-My-old-love&#34;&gt;&lt;a href=&#34;#Photography-My-old-love&#34; class=&#34;headerlink&#34; title=&#34;Photography: My old love&#34;&gt;&lt;/a&gt;Photography: My old love&lt;/h2&gt;&lt;p&gt;In the 1990s, after finishing school, I knew exactly what career I wanted to pursue: Photography. I sent out over 30 applications for an apprenticeship at photo studios throughout Germany and ultimately decided on one in nearby Frankfurt am Main. Big mistake. The boss was a pedantic hothead, and I’ve never been able to keep my mouth shut. So the adventure ended after only six months, and I switched to the comparatively boring profession of industrial clerk, came into contact with IT at technical college, and some time later was working as a freelancer in software development.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Software-My-second-love&#34;&gt;&lt;a href=&#34;#Software-My-second-love&#34; class=&#34;headerlink&#34; title=&#34;Software: My second love&#34;&gt;&lt;/a&gt;Software: My second love&lt;/h2&gt;&lt;p&gt;I have been working in IT for over 30 years now, and what has interested me most from the very beginning are user interfaces, the presentation of a piece of software, starting with Microsoft Access, VB 6, VB.NET, C#, ASP.NET, and native web technologies, right through to various web frameworks. The visual component has always been very important to me, to the point of pedantry. Every pixel had to be in the right place. I have almost always developed interface structures based on a visual gut feeling rather than established patterns, because I trust my general understanding of shapes and colors for information transfer, which I acquired through photography.&lt;/p&gt;
&lt;p&gt;At some point, my enthusiasm for photography returned, albeit not as intensely as in the beginning. With slightly more modern equipment (there’s always a lens you really must have), I limited myself to travel photos. Wherever I go in the world, I take my camera bag with me and try to keep the restrictions and waiting times for my wife to a minimum… “What is he photographing now?” … “Oh, nice photo.” It’s not unusual for me to bring back 1,500 or more photos from such a trip, which I then review and edit in Lightroom.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Complementary&#34;&gt;&lt;a href=&#34;#Complementary&#34; class=&#34;headerlink&#34; title=&#34;Complementary&#34;&gt;&lt;/a&gt;Complementary&lt;/h2&gt;&lt;p&gt;I have been running this blog since 2019, initially to write about technical things that I wanted to remember myself. Over time, I have adapted the technology behind it, the SSG &lt;a href=&#34;https://hexo.io/&#34;&gt;Hexo&lt;/a&gt;, to my own needs through additions, extensions, and workarounds, simply because it is incredibly fun to put web technologies into practice. I have also written about this, as my series &lt;a href=&#34;https://kiko.io/series/a-new-blog/&#34;&gt;A New Blog&lt;/a&gt; with now 36 posts shows. I enjoy having my own little corner of the internet where I can publish my thoughts.&lt;/p&gt;
&lt;p&gt;In the first version, all pages still had the same header image, consisting of one of my favorite photos from a trip to Israel, until I thought to myself, ‘You have so many beautiful photos, use a different one for each page.’ For new posts, I created a pool from which an unused photo is automatically selected when generating the new post file (Markdown). The pool of photos grew rapidly, and I developed my own overview pages for these and previously used photos. I started publishing new photos according to the POSSE principle, first on the blog and then, with a reference, on classic photo portals such as &lt;a href=&#34;https://www.flickr.com/photos/kzerbe/&#34;&gt;Flickr&lt;/a&gt;, 500px, and later in the Fediverse on &lt;a href=&#34;https://pixelfed.social/kristofz&#34;&gt;Pixelfed&lt;/a&gt; and &lt;a href=&#34;https://vernissage.photos/@kiko&#34;&gt;Vernissage&lt;/a&gt;. For this purpose, each photo was given its own page with lots of details about the image that I could link to. I created separate photo posts, and for the images that couldn’t or shouldn’t be used as header images, I built a new section or overview called ‘Shed’. As of today, I host 1,243 photos on the website, which takes up 772 MB in the build, but that’s only because I’ve optimized a lot.&lt;/p&gt;
&lt;p&gt;With kiko.io, I have successfully combined my two passions, web development and photography, and have also integrated writing into the mix. Programming, designing, photography, post-processing, writing, and publishing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Contrary&#34;&gt;&lt;a href=&#34;#Contrary&#34; class=&#34;headerlink&#34; title=&#34;Contrary&#34;&gt;&lt;/a&gt;Contrary&lt;/h2&gt;&lt;p&gt;Like all of us, I spend most of my time working toward other people’s goals. That’s fine, because it’s fulfilling and fundamental to my down-to-earth lifestyle. The time left over for my personal passions is therefore limited, and the chunks of time I can devote to them are rather small. Evenings, weekends, vacations. And sometimes, when work stress takes over again, I withdraw from my private productivity altogether and do nothing at all. On the one hand, this is relaxing, but on the other, I always feel a little guilty because I always have ideas and a correspondingly long to-do or wish list in all three areas (photography, programming, writing). I often make mental plans about what I can do next weekend, for example, only to realize on Sunday evening that none of it has come to reality because the couch was simply too attractive.&lt;/p&gt;
&lt;p&gt;When I start something, like this text, I know that I’ll need a few days to finish it. During this time, I focus all my free time on it, which means that my other two passions and their to-do lists have to wait until I have time for them again. This happens to me particularly often when I’m programming. I spend days enthusiastically tinkering with a new feature for this blog, only to start on the next one straight away, and at the end of the month I realize I haven’t written a single post or even taken or edited a single photo.&lt;/p&gt;
&lt;p&gt;Unfortunately, there are only 24 hours in a day, and at almost 58 years of age, I’m simply no longer able to get by on four hours of sleep. When I reflect on it, that’s okay, even if there’s always a little devil sitting on my shoulder whispering, ‘You can do more. More. It’s fun.’ Yes, it is, but the hobby-related dopamine rush isn’t worth sacrificing my health.&lt;/p&gt;
&lt;p&gt;Stay calm and be patient.&lt;/p&gt;
</content>
    <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
    <category term="IndieWeb" scheme="https://kiko.io/archives/tags/IndieWeb/" />
    <category term="Life" scheme="https://kiko.io/archives/tags/Life/" />
  </entry>
  <entry>
    <id>https://kiko.io/notes/2026/I-miss-thinking-hard/</id>
    <title>I miss thinking hard</title>
    <published>2026-02-18T05:21:22.000Z</published>
    <updated>2026-04-11T01:22:51.015Z</updated>
    <link href="https://kiko.io/notes/2026/I-miss-thinking-hard/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/$Notes-2026.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/$Notes-2026.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;This text accurately reflects the main problem with AI: We are gradually losing our cognitive abilities, because we are ceasing to train our  biggest muscle: the brain.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Vibe coding” satisfies the Builder. It feels great to see to pass from idea to reality in a fraction of a time that would take otherwise. But it has drastically cut the times I need to came up with creative solutions for technical problems&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;#AI&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://www.jernesto.com/articles/thinking_hard&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;I miss thinking hard.&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://www.jernesto.com/articles/thinking_hard&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;www.jernesto.com&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
  &lt;/a&gt;
&lt;/div&gt;
</content>
    <category term="Note" scheme="https://kiko.io/notes" />
  </entry>
  <entry>
    <id>https://kiko.io/notes/2026/Teams-Call-And-The-Shining/</id>
    <title>Teams Call and The Shining</title>
    <published>2026-01-28T00:00:00.000Z</published>
    <updated>2026-04-11T01:22:51.015Z</updated>
    <link href="https://kiko.io/notes/2026/Teams-Call-And-The-Shining/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/$Notes-2026.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/$Notes-2026.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;We try to have as much fun as possible in the department, because everyday life is hard enough. A quick-witted and funny response not only immediately lights up conversations, it also helps to create a good working atmosphere in general. Laughter is medicine for everything.&lt;/p&gt;
&lt;p&gt;I usually can’t write about funny business anecdotes in public, because on the one hand, it often requires context that I can’t provide, and on the other hand, it’s up to each person involved to decide whether something like that should be made public.&lt;/p&gt;
&lt;p&gt;In this screenshot of a chat following a Teams call in which I and another colleague participated, whose first name also begins with K but who, unlike me, has not configured an avatar, I am making an exception because it is &lt;strong&gt;too good&lt;/strong&gt; and only affects me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Somehow, this picture reminds me of something.&lt;br&gt;…&lt;br&gt;Ah, I know.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;/notes/2026/_attachments/Teams-And-Shining.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;🤣 Bull’s-eye! Where the hell is my axe …&lt;/p&gt;
</content>
    <category term="Note" scheme="https://kiko.io/notes" />
  </entry>
  <entry>
    <id>https://kiko.io/post/IndieWeb-Carnival-Meaning-of-Life/</id>
    <title>IndieWeb Carnival: Meaning of Life</title>
    <published>2026-01-16T17:45:06.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/IndieWeb-Carnival-Meaning-of-Life/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/IndieWeb-Carnival-Meaning-of-Life.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/IndieWeb-Carnival-Meaning-of-Life.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;I don’t often participate in the &lt;a href=&#34;https://indieweb.org/IndieWeb_Carnival&#34;&gt;IndieWeb Carnival&lt;/a&gt;. The last thing I contributed was in November 2024 with my post &lt;a href=&#34;/post/You-will-never-know-whose-butterfly-you-were/&#34;&gt;You will never know whose butterfly you were&lt;/a&gt; on the topic of “Impact.” Maybe I should do it more often, because it’s really exciting to read other people’s posts on the same topic. Different opinions offer new perspectives.&lt;/p&gt;
&lt;p&gt;This month’s topic from &lt;a href=&#34;https://www.jeremiahlee.com/&#34;&gt;Jeremiah&lt;/a&gt; really triggered me this time, and I’ve been thinking about it for days… &lt;a href=&#34;https://www.jeremiahlee.com/posts/2026-01-indieweb-carnival/&#34;&gt;&lt;strong&gt;The Meaning of Life&lt;/strong&gt;&lt;/a&gt; … and here are my two cents on the matter.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;What a topic, especially for a 57-year-old like me, who hardly has any days left where my body isn’t acting up somewhere and drawing attention to its gradual decline. To the young people out there: enjoy every day while it’s still not like that, because the day will come when the tide turns and you’ll ask yourselves, &lt;em&gt;‘how did I do that before?’&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It is probably no coincidence that this question is often asked at an advanced age. By then, you have already come a long way, reflect on it, and wonder what else might come and why you do certain things in the first place. Not everyone has this ability to reflect, because it is closely related to doubt, and some of us are not capable of doubting, or only to a limited extent. This is often found in politics and executive floors. Or among psychopaths. Hmm… anyway.&lt;/p&gt;
&lt;p&gt;Without doubt or reflection, the question of the true meaning, the deeper meaning of life, beyond profane things like money and power, does not arise at all. And when these thoughts do occur to such people, it is usually very late in life, and they realize the damage they have caused to those around them because of their lack of doubt.&lt;/p&gt;
&lt;p&gt;What if the quest for the meaning of life must remain unsuccessful even for doubting people because it simply does not exist? What if life is… and I say this without any judgment… “meaningless”?&lt;/p&gt;
&lt;p&gt;If the question of the meaning of life arises from doubt, one must ask whether doubt is something good and useful. In most cultures, it has negative connotations, and not without reason. Doubt can be paralyzing when it takes over, and from an evolutionary perspective, that has always been a bad idea.&lt;/p&gt;
&lt;p&gt;I wish every day that I had the serenity not to get upset or distressed about things I can’t change anyway. In other words, to doubt less or even despair less, and to take occurrences as they come without wasting my energy wishing they were other than they are. To achieve this state is my ultimate goal. I often think of a short video I saw years ago of an Indian man who said in his beautiful accent  something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some days are fucked and cannot be unfucked … Go home, sleep and try again tomorrow&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a healthy and desirable attitude toward life’s adversities. Without a doubt.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For me, the question about the meaning of life has another aspect that I can’t quite get my head around. It sounds like a goal that you can or should achieve. If I do this or that, then I’ll get a little closer to the meaning of my life? That contradicts my feeling. What’s more, this idea contains a close relative of meaning: Purpose. So you could also ask, &lt;em&gt;“What is the purpose of my life?”&lt;/em&gt; and that feels depressing even as I write it.&lt;/p&gt;
&lt;p&gt;The answer to the question &lt;em&gt;“What is my goal in life?”&lt;/em&gt; is much easier to come up with. As I did in the paragraph above, this can usually be expressed clearly. The problem here, however, is that this definition of a goal can only be an expression of the present, because if one thing is certain, it is change, and that also affects goals that have once been set.&lt;/p&gt;
&lt;p&gt;Some folks answer this question with something like “Being a good human being.” While this may seem timeless at first, even if you can’t be sure that you won’t turn into a dickhead in a few years, it generally comes with the problem of perspective. To whom am I a good person, who sees me that way, and are there people who judge my behavior completely different? An angel to one person, a devil to another. At first, you can only go by your own perspective, which is strongly influenced by the culture you live in.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I recently met up with a friend for a few drinks, and after the second or third glass of Guinness, we got onto the topic of religion. He is a trained and devout Catholic, and I have always been an atheist, also trained, but from a negative perspective. His approach is that his faith gives him structure, especially in matters over which he is powerless or which he cannot explain, à la &lt;em&gt;“It is God’s will”&lt;/em&gt;. I, on the other hand, have no third person in my head to whom I can pass things on, but I have to accept them as well. The difference between my friend and me is therefore only that I have no projection surface, which does not always make my life easier, as I can well understand how comforting such a figure can be in difficult times. But just as I do not need answers from a God, I also do not need an answer to the question of the meaning of life.&lt;/p&gt;
&lt;p&gt;The question itself has religious connotations for me to a certain extent. This can be seen, for example, in the enduring popularity of the pilgrimage to Santiago de Compostela, the Way of St. James. Its original destination is a prayer at the tomb of St. James, and since 830 AD, people from all parts of Europe have been walking there. The fact that so many people still undertake the weeks-long walk and the hardships involved, even today, when religiosity is on the decline, shows the real purpose of the journey: The journey itself. There are many reports of people setting off in pairs or threes, but eventually going their separate ways, not only because they have different walking speeds, but above all because people on the trail are preoccupied with themselves, their past, their future, their goals, desires, and fears. The brain begins to work, there are hardly any relevant distractions, and so you can find yourself. In the end, the actual geographical destination in northern Spain often plays only a minor role. The Camino itself, i.e., the path, and thus your own self, is the real goal.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Many words in these lines deal with movement and direction, and I think that is exactly what can and should replace the question of the meaning of life: What is my path in life? I am born and I am here. I start walking, make decisions that influence the direction of my path, and continue to do so until my strength wanes and I am no longer here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is our being that defines us, and nothing more. There is no deeper meaning behind it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our human ability to think about it and seek to understand it sometimes prevents us from making the next right decision for our current path.&lt;/p&gt;
</content>
    <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
    <category term="IndieWeb" scheme="https://kiko.io/archives/tags/IndieWeb/" />
    <category term="Life" scheme="https://kiko.io/archives/tags/Life/" />
  </entry>
  <entry>
    <id>https://kiko.io/notes/2026/Display-horizontal-container-initially-scrolled-to-the-right/</id>
    <title>#TIL | Display horizontal container initially scrolled to the right</title>
    <published>2026-01-13T00:00:00.000Z</published>
    <updated>2026-04-11T01:22:51.015Z</updated>
    <link href="https://kiko.io/notes/2026/Display-horizontal-container-initially-scrolled-to-the-right/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/$Notes-2026.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/$Notes-2026.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;On my &lt;a href=&#34;/stats&#34;&gt;&amp;#x2F;stats&lt;/a&gt; page, I used the wonderful web component &lt;a href=&#34;https://mariohamann.github.io/activity-graph/&#34;&gt;activity-graph&lt;/a&gt; to implement an Activity Graph that displays my posts over the entire lifetime of my blog. &lt;/p&gt;
&lt;p&gt;Now, as is common in Western cultures, the graph starts on the left side and is displayed horizontally. This means that the most recent and interesting entries are on the very right, and you have to scroll to the end to see them.&lt;/p&gt;
&lt;p&gt;The question was how to make the graph display directly scrolled to the far right at the start, and the solution is quite simple and uses the component’s various HTML levels:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;div class=&amp;quot;activity-graph-wrapper&amp;quot;&amp;gt;
  &amp;lt;activity-graph&amp;gt;
    &amp;lt;figure&amp;gt;
      &amp;lt;table&amp;gt;
       ...
      &amp;lt;/table&amp;gt;
    &amp;lt;/figure&amp;gt;
  &amp;lt;/activity-graph&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using the CSS &lt;code&gt;direction&lt;/code&gt; property, I first rotate the graph in the reading direction to RTL (right to left) at the top level, then rotate it back again at the next lower level. This means that the browser displays the graph starting on the right, but everything below has the usual western-style reading direction.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-css&#34;&gt;.activity-graph-wrapper figure {
  direction: rtl;
}
.activity-graph-wrapper figure table {
  direction: ltr;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;#CSS #TIL &lt;/p&gt;
</content>
    <category term="Note" scheme="https://kiko.io/notes" />
  </entry>
  <entry>
    <id>https://kiko.io/post/Remaining-Photos-from-2025/</id>
    <title>Remaining Photos from 2025</title>
    <published>2026-01-11T13:53:32.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/Remaining-Photos-from-2025/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/Remaining-Photos-from-2025.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/Remaining-Photos-from-2025.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Every now and then, when my sweetheart and I go on a day trip in the region, I sling my camera over my shoulder in the hope of capturing a beautiful scene or two. Last year was no exception. Often, however, I don’t get around to reviewing and editing the photos, but I have now caught up on three events from 2025. Enjoy…&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Roman-Festival-Wiesbaden-2025-09-13&#34;&gt;&lt;a href=&#34;#Roman-Festival-Wiesbaden-2025-09-13&#34; class=&#34;headerlink&#34; title=&#34;Roman Festival, Wiesbaden @ 2025-09-13&#34;&gt;&lt;/a&gt;Roman Festival, Wiesbaden @ 2025-09-13&lt;/h2&gt;&lt;p&gt;The history of my hometown Wiesbaden dates back to Roman times, when they used the hot springs for relaxation. The city organised a small festival in honour of the Romans in 2025, including a show with birds of prey. Whatever the birds had to do with the Romans, they were still the most interesting thing.&lt;/p&gt;
&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-qe08ga&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6849_2509&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6849_2509&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Roman Accessories&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_6849_2509/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_6849_2509/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6852_2509&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6852_2509&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Roman Meal&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_6852_2509/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_6852_2509/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6855_2509&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6855_2509&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Roman Armory&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_6855_2509/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_6855_2509/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6859_2509&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6859_2509&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Hawk Portrait&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6859_2509/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6859_2509/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_6861_2509&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_6861_2509.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_6861_2509.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_6869_2509&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_6869_2509&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Eagle Portrait&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_6869_2509/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_6869_2509/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_6921_2509&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_6921_2509.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_6921_2509.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_6924_2509&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_6924_2509.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_6924_2509.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;hr&gt;
&lt;h2 id=&#34;Opel-Zoo-Kronberg-2025-06-21&#34;&gt;&lt;a href=&#34;#Opel-Zoo-Kronberg-2025-06-21&#34; class=&#34;headerlink&#34; title=&#34;Opel Zoo, Kronberg @ 2025-06-21&#34;&gt;&lt;/a&gt;Opel Zoo, Kronberg @ 2025-06-21&lt;/h2&gt;&lt;p&gt;A few kilometres away from our home, in Kronberg im Taunus, lies Opel Zoo, the second largest scientifically managed zoological garden in the Rhine-Main area. It was founded in 1956 by the grandson of car manufacturer Adam Opel and remains privately owned to this day. Every schoolchild in the area has to visit it at least once. In my case, however, it took nearly 57 years. The absolute star in the zoo was Kaja, the newborn baby elephant.&lt;/p&gt;
&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-huwrql&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5681_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5681_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Nailed Food&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_5681_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_5681_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_5686_2506&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_5686_2506.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_5686_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_5691_2506&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_5691_2506.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_5691_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_5694_2506&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_5694_2506.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_5694_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5697_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5697_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Lama Portrait&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5697_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5697_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5708_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5708_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Chilled Surikat&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5708_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5708_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_5711_2506&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_5711_2506.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_5711_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5713_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5713_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Chilled Hyena&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5713_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5713_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5735_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5735_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Yellow-Bellied Slider Break&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5735_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5735_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5738_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5738_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Red Panda Rest&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5738_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5738_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5745_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5745_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Chilling Cheetah&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5745_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5745_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5747_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5747_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Wildflower Field&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_5747_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_5747_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5749_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5749_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Linum Grandiflorum&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_5749_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_5749_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5750_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5750_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Posing Lama&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5750_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5750_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5752_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5752_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Caged Emperor&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5752_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5752_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5754_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5754_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Emperor Tamarin Portrait&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5754_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5754_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5761_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5761_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Nandu Gathering&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5761_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5761_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5766_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5766_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Hiding Fawn&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5766_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5766_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5768_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5768_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Goat Gaze&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5768_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5768_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5770_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5770_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Dama Cuddling&#34;
          data-description=&#34;photo&#34;
          data-src=&#34;/photos/normal/D50_5770_2506.jpg&#34;&gt;
        &lt;img src=&#34;/photos/mobile/D50_5770_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_5772_2506&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_5772_2506.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_5772_2506.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5821_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5821_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Camel Portrait&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5821_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5821_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5789_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5789_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Kaja I&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5789_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5789_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5790_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5790_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Kaja II&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5790_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5790_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5807_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5807_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Kaja III&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5807_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5807_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_5812_2506&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_5812_2506&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Kaja IV&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_5812_2506/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_5812_2506/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;hr&gt;
&lt;h2 id=&#34;Knights’-Tournaments-and-Easter-Market-Loreley-2025-04-20&#34;&gt;&lt;a href=&#34;#Knights’-Tournaments-and-Easter-Market-Loreley-2025-04-20&#34; class=&#34;headerlink&#34; title=&#34;Knights’ Tournaments and Easter Market, Loreley @ 2025-04-20&#34;&gt;&lt;/a&gt;Knights’ Tournaments and Easter Market, Loreley @ 2025-04-20&lt;/h2&gt;&lt;p&gt;Medieval markets are no longer as popular in Germany as they were 10 years ago, but the annual market held at the Loreley in spring still attracts thousands of visitors, perhaps due to the jousting tournaments that take place there.&lt;/p&gt;
&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-9d3l95&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3811_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3811_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Forge Flame&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3811_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3811_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3819_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3819_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3819_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3833_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3833_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3833_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3834_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3834_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Witchcraft&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_3834_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_3834_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3835_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3835_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Hennaing&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3835_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3835_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3837_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3837_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Fantasy Ornaments&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_3837_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_3837_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3838_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3838_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Wicker Work&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3838_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3838_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3843_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3843_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Leather Purses&#34;
          data-description=&#34;pool&#34;
          data-src=&#34;/pool/D50_3843_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/pool/D50_3843_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3844_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3844_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Stag Antlers&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3844_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3844_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3856_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3856_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Guarding Dragon&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3856_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3856_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3858_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3858_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Bearded Runes&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3858_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3858_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3866_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3866_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3866_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3867_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3867_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3867_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3873_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3873_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3873_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3881_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3881_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Flag Bearer&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3881_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3881_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3884_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3884_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Dark Knight&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/D50_3884_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/D50_3884_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          data-title=&#34;D50_3891_2504&#34;
          data-description=&#34;asset&#34;
          data-src=&#34;/post/Remaining-Photos-from-2025/D50_3891_2504.jpg&#34;&gt;
        &lt;img src=&#34;/post/Remaining-Photos-from-2025/D50_3891_2504.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/D50_3907_2504&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/D50_3907_2504&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;Loreley Lock&#34;
          data-description=&#34;reserve&#34;
          data-src=&#34;/reserve/D50_3907_2504/normal.jpg&#34;&gt;
        &lt;img src=&#34;/reserve/D50_3907_2504/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;

</content>
    <category term="Photo" scheme="https://kiko.io/archives/categories/Photo/" />
    <category term="Publishing" scheme="https://kiko.io/archives/tags/Publishing/" />
    <category term="Imaging" scheme="https://kiko.io/archives/tags/Imaging/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/New-Approach-on-Sending-Webmentions/</id>
    <title>New Approach on Sending Webmentions</title>
    <published>2026-01-08T17:20:22.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/New-Approach-on-Sending-Webmentions/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/New-Approach-on-Sending-Webmentions.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/New-Approach-on-Sending-Webmentions.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Four years ago, I made this blog fit for &lt;a href=&#34;https://en.wikipedia.org/wiki/IndieWeb&#34;&gt;IndieWeb&lt;/a&gt;. The most important part for me was the integration of &lt;a href=&#34;https://indieweb.org/Webmention&#34;&gt;Webmentions&lt;/a&gt;, which are mainly automated “pings” sent from one website to another, telling the latter: “Hey, I mentioned your post ABC in my post XYZ.” Such a connection between two blogs is certainly not the same as the fast interactions of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Fediverse&#34;&gt;Fediverse&lt;/a&gt; &lt;a href=&#34;https://fediverse.party/en/miscellaneous/&#34;&gt;platforms&lt;/a&gt;, which are more like email or chat, but are usually one-way and, unfortunately, still rather rare. But for me, they offer a healthy basis for networking my own digital home with others who think along similar lines.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;In general, it seems that good old blogs, equipped with modern technology, are becoming fashionable again, because what the formerly hip Silicon Valley garage boys have done to the digital social world is simply incomprehensibly creepy and will probably get a lot worse with the advent of AI. And I’m not the only one who’s happy about the revival of the old blog days:&lt;/p&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://henry.codes/writing/a-website-to-destroy-all-websites/&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;A Website To End All Websites | Henry From Online&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;How to win the war for the soul of the internet, and build the Web We Want.&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://henry.codes/writing/a-website-to-destroy-all-websites/&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;henry.codes&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://henry.codes/img/og/og-a-website-to-destroy-all-websites.png)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://www.joanwestenberg.com/the-case-for-blogging-in-the-ruins/&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;The Case for Blogging in the Ruins&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;In 1751, Denis Diderot began publishing his Encyclopédie, a project that would eventually span 28 volumes and take more than two decades to complete. The French government banned it twice. The Catholic Church condemned it, Diderot&amp;#x27;s collaborators abandoned him, his publisher secretly censored entries behind his back, and he worked&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://www.joanwestenberg.com/the-case-for-blogging-in-the-ruins/&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;www.joanwestenberg.com&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://images.unsplash.com/photo-1609147110636-8470ee620ee6)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;My approach to sending Webmentions was based on a custom script for my static site generator called &lt;a href=&#34;/projects/hexo-console-webmention/&#34;&gt;Hexo Console Webmention&lt;/a&gt;, which builds on the work of &lt;a href=&#34;https://remysharp.com/2019/06/18/send-outgoing-webmentions&#34;&gt;Remy Sharp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the meantime, a lot of water has flowed down the Rhine (as we say in my home region) and the possibilities have become more diverse. Generally, what always bothered me about the script was, that it could only run after the build &amp;amp; deployment and, in addition, the entire artifact, including all NPM packages, had to be loaded again as the last step in my GitHub Action (the blog lives on GitHub Pages). Not only was this time-consuming, it also wasn’t really resource-efficient.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://rknight.me/&#34;&gt;Robb Knight&lt;/a&gt; launched &lt;a href=&#34;https://echofeed.app/&#34;&gt;&lt;strong&gt;EchoFeed&lt;/strong&gt; &lt;/a&gt; in &lt;a href=&#34;https://rknight.me/blog/echofeed/&#34;&gt;2024&lt;/a&gt;, which is essentially the counterpart to &lt;a href=&#34;https://webmention.io/&#34;&gt;Webmention.io&lt;/a&gt;, which, of course, collects Webmentions. Robb’s sending mechanism relies on RSS, Atom, or JSON feeds as data sources, at least one of which every blogger should offer on their own site. These are linked in the app to “services” such as Webmentions, Mastodon, Bluesky, and others to create so-called &lt;strong&gt;Echos&lt;/strong&gt;. These Echos pull the feed data from the server every 15 minutes as standard and use templates to turn it into posts … or Webmentions.&lt;/p&gt;
&lt;p&gt;A fantastic way for me to clean up some of the blog code, even if I have one more dependency now, but seriously… who cares if a webmention arrives late or not at all?&lt;/p&gt;
</content>
    <category term="Tools" scheme="https://kiko.io/archives/categories/Tools/" />
    <category term="Hexo" scheme="https://kiko.io/archives/tags/Hexo/" />
    <category term="Publishing" scheme="https://kiko.io/archives/tags/Publishing/" />
    <category term="Webmention" scheme="https://kiko.io/archives/tags/Webmention/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/ChartsCSS-Without-a-single-line-of-JavaScript/</id>
    <title>ChartsCSS - Without a single line of JavaScript</title>
    <published>2026-01-06T15:47:37.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/ChartsCSS-Without-a-single-line-of-JavaScript/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/ChartsCSS-Without-a-single-line-of-JavaScript.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/ChartsCSS-Without-a-single-line-of-JavaScript.jpg&#34; /&gt;&lt;/p&gt;&lt;img src=&#34;/post/ChartsCSS-Without-a-single-line-of-JavaScript/logo-animation.svg&#34; class=&#34;float-right no-zoom&#34; /&gt;

&lt;p&gt;I’ve known for a while that I want to add a &lt;a href=&#34;/stats&#34;&gt;statistics page&lt;/a&gt; to my blog. Just for the fun of tinkering with code, without any deeper reason. In the summer, I wrote down my ideas on a few Obsidian pages and looked around to see what options were available for data visualization. It’s nicer and more intuitive to display some of the statistics as bars and pies than just in boring numerical columns. I’m more of a visual person… “Everything is so colorful here.”&lt;/p&gt;
&lt;p&gt;One research find stood out from the crowd of the usual JavaScript tools: &lt;a href=&#34;https://chartscss.org/&#34;&gt;&lt;strong&gt;ChartsCSS&lt;/strong&gt;&lt;/a&gt; by &lt;a href=&#34;https://github.com/ramiy&#34;&gt;Rami Yushuvaev&lt;/a&gt; and Lana Gordiievska. It promised to bring classic number visualizations such as bar and pie charts to a web page &lt;strong&gt;without a single line of script&lt;/strong&gt;, but &lt;strong&gt;exclusively with CSS styles&lt;/strong&gt;!&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;I took advantage of a few days off at the end of the year to tackle my statistics, including Rami’s CSS framework, which is already five years old… and what can I say? It’s really impressive how cleverly he uses common style methods to turn HTML tables (! … read: correctly) into colorful charts that can be easily customized with your own styles without having to fiddle around with the mere 59KB &lt;code&gt;charts.min.css&lt;/code&gt; file. I just wanted a bar chart, so I only peeked at the code for the pie charts, but I didn’t really figure out how Rami turns rectangular table cells into pie slices!?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/ChartsCSS-Without-a-single-line-of-JavaScript/chartcss-samples.png&#34; alt=&#34;ChartsCSS Samples&#34;&gt;&lt;/p&gt;
&lt;p&gt;In addition to these five available chart types, according to the website, three more are planned: Radial, Polar, and Radar, but they are not really getting off the ground, as the project seems to have stalled a bit. Rami released the current version 1.20 six months ago, and the previous one dates back to 2023. But that doesn’t matter much, because what’s there is excellent. The same goes for the documentation at &lt;a href=&#34;https://chartscss.org/docs/&#34;&gt;chartscss.org&amp;#x2F;docs&lt;/a&gt;, which leaves hardly any questions unanswered thanks to its many examples.&lt;/p&gt;
&lt;h2 id=&#34;Conclusion&#34;&gt;&lt;a href=&#34;#Conclusion&#34; class=&#34;headerlink&#34; title=&#34;Conclusion&#34;&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;&lt;p&gt;If you’re struggling with JavaScript but have a reasonable understanding of HTML and CSS, you can achieve very impressive results with &lt;a href=&#34;https://chartscss.org/&#34;&gt;ChartsCSS&lt;/a&gt;. In most cases, that’s all it takes.&lt;/p&gt;
&lt;p&gt;Here’s an example… &lt;a href=&#34;/stats&#34;&gt;&amp;#x2F;stats&lt;/a&gt;&lt;/p&gt;
</content>
    <category term="UI/UX" scheme="https://kiko.io/archives/categories/UI-UX/" />
    <category term="CSS" scheme="https://kiko.io/archives/tags/CSS/" />
    <category term="Visualization" scheme="https://kiko.io/archives/tags/Visualization/" />
    <category term="HTML" scheme="https://kiko.io/archives/tags/HTML/" />
  </entry>
  <entry>
    <id>https://kiko.io/notes/2026/Unexpected-Visitor/</id>
    <title>Unexpected Visitor</title>
    <published>2026-01-02T00:00:00.000Z</published>
    <updated>2026-04-11T01:22:51.015Z</updated>
    <link href="https://kiko.io/notes/2026/Unexpected-Visitor/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/$Notes-2026.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/$Notes-2026.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Today, we had a visit from an animal that is quite rare in a city, a Gray Heron, which probably needed to inspect our neighbour’s little fish pond with the Kois. What a beauty …&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/notes/2026/_attachments/Unexpected-Visitor.jpeg&#34;&gt;&lt;/p&gt;
</content>
    <category term="Note" scheme="https://kiko.io/notes" />
  </entry>
  <entry>
    <id>https://kiko.io/notes/2026/Farewell-2025/</id>
    <title>Farewell 2025</title>
    <published>2026-01-01T00:00:00.000Z</published>
    <updated>2026-04-11T01:22:51.015Z</updated>
    <link href="https://kiko.io/notes/2026/Farewell-2025/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/$Notes-2026.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/$Notes-2026.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;I ‘ve found 2025 to be a particularly difficult and challenging year, quite apart from the political madness that is unfolding in so many parts of the world and which cannot leave a political person like me unaffected. No, even on a personal level, I will not forget this past year. Starting with my return from an absolutely amazing holiday in South Africa and two other wonderful breaks in Portugal and Sweden, the year has mainly shown me my physical limits. Yes, 57 is no longer mid-20s, and some decisions and habits in my life are now taking their toll, along with a few others that I hadn’t on the list.. and I’m struggling with that physically and mentally. Getting older is not for wimps…&lt;/p&gt;
&lt;p&gt;My wish for 2026 is to achieve the serenity that allows me not to get upset about things I cannot change anyway, and to simply tackle those things that I can influence and shape. &lt;/p&gt;
</content>
    <category term="Note" scheme="https://kiko.io/notes" />
  </entry>
  <entry>
    <id>https://kiko.io/post/App-Defaults-2025/</id>
    <title>App Defaults 2025</title>
    <published>2025-12-19T12:05:42.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/App-Defaults-2025/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/App-Defaults-2025.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/App-Defaults-2025.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;While preparing this new &lt;a href=&#34;https://defaults.rknight.me/&#34;&gt;AppDefaults&lt;/a&gt; post for the passing year 2025, I took a look back at the two previous posts from &lt;a href=&#34;post/App-Defaults-2023&#34;&gt;2023&lt;/a&gt; and &lt;a href=&#34;post/App-Defaults-2024&#34;&gt;2024&lt;/a&gt; and find it exciting to see how my behavior has gradually changed over time.&lt;/p&gt;
&lt;p&gt;A slight shift away from the tools offered by large American companies towards small European alternatives or OSS, which is likely to intensify in the future. I also have less and less patience with software that is going down the path of &lt;a href=&#34;https://en.wikipedia.org/wiki/Enshittification&#34;&gt;enshittification&lt;/a&gt;. I don’t care how long I’ve been using it or how much work is needed to make the switch; it just has to go, even if it hurts, like Plex. I’m not going to be taken for a ride … just die.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mail:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://proton.me/mail&#34;&gt;Proton Mail&lt;/a&gt;, &lt;a href=&#34;https://gmail.com/&#34;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tasks:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt;, &lt;a href=&#34;https://www.appgenix-software.com/&#34;&gt;Business Calendar 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contacts:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://contacts.google.com/&#34;&gt;Google Contacts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Photo Shooting:&lt;/strong&gt;&lt;br&gt;Nikon D500, &lt;a href=&#34;https://store.google.com/product/pixel_9a&#34;&gt;Google Pixel 9a&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Photo Editing &amp;#x2F; Management:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://www.adobe.com/products/photoshop-lightroom-classic.html&#34;&gt;Adobe Lightroom Classic&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RSS:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;/blogroll&#34;&gt;kiko.io’s Blogroll&lt;/a&gt;, &lt;a href=&#34;https://feedly.com/&#34;&gt;Feedly&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;News:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://flipboard.com/&#34;&gt;Flipboard&lt;/a&gt;, &lt;a href=&#34;https://news.google.com/&#34;&gt;Google News&lt;/a&gt;, &lt;a href=&#34;https://feedly.com/&#34;&gt;Feedly&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Browser:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://vivaldi.com/&#34;&gt;Vivaldi&lt;/a&gt;, &lt;a href=&#34;https://www.google.com/intl/en/chrome/&#34;&gt;Google Chrome&lt;/a&gt;, &lt;a href=&#34;https://www.microsoft.com/edge&#34;&gt;Microsoft Edge&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chat:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://signal.org/&#34;&gt;Signal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bookmarks:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt;, &lt;a href=&#34;/tools/tiny-tools/&#34;&gt;kiko.io’s Tiny Tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read It Later:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt;, &lt;a href=&#34;https://www.google.com/intl/en/chrome/&#34;&gt;Google Chrome&lt;/a&gt; (Android)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Word Processing:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://www.microsoft.com/microsoft-365&#34;&gt;M365&lt;/a&gt; (used twice in 2025 and can actually be removed)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spreadsheets:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://www.microsoft.com/microsoft-365&#34;&gt;M365&lt;/a&gt; (same)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Presentations:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://www.microsoft.com/microsoft-365&#34;&gt;M365&lt;/a&gt; (same)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Music:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=com.musicplayer.blackplayerfree&#34;&gt;BlackPlayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Media:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://jellyfin.org/&#34;&gt;Jellyfin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Passwords:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://keepass.info/&#34;&gt;KeePass&lt;/a&gt;, &lt;a href=&#34;https://2fas.com/&#34;&gt;2FAS Auth&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Editor&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&lt;/a&gt;, &lt;a href=&#34;https://visualstudio.microsoft.com/&#34;&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source Control&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://github.com/&#34;&gt;GitHub&lt;/a&gt;, &lt;a href=&#34;https://www.microsoft.com/en/microsoft-365/onedrive/online-cloud-storage&#34;&gt;OneDrive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shopping Lists:&lt;/strong&gt;&lt;br&gt;&lt;a href=&#34;https://keep.google.com/&#34;&gt;Google Keep&lt;/a&gt;, &lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Meal Planning:&lt;/strong&gt;&lt;br&gt;Leni - Stillllll … ultimate version of wife&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Changes&#34;&gt;&lt;a href=&#34;#Changes&#34; class=&#34;headerlink&#34; title=&#34;Changes&#34;&gt;&lt;/a&gt;Changes&lt;/h2&gt;&lt;p&gt;One example of the slow shift away from American services is my new &lt;strong&gt;Proton Mail&lt;/strong&gt; account under one of my own domains, kristofz.me. After 20 years of using Gmail, I no longer enter my old, familiar email address when registering for new accounts, but rather the new one, even though I am still a fan of Gmail in terms of comfort. However, the Swiss company Proton has opened security doors for me that I never thought I would need. Don’t be evil … Okay, but a little diversification is needed these days.&lt;/p&gt;
&lt;p&gt;I’m increasingly opening websites in the &lt;strong&gt;Vivaldi&lt;/strong&gt; browser, which is already installed on all my devices, even though I find all the bells and whistles a bit too much. Jón von Tetzchner is right to keep the European perspective and data protection in mind, whereas with Google Chrome, we know full well that this is a foreign concept to them.&lt;/p&gt;
&lt;p&gt;When I tinker with software in my spare time, I do so 99% of the time in VS Code. I have completely stopped trying to work with online versions such as &lt;em&gt;github.dev&lt;/em&gt;, as I mainly need such solutions on my smartphone and they simply don’t work there.&lt;/p&gt;
&lt;p&gt;What I have completely stopped using this year is &lt;em&gt;Trello&lt;/em&gt;, as Obsidian now provides me with everything I need. Another thing that has disappeared into oblivion for me is &lt;em&gt;Plex&lt;/em&gt;, once the best media solution, but now just one thing: crap. I now use &lt;strong&gt;Jellyfin&lt;/strong&gt; instead.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;Looking-ahead-…&#34;&gt;&lt;a href=&#34;#Looking-ahead-…&#34; class=&#34;headerlink&#34; title=&#34;Looking ahead …&#34;&gt;&lt;/a&gt;Looking ahead …&lt;/h2&gt;&lt;p&gt;I am thoroughly exploring the possibilities of self-hosting, albeit with regard to VPS services and not at home. This blog lives on &lt;em&gt;GitHub Pages&lt;/em&gt; and is automatically built once a day via GitHub Actions to update the blogroll. I would like to separate this into a serverless solution so that I can host the code on my own &lt;strong&gt;Forgejo&lt;/strong&gt; instance and simplify deployment via FTP when something substantial has changed. Elena Rossini contributed to these considerations with her &lt;a href=&#34;https://blog.elenarossini.com/tag/yunohost/&#34;&gt;YunoHost posts&lt;/a&gt;.&lt;/p&gt;
</content>
    <category term="Tools" scheme="https://kiko.io/archives/categories/Tools/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/The-Long-Farewell-to-Stylus/</id>
    <title>The Long Farewell to Stylus</title>
    <published>2025-11-30T17:36:32.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/The-Long-Farewell-to-Stylus/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/The-Long-Farewell-to-Stylus.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/The-Long-Farewell-to-Stylus.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Since I decided in 2019 to use the static site generator (SSG) &lt;a href=&#34;https://hexo.io/&#34;&gt;Hexo&lt;/a&gt; as the foundation for my blog, I have been struggling with the fact that it works with the CSS preprocessor &lt;a href=&#34;https://stylus-lang.com/&#34;&gt;Stylus&lt;/a&gt; via a pre-installed plugin. I thought I just needed some time to get used to the simplified but unfamiliar notation and take advantage of features such as functions, mixins, variables, and the like. Over time, however, the functionality of native CSS grew to such an extent that I started to implement workarounds for new and unsupported features in my Stylus code, which made it significantly more complex and confusing. I didn’t get used to it, but instead just got annoyed by Stylus for quite some time.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;I kept putting off the decision to leave Stylus behind and switch to native CSS because, after five years of tinkering around, it meant a lot of legwork, but I just started at some point and proceeded in small steps. The initial goal was to convert the Stylus code 1:1 to native CSS and clean up errors that had accumulated over the last few years, so that I would then have the opportunity to revamp the structure with modern CSS.&lt;/p&gt;
&lt;p&gt;I thought for a second about whether I should just use the &lt;code&gt;style.css&lt;/code&gt; file that the Hexo plugin &lt;a href=&#34;https://github.com/hexojs/hexo-renderer-stylus&#34;&gt;hexo-renderer-stylus&lt;/a&gt; generates from the dozens of separate &lt;code&gt;styl&lt;/code&gt; files during the build, but it didn’t make sense to start at the top and then break down the more than 7,000 lines into individual chunks and restructure them. You don’t renovate by first exploding a bucket of paint in the room, but by choosing a corner and doing it work-by-work.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-Variables&#34;&gt;&lt;a href=&#34;#1-Variables&#34; class=&#34;headerlink&#34; title=&#34;1. Variables&#34;&gt;&lt;/a&gt;1. Variables&lt;/h2&gt;&lt;p&gt;The file &lt;code&gt;_variables.styl&lt;/code&gt; contains what it promises: variables. And those should be the first to be removed, because native CSS variables (or custom properties) were already introduced by the W3C in 2022 and offer great flexibility, making workarounds from preprocessors unnecessary.&lt;br&gt;Here’s an example from my previous code:&lt;/p&gt;
&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;_variables.styl&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight styl&#34;&gt;&lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;-link = &lt;span class=&#34;number&#34;&gt;#000&lt;/span&gt;
&lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;-hover-link = &lt;span class=&#34;number&#34;&gt;#555&lt;/span&gt;

dark-&lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;-link = &lt;span class=&#34;number&#34;&gt;#fff&lt;/span&gt;
dark-&lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;-hover-link = &lt;span class=&#34;number&#34;&gt;#bbb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These 4 variables were used to set the color of a link depending on which &lt;strong&gt;theme&lt;/strong&gt; the user selected on the site (‘light’ is default), which is reflected in the &lt;code&gt;data-theme&lt;/code&gt; attribute of the &lt;code&gt;html&lt;/code&gt; element, which is then used as a selector in the styles:&lt;/p&gt;
&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;page.styl&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight styl&#34;&gt;&lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: color-link
  /&lt;span class=&#34;selector-attr&#34;&gt;[data-theme=&lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;]&lt;/span&gt; &amp;amp;
    &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: dark-color-link
  &lt;span class=&#34;selector-pseudo&#34;&gt;&amp;amp;:hover&lt;/span&gt;
    &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: color-hover-link
    /&lt;span class=&#34;selector-attr&#34;&gt;[data-theme=&lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;]&lt;/span&gt; &amp;amp;
      &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: dark-color-hover-link&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Stylus has generated the following code from the build so far:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight css&#34;&gt;&lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt; &amp;#123;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#000&lt;/span&gt;;
&amp;#125;

&lt;span class=&#34;selector-attr&#34;&gt;[data-theme=&lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;]&lt;/span&gt; &lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt; &amp;#123;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#fff&lt;/span&gt;;
&amp;#125;

&lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;selector-pseudo&#34;&gt;:hover&lt;/span&gt; &amp;#123;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#555&lt;/span&gt;;
&amp;#125;

&lt;span class=&#34;selector-attr&#34;&gt;[data-theme=&lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;]&lt;/span&gt; &lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;selector-pseudo&#34;&gt;:hover&lt;/span&gt; &amp;#123;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#bbb&lt;/span&gt;;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have now converted all stylus variables one by one into native variables in a new CSS file and replaced them in all &lt;code&gt;styl&lt;/code&gt; files with their new equivalent &lt;code&gt;var(--variable-name)&lt;/code&gt;. The example from above now looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;main.css&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight css&#34;&gt;&lt;span class=&#34;selector-pseudo&#34;&gt;:root&lt;/span&gt; &amp;#123;
  &lt;span class=&#34;attr&#34;&gt;--color-link&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#000&lt;/span&gt;;
  &lt;span class=&#34;attr&#34;&gt;--color-hover-link&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#555&lt;/span&gt;;
&amp;#125;
&lt;span class=&#34;selector-pseudo&#34;&gt;:root&lt;/span&gt;&lt;span class=&#34;selector-attr&#34;&gt;[data-theme=&lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;]&lt;/span&gt; &amp;#123; 
  &lt;span class=&#34;attr&#34;&gt;--color-link&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#fff&lt;/span&gt;;
  &lt;span class=&#34;attr&#34;&gt;--color-hover-link&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;#bbb&lt;/span&gt;;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;page.styl&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight styl&#34;&gt;&lt;span class=&#34;selector-tag&#34;&gt;a&lt;/span&gt;
  &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--color-link)
  &lt;span class=&#34;selector-pseudo&#34;&gt;&amp;amp;:hover&lt;/span&gt;
    &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--color-hover-link)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… and as a result, the generated CSS is two statements shorter.&lt;/p&gt;
&lt;p&gt;In this step, I took the opportunity to slim down the number of variables, which had grown absurdly over the years, and to standardize styles. I was also able to remove all &lt;code&gt;/[data-theme=&amp;quot;dark&amp;quot;] &amp;amp;&lt;/code&gt; rules, as the color is now set based on the theme created when defining the native CSS variable.&lt;/p&gt;
&lt;p&gt;The last remaining stylus variables after this process are a few stylus-specific ones (see section 2) and my own media queries (such as &lt;code&gt;mq-mobile = &amp;quot;screen and (max-width: 479px)&amp;quot;&lt;/code&gt;), which I unfortunately could &lt;strong&gt;not&lt;/strong&gt; transform into CSS variables because CSS rules are not linked to HTML elements, but have a global scope, as Ben Holmes explains in his post &lt;a href=&#34;https://bholmes.dev/blog/alternative-to-css-variable-media-queries/&#34;&gt;Want CSS variables in media query declarations? Try this!&lt;/a&gt;. But more on that later on …&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-Grid-Mixins-and-nib&#34;&gt;&lt;a href=&#34;#2-Grid-Mixins-and-nib&#34; class=&#34;headerlink&#34; title=&#34;2. Grid, Mixins and nib&#34;&gt;&lt;/a&gt;2. Grid, Mixins and nib&lt;/h2&gt;&lt;p&gt;The standard Hexo theme ‘Landscape’ has a four-part layout: &lt;code&gt;header&lt;/code&gt; and &lt;code&gt;footer&lt;/code&gt;, as well as &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;aside&lt;/code&gt; (sidebar), which are combined into content (&lt;code&gt;div#content.outer&lt;/code&gt;). While the first two always extend across the entire page width, the other two share the horizontal space via a fluid “grid” system with percentages calculated during the build. The system is highly customizable in the standards, depending on whether and where you would like to have the sidebar, but I have decided to go with my layout and therefore do not need all the configuration stuff.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/The-Long-Farewell-to-Stylus/hexo-fluid-layout.png&#34; alt=&#34;Hexo Fluid Layout&#34;&gt;&lt;/p&gt;
&lt;p&gt;Of course, such a layout would be implemented differently in 2025, but that wasn’t the task at this stage. I just had to get rid of all variables and functions that were defined or used in multiple files. The starting point was &lt;code&gt;_variables.styl&lt;/code&gt; and its variable &lt;code&gt;sidebar&lt;/code&gt;, which got its value from the Hexo theme’s &lt;code&gt;_config.yml&lt;/code&gt;. Following this thread, I deleted countless values, functions, and references, as can be seen in &lt;a href=&#34;https://github.com/kristofzerbe/kiko.io/commit/1a24503343b323a531b7e1f852883609424c7af4&#34;&gt;GitHub commit #1a24503 (Removed Stylus Gridsystem)&lt;/a&gt;. I simply replaced the whole thing with fixed values, merged the necessary files, and was then able to delete the &lt;code&gt;_grid.styl&lt;/code&gt; and all unnecessary &lt;code&gt;sidebar-*.styl&lt;/code&gt; files. This is what remained:&lt;/p&gt;
&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;style.styl&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight styl&#34;&gt;&lt;span class=&#34;selector-class&#34;&gt;.outer&lt;/span&gt;
  &lt;span class=&#34;attribute&#34;&gt;max-width&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;1220px&lt;/span&gt;

&lt;span class=&#34;selector-tag&#34;&gt;main&lt;/span&gt;
  &lt;span class=&#34;keyword&#34;&gt;@media&lt;/span&gt; mq-normal
    display: inline
    float: left
    &lt;span class=&#34;attribute&#34;&gt;width&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;73%&lt;/span&gt;
    margin: &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;1%&lt;/span&gt;
    
#sidebar
  @media mq-normal
    display: inline
    float: left
    &lt;span class=&#34;attribute&#34;&gt;width&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;23%&lt;/span&gt;
    margin: &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;1%&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;
&lt;p&gt;Getting rid of the &lt;code&gt;_mixin.styl&lt;/code&gt; file was pretty straightforward, as it basically just contains a few functions that place CSS code where it is used.&lt;/p&gt;
&lt;p&gt;That just left the following two variables:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight styl&#34;&gt;support-&lt;span class=&#34;keyword&#34;&gt;for&lt;/span&gt;-ie = false
vendor-prefixes = webkit moz ms official&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After some trial and error, I discovered that these belong to the &lt;a href=&#34;https://stylus.github.io/nib/&#34;&gt;nib CSS3 extensions for Stylus&lt;/a&gt;, a library that is installed with the Stylus renderer plugin. It has a few useful functions for Stylus users, such as &lt;code&gt;global-reset()&lt;/code&gt; and &lt;code&gt;clear-fix()&lt;/code&gt;, which Hexo makes use of. However, it is also responsible for adding vendor-specific declarations such as &lt;code&gt;-moz-box-shadow&lt;/code&gt; and the like to the output CSS, which will be completely out of date by 2025. After adopting the declarations of the above functions and deleting the &lt;code&gt;@import &amp;quot;nib&amp;quot;&lt;/code&gt; statement, these two variables could also be removed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;CSS-File-Structure-Bundling&#34;&gt;&lt;a href=&#34;#CSS-File-Structure-Bundling&#34; class=&#34;headerlink&#34; title=&#34;CSS File Structure &amp;amp; Bundling&#34;&gt;&lt;/a&gt;CSS File Structure &amp;amp; Bundling&lt;/h2&gt;&lt;p&gt;After migrating some of the Stylus code to the new &lt;code&gt;main.css&lt;/code&gt; in steps 1 and 2, it was time to structure the declarations into separate files. The variables in &lt;code&gt;defaults.css&lt;/code&gt;, all resets in &lt;code&gt;reset.css&lt;/code&gt; and, since it was a quick win, all font styles in &lt;code&gt;fonts.css&lt;/code&gt;. All these files now had to be merged back automatically while building into &lt;code&gt;main.css&lt;/code&gt; and minified.&lt;/p&gt;
&lt;p&gt;I didn’t need a super-duper bundling library for this, because, on the one hand, you should be thrifty with dependencies and, on the other hand, Hexo offered me everything I needed to concatenate a few files in the right order with Hexo’s &lt;a href=&#34;https://hexo.io/api/generator&#34;&gt;Generators&lt;/a&gt; concept, which I was already familiar with. I also use the &lt;a href=&#34;https://github.com/hexojs/hexo-browsersync&#34;&gt;hexo-browsersync&lt;/a&gt; plugin for live reloading while coding, which ensures that all generators run once after saving a file.&lt;/p&gt;
&lt;p&gt;My CSS bundle generator is very similar in its principle to the &lt;a href=&#34;https://github.com/MoNwastaken/hexo-css-merge&#34;&gt;hexo-css-merge&lt;/a&gt; plugin, from which I got the idea to use &lt;a href=&#34;https://github.com/clean-css/clean-css&#34;&gt;clean-css&lt;/a&gt; for compression, but it largely omits configurability and is somewhat shorter:&lt;/p&gt;
&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;_config-yaml&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight yml&#34;&gt;&lt;span class=&#34;attr&#34;&gt;css_bundle:&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;target:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;main&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;files_in_order:&lt;/span&gt;
    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;defaults&lt;/span&gt;
    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;fonts&lt;/span&gt;
    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;reset&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;div class=&#34;caption&#34;&gt;&lt;span&gt;generator-css-bundle.js&lt;/span&gt;&lt;/div&gt;&lt;code class=&#34;highlight js&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; fs = &lt;span class=&#34;built_in&#34;&gt;require&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;hexo-fs&amp;#x27;&lt;/span&gt;);
&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; path = &lt;span class=&#34;built_in&#34;&gt;require&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;path&amp;#x27;&lt;/span&gt;);
&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; cleanCSS = &lt;span class=&#34;built_in&#34;&gt;require&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;clean-css&amp;#x27;&lt;/span&gt;);

hexo.&lt;span class=&#34;property&#34;&gt;extend&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;generator&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;register&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;css-bundle&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; (&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) &amp;#123;
  &lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; config = &lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;config&lt;/span&gt;;
  &lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; bundle = config.&lt;span class=&#34;property&#34;&gt;css_bundle&lt;/span&gt;;

  &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; result = [];
  
  &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; files = bundle.&lt;span class=&#34;property&#34;&gt;files_in_order&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;map&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;params&#34;&gt;file&lt;/span&gt; =&amp;gt;&lt;/span&gt; &amp;#123;
    &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; path.&lt;span class=&#34;title function_&#34;&gt;join&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;themes&amp;quot;&lt;/span&gt;, config.&lt;span class=&#34;property&#34;&gt;theme&lt;/span&gt;, config.&lt;span class=&#34;property&#34;&gt;source_dir&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;quot;css&amp;quot;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;`&lt;span class=&#34;subst&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt;.css`&lt;/span&gt;);
  &amp;#125;);

  &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; styles = &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
  files.&lt;span class=&#34;title function_&#34;&gt;forEach&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;params&#34;&gt;file&lt;/span&gt; =&amp;gt;&lt;/span&gt; &amp;#123;
    styles += fs.&lt;span class=&#34;title function_&#34;&gt;readFileSync&lt;/span&gt;(file);
  &amp;#125;);

  result.&lt;span class=&#34;title function_&#34;&gt;push&lt;/span&gt;(&amp;#123;
    &lt;span class=&#34;attr&#34;&gt;path&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;`/css/&lt;span class=&#34;subst&#34;&gt;$&amp;#123;bundle.target&amp;#125;&lt;/span&gt;.css`&lt;/span&gt;,
    &lt;span class=&#34;attr&#34;&gt;data&lt;/span&gt;: styles
  &amp;#125;);

  &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; clean = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;cleanCSS&lt;/span&gt;().&lt;span class=&#34;title function_&#34;&gt;minify&lt;/span&gt;(styles);

  result.&lt;span class=&#34;title function_&#34;&gt;push&lt;/span&gt;(&amp;#123;
    &lt;span class=&#34;attr&#34;&gt;path&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;`/css/&lt;span class=&#34;subst&#34;&gt;$&amp;#123;bundle.target&amp;#125;&lt;/span&gt;.min.css`&lt;/span&gt;,
    &lt;span class=&#34;attr&#34;&gt;data&lt;/span&gt;: clean.&lt;span class=&#34;property&#34;&gt;styles&lt;/span&gt;
  &amp;#125;);

  &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; result;
&amp;#125;);&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Conclusion-after-the-first-steps&#34;&gt;&lt;a href=&#34;#Conclusion-after-the-first-steps&#34; class=&#34;headerlink&#34; title=&#34;Conclusion after the first steps&#34;&gt;&lt;/a&gt;Conclusion after the first steps&lt;/h2&gt;&lt;p&gt;It’s fun to throw out things you never needed anyway. Hexo’s theming capabilities per se are still impressive even today, but people like me quickly start tinkering around, so that a simple theme change is no longer possible after a few weeks, but also no longer desirable. However, it makes the switch from the built-in Stylus preprocessor to native CSS more complex and time-consuming.&lt;/p&gt;
&lt;p&gt;I still have a lot of work to do until I can finally start to modernise the layout technically based on plain CSS. The JavaScript-based scroll header solution in particular has been bothering me for a while now, but I’ve already built a CSS-based prototype, for which I need to change the HTML structure, and that’s hardly possible with Stylus and all the hacks in the way.&lt;/p&gt;
&lt;p&gt;In the meantime, my blog consists of two stylesheets: the new &lt;code&gt;main.min.css&lt;/code&gt; and the old &lt;code&gt;style.css&lt;/code&gt; from Stylus, but gradually one is getting bigger and the other smaller.&lt;/p&gt;
&lt;p&gt;The rebuild continues. Stay tuned…&lt;/p&gt;
</content>
    <category term="Coding" scheme="https://kiko.io/archives/categories/Coding/" />
    <category term="Hexo" scheme="https://kiko.io/archives/tags/Hexo/" />
    <category term="CSS" scheme="https://kiko.io/archives/tags/CSS/" />
    <category term="Stylus" scheme="https://kiko.io/archives/tags/Stylus/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/StreetComplete-Contribution-while-passing-by/</id>
    <title>StreetComplete - Contribution while passing by</title>
    <published>2025-11-27T17:34:15.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/StreetComplete-Contribution-while-passing-by/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/StreetComplete-Contribution-while-passing-by.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/StreetComplete-Contribution-while-passing-by.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;I have been working with &lt;a href=&#34;https://www.openstreetmap.org/&#34;&gt;OpenStreetMap&lt;/a&gt; for a while now from the developers’ perspective, who can use it to conjure up attractive maps, such as my &lt;a href=&#34;/photos/map/&#34;&gt;Photo Map&lt;/a&gt;, on the web free of charge. However, I am not part of the &lt;a href=&#34;https://community.openstreetmap.org/&#34;&gt;community&lt;/a&gt;, nor have I given much thought to where all the data comes from and how it finds its way into the maps. Until recently… when I stumbled across an app review of &lt;a href=&#34;https://streetcomplete.app/&#34;&gt;&lt;strong&gt;StreetComplete&lt;/strong&gt;&lt;/a&gt; by chance and installed the Android app (iOS is planned) out of curiosity.&lt;/p&gt;

    &lt;div&gt;
        &lt;blockquote&gt;&lt;p&gt;This app finds missing map data in your vicinity and displays it on a map as quests. Solve each quest by visiting the location on-site and answering a simple question to update the map.&lt;/p&gt;
&lt;/blockquote&gt;
        &lt;cite&gt;&lt;a href=&#34;https://streetcomplete.app/&#34;&gt;--- streetcomplete.app&lt;/a&gt;&lt;/cite&gt;
    &lt;/div&gt;
  

&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;A map, i.e., a genuine alternative to the all-powerful Google Maps, thrives not only on topographical features, but also on specific details that offer users added value but are much more time-consuming to capture. That’s probably what &lt;a href=&#34;https://github.com/westnordost&#34;&gt;Tobias Zwick&lt;/a&gt; from Hamburg thought when he wrote the first lines of code for this &lt;strong&gt;OpenStreetMap editor&lt;/strong&gt; back in 2017.&lt;/p&gt;
&lt;p&gt;The app is not only easy to use, but also has a clever design: it gamifies the recording of map details using a map of the current environment and awards points for answering easy-to-understand questions, which are then entered into a multi-level ranking. There is also a team mode where you can team up with several friends to hunt for points by dividing up tasks.&lt;/p&gt;
&lt;p&gt;Instead of silly Pokemon hunting, this wonderful app lets you make open maps accessible to everyone more detailed during a long walk or even in between other activities. I love it and just wish I had discovered it sooner, as I’m currently only ranked 3,255th in Germany.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/StreetComplete-Contribution-while-passing-by/streetcomplete-screenshots.jpg&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://play.google.com/store/apps/details?id&amp;#x3D;de.westnordost.streetcomplete&amp;amp;hl&amp;#x3D;en&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;StreetComplete - Apps on Google Play&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;OpenStreetMap surveyor app&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://play.google.com/store/apps/details?id&amp;#x3D;de.westnordost.streetcomplete&amp;amp;hl&amp;#x3D;en&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;play.google.com&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://play-lh.googleusercontent.com/crefZLyOIEES_RgEzHuMscsEDYogHZKFf2EwQ1gKSjL2ngTq42nE5rjalZBroAkSNho)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</content>
    <category term="Tools" scheme="https://kiko.io/archives/categories/Tools/" />
    <category term="Maps" scheme="https://kiko.io/archives/tags/Maps/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/REP-Embedding-Bandcamp-Tracks/</id>
    <title>Updated: </title>
    <published>2025-11-16T15:59:50.000Z</published>
    <updated>2025-11-20T19:00:00.000Z</updated>
    <link href="https://kiko.io/post/REP-Embedding-Bandcamp-Tracks/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/REP-Embedding-Bandcamp-Tracks.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/REP-Embedding-Bandcamp-Tracks.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Recently, I was greatly inspired by &lt;a href=&#34;https://front-end.social/@kizu&#34;&gt;Roma Komarov&lt;/a&gt; to add another, audible layer to my blog posts…&lt;/p&gt;
&lt;p&gt;At the beginning of the month, I complained to myself in my post &lt;a href=&#34;/post/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music&#34;&gt;Stoned Jesus, Bandcamp and the Necessity of Music&lt;/a&gt; that I hardly listen to music anymore, even though it seems to help me in stressful times. Just as I (re)discovered Bandcamp and my credit card was hit hard for various great albums, Roma came up with the following post:&lt;/p&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://blog.kizu.dev/embedding-bandcamp-tracks/&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;Embedding Bandcamp Tracks&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;A long time ago, back in LiveJournal, sometimes people embedded various music players in their posts. It was fun! I already had a &amp;#x27;Current music&amp;#x27; field added to most of my posts, but now I also added a way to enrich this field by adding an optional Bandcamp track reference, and spent my evening updating existing posts in the blog to have it.&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://blog.kizu.dev/embedding-bandcamp-tracks/&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;blog.kizu.dev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Well, if that isn’t fate…&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;p&gt;I especially like his approach with the &lt;code&gt;detail&lt;/code&gt; element, which only pulls the source of the &lt;code&gt;iframe&lt;/code&gt; from the network when you open it. Nothing complicated, just pretty straightforward.&lt;/p&gt;
&lt;p&gt;From the beginning, I had a small icon of a musical note at the top of the post in mind, accompanied by the artist and track name, so that you know what’s coming. Unfortunately, it’s still a bit difficult to replace the &lt;code&gt;marker&lt;/code&gt; of the &lt;code&gt;detail&lt;/code&gt; element with an icon in SVG form, but at least you can make it disappear.&lt;/p&gt;
&lt;p&gt;Here is the HTML of my EJS partial responsible for the visualization:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight html&#34;&gt; &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;details&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;class&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;bandcamp&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;summary&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;em&lt;/span&gt;&amp;gt;&lt;/span&gt;&amp;lt;%= artist %&amp;gt; - &amp;lt;%= track.name; %&amp;gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;em&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;svg&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;class&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;icon-music-note-accent&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;xlink:href&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;/images/icons/music-note-accent.svg#note&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;use&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;svg&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;summary&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;iframe&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;src&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;https://bandcamp.com/EmbeddedPlayer/album=&amp;lt;%= album.id %&amp;gt;/size=small/bgcol=ffffff/linkcol=333333/track=&amp;lt;%= track.id %&amp;gt;/transparent=true/&amp;quot;&lt;/span&gt; &lt;/span&gt;
&lt;span class=&#34;tag&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;width&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;height&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;42px&amp;quot;&lt;/span&gt; &lt;/span&gt;
&lt;span class=&#34;tag&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;load&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;lazy&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;seamless&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;iframe&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;details&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is controlled when the page is created via Frontmatter entries of the respective article … for example this one:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight yaml&#34;&gt;&lt;span class=&#34;attr&#34;&gt;bandcamp:&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;artist:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;Lowdrive&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;album:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;Rise|2549803014&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;track:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;Blood&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;Sacrifice|897654312&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;(Yes, I know… Pipe-separated strings in Frontmatter are ugly, but easier to keep track of)&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;I don’t know how Roma gets the necessary values for his songs, but the only way to extract the album and track IDs from the Bandcamp UI at the moment is via the link “Share&amp;#x2F;Embed”, the opening dialogs, the “Embed Code” field, and an external editor, since the field is only an &lt;code&gt;input&lt;/code&gt; and not a &lt;code&gt;textarea&lt;/code&gt; that could be enlarged :|&lt;br&gt;A little annoying, but bearable, because at least I don’t write my posts on the fly and therefore take the time to pick out the data.&lt;/p&gt;
&lt;p&gt;What’s left now is the CSS (here in Stylus format), which I’m still tinkering with because I’m not entirely satisfied with it yet. The &lt;code&gt;details&lt;/code&gt; element is really quite special…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight styl&#34;&gt;&lt;span class=&#34;selector-tag&#34;&gt;details&lt;/span&gt;&lt;span class=&#34;selector-class&#34;&gt;.bandcamp&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;--bc-margin&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;0.5rem&lt;/span&gt;
  &lt;span class=&#34;attr&#34;&gt;--bc-padding&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;1.5rem&lt;/span&gt;
  &lt;span class=&#34;attribute&#34;&gt;width&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;calc&lt;/span&gt;(&lt;span class=&#34;number&#34;&gt;100%&lt;/span&gt; - &lt;span class=&#34;built_in&#34;&gt;calc&lt;/span&gt;(&lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-margin) * &lt;span class=&#34;number&#34;&gt;2&lt;/span&gt;))
  &lt;span class=&#34;attribute&#34;&gt;margin-block&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-margin) &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;
  &lt;span class=&#34;attribute&#34;&gt;margin-inline&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-margin)
  &lt;span class=&#34;attribute&#34;&gt;display&lt;/span&gt;: grid
  justify-items: end
  &lt;span class=&#34;selector-pseudo&#34;&gt;&amp;amp;::marker&lt;/span&gt;
    &lt;span class=&#34;attribute&#34;&gt;display&lt;/span&gt;:none
    &lt;span class=&#34;attribute&#34;&gt;content&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
  &lt;span class=&#34;selector-tag&#34;&gt;summary&lt;/span&gt;
    &lt;span class=&#34;attribute&#34;&gt;list-style&lt;/span&gt;: none
    &lt;span class=&#34;attribute&#34;&gt;padding&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;
    &lt;span class=&#34;selector-tag&#34;&gt;em&lt;/span&gt;
      &lt;span class=&#34;attribute&#34;&gt;display&lt;/span&gt;: inline-block
      &lt;span class=&#34;attribute&#34;&gt;margin-right&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;calc&lt;/span&gt;(&lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-padding) / &lt;span class=&#34;number&#34;&gt;2&lt;/span&gt;)
      &lt;span class=&#34;attribute&#34;&gt;font-variant&lt;/span&gt;: all-small-caps
      &lt;span class=&#34;attribute&#34;&gt;color&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--color-accent-text)
      &lt;span class=&#34;attribute&#34;&gt;transition&lt;/span&gt;: all ease-out &lt;span class=&#34;number&#34;&gt;0.2s&lt;/span&gt;
    svg
      &lt;span class=&#34;attribute&#34;&gt;width&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-padding)
      &lt;span class=&#34;attribute&#34;&gt;height&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;var&lt;/span&gt;(--bc-padding)
      &lt;span class=&#34;attribute&#34;&gt;float&lt;/span&gt;: right
      &lt;span class=&#34;attribute&#34;&gt;transition&lt;/span&gt;: all ease-out &lt;span class=&#34;number&#34;&gt;0.2s&lt;/span&gt;
  &amp;amp;&lt;span class=&#34;selector-attr&#34;&gt;[open]&lt;/span&gt;
    &lt;span class=&#34;selector-tag&#34;&gt;summary&lt;/span&gt;
      &lt;span class=&#34;selector-tag&#34;&gt;em&lt;/span&gt;
        &lt;span class=&#34;attribute&#34;&gt;opacity&lt;/span&gt;: &lt;span class=&#34;number&#34;&gt;0.333&lt;/span&gt;
    svg
      &lt;span class=&#34;attribute&#34;&gt;transform&lt;/span&gt;: &lt;span class=&#34;built_in&#34;&gt;rotate&lt;/span&gt;(-&lt;span class=&#34;number&#34;&gt;20deg&lt;/span&gt;)&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Update-Theme-Switching&#34;&gt;&lt;a href=&#34;#Update-Theme-Switching&#34; class=&#34;headerlink&#34; title=&#34;Update: Theme Switching&#34;&gt;&lt;/a&gt;Update: Theme Switching&lt;/h2&gt;&lt;p&gt;&lt;del&gt;What I still need to do is make the theme change look good, because the colors of the Bandcamp player are coded in the iframe URL…&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;The URL parameters for the embedded Bandcamp player contain information about the background and link colors, and the values appear to be HEX colors, but they are not; rather, they are keys to the predefined colors in Bandcamp’s Customize dialog. It’s a shame, because this means I can’t use the page-specific accent colors for my pages. The only thing left is Light and Dark, along with the selected theme, and some JavaScript to set the player URL when the page is first opened and when the theme is switched.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/REP-Embedding-Bandcamp-Tracks/bandcamp-embed-customize.png&#34; alt=&#34;Bandcamp&amp;#39;s Embed Customize Dialog&#34;&gt;&lt;/p&gt;
&lt;p&gt;Resetting the &lt;code&gt;iframe&lt;/code&gt; URL via the &lt;code&gt;src&lt;/code&gt; attribute is not a good idea, because (for whatever reason) this affects the browser history of the entire page and means that the user has to press the BACK button as many times as the player has been reset in order to return to the previous page in the blog. Annoying.&lt;/p&gt;
&lt;p&gt;One option is to replace the entire &lt;code&gt;iframe&lt;/code&gt; element each time, but another, simpler option is to use &lt;code&gt;contentWindow.location&lt;/code&gt; of the &lt;code&gt;iframe&lt;/code&gt; element, which does not exhibit the history behavior.&lt;/p&gt;
&lt;p&gt;All wrapped up in a small JavaScript function and garnished with a &lt;code&gt;MutationObserver&lt;/code&gt; that responds to the theme change at this point, the following addition to the EJS code results:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight js&#34;&gt;&amp;lt;script&amp;gt;
  &lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;setThemeBandcampPlayer&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) &amp;#123;
    &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; bgColor = &lt;span class=&#34;string&#34;&gt;&amp;quot;ffffff&amp;quot;&lt;/span&gt;;
    &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; lnkColor = &lt;span class=&#34;string&#34;&gt;&amp;quot;333333&amp;quot;&lt;/span&gt;;
    &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; theme = &lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;documentElement&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;getAttribute&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;data-theme&amp;quot;&lt;/span&gt;);
    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (theme === &lt;span class=&#34;string&#34;&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;) &amp;#123; bgColor = &lt;span class=&#34;string&#34;&gt;&amp;quot;333333&amp;quot;&lt;/span&gt;; lnkColor = &lt;span class=&#34;string&#34;&gt;&amp;quot;ffffff&amp;quot;&lt;/span&gt;; &amp;#125; 

    &lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; bcPlayerUri = &lt;span class=&#34;string&#34;&gt;`\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  https://bandcamp.com/EmbeddedPlayer/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  album=&amp;lt;%= album.id %&amp;gt;/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  size=small/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  bgcol=&lt;span class=&#34;subst&#34;&gt;$&amp;#123;bgColor&amp;#125;&lt;/span&gt;/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  linkcol=&lt;span class=&#34;subst&#34;&gt;$&amp;#123;lnkColor&amp;#125;&lt;/span&gt;/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  track=&amp;lt;%= track.id %&amp;gt;/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  transparent=true/\&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  `&lt;/span&gt;;

    &lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;getElementById&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;bandcamp-player&amp;quot;&lt;/span&gt;).&lt;span class=&#34;property&#34;&gt;contentWindow&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;location&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;replace&lt;/span&gt;(bcPlayerUri)
  &amp;#125;

  &lt;span class=&#34;comment&#34;&gt;// Startup&lt;/span&gt;
  &lt;span class=&#34;title function_&#34;&gt;setThemeBandcampPlayer&lt;/span&gt;(); 

  &lt;span class=&#34;comment&#34;&gt;// Theme Switch&lt;/span&gt;
  &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;MutationObserver&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;params&#34;&gt;m&lt;/span&gt; =&amp;gt;&lt;/span&gt; &amp;#123; 
      &lt;span class=&#34;title function_&#34;&gt;setThemeBandcampPlayer&lt;/span&gt;(); 
    &amp;#125;).&lt;span class=&#34;title function_&#34;&gt;observe&lt;/span&gt;(&lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;documentElement&lt;/span&gt;, &amp;#123;
      &lt;span class=&#34;attr&#34;&gt;attributes&lt;/span&gt;: &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;, &lt;span class=&#34;attr&#34;&gt;attributeFilter&lt;/span&gt;: [&lt;span class=&#34;string&#34;&gt;&amp;quot;data-theme&amp;quot;&lt;/span&gt;], &lt;span class=&#34;attr&#34;&gt;attributeOldValue&lt;/span&gt;: &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;
    &amp;#125;);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Conclusion&#34;&gt;&lt;a href=&#34;#Conclusion&#34; class=&#34;headerlink&#34; title=&#34;Conclusion&#34;&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Thanks Roma for the impetus for this fun little feature for my readers… at least if they like rock music ;)&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;em&gt;… he writes as the guitar riff kicks in massively and he raises the devil’s horn towards the sky&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
</content>
    <category term="Coding" scheme="https://kiko.io/archives/categories/Coding/" />
    <category term="Hexo" scheme="https://kiko.io/archives/tags/Hexo/" />
    <category term="CSS" scheme="https://kiko.io/archives/tags/CSS/" />
    <category term="SVG" scheme="https://kiko.io/archives/tags/SVG/" />
    <category term="HTML" scheme="https://kiko.io/archives/tags/HTML/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/European-Perspectives/</id>
    <title>European Perspectives</title>
    <published>2025-11-10T16:15:08.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/European-Perspectives/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/European-Perspectives.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/European-Perspectives.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Earlier this year, my sweetie and I made a little trip to nearby Strasbourg. Not only because I really like the city and its French flair (she has never been there before), but also because I had never set foot in the &lt;strong&gt;European Parliament&lt;/strong&gt; (EP) before. The people there have a big influence on our lives with their institutions and regulations, which eventually find their way into German law. As a committed European, you simply have to see it for yourself. And we live just 2.5 hours or 230 kilometers away.&lt;/p&gt;
&lt;p&gt;The institution is very open. Guests are always welcome, even though tickets must be booked online in advance due to the large number of visitors. We were fortunate that on that day, the EP had invited young people from all over Europe to discuss issues important to them in the plenary chamber.&lt;/p&gt;
&lt;p&gt;The building, which dates back to 1999, is impressive and beautifully located directly on a tributary of the Îll River, which winds its way through Strasbourg. It’s wonderful to take a leisurely walk around the complex and feed the ducks on the river, as long as you have some stale bread with you.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;div class=&#34;photo-masonry&#34; id=&#34;photo-masonry-jj13jz&#34;&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-096&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-096&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP I&#34;
          data-description=&#34;photo&#34;
          data-src=&#34;/photos/normal/25-05-Strassburg-096.jpg&#34;&gt;
        &lt;img src=&#34;/photos/mobile/25-05-Strassburg-096.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-097&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-097&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP II&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-097/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-097/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-098&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-098&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP III&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-098/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-098/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-103&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-103&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP IV&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-103/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-103/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-114&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-114&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP V&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-114/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-114/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-121&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-121&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP VI&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-121/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-121/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-133&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-133&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP VII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-133/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-133/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-135&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-135&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP VIII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-135/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-135/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-137&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-137&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP X&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-137/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-137/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-140&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-140&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XI&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-140/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-140/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-141&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-141&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-141/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-141/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-149&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-149&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XIII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-149/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-149/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-150&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-150&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XIV&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-150/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-150/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-159&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-159&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XV&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-159/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-159/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-160&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-160&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XVI&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-160/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-160/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-163&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-163&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XVII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-163/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-163/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-165&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-165&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XVIII&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-165/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-165/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-166&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-166&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XIX&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-166/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-166/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a class=&#34;spotlight&#34; 
          href=&#34;/photos/25-05-Strassburg-171&#34;
          data-button=&#34;Photo Page&amp;nbsp;&amp;nbsp;&amp;#10148;&#34;
          data-button-href=&#34;/photos/25-05-Strassburg-171&#34;
          data-autohide=&#34;10&#34;
          data-title=&#34;EP XX&#34;
          data-description=&#34;shed&#34;
          data-src=&#34;/shed/25-05-Strassburg-171/normal.jpg&#34;&gt;
        &lt;img src=&#34;/shed/25-05-Strassburg-171/mobile.jpg&#34; /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;

</content>
    <category term="Photo" scheme="https://kiko.io/archives/categories/Photo/" />
    <category term="Publishing" scheme="https://kiko.io/archives/tags/Publishing/" />
    <category term="Imaging" scheme="https://kiko.io/archives/tags/Imaging/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/Mentions-United-GitHub-GraphQL/</id>
    <title>Mentions United, GitHub &amp; GraphQL</title>
    <published>2025-11-09T11:10:14.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/Mentions-United-GitHub-GraphQL/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/Mentions-United-GitHub-GraphQL.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/Mentions-United-GitHub-GraphQL.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;A few months ago, in my post &lt;a href=&#34;/post/Using-GitHub-as-Commenting-Platform-2025-Edition&#34;&gt;Using GitHub as Commenting Platform, 2025 Edition&lt;/a&gt;, I explained how GitHub Issues can be used quite easily as a commenting platform:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a GitHub issue for each post that contains at least the post URL&lt;/li&gt;
&lt;li&gt;Add a syndication link to the issue on the post page&lt;/li&gt;
&lt;li&gt;Let Brid.gy and Webmention.io do their job&lt;/li&gt;
&lt;li&gt;Integrate Mentions United into the page to display comments via the &lt;a href=&#34;https://github.com/kristofzerbe/Mentions-United?tab=readme-ov-file#provider-webmentions&#34;&gt;Provider Plugin Webmentions&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So I’ve made it a habit to syndicate every new post in a GitHub issue. This saves me from having to set up my own spam-proof comment system, which is difficult or even impossible to implement on &lt;a href=&#34;https://en.wikipedia.org/wiki/Static_site_generator&#34;&gt;SSG&lt;/a&gt; sites anyway.&lt;/p&gt;
&lt;p&gt;One might argue that the data chain &lt;strong&gt;Site&lt;/strong&gt; &amp;rarr; &lt;strong&gt;GitHub&lt;/strong&gt; &amp;rarr; &lt;strong&gt;brid.gy&lt;/strong&gt; &amp;rarr; &lt;strong&gt;webmention.io&lt;/strong&gt; &amp;rarr; &lt;strong&gt;Site&lt;/strong&gt; is quite long and offers a lot of room for errors, but all I can say to that is: Yes, you’re right, because that’s exactly the case at the moment!&lt;/p&gt;
&lt;p&gt;A blog like this, with two or three posts a month (if there’s time), isn’t exactly flooded with comments, so some time passed before I noticed that brid.gy is still polling my GitHub account, but unfortunately isn’t getting any results and therefore isn’t passing along any web mentions for GitHub issue comments. The chain has been broken!&lt;br&gt;I will certainly inform the creator &lt;a href=&#34;https://snarfed.org/about&#34;&gt;Ryan Barrett&lt;/a&gt; about this, but that doesn’t help me at the moment, so I decided to build a &lt;a href=&#34;https://github.com/kristofzerbe/Mentions-United#provider-github&#34;&gt;native GitHub provider plugin for Mentions United&lt;/a&gt;.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;hr&gt;
&lt;h2 id=&#34;The-GitHub-Provider-Plugin&#34;&gt;&lt;a href=&#34;#The-GitHub-Provider-Plugin&#34; class=&#34;headerlink&#34; title=&#34;The GitHub Provider Plugin&#34;&gt;&lt;/a&gt;The GitHub Provider Plugin&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/post/Mentions-United-GitHub-GraphQL/Provider-github.png&#34; alt=&#34;Architecture GitHub Provider-Plugin&#34;&gt;&lt;/p&gt;
&lt;p&gt;The process wasn’t really that complicated, because my code template for new Mention United providers already contains the basic structure, which I just had to fill up. It was also a little easier for me here because, unlike my native &lt;a href=&#34;/post/Mentions-United-Native-Mastodon-Provider/&#34;&gt;Provider Plugin for Mastodon&lt;/a&gt;, I didn’t need to evaluate any instances here, but could go directly to &lt;a href=&#34;https://api.github.com/&#34;&gt;https://api.github.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first calls to the API endpoint relevant to my purposes, &lt;code&gt;https://api.github.com/repos/&amp;#123;&amp;#123;OWNER&amp;#125;&amp;#125;/&amp;#123;&amp;#123;REPO&amp;#125;&amp;#125;/issues/&amp;#123;&amp;#123;ISSUENO&amp;#125;&amp;#125;/comments&lt;/code&gt;, returned a lot of data, 80% of which I didn’t need, but some of which was missing. GitHub only resolves the author of a comment via REST in a &lt;code&gt;login&lt;/code&gt; object, which does not contain the user’s name. To get that, I would have had to use another API endpoint. The &lt;a href=&#34;https://docs.github.com/en/graphql&#34;&gt;GitHub GraphQL API&lt;/a&gt; seemed to me to be a much more elegant, time-saving, and resource-efficient approach. It was the perfect opportunity to finally get to grips with &lt;a href=&#34;https://en.wikipedia.org/wiki/GraphQL&#34;&gt;GraphQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unlike a classic GET request to a REST URL with various URL parameters, GraphQL only has one URL to which you send a query specifically defined for this retrieval using POST in the request body. Here is my first attempt, which reads as follows:&lt;br&gt;Query the repository XXX of owner YYY for all issues with the number ZZZ and output the fields &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt; and the first 100 comments in a nodes list with the fields &lt;code&gt;id,&lt;/code&gt; &lt;code&gt;login,&lt;/code&gt; &lt;code&gt;body,&lt;/code&gt; &lt;code&gt;url,&lt;/code&gt; and &lt;code&gt;createdAt&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight http&#34;&gt;POST https://api.github.com/graphql
&lt;span class=&#34;attribute&#34;&gt;Authorization&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;: &lt;/span&gt;Bearer &amp;#123;&amp;#123;TOKEN&amp;#125;&amp;#125;
&lt;span class=&#34;attribute&#34;&gt;Accept&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;: &lt;/span&gt;application/vnd.github+json
&lt;span class=&#34;attribute&#34;&gt;X-REQUEST-TYPE&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;: &lt;/span&gt;GraphQL

query &amp;#123;
  repository(owner: &amp;quot;YYY&amp;quot;, name: &amp;quot;XXX&amp;quot;) &amp;#123;
    issue(number: ZZZ) &amp;#123;
      url
      title
      comments(first: 100) &amp;#123;
        nodes &amp;#123;
          id
          author &amp;#123;
            login
          &amp;#125;
          body
          url
          createdAt
        &amp;#125;
      &amp;#125;
    &amp;#125;
  &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The trick to outputting additional author information is to first include the type of the &lt;code&gt;author&lt;/code&gt; field using &lt;code&gt;__typename&lt;/code&gt;, because the interface can be either a &lt;code&gt;User&lt;/code&gt;, a &lt;code&gt;Bot&lt;/code&gt;, or an &lt;code&gt;Organization&lt;/code&gt;, and then explicitly define it as a user in order to output additional fields of exactly this type:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight http&#34;&gt;author &amp;#123;
  __typename
  ... on User &amp;#123;
    login      
    name
    avatarUrl
    websiteUrl
  &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once you understand the construct, calling up a GraphQL query like this is quite simple. Here is an excerpt from the finished plugin, which is &lt;a href=&#34;https://github.com/kristofzerbe/Mentions-United/blob/main/mentions-united-provider_github.js&#34;&gt;freely available on GitHub&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;highlight js&#34;&gt;&lt;span class=&#34;title function_&#34;&gt;issueCommentQuery&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) &amp;#123; &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &amp;#123; 
  &lt;span class=&#34;attr&#34;&gt;query&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;`&amp;#123;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;    repository(owner: &amp;quot;&lt;span class=&#34;subst&#34;&gt;$&amp;#123;&lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.owner&amp;#125;&lt;/span&gt;&amp;quot;, name: &amp;quot;&lt;span class=&#34;subst&#34;&gt;$&amp;#123;&lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.repo&amp;#125;&lt;/span&gt;&amp;quot;) &amp;#123;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;      issue(number: &lt;span class=&#34;subst&#34;&gt;$&amp;#123;&lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.issueNo&amp;#125;&lt;/span&gt;) &amp;#123;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;        url&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;        title&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;        comments(first: 100) &amp;#123;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;          nodes &amp;#123; &lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;            ... more fields &lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;          &amp;#125;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;        &amp;#125;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;      &amp;#125;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;    &amp;#125;&lt;/span&gt;
&lt;span class=&#34;string&#34;&gt;  &amp;#125;`&lt;/span&gt;&amp;#125;; 
&amp;#125;

&lt;span class=&#34;keyword&#34;&gt;let&lt;/span&gt; fetchOptions = &amp;#123;
  &lt;span class=&#34;attr&#34;&gt;method&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;&amp;#x27;POST&amp;#x27;&lt;/span&gt;,
  &lt;span class=&#34;attr&#34;&gt;headers&lt;/span&gt;: &amp;#123;
    &lt;span class=&#34;string&#34;&gt;&amp;#x27;X-REQUEST-TYPE&amp;#x27;&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;&amp;#x27;GraphQL&amp;#x27;&lt;/span&gt;,
    &lt;span class=&#34;string&#34;&gt;&amp;#x27;Accept&amp;#x27;&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;&amp;#x27;application/vnd.github+json&amp;#x27;&lt;/span&gt;
  &amp;#125;,
  &lt;span class=&#34;attr&#34;&gt;body&lt;/span&gt;: &lt;span class=&#34;title class_&#34;&gt;JSON&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;stringify&lt;/span&gt;(&lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;issueCommentQuery&lt;/span&gt;())
&amp;#125;;

&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; apiResponse = &lt;span class=&#34;keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;fetch&lt;/span&gt;(&lt;span class=&#34;variable language_&#34;&gt;this&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;graphApiUrl&lt;/span&gt;(), fetchOptions);
&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; apiData = &lt;span class=&#34;keyword&#34;&gt;await&lt;/span&gt; apiResponse.&lt;span class=&#34;title function_&#34;&gt;json&lt;/span&gt;();&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;
&lt;h2 id=&#34;Conclusion&#34;&gt;&lt;a href=&#34;#Conclusion&#34; class=&#34;headerlink&#34; title=&#34;Conclusion&#34;&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Another native Mentions United plugin, and one that I will be expanding in the near future, because this mechanism also allows you to pull all issues and comments from GitHub where your post URL has been mentioned.&lt;/p&gt;
&lt;p&gt;Here is an example of what the result looks like:&lt;/p&gt;
&lt;div class=&#34;cardlink-container&#34;&gt;
  &lt;a class=&#34;cardlink-card&#34; href=&#34;https://kiko.io/post/How-To-Visual-Studio-Database-Project-and-ADSI/#interactions&#34;&gt;
    &lt;div class=&#34;cardlink-main&#34;&gt;
      &lt;div class=&#34;cardlink-title&#34;&gt;How-To: Visual Studio Database Project and ADSI - kiko.io&lt;/div&gt;
      &lt;div class=&#34;cardlink-description&#34;&gt;If you are working with a Visual Studio Database Project and have to deal with data from the Active Directory via a Linked Server, you have to announc...&lt;/div&gt;
      &lt;div class=&#34;cardlink-host&#34;&gt;
        &lt;img class=&#34;cardlink-favicon no-zoom&#34; src=&#34;https://t2.gstatic.com/faviconV2?client&amp;#x3D;SOCIAL&amp;amp;type&amp;#x3D;FAVICON&amp;amp;fallback_opts&amp;#x3D;TYPE,SIZE,URL&amp;amp;url&amp;#x3D;https://kiko.io/post/How-To-Visual-Studio-Database-Project-and-ADSI/#interactions&amp;amp;size&amp;#x3D;32&#34; /&gt;
        &lt;span&gt;kiko.io&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;cardlink-thumbnail&#34; style=&#34;background-image: url(https://kiko.io/images/social-media/How-To-Visual-Studio-Database-Project-and-ADSI.jpg)&#34;&gt;&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;</content>
    <category term="Coding" scheme="https://kiko.io/archives/categories/Coding/" />
    <category term="GitHub" scheme="https://kiko.io/archives/tags/GitHub/" />
  </entry>
  <entry>
    <id>https://kiko.io/post/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music/</id>
    <title>Stoned Jesus, Bandcamp and the Necessity of Music</title>
    <published>2025-11-02T13:10:34.000Z</published>
    <updated></updated>
    <link href="https://kiko.io/post/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music/"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kiko.io/images/social-media/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music.jpg" height="1200" width="630" />
    <content type="html">&lt;p&gt;&lt;img src=&#34;https://kiko.io/images/social-media/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music.jpg&#34; /&gt;&lt;/p&gt;&lt;p&gt;Since yesterday, I know why I’ve been feeling like something’s been missing. For months, I’ve been trying to deal with work stress by finding little or larger distractions that calm my brain down a bit, take my mind off things, and release some of the happiness hormones. Unfortunately, I was on the path of short video dopamine kicks for a while, but two weeks ago I gave up YouTube, my last platform of this kind. The end, over, done. Deactivated.&lt;/p&gt;
&lt;p&gt;Yesterday, I was browsing through my favorite section, ROCK, on NRN (&lt;a href=&#34;https://www.newreleasesnow.com/new-rock-songs&#34;&gt;newreleasesnow.com&lt;/a&gt;) and stumbled across a band called &lt;strong&gt;STONED JESUS&lt;/strong&gt;, whose (Spotify) teaser of the first song, NEW DAWN, from their new album SONGS TO SUN immediately electrified me. Man, what a blast! The hookline is very reminiscent of TOOL, who, in my opinion, performed the best song of all time with RIGHT IN TWO. Of course, I immediately bought the album on Amazon and downloaded it…&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;Download? Amazon? Yes, I’m not a streamer, I’m an owner. I completely reject music streaming. The musician makes music, the label distributes it digitally as MP3s, I buy it, put it in my digital “record cabinet” and listen to it wherever and whenever I want. I could accept streaming services managing my digital assets for a small fee, but instead, they are all predatory exploiters with questionable business concepts that only benefit themselves. Amazon is (of course!) no exception… apart from the fact that they actually still offer MP3 downloads, which has become very rare in the Spotify era.&lt;/p&gt;
&lt;p&gt;However, I wasn’t happy yesterday when I bought the SONGS TO SUN album on Amazon, because I have a pretty rough idea how much of the purchase price of around €6 actually ends up with the artist :| … So I searched the internet for alternatives to buy more albums from the band and came across an old acquaintance: &lt;strong&gt;&lt;a href=&#34;https://bandcamp.com/&#34;&gt;Bandcamp&lt;/a&gt;&lt;/strong&gt;. They promise that 82% will be paid out to the artist, but they tend to have indie labels in their program rather than the big bands. You can also stream via a proprietary app, but Bandcamp also offers a wide range of downloads for people like me… and makes it very easy to browse through similar music.&lt;/p&gt;
&lt;p&gt;What can I say… at the end of the day, I had used up the small batteries in my Pixelbuds twice and spent almost 60 euros on Bandcamp for several albums by four bands. I didn’t know three of them before: Stoned Jesus, of course, but also &lt;strong&gt;Quintana&lt;/strong&gt; and &lt;strong&gt;Howling Giant&lt;/strong&gt;. But now I’m listening to all three albums over and over again.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/post/Stoned-Jesus-Bandcamp-and-the-Necessity-of-Music/bandcamp-buys-251101.jpg&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quintana&lt;/strong&gt; (2024) - &lt;a href=&#34;https://boneshackrecords.bandcamp.com/album/the-traveler&#34;&gt;The Traveler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quintana&lt;/strong&gt; (2025) - &lt;a href=&#34;https://boneshackrecords.bandcamp.com/album/eternity&#34;&gt;Eternity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quintana&lt;/strong&gt; (2025) - &lt;a href=&#34;https://boneshackrecords.bandcamp.com/album/hums-coils&#34;&gt;Hums &amp;amp; Coils&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Howling Giant&lt;/strong&gt; (2025) - &lt;a href=&#34;https://howlinggiant.bandcamp.com/album/crucible-ruin&#34;&gt;Crucible &amp;amp; Ruin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stoned Jesus&lt;/strong&gt; (2019) - &lt;a href=&#34;https://stonedjesus.bandcamp.com/album/from-the-outer-space&#34;&gt;From the Outer Space&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stoned Jesus&lt;/strong&gt; (2023) - &lt;a href=&#34;https://stonedjesus.bandcamp.com/album/father-light&#34;&gt;Father Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stoned Jesus&lt;/strong&gt; (2012) - &lt;a href=&#34;https://stonedjesus.bandcamp.com/album/seven-thunders-roar&#34;&gt;Seven Thunders Roar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stoned Jesus&lt;/strong&gt; (2025) - &lt;a href=&#34;https://stonedjesus.bandcamp.com/album/songs-to-sun&#34;&gt;Songs to Sun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;I started this text the way I did, because I realize how good hard rock, bobbing along, head banging, and pretending to play air guitar are for me right now. I have so much music in my sync folder, but I use it far too rarely for my well-being. That’s going to change…&lt;/p&gt;
</content>
    <category term="Misc" scheme="https://kiko.io/archives/categories/Misc/" />
    <category term="Audio" scheme="https://kiko.io/archives/tags/Audio/" />
    <category term="Music" scheme="https://kiko.io/archives/tags/Music/" />
  </entry>
</feed>
