<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Allibragi</title><link>https://allibragi.codeberg.page/</link><description>Recent content on Allibragi</description><generator>Hugo -- 0.161.1</generator><language>en-us</language><copyright>Allibragi</copyright><lastBuildDate>Fri, 26 Jun 2026 13:13:39 +0100</lastBuildDate><atom:link href="https://allibragi.codeberg.page/index.xml" rel="self" type="application/rss+xml"/><item><title>What I Watch #1 - F-Droid</title><link>https://allibragi.codeberg.page/dev-blog/wiw-1/</link><pubDate>Fri, 26 Jun 2026 13:13:39 +0100</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/dev-blog/wiw-1/</guid><description>Publishing a Flutter app</description><content type="text/html" mode="escaped"><![CDATA[<p>Following Google’s decision to <a href="https://keepandroidopen.org" target="_blank" rel="noopener">lock Android out of the open-source</a>, I&rsquo;ve decided not only to make an Android app but also to publish it on <a href="https://f-droid.org" target="_blank" rel="noopener">F-Droid</a>.
It will be all for nothing? As I write this post, there are 96 days to go until that fateful moment, so only time will tell.</p>
<p>So, first thing first: my app is called <a href="https://f-droid.org/it/packages/io.codeberg.allibragi.whatiwatch/" target="_blank" rel="noopener">What I Watch</a> (<a href="https://codeberg.org/allibragi/whatiwatch" target="_blank" rel="noopener">repo here</a>) and helps you keep track of the series you&rsquo;re currently watching. Not only TV series because it uses the <a href="https://www.tvmaze.com/" target="_blank" rel="noopener">TvMaze</a> API, that is a sort of community driven things for what I&rsquo;ve understood, there are also anime and other stuff but it would have ben too long to put in as short description for the store page.</p>
<p>Enough with the preamble, let’s get to the point. To publish your app on FDroid you need to:</p>
<ul>
<li>have an open source app</li>
<li>fork the <code>fdroiddata</code> repo from <a href="https://gitlab.com" target="_blank" rel="noopener">GitLab</a></li>
<li>add a <code>yml</code> file with the istruction to build your app</li>
<li>make a merge request to add you app to the FDroid repo</li>
</ul>
<p>Now that I’ve managed it, it’s not a difficult task. But I’m not a super-talented developer like you readers, so I struggled to figure out what to do. So thank you, Linsui, for babay-sit me through the whole process (I couldn’t find any social media links or anything else on your profile, so I can’t mention you directly, but I really do thank you so much).</p>
<h2 id="first-steps">First steps<a href="#first-steps" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>As said, the first thin you need is the URL to the git repo of your app. The repo could be anywhere on the internet but it must be open source and reachable from the FDroid servers.</p>
<p>Then create an account on GitLab and fork the <a href="https://gitlab.com/fdroid/fdroiddata" target="_blank" rel="noopener">fdroiddata</a> repository. Now you can clone the repo on your PC, you&rsquo;ll have something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://gitlab.com/YOUR_USERNAME/fdroiddata.git
</span></span></code></pre></div><p>Now in the <code>metadata</code> folder create a <code>yml</code> file named as your Andorid app unique name. It will be something like <code>com.example.whatever.yml</code>. Inside this file we need to put the instuctions to the FDroid server on how to reach our repo and how to build the app.</p>
<h2 id="publish-a-flutter-app">Publish a Flutter app<a href="#publish-a-flutter-app" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I&rsquo;m not quite sure how to go about this, so first I&rsquo;ll provide an example of the YML file based on my experience, and then I&rsquo;ll list, in the order they come to mind, the things I&rsquo;ve discovered along the way.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">Categories</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">List of categories</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">Your app belongs to</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">License: Your app license (es</span><span class="p">:</span><span class="w"> </span><span class="l">AGPL-3.0-or-later)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">AuthorName</span><span class="p">:</span><span class="w"> </span><span class="l">Your name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">SourceCode</span><span class="p">:</span><span class="w"> </span><span class="l">https://your-git-repo-url</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">IssueTracker</span><span class="p">:</span><span class="w"> </span><span class="l">https://your-issue-traker-url</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">AutoName</span><span class="p">:</span><span class="w"> </span><span class="l">your app name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">RepoType</span><span class="p">:</span><span class="w"> </span><span class="l">git</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">Repo</span><span class="p">:</span><span class="w"> </span><span class="l">https://your-git-repo-url</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">Builds</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">versionName</span><span class="p">:</span><span class="w"> </span><span class="m">0.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">versionCode</span><span class="p">:</span><span class="w"> </span><span class="m">11</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">commit</span><span class="p">:</span><span class="w"> </span><span class="l">your-commit-sha</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">srclibs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutter@stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">rm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">prebuild</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutterVersion=$(cat .flutter-version)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;[[ $flutterVersion ]]&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">git -C $$flutter$$ checkout -f $flutterVersion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter config --no-analytics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter pub get</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">scanignore</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter build apk --release --split-per-abi --target-platform=android-arm</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">versionName</span><span class="p">:</span><span class="w"> </span><span class="m">0.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">versionCode</span><span class="p">:</span><span class="w"> </span><span class="m">12</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">commit</span><span class="p">:</span><span class="w"> </span><span class="l">your-commit-sha</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">build/app/outputs/flutter-apk/app-arm64-v8a-release.apk</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">srclibs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutter@stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">rm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">prebuild</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutterVersion=$(cat .flutter-version)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;[[ $flutterVersion ]]&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">git -C $$flutter$$ checkout -f $flutterVersion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter config --no-analytics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter pub get</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">scanignore</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter build apk --release --split-per-abi --target-platform=android-arm64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">versionName</span><span class="p">:</span><span class="w"> </span><span class="m">0.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">versionCode</span><span class="p">:</span><span class="w"> </span><span class="m">13</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">commit</span><span class="p">:</span><span class="w"> </span><span class="l">your-commit-sha</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">build/app/outputs/flutter-apk/app-x86_64-release.apk</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">srclibs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutter@stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">rm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">prebuild</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">flutterVersion=$(cat .flutter-version)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;[[ $flutterVersion ]]&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">git -C $$flutter$$ checkout -f $flutterVersion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter config --no-analytics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter pub get</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">scanignore</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">export PUB_CACHE=$(pwd)/.pub-cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$$flutter$$/bin/flutter build apk --release --split-per-abi --target-platform=android-x64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">AutoUpdateMode</span><span class="p">:</span><span class="w"> </span><span class="l">Version</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">UpdateCheckMode</span><span class="p">:</span><span class="w"> </span><span class="l">Tags</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">VercodeOperation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="s1">&#39;%c * 10 + 1&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="s1">&#39;%c * 10 + 2&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="s1">&#39;%c * 10 + 3&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">UpdateCheckData</span><span class="p">:</span><span class="w"> </span><span class="l">pubspec.yaml|version:\s.+\+(\d+)|.|version:\s(.+)\+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">CurrentVersion</span><span class="p">:</span><span class="w"> </span><span class="m">0.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">CurrentVersionCode</span><span class="p">:</span><span class="w"> </span><span class="m">13</span><span class="w">
</span></span></span></code></pre></div><h3 id="abi-split--vercodeoperation">ABI Split &amp; VercodeOperation<a href="#abi-split--vercodeoperation" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>This is the thing that annoyed me the most, so it’s only natural that it’s the first thing that comes to mind.</p>
<p>Once the build process is complete, the FDroid pipeline expects to receive three APKs: arm, arm64, and x86_64. These three files must follow a naming convention for the version code that differs from Flutter’s default one. You must therefore modify the <code>version</code> in your <code>pubspec.yaml</code>, change the Gradle file to build the APKs with the correct naming convention and include the same logic in the YML file.</p>
<p>So in the <code>pubspec.yaml</code> you have to add the version for the FDroid&rsquo;s pipeline after the version you are using with a <code>+</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;0.1.1+1&#39;</span><span class="w">
</span></span></span></code></pre></div><p>In the <code>android/app/build.gradle.kts</code> you have to add this to map the APKs versions:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">com.android.build.gradle.internal.api.ApkVariantOutputImpl</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="o">[</span><span class="p">...</span><span class="o">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">val</span><span class="w"> </span><span class="n">abiCodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mapOf</span><span class="p">(</span><span class="s">&#34;armeabi-v7a&#34;</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">1</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;arm64-v8a&#34;</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">2</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;x86_64&#34;</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">3</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">android</span><span class="p">.</span><span class="na">applicationVariants</span><span class="p">.</span><span class="na">configureEach</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">val</span><span class="w"> </span><span class="n">variant</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">variant</span><span class="p">.</span><span class="na">outputs</span><span class="p">.</span><span class="na">forEach</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">output</span><span class="w"> </span><span class="o">-&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">val</span><span class="w"> </span><span class="n">abiVersionCode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abiCodes</span><span class="o">[</span><span class="n">output</span><span class="p">.</span><span class="na">filters</span><span class="p">.</span><span class="na">find</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">it</span><span class="p">.</span><span class="na">filterType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">&#34;ABI&#34;</span><span class="w"> </span><span class="p">}</span><span class="o">?</span><span class="p">.</span><span class="na">identifier</span><span class="o">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">abiVersionCode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">(</span><span class="n">output</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">ApkVariantOutputImpl</span><span class="p">).</span><span class="na">versionCodeOverride</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variant</span><span class="p">.</span><span class="na">versionCode</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">abiVersionCode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>And in the <code>yml</code>, as you can see above, three entry in the <code>Build</code> section and the <code>VercodeOperation</code> section to tell the FDroid server how to build and what to expect.</p>
<p>So, for version 0.1.1+1 of the app, we will have version codes 11, 12, and 13; for version 0.1.2+2, 21, 22, and 23; and so on.</p>
<h3 id="fastlane">Fastlane<a href="#fastlane" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>This is a folder we need to create in the root directory of your repository to generate descriptions, previews, icons, etc., for the store page. You can find more details <a href="https://fastlane.tools" target="_blank" rel="noopener">here</a>.</p>
<h3 id="flutter-version">.flutter-version<a href="#flutter-version" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Fdroid doesn’t like to use the latest version of Flutter just because it&rsquo;s cool, so we need to create a <code>.flutter-version</code> file in the project root containing the version of Flutter to be used in the build, and then reference it in the yml file.
Take a look at this line in the YML file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl">- <span class="l">flutterVersion=$(cat .flutter-version)</span><span class="w">
</span></span></span></code></pre></div><h3 id="antifeatures">Antifeatures<a href="#antifeatures" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>F-Droid have a exaustive explantation of what an antifeature is <a href="https://f-droid.org/docs/Anti-Features/" target="_blank" rel="noopener">here</a>. Just see if something in your app matches and add it to a list at the topof your <code>.yml</code> file.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">AntiFeatures</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">NonFreeNet</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">en-US</span><span class="p">:</span><span class="w"> </span><span class="l">Data is sourced from 3rd party public API.</span><span class="w">
</span></span></span></code></pre></div><h3 id="commit-sha">Commit SHA<a href="#commit-sha" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>I don&rsquo;t remember why I&rsquo;ve written this down for the the post but in the <code>commit:</code> section of the <code>yml</code> you need to put the sha of the commit. It&rsquo;s like obvious, right?</p>
<h3 id="rm">rm:<a href="#rm" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>In the <code>yml</code> file, under the <code>Builds</code> section, there is a subsection labeled <code>rm:</code>. This section tells F-Droid to delete certain files after cloning the Git repository. It is used to free up space on the server by removing items that are not needed for the build process. In my case, I delete the <code>linux</code> folder because it is not required for the Android version of the app.</p>
<h2 id="merge-forrest-merge">Merge, Forrest! Merge!<a href="#merge-forrest-merge" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Once your <code>yml</code> file is ready you can push the file in your forked repo, a build pipeline should start. If all is on the green side you can proceed to make a merge request. The naming of the request for a new app is &ldquo;New App: app name&rdquo;, in the merge form you also need to complete the template provided with the correct info.</p>
<p>Aaaand that&rsquo;s all for now. Ciao!</p>
]]></content></item><item><title>Git-Pages #2 - Collapsible code blocks</title><link>https://allibragi.codeberg.page/dev-blog/git-pages-2/</link><pubDate>Tue, 07 Apr 2026 09:00:00 +0200</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/dev-blog/git-pages-2/</guid><description>Making long code blocks less long</description><content type="text/html" mode="escaped"><![CDATA[<p>While I&rsquo;m on this whole &ldquo;building a blog&rdquo; thing, I&rsquo;ve noticed that code blocks can get really long.
When a code block has 50+ lines, it takes up a lot of vertical space and makes the post hard to read.
Sure, you can scroll past it, but it&rsquo;s not exactly elegant.</p>
<figure>
  <a href="https://xkcd.com/297/" target="_blank" rel="noopener noreferrer">
    <img src="https://imgs.xkcd.com/comics/lisp_cycles.png" alt="That XKCD comic about elegance">
  </a>
  <figcaption>On the subject of elegant things</figcaption>
