<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xml" href="https://aldur.blog/feed.xslt.xml"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://aldur.blog/feed/micros.xml" rel="self" type="application/atom+xml" /><link href="https://aldur.blog/" rel="alternate" type="text/html" /><updated>2026-07-01T15:18:07+00:00</updated><id>https://aldur.blog/feed/micros.xml</id><title type="html">Universal Bits | Micros</title><subtitle>Exploring mental models, connecting the dots, and writing about it.</subtitle><author><name>aldur</name><email>hello@aldur.blog</email></author><entry><title type="html">Recovering camera credentials from Synology’s Surveillance Station</title><link href="https://aldur.blog/micros/2026/07/01/recovering-camera-credentials-from-synology-s-surveillance-station/" rel="alternate" type="text/html" title="Recovering camera credentials from Synology’s Surveillance Station" /><published>2026-07-01T00:00:00+00:00</published><updated>2026-07-01T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/07/01/recovering-camera-credentials-from-synology-s-surveillance-station</id><content type="html" xml:base="https://aldur.blog/micros/2026/07/01/recovering-camera-credentials-from-synology-s-surveillance-station/"><![CDATA[<p>Surveillance Station allows managing cameras, recordings, alerts, etc. on
Synology NAS.</p>

<p>I recently noticed that I had lost RTSP credentials for one of my IP cameras.
They weren’t in my password manager nor anywhere else I could think of, but the
camera was currently configured and streaming in Surveillance Station. If it
was streaming, then Surveillance Station must have had credentials stored
somewhere.</p>

<p>With a bit of trial and error and some LLM assistance, I recovered the
credentials as follows (Synology 7.3.2, your <code class="language-plaintext highlighter-rouge">volume</code> might change):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sqlite3 <span class="nt">--readonly</span> /volume1/@appstore/SurveillanceStation/system.db <span class="se">\</span>
  <span class="s2">"SELECT name, hostname, port, username, password FROM camera;"</span>
</code></pre></div></div>

