<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Journal auf cbrueggenolte.de</title>
    <link>https://cbrueggenolte.de/collection/journal/</link>
    <description>Neueste Beiträge in Journal auf cbrueggenolte.de</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <managingEditor>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</managingEditor>
    <webMaster>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</webMaster>
    <copyright>2018-2026 cbrueggenolte</copyright>
    <atom:link href="https://cbrueggenolte.de/collection/journal/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>CLI-Tools, die ich im September gefunden habe</title>
      <link>https://cbrueggenolte.de/cli-tools-die-ich-im-september-gefunden-habe/</link>
      <pubDate>Sun, 27 Sep 2026 12:00:00 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/cli-tools-die-ich-im-september-gefunden-habe/</guid>
      <description>&lt;p&gt;Ich verbringe einen großen Teil meines Tages im Terminal.&#xA;Und wie wohl jeder, der das tut, bin ich ständig auf der Suche nach Dingen,&#xA;die mir die tägliche Arbeit ein bisschen leichter machen.&#xA;Kommandozeilen-Tools sind dafür für mich einfach unschlagbar.&lt;/p&gt;&#xA;&lt;p&gt;Manche davon nutze ich wirklich jeden Tag,&#xA;andere hole ich nur raus, wenn ich ein ganz bestimmtes Problem habe.&#xA;Hier ist meine Liste – quer durch den Gemüsegarten:&#xA;Git, Docker, Netzwerk, Daten und inzwischen auch lokale KI.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich verbringe einen großen Teil meines Tages im Terminal.
Und wie wohl jeder, der das tut, bin ich ständig auf der Suche nach Dingen,
die mir die tägliche Arbeit ein bisschen leichter machen.
Kommandozeilen-Tools sind dafür für mich einfach unschlagbar.</p>
<p>Manche davon nutze ich wirklich jeden Tag,
andere hole ich nur raus, wenn ich ein ganz bestimmtes Problem habe.
Hier ist meine Liste – quer durch den Gemüsegarten:
Git, Docker, Netzwerk, Daten und inzwischen auch lokale KI.</p>
<p>Auch bemerke ich immer mehr, dass sehr viel mehr Menschen CLI Tools bevorzugen.
Viele Entwickler und Entwicklerinnen, die ich kenne, nutzen sie täglich.
Desktop-Apps sind oft überladen und berbrauchen zviel zu viele Ressourcen.
Ausserdem kann ich eine CLI auch auf einem Server nutzen, ohne dass ich eine GUI brauche.</p>
<h2 id="1-dnsglobe">1. DNSGlobe</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/dnsglobe-screenshot_hu_ca1bb0517f6464ee.webp"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/dnsglobe-screenshot_hu_caafc395f80bf28b.webp" alt="DNSGlobe Screenshot" loading="lazy" width="1440" height="677" /></a></p>
<p><a href="https://github.com/514-labs/dnsglobe">dnsglobe</a> ist ein DNS Propagation Checker und ein DNS Lookup Tool.
Betrachte deine DNS Einträge auf einer Weltkarte in deinem Terminal.
Es sind 34 öffentliche DNS Resolver voreingestellt, die du abfragen kannst.
Abgesehen davon kannst du auch eigene Resolver hinzufügen.</p>
<p>Installieren kannst du es mit dem Befehl:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew install dnsglobe   <span class="c1"># Homebrew (macOS/Linux)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">cargo install dnsglobe               <span class="c1"># from crates.io</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">yay -S dnsglobe                      <span class="c1"># from archlinux aur (compile from source)</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">yay -S dnsglobe-bin                  <span class="c1"># from archlinux aur (install prebuilt binary)</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">nix run github:514-labs/dnsglobe     <span class="c1"># Nix flakes (builds from source)</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">x eget use 514-labs/dnsglobe         <span class="c1"># from (from its GitHub release)</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># or grab a prebuilt binary from the GitHub Releases page</span></span></span></code></pre></div><p>Und starten kannst du es so:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">dnsglobe                            <span class="c1"># start empty, type a domain</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">dnsglobe example.com                <span class="c1"># query immediately and watch</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">dnsglobe example.com TXT            <span class="c1"># same, starting on TXT records</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">dnsglobe --once example.com TXT     <span class="c1"># no TUI: print results, exit (for scripts)</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">dnsglobe example.com --ecs 203.0.113.0/24        <span class="c1"># see the zone as that client network does</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">dnsglobe --once example.com --ecs 203.0.113.0/24,198.51.100.0/24
</span></span><span class="line"><span class="ln">7</span><span class="cl">                                    <span class="c1"># one table per subnet + a convergence summary</span></span></span></code></pre></div><p><a href="https://github.com/514-labs/dnsglobe">dnsglobe</a> - Global DNS propagation checker TUI — watch a DNS record propagate across 34 public resolvers worldwide, on a world map in your terminal</p>
<h2 id="2-oxker">2. Oxker</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/oxker-screenshot_hu_360e77b775e5338e.webp"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/oxker-screenshot_hu_5c997ed911da0f21.webp" alt="Oxker Screenshot" loading="lazy" width="1440" height="822" /></a></p>
<p>Die Verwaltung von Docker-Containern im Terminal braucht
oft mehrere Befehle, um den Überblick zu behalten.</p>
<p><a href="https://github.com/mrjackwills/oxker">Oxker</a> vereinfacht das.
Es bündelt die wichtigsten Funktionen in einer einzigen
Konsolen-App. Du kannst Container anzeigen, ihre
Ressourcennutzung prüfen, Logs ansehen und verwalten,
ohne ständig neue Befehle einzutippen.</p>
<p>Zusätzlich lassen sich Container direkt über die
Benutzeroberfläche starten, stoppen oder neu starten.
Damit entfallen ständige ID-Kopieraktionen und das Openen
mehrerer Fenster. Gerade bei der Fehlersuche ist das ein
praktischer Vorteil.</p>
<p>Wenn du Logs und Status schnell prüfen willst, ohne immer
wieder Docker-Befehle zu tippen, ist Oxker eine sehr
effiziente Lösung.</p>
<p><a href="https://github.com/mrjackwills/oxker">Oxker</a> - A simple tui to view &amp; control docker containers</p>
<h2 id="3-croc">3. Croc</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/croc-demo.gif"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/croc-demo.gif" alt="Croc Demo Gif" loading="lazy" width="800" height="450" /></a></p>
<p>Dateien zwischen zwei Computern zu senden ist nicht immer
Einfach. Manchmal braucht es SSH-Zugriff, Schlüssel,
oder Port-Weiterleitungen, bevor ein Transfer klappt.</p>
<p><a href="https://github.com/schollz/croc">Croc</a> vereinfacht das. Du kannst Dateien und Ordner direkt
vom Terminal zwischen Rechnern verschieben. Die Übertragung
ist Ende-zu-Ende verschlüsselt, unterstützt mehrere
Dateien und kann nach einer Unterbrechung fortgesetzt
werden.</p>
<p>Croc ist ideal, wenn du Dateien schnell und ohne aufwendige
Netzwerk-Konfiguration austauschen möchtest.</p>
<p><a href="https://github.com/schollz/croc">Croc</a> - Easily and securely send things from one computer to another 🐊 📦</p>
<h2 id="4-worktrunk">4. Worktrunk</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/worktrunk-demo.gif"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/worktrunk-demo.gif" alt="Worktrunk Demo" loading="lazy" width="1600" height="900" /></a></p>
<p>Worktrunk ist ein Tool zur Verwaltung von Git-Worktrees im
Terminal. Es macht es einfacher, mehrere Worktrees zu
erstellen, zwischen ihnen zu wechseln und sie zu verwalten,
wenn man parallel an verschiedenen Aufgaben arbeitet.</p>
<p>Mit Befehlen wie <code>wt switch</code>, <code>wt list</code> und <code>wt remove</code>
kannst du Worktrees schnell anlegen, wechseln, prüfen und
aufräumen. Das Tool unterstützt außerdem Hooks, Merge-
Workflows, interaktive Worktree-Navigation, gemeinsame Build-
Caches und Integrationen, mit denen du Agenten wie Claude
Code direkt aus einem Worktree starten kannst.</p>
<p><a href="https://github.com/max-sixty/worktrunk">Worktrunk</a> - Worktrunk is a CLI for Git worktree management, designed for parallel AI agent workflows.</p>
<h2 id="5-yq">5. Yq</h2>
<p><a href="/images/yq-screenshot.png"><img class="content-image" src="images/yq-screenshot.png" alt="Yq Screenshot" loading="lazy" /></a></p>
<p>Wenn du mit YAML-Dateien im Terminal arbeitest, musst du oft
immer wieder Datei öffnen, Wert finden, ändern und dann
wieder speichern. yq macht diese kleinen Aufgaben deutlich
schneller und komfortabler direkt in der Kommandozeile.</p>
<p>Du kannst damit strukturierte Daten wie YAML, JSON, XML,
CSV und TOML einfach lesen, filtern, aktualisieren,
zusammenführen und konvertieren. yq ist besonders praktisch,
wenn du Konfigurationsdateien, Skripte oder CI/CD-Pipelines
bearbeitest und Werte schnell auslesen oder ändern willst,
ohne die Datei manuell zu editieren.</p>
<h2 id="6-gitlogue">6. Gitlogue</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/gitlogue-screenshot_hu_35c5ba352aaaf435.webp"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/gitlogue-screenshot_hu_eb23243f8e8e08b2.webp" alt="Gitlogue Screenshot" loading="lazy" width="1440" height="766" /></a></p>
<p>Das Durchsehen von Git-Protokollen und Diffs kann zwar Aufschluss über Änderungen geben,
bietet aber nicht immer ein umfassendes Verständnis der Entwicklung eines Projekts im Laufe der Zeit.
Gitlogue löst dieses Problem, indem es Ihren Commit-Verlauf in eine animierte Wiederholung umwandelt,
sodass Sie die Entwicklung Ihrer Codebasis direkt vom Terminal aus Schritt für Schritt verfolgen können.</p>
<p>Gitlogue ist besonders nützlich, wenn Sie die Entwicklung Ihres Projekts im Allgemeinen überprüfen möchten,
anstatt jeden einzelnen Commit einzeln zu untersuchen.
Es bietet einen klareren und prägnanteren Überblick über Ihren Git-Verlauf und
erleichtert so das Verständnis der Entwicklung Ihres Projekts im Laufe der Zeit.</p>
<p><a href="https://github.com/unhappychoice/gitlogue">Gitlogue</a> - A cinematic Git commit replay tool for the terminal, turning your Git history into a living, animated story.</p>
<h2 id="7-visidata">7. Visidata</h2>
<p><a href="/images/visidata-screenshot.png"><img class="content-image" src="images/visidata-screenshot.png" alt="Visidata Screenshot" loading="lazy" /></a></p>
<p>Wenn du eine CSV-Datei schnell ansehen oder filtern willst,
ist die Arbeit mit strukturierten Daten im Terminal oft
nicht besonders angenehm. Mit VisiData kannst du Datensätze
sofort direkt im Terminal erkunden und analysieren.</p>
<p>VisiData bietet eine Tabellenoberfläche mit Funktionen zum
Sortieren, Filtern, Bearbeiten und Arbeiten mit Daten. Es
erspart dir oft das Kombinieren mehrerer Tools wie <code>awk</code>,
<code>sed</code> und <code>jq</code>, wenn du einen Datensatz schnell
überprüfen willst.</p>
<p><a href="https://github.com/saulpw/visidata">VisiData</a> - A terminal spreadsheet multitool for discovering and arranging data</p>
<h2 id="8-kondo">8. Kondo</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/kondo-screenshot_hu_edc05db5ef670176.webp"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/kondo-screenshot_hu_9502ffab336b7fa0.webp" alt="Kondo Screenshot" loading="lazy" width="1440" height="867" /></a></p>
<p>Wenn du an mehreren Projekten arbeitest, können Build-Dateien,
Abhängigkeiten und generierte Dateien still und leise viel
Platz verschwenden. Ordner wie <code>node_modules</code> oder <code>build</code>
manuell zu finden, kostet Zeit.</p>
<p>Mit <a href="https://github.com/tbillington/kondo">kondo</a> kannst du
Projekte direkt aus dem Terminal aufräumen. Es scannt deine
Projekte nach unnötigen Build-Artefakten und Abhängigkeiten
und zeigt dir an, was du entfernen kannst, um Speicherplatz
freizugeben.</p>
<p>Es zeigt auch, wie viel Platz diese Dateien einnehmen, und du
kannst auswählen, was du entfernen willst. Kondo unterstützt
verschiedene Sprachen und Frameworks und ist deshalb sehr
nützlich, um alte Abhängigkeiten und Build-Dateien im Laufe
der Zeit aufzuräumen.</p>
<p>Ein Wort der Warnung: Kondo ist im nichts anderes als &ldquo;rm -rf&rdquo;.
Benutzte es mit Vorsicht. Immer ein Backup deiner Projekte haben.</p>
<p><a href="https://github.com/tbillington/kondo">kondo</a> - A command-line tool for cleaning up dependencies and build artifacts from your projects.</p>
<h2 id="9-grex">9. Grex</h2>
<p><a href="/cli-tools-die-ich-im-september-gefunden-habe/images/grex-demo.gif"><img class="content-image" src="/cli-tools-die-ich-im-september-gefunden-habe/images/grex-demo.gif" alt="Grex Demo" loading="lazy" width="1200" height="850" /></a></p>
<p>Reguläre Ausdrücke zu schreiben ist nicht immer einfach.
Man weiß oft, was man abgleichen will, braucht aber dennoch
Zeit, um das richtige Muster und die passende Syntax zu
finden.</p>
<p><a href="https://github.com/pemistahl/grex">grex</a> macht das leichter.
Du gibst ihm Beispiel-Strings, die du abgleichen willst, und
es erzeugt automatisch ein passendes Muster. So musst du die
Regex nicht selbst schreiben.</p>
<p>Das Tool unterstützt auch Unicode, inklusive Zeichen außerhalb
von einfachem ASCII. grex ist deshalb nützlich für
Eingabevalidierung, Log-Parsing, Textverarbeitung und andere
Aufgaben, bei denen Muster abgeglichen werden müssen.</p>
<p><a href="https://github.com/pemistahl/grex">Grex</a> - A command-line tool and Rust library with Python bindings for generating regular expressions from user-provided test cases.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows 11 Suche nach Tiny11-Installation reparieren (WebView2 Fehler)</title>
      <link>https://cbrueggenolte.de/windows-11-suche-nach-tiny11-installation-reparieren-webview2-fehler/</link>
      <pubDate>Wed, 15 Jul 2026 23:35:44 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/windows-11-suche-nach-tiny11-installation-reparieren-webview2-fehler/</guid>
      <description>&lt;p&gt;Ich habe mir mit Hilfe von Tiny11 ein Windows 11 ISO gebaut, welches&#xA;von unnötigem Ballast wie dem Microsoft Edge Browser und vielen&#xA;anderen Dingen befreit wurde.&#xA;Doch stößt man oft auf ein nerviges Problem: Die normale&#xA;Windows-Suche funktioniert plötzlich nicht mehr.&lt;/p&gt;&#xA;&lt;p&gt;Der Grund dafür war bei mir, dass durch das Fehlen des Browsers Edge&#xA;auch die &lt;strong&gt;WebView2-Komponente&lt;/strong&gt; fehlte oder fehlerhaft war.&#xA;Windows braucht WebView2 aber zwingend, um bestimmte Inhalte&#xA;(wie eben die Websuche im Startmenü) anzuzeigen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich habe mir mit Hilfe von Tiny11 ein Windows 11 ISO gebaut, welches
