<?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>Blogging auf cbrueggenolte.de</title>
    <link>https://cbrueggenolte.de/tags/blogging/</link>
    <description>Neueste Beiträge in Blogging 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>
    <lastBuildDate>Mon, 23 Feb 2026 23:13:39 +0100</lastBuildDate>
    <atom:link href="https://cbrueggenolte.de/tags/blogging/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GoBlogger: Meine eigene Blogging-Software in Go</title>
      <link>https://cbrueggenolte.de/goblogger-eigene-blogging-software/</link>
      <pubDate>Mon, 23 Feb 2026 23:13:39 +0100</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/goblogger-eigene-blogging-software/</guid>
      <description>&lt;p&gt;Seit ein paar Tagen schon arbeite ich an einer neuen Blogger-Software, die ich auch schon unter &lt;a href=&#34;https://goblogger.org&#34;&gt;https://goblogger.org&lt;/a&gt; veröffentlicht habe. Es ist eine Software, die in Go geschrieben ist und die ich für meine eigenen Bedürfnisse entwickelt habe. Denn damit will ich in den nächsten Tagen diesen Hugo Blog ersetzen, sobald die Software so weit ist, dass ich damit auch meinen Blog betreiben kann.&lt;/p&gt;&#xA;&lt;p&gt;Noch bin ich fleißig daran am Entwickeln, aber es macht mir sehr viel Spaß. Auch wenn &lt;strong&gt;GoBLogger&lt;/strong&gt; erstmal nur für mich ist, so hoffe ich doch, dass sie auch für andere Schreiberlinge interessant sein könnte. Abgesehen davon, ist es natürlich nicht so einfach einen Hoster zu finden, der auch Go unterstützt. Hier kann ich euch allerdings  &lt;a href=&#34;https://uberspace.de&#34;&gt;uberspace&lt;/a&gt; empfehlen, die ich auch für diesen Blog hier nutze. &amp;ldquo;Hosting on Asteroids&amp;rdquo; ist das Motto von uberspace, und das trifft es ziemlich gut. Bin ich doch selbst schon seit über 10 Jahren dort.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seit ein paar Tagen schon arbeite ich an einer neuen Blogger-Software, die ich auch schon unter <a href="https://goblogger.org">https://goblogger.org</a> veröffentlicht habe. Es ist eine Software, die in Go geschrieben ist und die ich für meine eigenen Bedürfnisse entwickelt habe. Denn damit will ich in den nächsten Tagen diesen Hugo Blog ersetzen, sobald die Software so weit ist, dass ich damit auch meinen Blog betreiben kann.</p>
<p>Noch bin ich fleißig daran am Entwickeln, aber es macht mir sehr viel Spaß. Auch wenn <strong>GoBLogger</strong> erstmal nur für mich ist, so hoffe ich doch, dass sie auch für andere Schreiberlinge interessant sein könnte. Abgesehen davon, ist es natürlich nicht so einfach einen Hoster zu finden, der auch Go unterstützt. Hier kann ich euch allerdings  <a href="https://uberspace.de">uberspace</a> empfehlen, die ich auch für diesen Blog hier nutze. &ldquo;Hosting on Asteroids&rdquo; ist das Motto von uberspace, und das trifft es ziemlich gut. Bin ich doch selbst schon seit über 10 Jahren dort.</p>
<p>Also. Probiere es doch einfach mal aus und lass mich wissen, was du davon hältst. Es ist natürlich noch nicht perfekt, aber ich bin zuversichtlich, dass es in den nächsten Wochen immer besser wird. Und wer weiß, vielleicht ist es ja auch für dich eine interessante Alternative zu anderen Blogging-Software.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mein Microblog – Von der Idee zur stabilen App</title>
      <link>https://cbrueggenolte.de/mein-microblog-von-der-idee-zur-stabilen-app/</link>
      <pubDate>Sat, 06 Sep 2025 00:00:00 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/mein-microblog-von-der-idee-zur-stabilen-app/</guid>
      <description>&lt;p&gt;Die letzten Wochen habe ich mich intensiv mit meinem eigenen Microblog beschäftigt. Was als kleines Experiment begann,&#xA;wuchs schnell zu einem vollwertigen Projekt heran.&#xA;Die Idee war klar: eine minimalistische Plattform für kurze Beiträge in Markdown,&#xA;ohne schweres CMS, ohne unnötigen Ballast.&#xA;Ich wollte etwas Eigenes schaffen – unabhängig von großen Anbietern, leichtgewichtig und trotzdem funktional.&lt;/p&gt;&#xA;&lt;h2 id=&#34;der-weg-zur-richtigen-technologie&#34;&gt;Der Weg zur richtigen Technologie&lt;/h2&gt;&#xA;&lt;p&gt;Ich war sofort von &lt;a href=&#34;https://bun.sh/&#34;&gt;Bun&lt;/a&gt; begeistert – schnell, modern,&#xA;mit einer eleganten All-in-One-Philosophie.&#xA;Doch auf meinem Uberspace-Host scheiterte jede Bun-Version&#xA;an einer zu alten glibc.&#xA;Schade, aber Plan B war schnell gefunden: &lt;a href=&#34;https://deno.land/&#34;&gt;Deno&lt;/a&gt;.&#xA;Deno versprach Sicherheit und moderne Features.&#xA;Allerdings war die Kompatibilität mit manchen Bibliotheken hakelig,&#xA;und ich stieß bei der Integration auf zu viele kleine Hürden.&#xA;Nach diesen Experimenten landete ich bei klassischem Node.js (mit pnpm).&#xA;Es ist robust, weit verbreitet und ließ sich auf meinem Host&#xA;ohne Probleme einrichten.&#xA;Mit TypeScript und ESM war ich trotzdem nah&#xA;an einer modernen Entwicklungsumgebung.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Die letzten Wochen habe ich mich intensiv mit meinem eigenen Microblog beschäftigt. Was als kleines Experiment begann,