<p>The password is prefixed with a <code class="language-plaintext highlighter-rouge">$</code> and is then (inexplicably) encoded <em>twice</em>
in base 64.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[Surveillance Station allows managing cameras, recordings, alerts, etc. on Synology NAS.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-07-01-recovering-camera-credentials-from-synology-s-surveillance-station.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-07-01-recovering-camera-credentials-from-synology-s-surveillance-station.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PSA: Apple container bloats Time Machine backups</title><link href="https://aldur.blog/micros/2026/06/18/psa-apple-container-bloats-time-machine-backups/" rel="alternate" type="text/html" title="PSA: Apple container bloats Time Machine backups" /><published>2026-06-18T00:00:00+00:00</published><updated>2026-06-18T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/06/18/psa-apple-container-bloats-time-machine-backups</id><content type="html" xml:base="https://aldur.blog/micros/2026/06/18/psa-apple-container-bloats-time-machine-backups/"><![CDATA[<p>After <a href="/articles/2026/06/11/nixos-for-apple-container.html">playing with Apple container</a>, my Time Machine backups started
failing with the error: “The backup disk is full”.</p>

<p>On that particular Mac, the disk is 2TB and I am only allocating 1.5TB to Time
Machine over Samba. That’s why the error isn’t particularly surprising at first
glance. What’s surprising is that <code class="language-plaintext highlighter-rouge">/nix</code> on the Mac was using almost 1TB and is
<em>excluded</em> from Time Machine, in addition to a few other things (VMs, cache
directories, etc.). As a result, the Samba share should have easily fit what I
needed to back up (plus keep some older copies).</p>

<p>Puzzled, I started investigating. LLMs couldn’t pinpoint the exact issue, but
helped me realize that a single Time Machine backup had grown to occupy the
full 1.5TB. Once I discovered that Time Machine mounts the backup image as a
file system under <code class="language-plaintext highlighter-rouge">/Volumes/Backup of &lt;hostname&gt;</code>, I pointed the great <a href="https://www.derlien.com/">Disk
Inventory X</a> at it to take a look at what was eating my backup space. Here’s
the result:</p>

<p class="text-align-center"><img src="/images/disk-inventory-x.webp" alt="A Disk Inventory X screenshot showing the `snapshot` directory of `com.apple.container` taking more than 500GB of space" class="centered" style="width: 70%; border-radius: 10px;" />
<em>The whole backup is about 540GB, of which 524GB are from <code class="language-plaintext highlighter-rouge">container/snapshot</code>.</em></p>

<p>I later found <a href="https://github.com/apple/container/issues/404">issue #404 in the <code class="language-plaintext highlighter-rouge">container</code> repository</a>, where multiple
users report the same issue. To prevent this from happening again, you can
exclude the <code class="language-plaintext highlighter-rouge">container</code> state from your Time Machine backups as follows:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmutil addexclusion ~/Library/Application<span class="se">\ </span>Support/com.apple.container
</code></pre></div></div>

<p>Unfortunately, I tried and failed to recover space from the existing bloated
backup, so I just deleted it and started from scratch.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[After playing with Apple container, my Time Machine backups started failing with the error: “The backup disk is full”.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-06-18-psa-apple-container-bloats-time-machine-backups.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-06-18-psa-apple-container-bloats-time-machine-backups.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tailscale and ChromeOS Baguette</title><link href="https://aldur.blog/micros/2026/03/22/tailscale-for-chromeos-baguette/" rel="alternate" type="text/html" title="Tailscale and ChromeOS Baguette" /><published>2026-03-22T00:00:00+00:00</published><updated>2026-03-22T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/03/22/tailscale-for-chromeos-baguette</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/22/tailscale-for-chromeos-baguette/"><![CDATA[<p>When running <a href="/tags/chromeos.html">NixOS in ChromeOS</a>, I use
Tailscale to access a few remote hosts.</p>

<p>Although Tailscale can run within the VM itself, I prefer to run its Android
app in ChromeOS. This way, the VM never sees the raw Tailscale credentials and,
if running multiple VMs, they can all share network access.</p>

<p>Under the hood, all VM traffic already flows through the host, enabling
Tailscale routing. In addition, the <a href="https://github.com/aldur/nixos-crostini" title="NixOS Baguette image"><svg class="svg-icon grey" viewBox="0 0 512 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
  NixOS Baguette image</a> delegates DNS
resolution to the host, as follows:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ln</span> <span class="nt">-sf</span> /run/resolv.conf /etc/resolv.conf
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">maitred</code> <a href="https://chromium.googlesource.com/chromiumos/platform2/+/c4c2468e01f6b37c97d842c9981b1bafb71d751b/vm_tools/maitred/service_impl.cc#168">takes care</a> of populating the <code class="language-plaintext highlighter-rouge">/run/resolv.conf</code> file as the host’s
network configuration changes:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Mar 17 10:26:43 baguette-nixos maitred[412]: Received request to update VM resolv.conf
</code></pre></div></div>

<p>Activating and de-activating Tailscale correctly updates the <code class="language-plaintext highlighter-rouge">resolv.conf</code>
file. With Tailscale enabled, it will look as follows:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nameserver 100.100.100.100
search <span class="o">[</span>redacted].ts.net
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">search</code> configuration allows using <code class="language-plaintext highlighter-rouge">ping &lt;hostname&gt;</code> or <code class="language-plaintext highlighter-rouge">ssh &lt;hostname&gt;</code>
from the VM without specifying the Tailnet FQDN (something that wasn’t working
in <code class="language-plaintext highlighter-rouge">crostini</code>). Queries <em>outside</em> the Tailnet go through the host’s DNS
configuration.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><category term="ChromeOS" /><summary type="html"><![CDATA[When running NixOS in ChromeOS, I use Tailscale to access a few remote hosts.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-22-tailscale-for-chromeos-baguette.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-22-tailscale-for-chromeos-baguette.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Generating OpenGraph images</title><link href="https://aldur.blog/micros/2026/03/21/generating-opengraph-images/" rel="alternate" type="text/html" title="Generating OpenGraph images" /><published>2026-03-21T16:43:00+00:00</published><updated>2026-03-21T16:43:00+00:00</updated><id>https://aldur.blog/micros/2026/03/21/generating-opengraph-images</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/21/generating-opengraph-images/"><![CDATA[<p>I recently started <a href="https://indieweb.org/POSSE">syndicating</a> this blog’s contents to <a href="https://bsky.app/profile/aldur.blog">Bluesky</a>.
While at it, I made a <a href="https://github.com/aldur/aldur.github.io/pull/134" title="few improvements"><svg class="svg-icon grey" viewBox="0 0 512 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
  few improvements</a> to its OpenGraph metadata to make
the display of cards in timelines a bit prettier.</p>

<p>The most noticeable improvement comes from <code class="language-plaintext highlighter-rouge">og:image</code>, which adds an image on
top of the page title:</p>

<p class="text-align-center"><img src="/images/og/micros-2026-03-21-generating-opengraph-images.webp" alt="An image with this blog's name and this post's title, plus the greek letter mu and the site URL" class="centered" style="width: 70%; border-radius: 10px;" />
<em>The OpenGraph image for this post.</em></p>

<p>Ideally, I’d dynamically generate all images when running <code class="language-plaintext highlighter-rouge">jekyll build</code>.
However, the image generation plugin converts an SVG to webp through
<code class="language-plaintext highlighter-rouge">imagemagick</code>, which isn’t available in the Cloudflare builder. As a (ugly)
workaround, I pre-generate each image and <a href="https://github.com/aldur/aldur.github.io?tab=readme-ov-file#opengraph-images" title="commit it"><svg class="svg-icon grey" viewBox="0 0 512 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
  commit it</a> to the repository.</p>

<p>In addition, each post now also includes OpenGraph tags for:</p>

<ol>
  <li>Its modified time.</li>
  <li>Its section (e.g., micros).</li>
  <li>Its tags (if any).</li>
</ol>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[I recently started syndicating this blog’s contents to Bluesky. While at it, I made a few improvements to its OpenGraph metadata to make the display of cards in timelines a bit prettier.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-21-generating-opengraph-images.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-21-generating-opengraph-images.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Configuring Jekyll for Cloudflare Pages previews</title><link href="https://aldur.blog/micros/2026/03/21/configuring-jekyll-for-cloudflare-pages-previews/" rel="alternate" type="text/html" title="Configuring Jekyll for Cloudflare Pages previews" /><published>2026-03-21T16:20:00+00:00</published><updated>2026-03-21T16:20:00+00:00</updated><id>https://aldur.blog/micros/2026/03/21/configuring-jekyll-for-cloudflare-pages-previews</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/21/configuring-jekyll-for-cloudflare-pages-previews/"><![CDATA[<p><a href="https://developers.cloudflare.com/pages/configuration/preview-deployments/">Cloudflare Pages</a> previews deployments at
<code class="language-plaintext highlighter-rouge">&lt;branch-or-commit&gt;.&lt;project&gt;.pages.dev</code>. Those previews are useful to review
content and layout and to test specific features (e.g., OpenGraph integration
and RSS feed/sitemap generation, which can be validated once online through
third party tools). For those features to work correctly, Jekyll needs to know
the <code class="language-plaintext highlighter-rouge">url</code> at which it is serving its assets.</p>

<p>Cloudflare builders expose the URL for previews through the <a href="https://developers.cloudflare.com/pages/configuration/build-configuration/#environment-variables"><code class="language-plaintext highlighter-rouge">CF_PAGES_URL</code>
environmental variable</a>. We can make Jekyll aware of it through this
<code class="language-plaintext highlighter-rouge">build_cloudflare.sh</code> script:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">configs</span><span class="o">=</span><span class="s2">"_config.yml"</span>

<span class="k">if</span> <span class="o">[</span> <span class="nt">-n</span> <span class="s2">"</span><span class="k">${</span><span class="nv">CF_PAGES_URL</span><span class="k">:-}</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"url: </span><span class="nv">$CF_PAGES_URL</span><span class="s2">"</span> <span class="o">&gt;</span> _cf_url.yml
  <span class="nv">configs</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">configs</span><span class="k">}</span><span class="s2">,_cf_url.yml"</span>
<span class="k">fi

</span>bundle <span class="nb">exec </span>jekyll build <span class="nt">--config</span> <span class="s2">"</span><span class="nv">$configs</span><span class="s2">"</span>
</code></pre></div></div>

<p>To run it, set the script as the build command in your Cloudflare Workers and
Pages configuration.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[Cloudflare Pages previews deployments at &lt;branch-or-commit&gt;.&lt;project&gt;.pages.dev. Those previews are useful to review content and layout and to test specific features (e.g., OpenGraph integration and RSS feed/sitemap generation, which can be validated once online through third party tools). For those features to work correctly, Jekyll needs to know the url at which it is serving its assets.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-21-configuring-jekyll-for-cloudflare-pages-previews.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-21-configuring-jekyll-for-cloudflare-pages-previews.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">human.json</title><link href="https://aldur.blog/micros/2026/03/20/human-json/" rel="alternate" type="text/html" title="human.json" /><published>2026-03-20T00:00:00+00:00</published><updated>2026-03-20T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/03/20/human-json</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/20/human-json/"><![CDATA[<p>As a small addition to my longer post about <a href="/articles/2026/03/20/human-voices.html">human voices</a>, I just added a small Jekyll plugin that generates
a <a href="/human.json"><code class="language-plaintext highlighter-rouge">/human.json</code> file</a>.</p>

<p>From the <a href="https://codeberg.org/robida/human.json"><code class="language-plaintext highlighter-rouge">human.json</code> protocol</a>:</p>

<blockquote>
  <p><code class="language-plaintext highlighter-rouge">human.json</code> is a lightweight protocol for humans to assert authorship of their
site content and vouch for the humanity of others.</p>
</blockquote>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[As a small addition to my longer post about human voices, I just added a small Jekyll plugin that generates a /human.json file.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-20-human-json.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-20-human-json.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Stop claude-code from fetching git at startup</title><link href="https://aldur.blog/micros/2026/03/12/stop-claude-code-from-fetching-git-at-startup/" rel="alternate" type="text/html" title="Stop claude-code from fetching git at startup" /><published>2026-03-12T00:00:00+00:00</published><updated>2026-03-12T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/03/12/stop-claude-code-from-fetching-git-at-startup</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/12/stop-claude-code-from-fetching-git-at-startup/"><![CDATA[<p>Since a couple of weeks ago, issuing a first prompt to <code class="language-plaintext highlighter-rouge">claude-code</code> results in
an unattended request to unlock/touch the Yubikey that holds my SSH keys, as if
it is trying to do a <code class="language-plaintext highlighter-rouge">git</code> operation on my behalf. The whole thing is
confusing, because the Yubikey request is “blind”: it doesn’t specify which
command is being executed and for which purpose. Others have noticed the
<a href="https://github.com/anthropics/claude-code/issues/21108">issue</a> as well.</p>

<p>It looks like <code class="language-plaintext highlighter-rouge">claude-code</code> does a <code class="language-plaintext highlighter-rouge">git fetch</code> at startup, which requires SSH
if the repository was cloned that way. To fix it, set this environmental
variable:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC</span><span class="o">=</span>1
</code></pre></div></div>

<p>From the <a href="https://code.claude.com/docs/en/settings">manual</a>:</p>

<blockquote>
  <p>CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: Equivalent of setting
  DISABLE_AUTOUPDATER, DISABLE_BUG_COMMAND, DISABLE_ERROR_REPORTING, and
  DISABLE_TELEMETRY</p>
</blockquote>

<p>I haven’t tried scoping it down to one of these variables, let me know if you
do! Meanwhile, this should also prevent <code class="language-plaintext highlighter-rouge">claude-code</code> from asking for
feedback during a session.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[Since a couple of weeks ago, issuing a first prompt to claude-code results in an unattended request to unlock/touch the Yubikey that holds my SSH keys, as if it is trying to do a git operation on my behalf. The whole thing is confusing, because the Yubikey request is “blind”: it doesn’t specify which command is being executed and for which purpose. Others have noticed the issue as well.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-12-stop-claude-code-from-fetching-git-at-startup.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-12-stop-claude-code-from-fetching-git-at-startup.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">All Ruby versions in Cloudflare pages</title><link href="https://aldur.blog/micros/2026/03/06/ruby-versions-cloudflare-pages/" rel="alternate" type="text/html" title="All Ruby versions in Cloudflare pages" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/03/06/ruby-versions-cloudflare-pages</id><content type="html" xml:base="https://aldur.blog/micros/2026/03/06/ruby-versions-cloudflare-pages/"><![CDATA[<p>This post originally started as a rant: until late February, Cloudflare Pages’
documentation stated to support <em>any</em> Ruby version (or Python, Node.js, etc.),
but <a href="https://github.com/aldur/aldur.github.io/pull/116" title="didn’t really"><svg class="svg-icon grey" viewBox="0 0 512 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
  didn’t really</a>.</p>

<p>Although the problem was real, my post felt overly negative, not constructive,
and <em>wrong</em>. Instead of publishing it, I just opened an <a href="https://github.com/cloudflare/cloudflare-docs/issues/27779#event-23112259622">issue in
<code class="language-plaintext highlighter-rouge">cloudflare-docs</code></a>.</p>

<p>The maintainers have now kindly fixed the issue. Anyone can use <em>any</em> Ruby
version in a Cloudflare Pages build. If the worker doesn’t have that version
available, it will automatically download it and compile it (in which case, the
build might take a bit longer).</p>

<p>As for me, this means I can pin my <code class="language-plaintext highlighter-rouge">.ruby_version</code> to one that is cached in
<code class="language-plaintext highlighter-rouge">nixpkgs</code> so that I can quickly start writing on low-powered devices.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[This post originally started as a rant: until late February, Cloudflare Pages’ documentation stated to support any Ruby version (or Python, Node.js, etc.), but didn’t really.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-03-06-ruby-versions-cloudflare-pages.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-03-06-ruby-versions-cloudflare-pages.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Port forwarding to a running QEMU VM</title><link href="https://aldur.blog/micros/2026/02/04/port-forwarding-to-a-running-qemu-vm/" rel="alternate" type="text/html" title="Port forwarding to a running QEMU VM" /><published>2026-02-04T00:00:00+00:00</published><updated>2026-02-04T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/02/04/port-forwarding-to-a-running-qemu-vm</id><content type="html" xml:base="https://aldur.blog/micros/2026/02/04/port-forwarding-to-a-running-qemu-vm/"><![CDATA[<p>If you are running a QEMU VM with <code class="language-plaintext highlighter-rouge">-qmp</code> (<a href="https://wiki.qemu.org/Documentation/QMP">QEMU Machine Protocol</a>), then you
can add port-forwarding to it while running as follows:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'{ "execute": "qmp_capabilities" }
{ "execute": "human-monitor-command", "arguments": { "command-line": "hostfwd_add tcp::2222-:22" } }'</span> <span class="se">\</span>
  | socat - UNIX-CONNECT:/path/to/qmp.sock
</code></pre></div></div>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><summary type="html"><![CDATA[If you are running a QEMU VM with -qmp (QEMU Machine Protocol), then you can add port-forwarding to it while running as follows:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-02-04-port-forwarding-to-a-running-qemu-vm.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-02-04-port-forwarding-to-a-running-qemu-vm.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Importing p12 certificates on a Chromebook</title><link href="https://aldur.blog/micros/2026/01/22/importing-p12-certificates-on-a-chromebook/" rel="alternate" type="text/html" title="Importing p12 certificates on a Chromebook" /><published>2026-01-22T00:00:00+00:00</published><updated>2026-01-22T00:00:00+00:00</updated><id>https://aldur.blog/micros/2026/01/22/importing-p12-certificates-on-a-chromebook</id><content type="html" xml:base="https://aldur.blog/micros/2026/01/22/importing-p12-certificates-on-a-chromebook/"><![CDATA[<p>I sometimes need to use a Chromebook and a <code class="language-plaintext highlighter-rouge">.p12</code> certificate to authenticate
through TLS (e.g. through the Spanish “Identificación electrónica”). Everytime
that happens, I need to “rediscover” the process. Here it is for future memory.</p>

<p>To add a <code class="language-plaintext highlighter-rouge">.p12</code> certificate to ChromeOS’ certificate manager:</p>

<ol>
  <li>Navigate to <code class="language-plaintext highlighter-rouge">chrome://certificate-manager</code></li>
  <li>→ “<em>Your certificates</em>”</li>
  <li>→ “<em>View imported certificates from ChromeOS</em>”</li>
  <li>→ “<em>Import and bind</em>”</li>
  <li>Select your certificate from the file picker</li>
  <li>Enter your certificate’s password</li>
</ol>

<p>“<em>Import and bind</em>” stores the certificate <a href="https://www.chromium.org/developers/design-documents/tpm-usage/#protecting-certain-user-rsa-keys">on the device’s Trusted Platform
Module (TPM)</a>.</p>

<p>It might be possible to also store the certificate on a Yubikey through the
<a href="https://docs.yubico.com/yesdk/users-manual/application-piv/slots.html">Personal Identity Verification (PIV)</a> app and then use it on a Chromebook
through the <a href="https://chromewebstore.google.com/detail/smart-card-connector/khpfeaanjngmcnplbdlpegiifgpfgdco?sjid=12624726738251298427-NA">Smart Card Connector</a> and a middleware. I haven’t tried this
approach yet, but I hear it is tricky on non-enterprise devices.</p>]]></content><author><name>aldur</name><email>hello@aldur.blog</email></author><category term="micros" /><category term="ChromeOS" /><summary type="html"><![CDATA[I sometimes need to use a Chromebook and a .p12 certificate to authenticate through TLS (e.g. through the Spanish “Identificación electrónica”). Everytime that happens, I need to “rediscover” the process. Here it is for future memory.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aldur.blog/images/og/micros-2026-01-22-importing-p12-certificates-on-a-chromebook.webp" /><media:content medium="image" url="https://aldur.blog/images/og/micros-2026-01-22-importing-p12-certificates-on-a-chromebook.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>