von unnötigem Ballast wie dem Microsoft Edge Browser und vielen
anderen Dingen befreit wurde.
Doch stößt man oft auf ein nerviges Problem: Die normale
Windows-Suche funktioniert plötzlich nicht mehr.</p>
<p>Der Grund dafür war bei mir, dass durch das Fehlen des Browsers Edge
auch die <strong>WebView2-Komponente</strong> fehlte oder fehlerhaft war.
Windows braucht WebView2 aber zwingend, um bestimmte Inhalte
(wie eben die Websuche im Startmenü) anzuzeigen.</p>
<p>Das zweite Problem: Wenn man versucht, WebView2 über die normalen
Windows-Einstellungen zu reparieren oder zu löschen, passiert gar
nichts.
Auch eine manuelle Neuinstallation funktioniert nicht, weil die
Komponente laut Windows angeblich schon installiert ist.</p>
<p>Hier ist die einfache Anleitung, wie du WebView2 komplett löschst
und sauber neu installierst – und zwar ganz ohne die kaputte
Windows-Suche nutzen zu müssen.</p>
<h2 id="schritt-1-schlüssel-aus-der-registry-entfernen">Schritt 1: Schlüssel aus der Registry entfernen</h2>
<p>Damit wir das Programm löschen dürfen, müssen wir zuerst einen
Sperr-Schlüssel in der Windows-Registry entfernen.</p>
<ol>
<li>Drücke die Tastenkombination <strong>Win + R</strong>, tippe <code>regedit</code> ein
und bestätige mit <strong>Enter</strong> (oder Klick auf OK).</li>
<li>Navigiere auf der linken Seite zu folgendem Pfad:
<code>HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\</code></li>
<li>Lösche dort auf der linken Seite den kompletten „Ordner“
(Schlüssel) mit dem Namen:
<code>{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}</code></li>
</ol>
<h2 id="schritt-2-webview2-deinstallieren">Schritt 2: WebView2 deinstallieren</h2>
<p>Nachdem die Sperre in der Registry weg ist, können wir die alte
(oder fehlerhafte) Installation entfernen.
Da unsere Windows-Suche kaputt ist, starten wir das Terminal über
das versteckte Power-Menü.</p>
<ol>
<li>Drücke <strong>Win + X</strong> auf deiner Tastatur (oder mache einen
Rechtsklick auf den Start-Button).</li>
<li>Klicke im aufklappenden Menü auf <strong>Terminal (Admin)</strong> oder
<strong>Windows PowerShell (Administrator)</strong>.
Bestätige die Sicherheitsabfrage mit &ldquo;Ja&rdquo;.</li>
<li>Gib nun den folgenden Befehl ein, um in das richtige Verzeichnis
zu wechseln, und drücke Enter:</li>
</ol>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">cd </span><span class="s2">&#34;C:\Program Files (x86)\Microsoft\EdgeWebView\Application\*\Installer&#34;</span></span></span></code></pre></div><p><em>(Hinweis: Das Sternchen <code>*</code> ist praktisch, da es automatisch den
Ordner mit der aktuellen Versionsnummer findet.)</em></p>
<ol start="4">
<li>Starte danach die Deinstallation mit diesem Befehl und drücke
Enter:</li>
</ol>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">.\</span><span class="n">setup</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-uninstall</span> <span class="p">-</span><span class="n">-msedgewebview</span> <span class="p">-</span><span class="n">-system-level</span> <span class="p">-</span><span class="n">-verbose-logging</span> <span class="p">-</span><span class="n">-force-uninstall</span></span></span></code></pre></div><p>Das Programm wird jetzt im Hintergrund restlos deinstalliert.</p>
<h2 id="schritt-3-restliche-dateien-aufräumen">Schritt 3: Restliche Dateien aufräumen</h2>
<p>Um ganz sicherzugehen, dass für die Neuinstallation ein komplett
sauberes System bereitsteht, löschen wir noch die übrig gebliebenen
Ordner.</p>
<p>Kopiere diese beiden Befehle nacheinander in dein noch offenes
Terminal-Fenster und bestätige jeweils mit Enter:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="ln">1</span><span class="cl"><span class="n">cmd</span> <span class="p">/</span><span class="n">c</span> <span class="nb">rmdir </span><span class="p">/</span><span class="n">s</span> <span class="p">/</span><span class="n">q</span> <span class="s2">&#34;C:\Program Files (x86)\Microsoft\EdgeWebView&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">cmd</span> <span class="p">/</span><span class="n">c</span> <span class="nb">rmdir </span><span class="p">/</span><span class="n">s</span> <span class="p">/</span><span class="n">q</span> <span class="s2">&#34;</span><span class="nv">$env:localappdata</span><span class="s2">\Microsoft\EdgeWebView&#34;</span></span></span></code></pre></div><p><em>(Da wir uns in der PowerShell befinden, nutzen wir <code>cmd /c</code> davor,
damit der Löschbefehl sauber ausgeführt wird).</em></p>
<p>Du kannst das blaue/schwarze Fenster nun schließen.
Dein System ist jetzt komplett frei von WebView2-Resten.</p>
<h2 id="schritt-4-webview2-sauber-neu-installieren">Schritt 4: WebView2 sauber neu installieren</h2>
<p>Zum Schluss müssen wir die Komponente nur noch frisch installieren,
damit die Windows-Suche wieder funktioniert.</p>
<ol>
<li>Öffne deinen verbliebenen Browser und gehe auf die offizielle
Download-Seite von Microsoft: <a href="https://developer.microsoft.com/en-us/microsoft-edge/webview2/?ch=1&amp;form=MA13LH&amp;cs=2816712725">Microsoft Edge WebView2
herunterladen</a>.</li>
<li>Scrolle etwas nach unten zum Bereich <strong>&ldquo;Evergreen Standalone
Installer&rdquo;</strong>.
(Nimm unbedingt diesen Standalone-Installer, der funktioniert bei
modifizierten Systemen wie Tiny11 deutlich zuverlässiger).</li>
<li>Klicke auf den Button <strong>x64</strong> (für 64-Bit Systeme), stimme den
Bedingungen zu und lade die Datei herunter.</li>
<li>Mache einen Rechtsklick auf die heruntergeladene Datei in deinem
Download-Ordner und wähle <strong>&ldquo;Als Administrator ausführen&rdquo;</strong>.</li>
</ol>
<p>Sobald die Installation durchgelaufen ist, starte deinen Computer
einmal neu.
Danach sollte die Windows-Suche sofort wieder wie gewohnt reagieren!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Jan AI: Meine Erfahrungen mit der lokalen LLM-Desktop-App nach ein paar Monaten</title>
      <link>https://cbrueggenolte.de/jan-ai/</link>
      <pubDate>Sun, 28 Jun 2026 12:18:36 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/jan-ai/</guid>
      <description>&lt;p&gt;Ich nutze &lt;a href=&#34;https://github.com/janhq/jan&#34;&gt;Jan&lt;/a&gt; jetzt seit ein paar Monaten auf meinem Rechner und wollte mal ein kurzes Fazit ziehen. Wer mein Setup kennt, weiß: Ich behalte gerne die Kontrolle über meine Daten und setze wo immer möglich auf lokale KI-Lösungen. Jan ist genau dafür gebaut – eine Open-Source-Alternative (AGPLv3) zu den großen Cloud-Anbietern, die komplett offline läuft.&lt;/p&gt;&#xA;&lt;p&gt;Besonders eine Sache habe ich in der letzten Zeit im Arbeitsalltag extrem zu schätzen gelernt: die &lt;strong&gt;Assistenten-Funktion&lt;/strong&gt;. Die Möglichkeit, sich spezifische Agenten für unterschiedliche Aufgabenbereiche (z. B. gezieltes Code-Review, Brainstorming oder als Refactoring-Helfer) mit eigenen System-Prompts vorzukonfigurieren, beschleunigt den Workflow enorm.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ich nutze <a href="https://github.com/janhq/jan">Jan</a> jetzt seit ein paar Monaten auf meinem Rechner und wollte mal ein kurzes Fazit ziehen. Wer mein Setup kennt, weiß: Ich behalte gerne die Kontrolle über meine Daten und setze wo immer möglich auf lokale KI-Lösungen. Jan ist genau dafür gebaut – eine Open-Source-Alternative (AGPLv3) zu den großen Cloud-Anbietern, die komplett offline läuft.</p>