wuchs schnell zu einem vollwertigen Projekt heran.
Die Idee war klar: eine minimalistische Plattform für kurze Beiträge in Markdown,
ohne schweres CMS, ohne unnötigen Ballast.
Ich wollte etwas Eigenes schaffen – unabhängig von großen Anbietern, leichtgewichtig und trotzdem funktional.</p>
<h2 id="der-weg-zur-richtigen-technologie">Der Weg zur richtigen Technologie</h2>
<p>Ich war sofort von <a href="https://bun.sh/">Bun</a> begeistert – schnell, modern,
mit einer eleganten All-in-One-Philosophie.
Doch auf meinem Uberspace-Host scheiterte jede Bun-Version
an einer zu alten glibc.
Schade, aber Plan B war schnell gefunden: <a href="https://deno.land/">Deno</a>.
Deno versprach Sicherheit und moderne Features.
Allerdings war die Kompatibilität mit manchen Bibliotheken hakelig,
und ich stieß bei der Integration auf zu viele kleine Hürden.
Nach diesen Experimenten landete ich bei klassischem Node.js (mit pnpm).
Es ist robust, weit verbreitet und ließ sich auf meinem Host
ohne Probleme einrichten.
Mit TypeScript und ESM war ich trotzdem nah
an einer modernen Entwicklungsumgebung.</p>
<p>Für das Web-Framework fiel die Wahl auf <a href="https://hono.dev/">Hono</a>.
Es ist klein, schnell und hat eine klare, intuitive API – perfekt für ein
Projekt, das keinen Overhead verträgt.
Als Template-Engine wählte ich <a href="https://eta.js.org/">Eta</a>, weil sie
minimalistisch ist, eine einfache Syntax bietet und mir volle Kontrolle über
die Templates gibt.
Für die Datenhaltung experimentierte ich zunächst mit Markdown-Dateien im
Dateisystem.
Das war simpel, aber unpraktisch, sobald es um dynamische Inhalte oder
Metadaten ging.
Also wechselte ich zu <a href="https://github.com/typicode/lowdb">LowDB</a>, einem
JSON-Datei-Store, der sich schnell einbinden ließ und für ein
Single-Instance-Projekt wie dieses ideal ist.</p>
<p>Das Design hielt ich mit <a href="https://tailwindcss.com/">Tailwind CSS</a> bewusst schlicht.
Tailwind ermöglicht es,
schnell ansprechende Layouts zu bauen,
ohne sich in CSS-Details zu verlieren.
Für die Umwandlung von Markdown in sauberes HTML
kam <a href="https://markdown-it.github.io/">Markdown-It</a> zum Einsatz,
das zuverlässig und flexibel ist.</p>
<h2 id="technik-stack">Technik Stack</h2>
<ul>
<li><strong>Runtime</strong>: Node.js (ESM + TypeScript) – robust und kompatibel</li>
<li><strong>Framework</strong>: Hono – schlank, schnell, mit klarer API</li>
<li><strong>Templates</strong>: Eta – minimalistisch und leicht kontrollierbar</li>
<li><strong>Datenhaltung</strong>: LowDB – JSON-Datei-Store, ideal für kleine Projekte</li>
<li><strong>Styling</strong>: Tailwind CSS (CLI v4) – für ein sauberes, modernes Design</li>
<li><strong>Markdown</strong>: Markdown-It – für zuverlässige Markdown-zu-HTML-Konvertierung</li>
<li><strong>Sicherheit</strong>: CSRF-Schutz, Rate Limiting, sichere Cookies</li>
<li><strong>Build/Deploy</strong>: <code>tsc</code>, Tailwind CLI, rsync-Deploy mit Backup</li>
<li><strong>Performance</strong>: Statische Assets mit Cache-Headers, minimale JS-Bundles</li>
</ul>
<h2 id="herausforderungen-und-lösungen">Herausforderungen und Lösungen</h2>
<p>Die größte Herausforderung war,
die Balance zwischen Einfachheit und Funktionalität zu finden.
Zum Beispiel war die Entscheidung für LowDB nicht trivial:
Ich hatte zunächst überlegt,
eine richtige Datenbank wie PostgreSQL einzusetzen.
Aber für ein kleines Projekt mit überschaubarem Datenvolumen
wäre das Overkill gewesen.
SQLite schied leider auch aus, weil Uberspace keine Unterstützung
aufgrund von fehlenden Bibliotheken bot.
LowDB bot die perfekte Mischung aus Flexibilität und Einfachheit,
auch wenn ich für größere Projekte vielleicht noch mal umdenken würde.</p>
<h2 id="sicherheit-und-betrieb">Sicherheit und Betrieb</h2>
<p>Sicherheit war mir von Anfang an wichtig.
Sessions werden im Speicher gehalten,
was bei einem Server-Neustart zu einem Logout führt –
für mein kleines Projekt akzeptabel.
Cookies sind sicher konfiguriert
(<code>HttpOnly</code>, <code>SameSite</code>, <code>Secure</code> in Produktion),
und ein CSRF-Schutz sichert Login- und Admin-Formulare ab.
Um Brute-Force-Attacken vorzubeugen,
habe ich ein einfaches IP-basiertes Rate Limiting implementiert.
Es ist nicht perfekt,
sollte für meine Zwecke aber ausreichen.</p>
<p>Der Build-Prozess ist bewusst schlank:
TypeScript wird mit <code>tsc</code> kompiliert,
Tailwind CSS über die CLI gebaut.
Die Artefakte werden mit <code>rsync</code> auf den Server übertragen,
mit einem automatischen Backup vor jedem Deploy.
Um CSS-Cache-Probleme zu vermeiden,
nutze ich Cache-Busting durch Versions-Hashes in den Dateinamen.
Das sorgt dafür,
dass Nutzer immer die aktuelle Version der Stylesheets laden,
ohne dass ich manuell eingreifen muss.</p>
<h2 id="ausblick-was-kommt-noch">Ausblick: Was kommt noch?</h2>
<p>Das Projekt ist jetzt stabil, aber es gibt noch Ideen für die Zukunft.
Erst heute habe ich die RSS-Feed Funktion implementiert.
Eine Kommentarfunktion wäre auch spannend,
aber ich müsste entscheiden, wie ich das ohne großen Verwaltungsaufwand umsetze.
Von daher gibt es erst einmal keine Kommentare.
Wenn mir jemand etwas schreiben möchte,
gibt es genügend Möglichkeiten, dies zu tun.
Außerdem spiele ich mit dem Gedanken,
Beiträge nach Veröffentlichung automatisiert auch ins Fediverse zu pushen.</p>
<h2 id="fazit">Fazit</h2>
<p>Aus einer kleinen Idee ist in kurzer Zeit ein stabiler,
sicherer Microblog geworden – bewusst schlank gebaut,
aber erweiterbar.
Hono, Eta und LowDB haben sich als hervorragende Kombi
für ein leichtgewichtiges Projekt erwiesen.
Die Entscheidung für Node.js und TypeScript
hat sich als pragmatisch und zukunftssicher herausgestellt.
Am meisten freut mich, dass ich jetzt eine Plattform habe,
die genau das tut, was ich wollte: kurze, fokussierte Inhalte teilen,
ohne Overhead und unabhängig von großen Anbietern.
Es war ein Lernprozess, aber jeder Schritt –
von den gescheiterten Bun-Experimenten
bis zur finalen Deploy-Strategie – hat sich gelohnt.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ghost: Ungenutzte Bilder automatisch löschen</title>
      <link>https://cbrueggenolte.de/ghost-ungenutzte-bilder-automatisch-loeschen/</link>
      <pubDate>Tue, 10 Nov 2020 21:58:17 +0000</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/ghost-ungenutzte-bilder-automatisch-loeschen/</guid>
      <description>&lt;p&gt;Mit dem [Tool/&lt;a href=&#34;https://github.com/ghostboard/ghost-purge-images&#34;&gt;Script&lt;/a&gt;] von &lt;a href=&#34;https://github.com/ghostboard/ghost-purge-images&#34;&gt;David Burgos&lt;/a&gt; lassen sich in einer &lt;a href=&#34;http://ghost.org&#34;&gt;Ghost&lt;/a&gt;-Installation die nicht benutzten Bilder löschen.&#xA;Denn leider gibt es immer noch keinen Medien-Manager (oder ich bin zu doof den zu finden) um hochgeladene Dateien zu löschen.&#xA;Das Script von David funktioniert hervorragend.&lt;/p&gt;&#xA;&lt;p&gt;Auf dem &lt;a href=&#34;https://uberspace.de&#34;&gt;Uberspace&lt;/a&gt; kann man das Tool ganz einfach installieren.&#xA;Achte nur darauf, dass du auch die richtige Version für deine Ghost-Version installierst:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ghost v3 &lt;code&gt;npm install -g ghost-purge-images&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ghost v2 +v2.16 &lt;code&gt;npm install -g ghost-purge-images@2.1.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ghost v2 - v2.15.x &lt;code&gt;npm install -g ghost-purge-images@2.0.3&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ghost v0.7.2 - v1.x &lt;code&gt;npm install -g ghost-purge-images@1.0.0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Um das Tool jetzt einzusetzen, benötigst du noch zwei Schlüssel.&#xA;Diese generiert man sich in &lt;strong&gt;Settings&lt;/strong&gt; unter dem Menüpunkt &lt;strong&gt;Integrations.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mit dem [Tool/<a href="https://github.com/ghostboard/ghost-purge-images">Script</a>] von <a href="https://github.com/ghostboard/ghost-purge-images">David Burgos</a> lassen sich in einer <a href="http://ghost.org">Ghost</a>-Installation die nicht benutzten Bilder löschen.
Denn leider gibt es immer noch keinen Medien-Manager (oder ich bin zu doof den zu finden) um hochgeladene Dateien zu löschen.
Das Script von David funktioniert hervorragend.</p>
<p>Auf dem <a href="https://uberspace.de">Uberspace</a> kann man das Tool ganz einfach installieren.
Achte nur darauf, dass du auch die richtige Version für deine Ghost-Version installierst:</p>
<ul>
<li>Ghost v3 <code>npm install -g ghost-purge-images</code></li>
<li>Ghost v2 +v2.16 <code>npm install -g ghost-purge-images@2.1.1</code></li>
<li>Ghost v2 - v2.15.x <code>npm install -g ghost-purge-images@2.0.3</code></li>
<li>Ghost v0.7.2 - v1.x <code>npm install -g ghost-purge-images@1.0.0</code></li>
</ul>
<p>Um das Tool jetzt einzusetzen, benötigst du noch zwei Schlüssel.
Diese generiert man sich in <strong>Settings</strong> unter dem Menüpunkt <strong>Integrations.</strong></p>
<p>Ich habe das hier für mcih schon erstellt, du musst in deinem Blog auf <strong>Add custom integration</strong> klicken.
Dann einen Namen vergeben und mit Save speichern.</p>
<p>Das sollte dann so aussehen:</p>
<p>In der Kommandozeile wechselst du dann in das Verzeichnis von deiner Ghost Installation und führst den Befehl <code>ghost-purge-images display --content-key=1234567890 --admin-key=0987654321s</code> aus.
Die Zahlen musst du natürlich durch deine Schlüssel aus der oben erstellen <strong>Integration</strong> nehmen.</p>
<p><strong>ghost-purge-images</strong> mit Parameter <strong>display</strong> zeigt die möglichen Kandidaten
Den gleichen Befehl kannst du dann noch mal mit dem Parameter <strong>purge</strong> ausführen, um die Bilder auch wirklich zu löschen.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