</figure>
<p>So I decided to make code blocks collapsible. Here&rsquo;s how it works:</p>
<ul>
<li>Code blocks with 10 or fewer lines are displayed normally.</li>
<li>Code blocks with more than 10 lines start collapsed, showing only the first 10.</li>
<li>A &ldquo;Show X more lines&rdquo; button appears in the bottom right.</li>
<li>Clicking it expands the full code block.</li>
<li>The button then changes to &ldquo;Hide&rdquo; to collapse it again. I’m not sure it’s useful because by that point you’d already be ‘past’ the code, but it still seemed odd not to have this feature.</li>
</ul>
<p>The implementation uses the standard Hugo &ldquo;extra partials&rdquo; feature, so no modifications to the theme were needed.
I created two files:</p>
<p><code>layouts/_partials/extra-head.html</code> with the CSS:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nt">style</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">block</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span> <span class="p">.</span><span class="nc">collapse-toggle</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">block</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">absolute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">bottom</span><span class="p">:</span> <span class="mi">7</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">right</span><span class="p">:</span> <span class="mi">70</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mf">0.35</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">border</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.75</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-family</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">z-index</span><span class="p">:</span> <span class="mi">5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span><span class="p">:</span><span class="nd">hover</span> <span class="p">.</span><span class="nc">collapse-toggle</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">opacity</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span> <span class="p">.</span><span class="nc">collapse-toggle</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span> <span class="p">.</span><span class="nc">chroma</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">max-height</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">visible</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">transition</span><span class="p">:</span> <span class="k">max-height</span> <span class="mf">0.3</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-collapsible</span><span class="p">.</span><span class="nc">collapsed</span> <span class="p">.</span><span class="nc">chroma</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">max-height</span><span class="p">:</span> <span class="nb">calc</span><span class="p">(</span><span class="mf">1.6</span><span class="kt">em</span> <span class="o">*</span> <span class="mi">15</span><span class="p">);</span> <span class="c">/* In my theme, 1.6 is the line height */</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">hidden</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;/</span><span class="nt">style</span><span class="o">&gt;</span>
</span></span></code></pre></div><p>And <code>layouts/_partials/extra-foot.html</code> with the JavaScript:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">codeBlocks</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.highlight&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">codeBlocks</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">lines</span> <span class="o">=</span> <span class="nx">codeBlocks</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.line&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">lines</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">codeBlocks</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;code-collapsible&#39;</span><span class="p">,</span> <span class="s1">&#39;collapsed&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">btn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;button&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">className</span> <span class="o">=</span> <span class="s1">&#39;collapse-toggle&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s1">&#39;button&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s1">&#39;Show &#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">lines</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; more lines&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">container</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">contains</span><span class="p">(</span><span class="s1">&#39;expanded&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="nx">container</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s1">&#39;expanded&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">              <span class="nx">container</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;collapsed&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">              <span class="kd">var</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.line&#39;</span><span class="p">).</span><span class="nx">length</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="k">this</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s1">&#39;Show &#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">l</span> <span class="o">-</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; more lines&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="nx">container</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s1">&#39;collapsed&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">              <span class="nx">container</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;expanded&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">              <span class="k">this</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s1">&#39;Hide&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="p">})(</span><span class="nx">codeBlocks</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">codeBlocks</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">btn</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">})();</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></span></code></pre></div><p>The theme I&rsquo;m using, <a href="https://github.com/1bl4z3r/hermit-V2" target="_blank" rel="noopener">Hermit-V2</a>, already supports <code>extra-head.html</code> and <code>extra-foot.html</code> - these are partials that get included in every page automatically. The copy button<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> (provided by the theme) still works fine - it copies the entire code, not just the visible portion.</p>
<p>As I mentioned in my previous dev-blog, I’m just getting started with web development, so there’s definitely room for improvement here. I’m always open to suggestions.</p>
<p>That&rsquo;s all for now. Ciao!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Don’t trust the ‘Copy’ buttons you find on random web pages; copy and paste the code yourself. Or, <em>se ti pesa il culo</em>, always check what you’re pasting, especially if it’s a script to be run in the terminal!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>Git-Pages #1 - Mastodon comments in Hugo</title><link>https://allibragi.codeberg.page/dev-blog/git-pages-1/</link><pubDate>Sat, 14 Mar 2026 14:54:18 +0100</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/dev-blog/git-pages-1/</guid><description>I am not a web developer</description><content type="text/html" mode="escaped"><![CDATA[<p>In this age of the internet (AD 2026) people don&rsquo;t usually like to receive comments, let alone negative ones.
But this is a period in which I make anachronistic and stupid decisions, so here I am integrating the Fediverse into those pages.
I’ve chosen <a href="https://joinmastodon.org" target="_blank" rel="noopener">Mastodon</a>, simply because I already have an account, but I think these steps can be adapted to any platform that uses <a href="https://activitypub.rocks" target="_blank" rel="noopener">ActivityPub</a>.</p>
<p>First of all, thanks to <a href="https://andreas.scherbaum.la/post/2024-05-23_client-side-comments-with-mastodon-on-a-static-hugo-website/" target="_blank" rel="noopener">Andreas</a>, <a href="https://jan.wildeboer.net/2023/02/Jekyll-Mastodon-Comments/" target="_blank" rel="noopener">Jan</a>, <a href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/" target="_blank" rel="noopener">Carl</a>, <a href="https://sinodun.com/post/using-the-fediverse-to-add-comments-to-a-static-website/" target="_blank" rel="noopener">John</a> and to many others for trying this out before me and sharing their knowledge with all of us.</p>
<h2 id="making-the-pages-go-mastodon">Making the pages go Mastodon<a href="#making-the-pages-go-mastodon" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I&rsquo;m using <a href="https://blzr.sbs/" target="_blank" rel="noopener">BLZR</a>&rsquo;s <a href="https://github.com/1bl4z3r/hermit-V2" target="_blank" rel="noopener">hermit-V2</a> theme, so there is already a comments section set up to work with Disqus.</p>
<p>We can override the <code>comments.html</code> creating a new one under <code>layouts/_default/_partials</code>.</p>
<p>You can view my guess at &ldquo;htmling&rdquo; here:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ if .Params.comments }}
</span></span><span class="line"><span class="cl">{{ $comments := .Params.comments }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">section</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comment-section&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h3</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comment-title&#34;</span><span class="p">&gt;</span>Comments<span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comment-intro&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    You can use your Mastodon or other fediverse account to comment on this article by replying to the
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://{{ $comments.host }}/@{{ $comments.username }}/{{ $comments.id }}&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener noreferrer&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comment-link-ext&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      associated post
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>.
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">button</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;load-comments&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comment-btn&#34;</span><span class="p">&gt;</span>Load comments from the Fediverse<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;comments-list&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;comments-container&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">noscript</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;no-js-msg&#34;</span><span class="p">&gt;</span>JavaScript is required to display comments.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">noscript</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">section</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-section</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mi">3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-top</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">border</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-title</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">1.4</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mf">0.6</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-intro</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-link-ext</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-weight</span><span class="p">:</span> <span class="mi">600</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-link-ext</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">underline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-btn</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mf">0.45</span><span class="kt">rem</span> <span class="mf">0.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">border</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mf">0.35</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="k">background</span> <span class="mf">0.15</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-weight</span><span class="p">:</span> <span class="mi">500</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-btn</span><span class="p">:</span><span class="nd">hover</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">:</span><span class="nd">disabled</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-btn</span><span class="p">:</span><span class="nd">disabled</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.6</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comments-container</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">1.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mf">0.8</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-bottom</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-avatar</span> <span class="nt">img</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">width</span><span class="p">:</span> <span class="mi">40</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">height</span><span class="p">:</span> <span class="mi">40</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-body</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">flex</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">min-width</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-header</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.85</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mf">0.3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mf">0.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">wrap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-header</span> <span class="nt">a</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-weight</span><span class="p">:</span> <span class="mi">600</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-header</span> <span class="nt">a</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">underline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-header</span> <span class="nt">time</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.8</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-content</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.95</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">line-height</span><span class="p">:</span> <span class="mf">1.5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">0.3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-actions</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.85</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-actions</span> <span class="nt">a</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.75</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-actions</span> <span class="nt">span</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.75</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment-actions</span> <span class="nt">a</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span><span class="o">[</span><span class="nt">data-depth</span><span class="o">=</span><span class="s2">&#34;1&#34;</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-left</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span><span class="o">[</span><span class="nt">data-depth</span><span class="o">=</span><span class="s2">&#34;2&#34;</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-left</span><span class="p">:</span> <span class="mi">40</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span><span class="o">[</span><span class="nt">data-depth</span><span class="o">=</span><span class="s2">&#34;3&#34;</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-left</span><span class="p">:</span> <span class="mi">60</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span><span class="o">[</span><span class="nt">data-depth</span><span class="o">=</span><span class="s2">&#34;4&#34;</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-left</span><span class="p">:</span> <span class="mi">80</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">comment</span><span class="o">[</span><span class="nt">data-depth</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-left</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">border</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-left</span><span class="p">:</span> <span class="mf">0.8</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">no-js-msg</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">no-comments</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">error-msg</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">0.8</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">max-width</span><span class="p">:</span><span class="nd">700px</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nc">comment-avatar</span> <span class="nt">img</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">width</span><span class="p">:</span> <span class="mi">34</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">height</span><span class="p">:</span> <span class="mi">34</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/js/purify.min.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text/javascript&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">btn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;load-comments&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">list</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;comments-list&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">host</span> <span class="o">=</span> <span class="s1">&#39;{{ $comments.host }}&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">id</span> <span class="o">=</span> <span class="s1">&#39;{{ $comments.id }}&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">btn</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kr">async</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">btn</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">&#34;Loading...&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nx">btn</span><span class="p">.</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="sb">`https://</span><span class="si">${</span><span class="nx">host</span><span class="si">}</span><span class="sb">/api/v1/statuses/</span><span class="si">${</span><span class="nx">id</span><span class="si">}</span><span class="sb">/context`</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;Accept&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">response</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="sb">`HTTP </span><span class="si">${</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">response</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">data</span><span class="p">.</span><span class="nx">descendants</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">descendants</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">list</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s1">&#39;&lt;p class=&#34;no-comments&#34;&gt;No comments yet.&lt;/p&gt;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">replies</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">descendants</span><span class="p">.</span><span class="nx">sort</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">created_at</span><span class="p">)</span> <span class="o">-</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">b</span><span class="p">.</span><span class="nx">created_at</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">map</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">        <span class="nx">replies</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="nx">map</span><span class="p">[</span><span class="nx">r</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="p">...</span><span class="nx">r</span><span class="p">,</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[]</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">roots</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">replies</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="k">if</span> <span class="p">(</span><span class="nx">r</span><span class="p">.</span><span class="nx">in_reply_to_id</span> <span class="o">&amp;&amp;</span> <span class="nx">map</span><span class="p">[</span><span class="nx">r</span><span class="p">.</span><span class="nx">in_reply_to_id</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">map</span><span class="p">[</span><span class="nx">r</span><span class="p">.</span><span class="nx">in_reply_to_id</span><span class="p">].</span><span class="nx">children</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">map</span><span class="p">[</span><span class="nx">r</span><span class="p">.</span><span class="nx">id</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">          <span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">roots</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">map</span><span class="p">[</span><span class="nx">r</span><span class="p">.</span><span class="nx">id</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">          <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">function</span> <span class="nx">actionIcons</span><span class="p">(</span><span class="nx">reply</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;a href=&#34;</span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">url</span><span class="si">}</span><span class="sb">&#34; target=&#34;_blank&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;span title=&#34;Replies&#34;&gt;💬 </span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">replies_count</span><span class="si">}</span><span class="sb">&lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;span title=&#34;Boosts&#34;&gt;🔁 </span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">reblogs_count</span><span class="si">}</span><span class="sb">&lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;span title=&#34;Favorites&#34;&gt;⭐ </span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">favourites_count</span><span class="si">}</span><span class="sb">&lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">function</span> <span class="nx">renderComment</span><span class="p">(</span><span class="nx">reply</span><span class="p">,</span> <span class="nx">depth</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">reply</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">display_name</span> <span class="o">||</span> <span class="nx">reply</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">username</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">avatar</span> <span class="o">=</span> <span class="nx">reply</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">avatar_static</span> <span class="o">||</span> <span class="nx">reply</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">avatar</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">safeContent</span> <span class="o">=</span> <span class="nx">DOMPurify</span><span class="p">.</span><span class="nx">sanitize</span><span class="p">(</span><span class="nx">reply</span><span class="p">.</span><span class="nx">content</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="kd">let</span> <span class="nx">html</span> <span class="o">=</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;article class=&#34;comment&#34; data-depth=&#34;</span><span class="si">${</span><span class="nx">depth</span><span class="si">}</span><span class="sb">&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;div class=&#34;comment-avatar&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;img src=&#34;</span><span class="si">${</span><span class="nx">avatar</span><span class="si">}</span><span class="sb">&#34; alt=&#34;</span><span class="si">${</span><span class="nx">name</span><span class="si">}</span><span class="sb">&#34; loading=&#34;lazy&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;div class=&#34;comment-body&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;header class=&#34;comment-header&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;a href=&#34;</span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">url</span><span class="si">}</span><span class="sb">&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                    </span><span class="si">${</span><span class="nx">name</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;time datetime=&#34;</span><span class="si">${</span><span class="nx">reply</span><span class="p">.</span><span class="nx">created_at</span><span class="si">}</span><span class="sb">&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                    </span><span class="si">${</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">reply</span><span class="p">.</span><span class="nx">created_at</span><span class="p">).</span><span class="nx">toLocaleString</span><span class="p">()</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;/time&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;/header&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;div class=&#34;comment-content&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                  </span><span class="si">${</span><span class="nx">safeContent</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;div class=&#34;comment-actions&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                  </span><span class="si">${</span><span class="nx">actionIcons</span><span class="p">(</span><span class="nx">reply</span><span class="p">)</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;/article&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="nx">reply</span><span class="p">.</span><span class="nx">children</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">child</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">html</span> <span class="o">+=</span> <span class="nx">renderComment</span><span class="p">(</span><span class="nx">child</span><span class="p">,</span> <span class="nx">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="nx">html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">list</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">roots</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="nx">renderComment</span><span class="p">(</span><span class="nx">r</span><span class="p">)).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">&#34;Mastodon API error:&#34;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">list</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">          <span class="s1">&#39;&lt;p class=&#34;error-msg&#34;&gt;Unable to load comments.&lt;/p&gt;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">finally</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">&#34;Reload comments&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">btn</span><span class="p">.</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">})();</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ end }}
</span></span></code></pre></div><p>Just as something in this wall of code may have suggested I’m not a web developer so it’s a mash of things all in one file.</p>
<p>The other thing you need to do is download and create the <code>purify.min.js</code><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> file in the <code>static/js/</code> folder. Be careful with the <em>static</em> folder in the one in the bloody <em>root</em> of the project. Don&rsquo;t do what I did and put it in the <em>assets</em> folder for only god knows why.</p>
<p>Now, in the toml at the top of your post, add:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">comments</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">host</span> <span class="p">=</span> <span class="s1">&#39;yourinstance.org&#39;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">username</span> <span class="p">=</span> <span class="s1">&#39;yourusername&#39;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">id</span> <span class="p">=</span> <span class="s1">&#39;1234567890&#39;</span>
</span></span></code></pre></div><p>The parameters are self explanatory but <em>per sicurezza</em><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>:</p>
<ul>
<li>host: the hostname of your Mastodon instance</li>
<li>username: your username in that instance</li>
<li>id: the ID of your mastodon toot</li>
</ul>
<p><strong>What? My post ID?</strong> Yes, as my professor always said, <em>‘computer science is not an exact science</em>’. To view the comments associated with a post, you need the toot ID in your Mastodon account first. The idea is that this ID is the one of the toot you will create to share the post on the fediverse.</p>
<p>You can find the ID opening the detail of your toot:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">https://mastodon.social/@username/116205479816064809
</span></span></code></pre></div><p>The customization will retrieve the toot and associated responses via the API and display them.</p>
<p>It is up to you to decide which flow to implement. You can publish, share with a toot and then edit the post with the ID, or create the toot first (you can easily guess the URL of the post) and then publish the post.</p>
<p>If you have any suggestions on how to improve the script, please leave a comment. That way, we can see if it actually works.</p>
<p>And that&rsquo;s all for now. Ciao!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>you can find it <a href="https://github.com/cure53/DOMPurify" target="_blank" rel="noopener">here</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>just to be on the safe side&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>First Post</title><link>https://allibragi.codeberg.page/dev-blog/first-post/</link><pubDate>Sat, 07 Mar 2026 12:08:13 +0100</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/dev-blog/first-post/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>This is <strong>bold</strong> text, and this is <em>emphasized</em> text. And we are ready to begin, I suppose.
Not much to say — I just happened to think I needed a landing page or something like that for my sh*t.</p>
<p>So I&rsquo;m trying out Codeberg Pages and Hugo.</p>
]]></content></item><item><title>About me</title><link>https://allibragi.codeberg.page/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/about/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>For work, I develop Microsoft Dynamics CRM solutions and .NET applications.<br/>
Outside of work, I’m a Linux user and I’m interested in open source and self-hosting.<br/>
I also like TTRPGs, science fiction, and video games.</p>
<blockquote>
<p>I’ve never been very good with people or socialising in general, so when I first came across a computer at around the age of 8, I was fascinated by it: you input things in it and get a result. Nothing to interpret, understand or read between the lines.
Later on, the prospect to be able to work with computers without having to deal with people convinced me to begin my journey in the world of IT.
I&rsquo;ve never been so wrong: you still have to deal with people.
~ Allibragi, 2026, as I first write this very page</p>
</blockquote>
<h2 id="now">Now:<a href="#now" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<ul>
<li>currently working on <a href="https://codeberg.org/allibragi/whatiwatch" target="_blank" rel="noopener"><strong>what I watch</strong></a>, my app to keep track of the series you&rsquo;re currently watching</li>
<li>currently reading the <a href="https://en.wikipedia.org/wiki/Dungeon_Crawler_Carl" target="_blank" rel="noopener"><strong>Dungeon Crawler Carl</strong></a> books serie</li>
<li>currently playing <a href="https://www.wagotabi.com/" target="_blank" rel="noopener"><strong>Wagotabi</strong></a> to pick up a few Japanese words, and running <a href="https://store.paizo.com/pathfinder-kingmaker-adventure-path-pdf/" target="_blank" rel="noopener"><strong>Pathfinder 2E Kingmaker</strong></a> as GM</li>
<li>currently watching <a href="[https:/en.wikipedia.org/wiki/Atelier_of_Witch_Hat]%28https://en.wikipedia.org/wiki/Witch_Hat_Atelier%29"><strong>Witch Hat Atelier</strong></a></li>
<li>currently tinkering with an old <strong>thermal receipt printer</strong> a friend gifted me</li>
</ul>
]]></content></item><item><title>Projects</title><link>https://allibragi.codeberg.page/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Allibragi</author><guid>https://allibragi.codeberg.page/projects/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<ul>
<li><a href="https://codeberg.org/allibragi/whatiwatch" target="_blank" rel="noopener"><strong>what I watch</strong></a>: An app that helps you keep track of the series you&rsquo;re currently watching.</li>
<li><a href="https://codeberg.org/allibragi/abutton" target="_blank" rel="noopener"><strong>a Button</strong></a>: Just a simple button made with Flutter..</li>
<li><a href="https://github.com/allibragi/writefreely_ls" target="_blank" rel="noopener"><strong>Writefreely LS</strong></a>: Fork of Writefreely for the <a href="https://livellosegreto.it" target="_blank" rel="noopener">livellosegreto.it Mastodon</a> instance, renamed LOG. <a href="https://log.livellosegreto.it" target="_blank" rel="noopener">Live here</a>.</li>
<li><a href="https://codeberg.org/allibragi/reader_to_toot" target="_blank" rel="noopener"><strong>reader to toot</strong></a>: Python script that scrapes the public &ldquo;/read&rdquo; page of a Writefreely instance and posts the new post titles on a Mastodon account.</li>
<li><a href="https://makerworld.com/en/@allibragi" target="_blank" rel="noopener"><strong>Maker World profile</strong></a>: I&rsquo;m not a 3D designer or anything like that, but sometimes I upload some models that I&rsquo;ve made for myself and think might be useful to others. I have a BambuLab 3D printer, so I mainly use MakerWorld for convenience.</li>
</ul>
]]></content></item></channel></rss>