<p>Besonders eine Sache habe ich in der letzten Zeit im Arbeitsalltag extrem zu schätzen gelernt: die <strong>Assistenten-Funktion</strong>. Die Möglichkeit, sich spezifische Agenten für unterschiedliche Aufgabenbereiche (z. B. gezieltes Code-Review, Brainstorming oder als Refactoring-Helfer) mit eigenen System-Prompts vorzukonfigurieren, beschleunigt den Workflow enorm.</p>
<p>Anders als LM Studio (Closed-Source) oder Ollama (klarer Fokus auf CLI) bringt Jan eine aufgeräumte grafische Oberfläche mit echter Open-Source-Transparenz und einer eigenen Plugin-Architektur mit.</p>
<h4 id="warum-jan-ai-aktuell-in-meinem-werkzeugkasten-liegt">Warum Jan AI aktuell in meinem Werkzeugkasten liegt</h4>
<ul>
<li><strong>Offline-First:</strong> Einmal das Modell (z. B. als GGUF) geladen, bleibt der gesamte Traffic auf meiner Maschine. Keine Telemetrie, keine Überraschungen.</li>
<li><strong>Die Assistenten:</strong> Mein persönliches Highlight. Verschiedene &ldquo;Personas&rdquo; lassen sich sauber trennen und per Klick umschalten, ohne dass ich jedes Mal den Kontext neu definieren muss.</li>
<li><strong>Ressourcenschonend:</strong> Basiert auf <code>llama.cpp</code> und greift direkt auf die Hardware-Beschleunigung (Metal, CUDA, Vulkan) zu.</li>
<li><strong>Nahtlose Remote-Provider:</strong> Auch wenn mein Ansatz ganz klar &ldquo;Local First&rdquo; ist, gibt es komplexe Aufgaben, für die man doch mal auf die großen Modelle der KI-Unternehmen zurückgreifen muss. Jan macht das extrem flexibel: Neben Anbietern wie Gemini oder LM Studio f0rge lassen sich unzählige weitere Remote-APIs wie OpenAI, Anthropic, Mistral, Groq, xAI, MLX, Azure, Hugging Face, NVIDIA NIM oder OpenRouter zuschalten (wie auch in <code>image_1567fe.png</code> zu sehen). Das Geniale daran: Man bleibt in derselben UI und nutzt seine perfekt konfigurierten lokalen Assistenten einfach temporär mit einem Cloud-Modell.</li>
</ul>
<h4 id="der-local-api-server">Der Local API Server</h4>
<p>Für Skripte und kleine Automatisierungen bringt Jan einen echten Vorteil mit: einen lokalen, OpenAI-kompatiblen API-Endpunkt.</p>
<ol>
<li>In den Settings den <strong>Local API Server</strong> aktivieren.</li>
<li>Der Dienst lauscht standardmäßig auf <code>http://localhost:1337</code>.</li>
</ol>
<p>Das lässt sich ganz simpel testen:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:1337/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl">  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl">  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;your-model-id&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hello&#34;}]
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p>Das funktioniert perfekt als lokales Drop-in-Replacement für IDE-Plugins oder Kommandozeilen-Tools, die eigentlich nach einem OpenAI-Key verlangen. Man verbiegt einfach die Base-URL auf localhost.</p>
<h4 id="jan-vs-lm-studio-vs-ollama">Jan vs. LM Studio vs. Ollama</h4>
<p>Je nach Einsatzzweck haben alle Tools ihre Berechtigung. Hier meine aktuelle Einordnung:</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">Feature</th>
					<th style="text-align: left">Jan</th>
					<th style="text-align: left">LM Studio</th>
					<th style="text-align: left">Ollama</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><strong>Lizenz</strong></td>
					<td style="text-align: left">AGPLv3 (Open-Source)</td>
					<td style="text-align: left">Proprietär (Freeware)</td>
					<td style="text-align: left">MIT (Open-Source)</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Fokus</strong></td>
					<td style="text-align: left">Desktop GUI, Assistenten, Offenheit</td>
					<td style="text-align: left">Desktop GUI, schnelle Modell-Tests</td>
					<td style="text-align: left">CLI, API-Serving im Cluster</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Extensions</strong></td>
					<td style="text-align: left">Ja</td>
					<td style="text-align: left">Ja</td>
					<td style="text-align: left">Nein</td>
			</tr>
	</tbody>
</table>
<h4 id="mein-fazit">Mein Fazit</h4>
<p>Wer primär schnelle, leichtgewichtige API-Endpunkte für Skripte oder zentrale Deployments sucht, ist mit Ollama nach wie vor gut bedient. Würde ich jedoch in 2026 immer direkt zu llama.cpp greifen weil es einfach flexibler ist. Für den Desktop-Einsatz als täglicher Begleiter hat Jan bei mir mittlerweile aber einen festen Platz – gerade wegen der sauberen Open-Source-Natur, der starken Assistenten-Verwaltung und der Flexibilität, bei Bedarf unkompliziert die großen Cloud-Modelle einzubinden.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Das Token-Dilemma: Warum HTML für technische Agenten-Specs oft Overkill ist</title>
      <link>https://cbrueggenolte.de/das-token-dilemma-warum-html-fuer-technische-agenten-specs-oft-overkill-ist/</link>
      <pubDate>Sat, 23 May 2026 11:12:19 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/das-token-dilemma-warum-html-fuer-technische-agenten-specs-oft-overkill-ist/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ein pragmatischer Reality-Check zum aktuellen &amp;ldquo;Effectiveness of HTML&amp;rdquo;-Trend aus Sicht der Pipeline-Effizienz und Kontext-Optimierung.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;In der AI-Engineering-Welt wird aktuell viel darüber diskutiert, wie überraschend effektiv das Generieren und Nutzen von nativem HTML im Umgang mit LLMs sein kann. Anthropic hat dazu vor Kurzem einen interessanten Blog-Post veröffentlicht: &lt;a href=&#34;https://claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html&#34;&gt;Using Claude Code: The unreasonable effectiveness of HTML&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ich nutze in meiner lokalen Umgebung selbst einen kleinen LLM-gestützten &lt;strong&gt;PDF Intelligence &amp;amp; Renaming Agent&lt;/strong&gt;, um Scans nach dem Einlesen einen Dateinamen zu geben, der meiner bevorzugten Wahl entspricht. Das funktioniert hervorragend.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Ein pragmatischer Reality-Check zum aktuellen &ldquo;Effectiveness of HTML&rdquo;-Trend aus Sicht der Pipeline-Effizienz und Kontext-Optimierung.</em></p>
<hr>
<p>In der AI-Engineering-Welt wird aktuell viel darüber diskutiert, wie überraschend effektiv das Generieren und Nutzen von nativem HTML im Umgang mit LLMs sein kann. Anthropic hat dazu vor Kurzem einen interessanten Blog-Post veröffentlicht: <a href="https://claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html">Using Claude Code: The unreasonable effectiveness of HTML</a>.</p>
<p>Ich nutze in meiner lokalen Umgebung selbst einen kleinen LLM-gestützten <strong>PDF Intelligence &amp; Renaming Agent</strong>, um Scans nach dem Einlesen einen Dateinamen zu geben, der meiner bevorzugten Wahl entspricht. Das funktioniert hervorragend.</p>
<p>Aus Neugier habe ich dann zwei aktuelle Frontier-Modelle gebeten, meine schlanke Markdown-Spezifikation (<code>AGENTS.md</code>) in ein hochgradig durchgestyltes HTML-Dokument zu übersetzen – so, wie es in dem Blogpost vorgeschlagen wird. Das optische Ergebnis ist bei beiden zweifellos schick. Aber als DevOps- und Software-Engineer schaut man eben auch auf die Metriken unter der Haube. Und die sprechen eine ganz andere Sprache.</p>
<hr>
<h2 id="der-nackte-zahlenvergleich-markdown-vs-html">Der nackte Zahlenvergleich: Markdown vs. HTML</h2>
<p>Schauen wir uns an, was passiert, wenn man identische logische Anweisungen von Markdown in ein modernes HTML-Skelett gießt. Ich habe dafür zwei Generierungen durchgeführt: einmal mit <strong>Google Gemini</strong> (kompakteres Output, Print-CSS-Fokus) und einmal mit <strong>Claude Sonnet</strong> (vollständiges interaktives Layout mit aufklappbaren Sektionen, CSS-Grid, Animationen).</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">Metrik</th>
					<th style="text-align: left">Original (<code>AGENTS.md</code>)</th>
					<th style="text-align: left">Gemini HTML</th>
					<th style="text-align: left">Claude Sonnet HTML</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><strong>Zeichen</strong></td>
					<td style="text-align: left">3.648</td>
					<td style="text-align: left">10.181</td>
					<td style="text-align: left">19.365</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Wörter</strong></td>
					<td style="text-align: left">391</td>
					<td style="text-align: left">746</td>
					<td style="text-align: left">~1.500</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Geschätzte Tokens</strong></td>
					<td style="text-align: left"><strong>~490–960</strong></td>
					<td style="text-align: left"><strong>~2.000–2.200</strong></td>
					<td style="text-align: left"><strong>~5.100</strong></td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Faktor ggü. Markdown</strong></td>
					<td style="text-align: left">1×</td>
					<td style="text-align: left"><strong>~4×</strong></td>
					<td style="text-align: left"><strong>~5,3×</strong></td>
			</tr>
	</tbody>
</table>
<p><em>Hinweis zur Token-Schätzung: Die GPT-4o-Zahlen (Gemini-Spalte) basieren auf dem OpenAI-Tokenizer; die Claude-Schätzung auf ~3,8 Zeichen/Token (claude-sonnet-4-6).</em></p>
<h3 id="warum-explodiert-der-token-count-so-massiv">Warum explodiert der Token-Count so massiv?</h3>
<p>Die zugrundeliegende Programmlogik, die Systemgrenzen und die Verzeichnisstrukturen sind identisch geblieben. Der Mehrverbrauch resultiert ausschließlich aus syntaktischem Overhead: Inline-CSS-Klassen, verschachtelte <code>&lt;div&gt;</code>- und <code>&lt;table&gt;</code>-Strukturen, CSS-Variablen, JavaScript für Interaktionen und HTML-Entities wie <code>&amp;rarr;</code> oder <code>&amp;bull;</code>. Das alles landet vollständig im Kontextfenster – kein Modell kann da &ldquo;wegschauen&rdquo;.</p>
<p>Je ambitionierter das visuelle Design, desto schlimmer die Bilanz. Die Claude-Variante, die wirklich hübsch geworden ist (dunkles Terminal-Theme, aufklappbare Phasen, farbcodierte Blöcke), kostet über <strong>5× so viele Tokens</strong> wie das Original.</p>
<hr>
<h2 id="der-funktionale-blueprint-des-agenten">Der funktionale Blueprint des Agenten</h2>
<p>Damit wir vom selben Inhalt sprechen, hier die Kurzfassung dessen, was die Spezifikation regelt:</p>
<ul>
<li><strong>Zweck:</strong> Nimmt PDFs aus <code>new/</code>, jagt sie durch ein Python-OCR-Skript (<code>pdf-extract.py</code>), liest die Extraktion aus einem Buffer <code>output.txt</code> und generiert ein finales, sicheres Batch-Skript (<code>rename.sh</code> oder <code>rename.ps1</code>).</li>
<li><strong>Sicherheitsgrenze:</strong> Der Agent darf niemals selbst Dateien verschieben oder löschen, sondern schreibt ausschließlich idempotente Befehle (wie <code>mv -n</code>) in das Skript.</li>
<li><strong>Naming-Schema:</strong> <code>yyyy-mm-dd--[category]--[sender]--[subject].pdf</code> (Strict Lowercase, Kebab-Case, Umlaut-Sanitizing).</li>
<li><strong>Klassifizierung:</strong> Striktes Mapping auf elf vordefinierte Kategorien (z. B. <code>amt-behoerde</code>, <code>arbeitgeber</code>, <code>haendler-shop</code>, <code>versicherungen</code>).</li>
</ul>
<hr>
<h2 id="mein-fazit-markdown-bleibt-king-im-core-engineering">Mein Fazit: Markdown bleibt King im Core-Engineering</h2>
<p>Versteht mich nicht falsch: Man <em>könnte</em> das CSS auslagern, wenn man solche UI-Strukturen standardisiert und häufiger abruft. Aber warum sollten wir das im Entwicklungsalltag überhaupt erzwingen?</p>
<p>Heutzutage schickt doch niemand mehr lose, rohe Markdown-Dateien per E-Mail oder Chat durch die Gegend. Wir arbeiten in Git-Ökosystemen. Sobald du einen Link zu einer <code>.md</code>-Datei in GitHub, GitLab oder Codeberg teilst, übernimmt das Web-Interface das saubere Rendering für das menschliche Auge – ganz ohne eine einzige Zeile mitgeschlepptes CSS.</p>
<p>Wenn dieser Prompt oder diese Dokumentation nun Teil des Kontextfensters eines AI-Agenten wird (sei es lokal via Ollama/vLLM oder über externe APIs), zahlen wir bei HTML einen <strong>400–430% Token-Aufschlag</strong> für reines visuelles Lametta, das die LLM-Logik kein bisschen verbessert. Das ist kein akademisches Detail: Bei langen Agentenläufen mit vielen eingelesenen Dateien summiert sich das direkt in höhere Kosten und kürzere effektive Kontextfenster.</p>
<p>Der Thariq-Blogpost hat übrigens durchaus seinen Punkt – aber er beschreibt primär einen <strong>Output</strong>-Workflow: Claude Code <em>erzeugt</em> HTML-Berichte, die Menschen lesen. Für diesen Anwendungsfall ist HTML tatsächlich überlegen. Das Problem entsteht, wenn man HTML auch als <strong>Input</strong> für Agenten einsetzt, also als Systemkontext, Spec oder Instruktionsdatei. Da dreht sich der Vorteil um.</p>
<p><strong>Mein Fazit für schlanke Dokumentation:</strong> Für menschliche Interfaces im Browser ist HTML nett; im Herzstück meiner/unserer Engineering- und Automatisierungsumgebungen ist GitHub-Flavored-Markdown nach wie vor das ungeschlagene Optimum aus Lesbarkeit, Versionierbarkeit und Token-Effizienz.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Forgejo SSH hinter UniFi Gateway Ultra &amp; Double-NAT einrichten</title>
      <link>https://cbrueggenolte.de/forgejo-ssh-hinter-unifi-gateway-ultra-double-nat-einrichten/</link>
      <pubDate>Tue, 05 May 2026 11:28:38 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/forgejo-ssh-hinter-unifi-gateway-ultra-double-nat-einrichten/</guid>
      <description>&lt;p&gt;Wer Forgejo (oder Gitea) intern betreibt, steht oft vor der Wahl: Bequemes &lt;strong&gt;SSH&lt;/strong&gt; oder universelles &lt;strong&gt;HTTPS&lt;/strong&gt;? Während HTTPS über den Nginx Proxy Manager (NPM) leicht zu handhaben ist, bietet SSH via Public-Keys mehr Komfort für Entwickler.&lt;/p&gt;&#xA;&lt;p&gt;In einem &lt;strong&gt;Double-NAT-Setup&lt;/strong&gt; (Router -&amp;gt; UniFi Gateway Ultra -&amp;gt; Forgejo) müssen die Ports jedoch präzise kaskadiert werden.&lt;/p&gt;&#xA;&lt;h3 id=&#34;das-setup&#34;&gt;Das Setup&lt;/h3&gt;&#xA;&lt;p&gt;Der Datenfluss folgt dieser Kette, um den internen Forgejo-SSH-Dienst sicher nach außen zu führen:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Externer Router:&lt;/strong&gt; Leitet Port &lt;code&gt;33022&lt;/code&gt; (Public) an die WAN-IP des UniFi Gateways weiter.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;UniFi Gateway Ultra:&lt;/strong&gt; Nimmt die Anfrage auf Port &lt;code&gt;33022 &lt;/code&gt; entgegen und leitet sie an die interne Server-IP von Forgejo (z.B. &lt;code&gt;192.168.1.201&lt;/code&gt;) weiter.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Forgejo Instanz:&lt;/strong&gt; Nutzt den internen SSH-Server, konfiguriert auf Port &lt;code&gt;33022&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;die-lösung-für-verbindungsprobleme&#34;&gt;Die Lösung für Verbindungsprobleme&lt;/h3&gt;&#xA;&lt;p&gt;Oft scheitert die Verbindung am Standard-Port 22. Die Lösung: Den internen Forgejo-SSH-Dienst explizit auf den Zielport umstellen (z.B. &lt;code&gt;2222&lt;/code&gt;), damit die Port-Weiterleitung der Firewall direkt auf den lauschenden Dienst trifft.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wer Forgejo (oder Gitea) intern betreibt, steht oft vor der Wahl: Bequemes <strong>SSH</strong> oder universelles <strong>HTTPS</strong>? Während HTTPS über den Nginx Proxy Manager (NPM) leicht zu handhaben ist, bietet SSH via Public-Keys mehr Komfort für Entwickler.</p>
<p>In einem <strong>Double-NAT-Setup</strong> (Router -&gt; UniFi Gateway Ultra -&gt; Forgejo) müssen die Ports jedoch präzise kaskadiert werden.</p>
<h3 id="das-setup">Das Setup</h3>
<p>Der Datenfluss folgt dieser Kette, um den internen Forgejo-SSH-Dienst sicher nach außen zu führen:</p>
<ol>
<li><strong>Externer Router:</strong> Leitet Port <code>33022</code> (Public) an die WAN-IP des UniFi Gateways weiter.</li>
<li><strong>UniFi Gateway Ultra:</strong> Nimmt die Anfrage auf Port <code>33022 </code> entgegen und leitet sie an die interne Server-IP von Forgejo (z.B. <code>192.168.1.201</code>) weiter.</li>
<li><strong>Forgejo Instanz:</strong> Nutzt den internen SSH-Server, konfiguriert auf Port <code>33022</code>.</li>
</ol>
<h3 id="die-lösung-für-verbindungsprobleme">Die Lösung für Verbindungsprobleme</h3>
<p>Oft scheitert die Verbindung am Standard-Port 22. Die Lösung: Den internen Forgejo-SSH-Dienst explizit auf den Zielport umstellen (z.B. <code>2222</code>), damit die Port-Weiterleitung der Firewall direkt auf den lauschenden Dienst trifft.</p>
<h3 id="wichtige-konfiguration-appini">Wichtige Konfiguration (<code>app.ini</code>)</h3>
<p>Damit die Links in der Weboberfläche stimmen, muss die Forgejo-Konfiguration angepasst werden:</p>
<ul>
<li><code>SSH_LISTEN_PORT = 33022</code> (Worauf der Dienst lauscht)</li>
<li><code>SSH_PORT = 33022</code> (Was der User von außen eingeben muss)</li>
<li><code>SSH_DOMAIN = deine.domain.de</code></li>
</ul>
<h3 id="client-tipp-ssh-config">Client-Tipp: SSH Config</h3>
<p>Um nicht jedes Mal den Port angeben zu müssen, hilft ein Eintrag in der lokalen <code>~/.ssh/config</code>:</p>





<pre tabindex="0"><code class="language-ssh" data-lang="ssh">Host mein-git
    HostName deine.domain.de
    Port 33022
    User git</code></pre><p>Ein einfaches <code>git clone ssh://git@deine.domain.de:33022/user/repo.git</code> genügt ab jetzt.</p>
<p><strong>Fazit:</strong> Durch die Trennung von Web-Traffic (via NPM auf 443) und SSH-Traffic (via Port-Forwarding auf 33022) erhält man ein performantes und sauberes Self-Hosting-Setup.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fix Nextcloud Updates</title>
      <link>https://cbrueggenolte.de/fix-nextcloud-updates/</link>
      <pubDate>Sat, 11 Apr 2026 20:03:05 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/fix-nextcloud-updates/</guid>
      <description>&lt;p&gt;Ein Nextcloud Update funktioniert manchmal nicht so wie es soll. Denn wenn im Webinterface das nicht funktioniert, dann braucht es ein wenig Hilfe über die Kommandozeile.&lt;/p&gt;&#xA;&lt;p&gt;Dort wechselt man in das Verzeichnis seiner Nextcloud-Installation und kann mit &lt;code&gt;sudo -u www-data php occ app:update --all&lt;/code&gt; den Update-Vorgang starten. Wenn das dann aber auch hier - siehe Bild - so aussieht wie im Webinterface, dann gibt es Abhilfe.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://cbrueggenolte.de/fix-nextcloud-updates/nextcloud-update-falsch_hu_ea0e3444ce3d2513.webp&#34;&gt;![nextcloud-update-falsch](nextcloud-update-falsch.png &amp;ldquo;nextcloud-update-falsch)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mit dem Befehl&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ein Nextcloud Update funktioniert manchmal nicht so wie es soll. Denn wenn im Webinterface das nicht funktioniert, dann braucht es ein wenig Hilfe über die Kommandozeile.</p>
<p>Dort wechselt man in das Verzeichnis seiner Nextcloud-Installation und kann mit <code>sudo -u www-data php occ app:update --all</code> den Update-Vorgang starten. Wenn das dann aber auch hier - siehe Bild - so aussieht wie im Webinterface, dann gibt es Abhilfe.</p>
<p><a href="/fix-nextcloud-updates/nextcloud-update-falsch_hu_ea0e3444ce3d2513.webp">![nextcloud-update-falsch](nextcloud-update-falsch.png &ldquo;nextcloud-update-falsch)</a></p>
<p>Mit dem Befehl</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo -u www-data php occ maintenance:repair</span></span></code></pre></div><p>least sich ein fehlgeschlagenes Update nämlich reparieren und wenn man dann erneut den Befehl <code>sudo -u www-data php occ app:update --all</code> für das Update ausführt, sollte nach kurzer Zeit die Ausgabe ähnlich aussehen:</p>
<p><a href="/fix-nextcloud-updates/nextcloud-update-repariert_hu_bc90559dc5693a8c.webp">![nextcloud-update-repariert](nextcloud-update-repariert.png &ldquo;nextcloud-update-repariert)</a></p>
<p>Und dann klappt das auch wieder mit den Updates.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wenn Aliens auf die Erde kommen</title>
      <link>https://cbrueggenolte.de/wenn-aliens-auf-die-erde-kommen/</link>
      <pubDate>Tue, 07 Apr 2026 08:43:03 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/wenn-aliens-auf-die-erde-kommen/</guid>
      <description>&lt;p&gt;In den tiefen meiner Notizen habe ich diesen wundervollen Text wiedergefunden, den ich vor ein paar Jahren schon einmal gelesen habe. Leider ist der Account des Autors nicht mehr verfügbar, aber der Text ist zu gut, um ihn in Vergessenheit geraten zu lassen. Im &lt;a href=&#34;https://web.archive.org/web/20220930061140/https://twitter.com/foone/status/1572260363764400129&#34;&gt;WebArchive&lt;/a&gt; habe ich eine Kopie gefunden. Hier gibt es ihn mit einigen zusätzlichen Sprecherinformationen, um das Lesen zu erleichtern.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Someday aliens are going to land their saucers in a field somewhere in New Jersey and everything is going to go just fine right up until we try to explain our calendar to them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In den tiefen meiner Notizen habe ich diesen wundervollen Text wiedergefunden, den ich vor ein paar Jahren schon einmal gelesen habe. Leider ist der Account des Autors nicht mehr verfügbar, aber der Text ist zu gut, um ihn in Vergessenheit geraten zu lassen. Im <a href="https://web.archive.org/web/20220930061140/https://twitter.com/foone/status/1572260363764400129">WebArchive</a> habe ich eine Kopie gefunden. Hier gibt es ihn mit einigen zusätzlichen Sprecherinformationen, um das Lesen zu erleichtern.</p>
<hr>
<p>Someday aliens are going to land their saucers in a field somewhere in New Jersey and everything is going to go just fine right up until we try to explain our calendar to them.</p>
<p>Humans: “yeah we divide our year into a number of sub units called ‘months’ made up a number of days, and they’re not all the same length”</p>
<p>Aliens: “I guess that’s unavoidable, if your rotations-count per orbit is a prime number”</p>
<p>Humans: “yeah, our’s isn’t prime”</p>
<p>Aliens: “but surely you have most of these ‘months’ the same length and just make the last one shorter or longer?”</p>
<p>Humans: “No… They’re different lengths following no logical pattern”</p>
<p>Aliens: “what”</p>
<p>Humans: “and we further subdivide the months into ‘weeks’, which is 7 days.”</p>
<p>Aliens: “ahh, so each month is an integer multiple of weeks?”</p>
<p>Humans: “that would make sense, but no. Only one is, sometimes”</p>
<p>Aliens: “SOMETIMES?!”</p>
<p>Humans: “yeah our orbit around the sun isn’t an integer number of days, so we have to change the number of days to in a year from time to time”</p>
<p>Aliens: “oh yes, a similar thing happens on Epsilon Indi 7, where they have to add an extra day every 39 years to keep holidays on track”</p>
<p>Humans: “yeah that’s how ours work! Although the ratio doesn’t work out cleanly, so we just do every 4 years, except every 100 years, except except every 400 years”</p>
<p>Aliens: “oh, you number your years? What’s the epoch?”</p>
<p>Humans: “uh, it’s supposed to be the birth of a religious leader, but they got the math wrong so it’s off by 4 years, if he existed at all.”</p>
<p>Aliens: “if? You based your calendar off the birth date of someone you’re not sure exists?”</p>
<p>Humans: “yeah. He’s written about in a famous book but historical records are spotty.”</p>
<p>Aliens: “interesting. I didn’t realize your planet was one of the ones with a single universal religion, that usually only happens in partial or complete hive minds.”</p>
<p>Humans: “uhh, we’re not.”</p>
<p>Aliens: “You’re not?!”</p>
<p>Humans: “yeah we have multiple religions.”</p>
<p>Aliens: “oh but they all have a common ancestor, which agrees on the existence of that leader, right?”</p>
<p>Humans: “uh, no. Two of the big ones do, but most of the others don’t believe in him”</p>
<p>Aliens: “YOUR CALENDAR IS BASED ON A RELIGIOUS LEADER THAT NOT EVERYONE BELIEVES IN?”</p>
<p>Humans: “well, on his birth. And yeah, we got it wrong by a couple years.”</p>
<p>Aliens: “OK, fine. So, you have somewhat complicated rules about when you change the length of your years, and I’m scared to ask this, but… You definitely just add or subtract that extra day at the end, right?”</p>
<p>Humans: “…. Nope.”</p>
<p>Aliens: “At the start of the year? &quot;</p>
<p>Humans: “nah. The end of the second month”</p>
<p>Aliens: “WHY WOULD IT BE THE SECOND MONTH?”</p>
<p>Humans: “I’m not sure, really.” Aliens: “huh. So at this point I’m dreading asking this, but how do you measure time within each day?”</p>
<p>Humans: “oh that’s much simpler. Each day is divided into hours, each hour has minutes, and each minute has seconds.”</p>
<p>Aliens: “ok. And 10 of each?”</p>
<p>Humans: “10 hours? No. There’s 24 hours, 60 minutes, 60 seconds”</p>
<p>Aliens: “…. I thought you said you used a base-10 counting system”</p>
<p>Humans: “we do! Mostly. But our time system came from some long gone civilization that liked base-60 like 5000 years ago”</p>
<p>Aliens: “and you haven’t changed it since?”</p>
<p>Humans: “No.”</p>
<p>Aliens: “huh. Okay, so why 24? That’s not a divisor of 60”</p>
<p>Humans: “oh because it’s actually 12!”</p>
<p>Aliens: “what”</p>
<p>Humans: “yeah each day is 24 hours but they are divided into two sets of 12.”</p>
<p>Aliens: “and that’s 5 12s, right, I see the logic here, almost. So like, after hour 12, it becomes the second half, which is 1?”</p>
<p>Humans: “No, after 11.”</p>
<p>Aliens: “oh, you zero-index them! So it’s hours 0-11 in the first half, then 12-23 in the second half?”</p>
<p>Humans: “No. 12 to 11 in the first half, and again in the second half”</p>
<p>Aliens: “please explain that before my brain melts out my mouth”</p>
<p>Humans: “the first hour is 12. Then the next one is 1, then it goes back up to 11, then 12 again”</p>
<p>Aliens: “that is not how numbers work. And how do you tell first 12 apart from second 12?”</p>
<p>Humans: “oh we don’t use numbers for that!”</p>
<p>Aliens: “you don’t number the two halves of your day?”</p>
<p>Humans: “nah, we call them AM and PM”</p>
<p>Aliens: “WHAT DOES THAT MEAN”</p>
<p>Humans: “I think it’s ante-meridian and post-meridian? But I’m not sure, I dont know much Latin”</p>
<p>Aliens: “Latin?”</p>
<p>Humans: “yeah it’s an ancient language from an old empire which controlled a lot of the world and we still use some of their terms”</p>
<p>Aliens: “oh, and that was the civilization that liked base-60 and set up your time system?”</p>
<p>Humans: “that would make sense, but… No, completely different one.”</p>
<p>Aliens: “okay, and what do you do to if you want to measure very short times, shorter than a second?”</p>
<p>Humans: “oh we use milliseconds and microseconds”</p>
<p>Aliens: “ahh, those are a 60th of a second and then 60th of the other?”</p>
<p>Humans: “No. Thousandths.”</p>
<p>Aliens: “so you switch to base-10 at last, but only for subdivisions of the second?”</p>
<p>Humans: “yeah.”</p>
<p>Aliens: “but at thousands, ie, ten tens tens”</p>
<p>Humans: “yeah. Technically we have deciseconds and centiseconds, which are 1/10 of a second, and 1/100 of a second, but no one really uses them. We just use milli.”</p>
<p>Aliens: “that seems more like a base-1000 system than a base-10 system.”</p>
<p>Humans: “it kinda is? We do a similar thing with measures of volume and distance and mass.”</p>
<p>Aliens: “but you still call it base-10?”</p>
<p>Humans: “yeah”</p>
<p>Aliens: “so let me see if I get this right: Your years are divided in 10 months, each of which is some variable number of days, the SECOND of which varies based on a complex formula… and each day is divided into two halves of 12 hours, of 60 minutes, 60 seconds, 1000 milliseconds?”</p>
<p>Humans: “12 months, actually.”</p>
<p>Aliens: “right, because of the ancient civilization that liked base-60, and 12 is a divisor of 60.”</p>
<p>Humans: “No, actually, that came from the civilization that used latin. Previously there were 10.”</p>
<p>Aliens: “what”</p>
<p>Humans: “yeah the Latin guys added two months part of the way through their rule, adding two more months. That’s why some are named after the wrong numbers”</p>
<p>Aliens: “you just said two things I am having trouble understanding. 1. Your months are named, not numbered? 2. THE NAMES ARE WRONG?”</p>
<p>Humans: “yep! Our 9th month is named after the number 7, and so on for 10, 11, and 12.”</p>
<p>Aliens: “your 12th month is named… 10?”</p>
<p>Humans: “yeah.”</p>
<p>Aliens: “what are the other ones named after?!”</p>
<p>Humans: “various things. Mainly Gods or rulers”</p>
<p>Aliens: “oh, from that same religion that your epoch is from?”</p>
<p>Humans: “uh… No. Different one.”</p>
<p>Aliens: “so you have an epoch based on one religion, but name your months based on a different one?”</p>
<p>Humans: “yeah! Just wait until you hear about days of the week.”</p>
<p>Aliens: “WHAT”</p>
<p>Humans: “so yeah we group days into 7-day periods-”</p>
<p>Aliens: “which aren’t an even divisor of your months lengths or year lengths?”</p>
<p>Humans: “right. Don’t interrupt”</p>
<p>Aliens: “sorry”</p>
<p>Humans: “but we name the days of the week, rather than numbering them. Funny story with that, actually: there’s disagreement about which day starts the week.”</p>
<p>Aliens: “you have a period that repeats every 7 days and you don’t agree when it starts?”</p>
<p>Humans: “yeah, it’s Monday or Sunday.”</p>
<p>Aliens: “and those names come from…”</p>
<p>Humans: “celestial bodies and gods! The sun and moon are Sunday and Monday, for example”</p>
<p>Aliens: “but… I looked at your planet’s orbit parameters. Doesn’t the sun come up every day?”</p>
<p>Humans: “yeah.”</p>
<p>Aliens: “oh, do you have one of those odd orbits where your natural satellite is closer or eclipsed every 7 days, like Quagnar 4?”</p>
<p>Humans: “no, the sun and moon are the same then as every other day, we just had to name them something.”</p>
<p>Aliens: “and the other days, those are named after gods?”</p>
<p>Humans: “yep!”</p>
<p>Aliens: “from your largest religion, I imagine?”</p>
<p>Humans: “nah. That one (and the second largest, actually) only has one god, and he doesn’t really have a name.”</p>
<p>Aliens: “huh. So what religion are they from? The Latin one again?”</p>
<p>Humans: “nah, they only named one of the God-days”</p>
<p>Aliens: “only on… SO THE OTHER DAYS ARE FROM A DIFFERENT RELIGON ENTIRELY?”</p>
<p>Humans: “Yep!”</p>
<p>Aliens: “the third or forth biggest, I assume?”</p>
<p>Humans: “nah, it’s one that… Kinda doesn’t exist anymore? It mostly died out like 800 years ago, though there are some modern small revivals, of course”</p>
<p>Aliens: “so, let me get confirm I am understanding this correctly. Your days and hours and seconds and smaller are numbered, in a repeating pattern. But your years are numbered based on a religious epoch, despite it being only one religion amongst several.”</p>
<p>Humans: “correct so far”</p>
<p>Aliens: “and your months and days of the week are instead named, although some are named after numbers, and it’s the wrong numbers”</p>
<p>Humans: “exactly”</p>
<p>Aliens: “and the ones that aren’t numbers or rulers or celestial objects are named after gods, right?”</p>
<p>Humans: “yup!”</p>
<p>Aliens: “but the months and the days of the week are named after gods from different religons from the epoch religion, and indeed, each other?”</p>
<p>Humans: “yeah! Except Saturday. That’s the same religion as the month religion”</p>
<p>Aliens: “and the month/Saturday religion is also from the same culture who gave you the 12 months system, and the names for the two halves of the day, which are also named?”</p>
<p>Humans: “right! Well, kinda.”</p>
<p>Aliens: “please explain, slowly and carefully”</p>
<p>Humans: “yeah so cultures before then had a 12 month system, because of the moon. But they had been using a 10 month system, before switching to 12 and giving them the modern names”</p>
<p>Aliens: “the… Moon? Your celestial body?”</p>
<p>Humans: “yeah, it completes an orbit about every 27 days, so which is about 12 times a year, so it is only natural to divide the year into 12 periods, which eventually got called months”</p>
<p>Aliens: “ok, that makes sense. Wait, no. Your orbital period is approximately 365.25 days, right?”</p>
<p>Humans: “yeah. That’s why we do 365 or 366 based on the formula”</p>
<p>Aliens: “but that doesn’t work. 365 divided by 27 is ~13.5, not 12”</p>
<p>Humans: “yeah I’m not sure why 12 was so common then. Maybe it goes back to the base 60 people?”</p>
<p>Aliens: “okay so one final check before I file this report: Years are numbered based on a religious leader. Years always have 12 months, but the lengths of those months is not consistent between each other or between years.”</p>
<p>Humans: “don’t forget the epoch we number our years from is wrong!”</p>
<p>Aliens: “right, yes. And your months are named, some after a different religion, and some after numbers, but not the number the month is in the year.”</p>
<p>Humans: “right. And when we change the month lengths, it’s the second one we change”</p>
<p>Aliens: “how could I forget? After months you have a repeating ‘week’ of 7 days, which is named after gods from two religons, one of which is the month-naming one, and a nearly extinct one. And you don’t agree when the week starts.”</p>
<p>Humans: “nope! My money is on Monday.”</p>
<p>Aliens: “that’s the Monday that’s named after your moon, which supposedly influenced the commonality of the 12 months in a year cycle, despite it orbiting 13 times in a year?”</p>
<p>Humans: “correct!”</p>
<p>Aliens: “and as for your days, they split into two halves, named after a phrase you don’t really understand in the long dead language of the same culture that named the months and Saturday.”</p>
<p>Humans: “Yep. I took some in college but all I remember is like, ‘boy’, ‘girl’, ‘stinky’, ‘cocksucker’”</p>
<p>Aliens: “charming. And then each half is divided into 12 hours, but you start at 12, then go to 1, and up to 11”</p>
<p>Humans: “all I can say is that it makes more sense on analog clocks.”</p>
<p>Aliens: “i don’t know what that is and at this point I would prefer you not elaborate. So each of those hours is divided into 60 minutes and then 60 seconds, and this comes from an ancient civilization, but not the one that gave you the month names”</p>
<p>Humans: “yep. Different guys. Different part of the world.”</p>
<p>Aliens: “ok. And then after seconds, you switch to a ‘base-10’ system, but you only really use multiples of a thousand? Milliseconds and microseconds?”</p>
<p>Humans: “right. And there’s smaller ones beyond that, but they all use thousands”</p>
<p>Aliens: “right. Got it. All written down here. Now if you’ll excuse me, I just gotta go make sure I didn’t leave my interociter on, I’ll be right back.”</p>
<p>The tall alien walks back into their saucer without a wave. The landing ramp closes.</p>
<p>The ship gently lifts off as gangly landing legs retract. There’s a beat, then a sudden whooshing sound as air rushes back into the space that previously held the craft, now suddenly vacuum.</p>
<p>NORAD alarms go off briefly as an object is detected leaving the earth’s atmosphere at a significant fraction of the speed of light.</p>
<p>In the years to come, many technological advances are made from what was left behind, a small tablet shaped object made of some kind of artifical stone/neutrino composite material.</p>
<p>The alien message left on screen is eventually translated to read “Untitled Document 1 has not been saved, are you sure you wish to quit? (yes) (no) (cancel)&quot;</p>
<p>Many years have passed, and we await the day the aliens return. They have not.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mittwoch, 02. April 2026</title>
      <link>https://cbrueggenolte.de/02apr26/</link>
      <pubDate>Thu, 02 Apr 2026 20:00:00 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/02apr26/</guid>
      <description>&lt;p&gt;Heute war ich mit meiner Frau beim Optiker. Es ist beeindruckend, wie modern diese Geschäfte hier in den Niederlanden sind – viele Untersuchungen, die man früher nur vom Augenarzt kannte, werden heute direkt vor Ort erledigt.&lt;/p&gt;&#xA;&lt;p&gt;Besonders positiv fiel uns der Mitarbeiter auf: fachlich kompetent, sehr erklärungsfreudig und vor allem absolut unaufdringlich. Keine Verkaufsmaschen, kein Aufschwatzen, sondern einfach nur sachliche Empfehlungen.&lt;/p&gt;&#xA;&lt;p&gt;Die Sehkraft meiner Frau ist zum Glück stabiler als gedacht. Dennoch wird es nun die erste „Gleitsichtbrille“ geben – beziehungsweise eine Booster-Version, die technisch zwischen normalen Gläsern und Gleitsichtgläsern liegt.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Heute war ich mit meiner Frau beim Optiker. Es ist beeindruckend, wie modern diese Geschäfte hier in den Niederlanden sind – viele Untersuchungen, die man früher nur vom Augenarzt kannte, werden heute direkt vor Ort erledigt.</p>
<p>Besonders positiv fiel uns der Mitarbeiter auf: fachlich kompetent, sehr erklärungsfreudig und vor allem absolut unaufdringlich. Keine Verkaufsmaschen, kein Aufschwatzen, sondern einfach nur sachliche Empfehlungen.</p>
<p>Die Sehkraft meiner Frau ist zum Glück stabiler als gedacht. Dennoch wird es nun die erste „Gleitsichtbrille“ geben – beziehungsweise eine Booster-Version, die technisch zwischen normalen Gläsern und Gleitsichtgläsern liegt.</p>
<p>Dass Markengläser von Zeiss ihren Preis haben, war uns bewusst, aber die Endabrechnung ist dennoch eine Ansage: Ein einzelnes Glas kostet 278 Euro, womit wir allein für die Gläser bei 556 Euro liegen. Beim Gestell konnten wir sparen: Dank 50 % Rabatt auf ein Modell aus der Vorjahreskollektion kostete dieses „nur“ noch 150 Euro.</p>
<p>Insgesamt landen wir also bei über 700 Euro für eine Brille. Warum Gestelle generell so teuer sein müssen, bleibt mir ein Rätsel – ein 3D-gedrucktes Modell, das mir sehr gut gefallen hat, sollte sogar über 400 Euro kosten. Nur für den Rahmen!</p>
<p>In zwei Wochen habe ich dann meinen eigenen Termin – ich bin gespannt, ob ich preislich ähnlich „glimpflich“ davonkomme oder ob mich das 3D-Design doch noch schwach werden lässt.</p>
]]></content:encoded>
    </item>
    <item>
      <title>whisper.cpp: Lokale Sprachtranskription ausprobiert</title>
      <link>https://cbrueggenolte.de/whisper-cpp-lokale-sprachtranskription-ausprobiert/</link>
      <pubDate>Mon, 23 Mar 2026 23:11:00 +0100</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/whisper-cpp-lokale-sprachtranskription-ausprobiert/</guid>
      <description>&lt;p&gt;Heute habe ein wenig mit whisper.cpp herum probiert. Gar nicht mal so verkehrt. Mit minimal Aufwand kann man seine mp3&amp;rsquo;s transkribieren oder Live seine eigene Stimme in eine Datei reinschreiben lassen. Auf dem Pixel 10 verwende ich das 400MB Model für Spracheingabe, auf dem das Medium-Model mit 1,5 GB.&lt;/p&gt;&#xA;&lt;p&gt;Whisper.cpp habe ich mit homebrew installiert und ziemlich gute Ergebnisse erzielt. Startet man den Server, gibt es auch ein einfaches Web-Interface mit Beispiel-Befehlen wie man es anwenden kann.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Heute habe ein wenig mit whisper.cpp herum probiert. Gar nicht mal so verkehrt. Mit minimal Aufwand kann man seine mp3&rsquo;s transkribieren oder Live seine eigene Stimme in eine Datei reinschreiben lassen. Auf dem Pixel 10 verwende ich das 400MB Model für Spracheingabe, auf dem das Medium-Model mit 1,5 GB.</p>
<p>Whisper.cpp habe ich mit homebrew installiert und ziemlich gute Ergebnisse erzielt. Startet man den Server, gibt es auch ein einfaches Web-Interface mit Beispiel-Befehlen wie man es anwenden kann.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Der Ceado Hoop ist bestellt</title>
      <link>https://cbrueggenolte.de/der-ceado-hoop-ist-bestellt/</link>
      <pubDate>Fri, 20 Mar 2026 20:58:52 +0100</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/der-ceado-hoop-ist-bestellt/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;content-image&#34; src=&#34;https://cbrueggenolte.de/der-ceado-hoop-ist-bestellt/ceado-hoop-radial-coffee-brewer_hu_9ca5ef8ebe859b9c.webp&#34; alt=&#34;ceado-hoop-radial-coffee-brewer&#34; title=&#34;ceado-hoop-radial-coffee-brewer&#34; loading=&#34;lazy&#34; width=&#34;1440&#34; height=&#34;901&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ich überlege mir den &lt;a href=&#34;https://www.ceado.com/en/products/pour-over-coffee-brewer/&#34;&gt;Hoop von Ceado&lt;/a&gt; zuzulegen. Der Hoop ist ein Radial-Infusionsbrüher, der dafür sorgt, dass das Wasser gleichmäßig durch das Kaffeebett fließt – sanft und regelmäßig. Dies wird durch die seitlichen Löcher am Boden des sogenannten Flow Towers ermöglicht. Der Wasserfluss durch diese Löcher garantiert eine gleichmäßige Extraktion. Das Wasser filtert mit der gleichen Menge und Stärke durch den Kaffee und erreicht den Papierfilter erst, nachdem es den gesamten Weg durch den Kaffee zurückgelegt hat.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img class="content-image" src="/der-ceado-hoop-ist-bestellt/ceado-hoop-radial-coffee-brewer_hu_9ca5ef8ebe859b9c.webp" alt="ceado-hoop-radial-coffee-brewer" title="ceado-hoop-radial-coffee-brewer" loading="lazy" width="1440" height="901" /></p>
<p>Ich überlege mir den <a href="https://www.ceado.com/en/products/pour-over-coffee-brewer/">Hoop von Ceado</a> zuzulegen. Der Hoop ist ein Radial-Infusionsbrüher, der dafür sorgt, dass das Wasser gleichmäßig durch das Kaffeebett fließt – sanft und regelmäßig. Dies wird durch die seitlichen Löcher am Boden des sogenannten Flow Towers ermöglicht. Der Wasserfluss durch diese Löcher garantiert eine gleichmäßige Extraktion. Das Wasser filtert mit der gleichen Menge und Stärke durch den Kaffee und erreicht den Papierfilter erst, nachdem es den gesamten Weg durch den Kaffee zurückgelegt hat.</p>
<p>Update: Bestellt!</p>
<h2 id="erste-erfahrungen">Erste Erfahrungen</h2>
<p>Eigentlich gehört dieser Satz auf ein T-Shirt:</p>
<p><em>&ldquo;Ich mag es simpel, aber ohne Pre-Infusion geht es nicht.&rdquo;</em></p>
<p>Der direkte Vergleich zeigt: Mit Bloom-Phase (Pre-Infusion) schmeckt der Kaffee einfach besser. Ist bei der AeroPress auch nicht anders.</p>
<p>Meine Zeitangaben basieren auf den Filter von Scott Rae. Wer Next Level oder Standard AeroPress benutzt, mahlt eine Stufe gröber. Das Ergebnis überzeugt auch hier, selbst wenn die Zeiten leicht variieren.</p>
<p>Ein wichtiger Rat: Lass die serienmäßigen Hoop-Filter im Schrank.</p>
<p>Der Hoop sitzt leider auf den meisten Karaffen nicht waagerecht. Hier kann man entweder mit einem Werkzeug nachhelfen oder sich einen <a href="https://www.printables.com/model/1598972-carafecup-adapter-for-ceado-hoop-brewer">3D-gedruckten Adapter</a> zulegen. Oder einfach eine passende Karaffe nehmen.</p>
<p>Mein Setup-Tipp für den Alltag: 300 ml Brühmenge und 18-20g Kaffeepulver. Der Brühkopf passt damit perfekt in die meisten Standard-300-ml-Becher. Es bleibt genau der richtige Luftspalt zwischen dem Boden des Kopfs und der Oberfläche des Kaffees.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nicht alles persönlich nehmen</title>
      <link>https://cbrueggenolte.de/nicht-alles-persoenlich-nehmen/</link>
      <pubDate>Fri, 20 Mar 2026 00:03:50 +0100</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/nicht-alles-persoenlich-nehmen/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cbrueggenolte.de/nicht-alles-persoenlich-nehmen/img_0593_hu_1676818acc91a715.webp&#34;&gt;![S-Bahn Berlin](img_0593.jpg &amp;ldquo;S-Bahn Berlin)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Im Büro ist es gerade „etwas schwierig“. Die Deadline drückt. Die Kollegen nerven. Die Kaffeemaschine ist kaputt. Jeder versucht, seinen eigenen Kopf durchzusetzen. Ich nehme mich da gar nicht aus – manchmal bin auch ich fest davon überzeugt, dass mein Weg der bessere ist.&lt;/p&gt;&#xA;&lt;p&gt;Und dann ploppte heute dieser Text in mein Postfach, der mich kurz innehalten ließ:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Unexpected forms of generosity:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Being early can be a form of generosity. You wait, so they don&amp;rsquo;t have to.&lt;/li&gt;&#xA;&lt;li&gt;Delivering your work on time can be a form of generosity. You make life easier for everyone downstream.&lt;/li&gt;&#xA;&lt;li&gt;Leaving something unsaid can be a form of generosity. You don&amp;rsquo;t always need the last word.&lt;/li&gt;&#xA;&lt;li&gt;Not taking things personally can be a form of generosity. You give people the space to say things imperfectly.&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Besonders diese beiden Punkte haben mich getroffen:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/nicht-alles-persoenlich-nehmen/img_0593_hu_1676818acc91a715.webp">![S-Bahn Berlin](img_0593.jpg &ldquo;S-Bahn Berlin)</a></p>
<p>Im Büro ist es gerade „etwas schwierig“. Die Deadline drückt. Die Kollegen nerven. Die Kaffeemaschine ist kaputt. Jeder versucht, seinen eigenen Kopf durchzusetzen. Ich nehme mich da gar nicht aus – manchmal bin auch ich fest davon überzeugt, dass mein Weg der bessere ist.</p>
<p>Und dann ploppte heute dieser Text in mein Postfach, der mich kurz innehalten ließ:</p>
<blockquote>
<p>&ldquo;Unexpected forms of generosity:</p>
<ul>
<li>Being early can be a form of generosity. You wait, so they don&rsquo;t have to.</li>
<li>Delivering your work on time can be a form of generosity. You make life easier for everyone downstream.</li>
<li>Leaving something unsaid can be a form of generosity. You don&rsquo;t always need the last word.</li>
<li>Not taking things personally can be a form of generosity. You give people the space to say things imperfectly.&rdquo;</li>
</ul>
</blockquote>
<p>Besonders diese beiden Punkte haben mich getroffen:</p>
<p><strong>Leaving something unsaid.</strong><br>
<strong>Not taking things personally.</strong></p>
<p>Also:</p>
<p>Nicht immer das letzte Wort haben zu müssen.<br>
Und nicht alles persönlich zu nehmen.</p>
<p>Klingt simpel.</p>
<p>Ist es aber nicht.</p>
<p>Gerade dann nicht, wenn man überzeugt ist, im Recht zu sein.</p>
<p>Vielleicht ist genau das eine der wichtigsten Fähigkeiten in Zusammenarbeit:</p>
<p>Raum lassen.
Nicht sofort reagieren.
Und Menschen zugestehen, dass nicht alles perfekt formuliert sein muss.</p>
<p>Ich sollte mir das ausdrucken und an den Bildschirm kleben.</p>
<p>Nicht nur für mich, sondern auch für die anderen.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Die .127-Falle: Wie ein /25-Subnetz meinen Reverse Proxy sabotiert hat</title>
      <link>https://cbrueggenolte.de/die-127-falle-subnetz-502/</link>
      <pubDate>Thu, 19 Mar 2026 00:11:52 +0100</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/die-127-falle-subnetz-502/</guid>
      <description>&lt;p&gt;Es gibt diese Fehler, bei denen man sich sicher ist: &lt;em&gt;Das kann eigentlich nicht falsch sein.&lt;/em&gt;&#xA;Alles sieht korrekt aus – und trotzdem funktioniert es nicht.&lt;/p&gt;&#xA;&lt;p&gt;In meinem Fall lief Gitea sauber auf &lt;code&gt;192.168.10.127:3000&lt;/code&gt;. Lokal war alles erreichbar, DNS zeigte korrekt auf den Server, und auch der Nginx Proxy Manager war wie gewohnt konfiguriert. Trotzdem endete jeder Zugriff über die Domain in einem &lt;strong&gt;502 Bad Gateway&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Die üblichen Checks brachten nichts. Upstream stimmte, Protokoll passte, keine offensichtlichen Netzwerk- oder Firewall-Probleme. Es sah einfach alles richtig aus.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Es gibt diese Fehler, bei denen man sich sicher ist: <em>Das kann eigentlich nicht falsch sein.</em>
Alles sieht korrekt aus – und trotzdem funktioniert es nicht.</p>
<p>In meinem Fall lief Gitea sauber auf <code>192.168.10.127:3000</code>. Lokal war alles erreichbar, DNS zeigte korrekt auf den Server, und auch der Nginx Proxy Manager war wie gewohnt konfiguriert. Trotzdem endete jeder Zugriff über die Domain in einem <strong>502 Bad Gateway</strong>.</p>
<p>Die üblichen Checks brachten nichts. Upstream stimmte, Protokoll passte, keine offensichtlichen Netzwerk- oder Firewall-Probleme. Es sah einfach alles richtig aus.</p>
<p>Der Wendepunkt kam durch einen simplen Test im Proxy-Container:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ping 192.168.10.127</span></span></code></pre></div><p>Die Antwort war unerwartet:</p>





<pre tabindex="0"><code>Do you want to ping broadcast? Then -b.</code></pre><p>Spätestens da war klar: Das ist kein klassisches Proxy-Problem, sondern etwas auf Netzwerkebene.</p>
<p>Ein Blick auf die IP-Konfiguration brachte die Erklärung. Das Interface lief mit einem <code>/25</code>-Subnetz. Damit liegt der Adressbereich bei <code>192.168.10.0 – 192.168.10.127</code> – und die <code>.127</code> ist in diesem Fall die Broadcast-Adresse.</p>
<p>Genau diese Adresse hatte ich aber für Gitea verwendet.</p>
<p>Für den Container war <code>192.168.10.127</code> also kein gültiger Host, sondern Broadcast. Entsprechend konnte keine Verbindung aufgebaut werden. Der Reverse Proxy lief ins Leere und quittierte das mit einem 502.</p>
<p>Lokal funktionierte weiterhin alles, weil der Zugriff nicht über diesen Netzwerkpfad ging. Das machte den Fehler besonders verwirrend: Je nachdem, wo man testete, sah alles entweder völlig in Ordnung oder komplett kaputt aus.</p>
<p>Der Fix war letztlich simpel: Subnetz von <code>/25</code> auf <code>/24</code> ändern. Testweise direkt im Container – danach dauerhaft in der Proxmox-Konfiguration:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># vorher</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nv">ip</span><span class="o">=</span>192.168.10.105/25
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># nachher</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nv">ip</span><span class="o">=</span>192.168.10.105/24</span></span></code></pre></div><p>Nach einem Neustart war das Problem sofort verschwunden. Der Proxy konnte den Upstream erreichen, Gitea war über die Domain verfügbar, und der 502 war Geschichte.</p>
<p>Am Ende war es weder ein Problem mit Gitea noch mit Nginx oder DNS – sondern schlicht ein falsch gewähltes Subnetz.</p>
<p>Die Lektion daraus: Wenn etwas komplett unlogisch wirkt, lohnt sich fast immer ein Blick aufs Netzwerk. Gerade bei Subnetzen reichen kleine Details, um alles scheinbar „korrekt“ aussehen zu lassen – während es in Wirklichkeit gar nicht funktionieren kann.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
