$ cat 2026-07-04-NoCMS.md
title : NoCMS
date  : 2026-07-04 19:45
tags  : [nocms, php, webdev, caddy, markdown]

Festplattencrash und NoCMS

Es war ein ganz normaler Tag. Bis es das nicht mehr war.

Die Festplatte war tot. Ich wunderte mich noch. Eigentlich nicht, denn die Katzen haben damals, in dieser Hitzeschlacht (es ist erst eine Woche her), den Server gekickt, physisch. Und jetzt, alles weg. Die Posts, die Ideen, der ganze Kram, den ich über die Jahre angesammelt hatte. Zum Glück ist diese Selfhosting-Attitüde ein Sport für mich, der keine grenzdebil-wichtigen Daten beinhaltet. Ich kann auf all das verzichten, es ist nur Zeit hinein geflossen.

Also setzte ich mich hin und baute nach einiger Zeit eine Notseite, parallel zum Versuch, Datenrettung zu betreiben. Eine Aufgabe reicht ja noch nicht in der Freizeit. Die Seite bestand aus einfachem HTML, ganz simpel, aber erstmal nur eine Seite.

Da ging es los - ich wanderte ins elende Rabbithole.

Ciao Welt

Die Erweiterungen

Zuerst kam also die Neugier. Was könnte ich tun?

Beides kleine Spielereien, die aber irgendwie zum Charakter der Seite gehören.

Der Ordner /posts

Und dann kamen die Posts. Nachdem das CSS ziemlich gut aussah und ich die Seite gern betrachtete, kam die Idee einen Ordner einfach mit Markdown Dateien zu befüllen, und diese würden dann angezeigt. Keine Datenbank, kein CMS. Einfach Text. posts/ – mehr nicht.

PHP liest den Ordner aus, sortiert die Dateien, rendert das Markdown zu HTML. Fertig. Begonnen mit Parsedown.php. Also alles in die Richtung "keinen Stress, keine Abhängigkeiten". So entstand dieses kleine, feine System, das ich "NoCMS" nenne.

Die Entwicklung

Irgendwann, und das passiert ja immer, wurde der Code schon unübersichtlich. Ich musste alles quasi doppelt, aber mit kleinen Unterschieden in index.php und posts.php (vorher hatte ich nur eine index.html), pflegen. Das ist kein Zeichen von Unzufriedenheit, sondern einfach von Wachstum. Die Seite wuchs, die Ideen wurden mehr, und der anfängliche, saubere Code begann sich in alle Richtungen auszubreiten. Ich hab da schon zwei mal was komplett kaputt gemacht.

Also kam die Refaktorisierung 1. Kein Umbau, sondern einfach eine Entschlackung, weil ich aktuell alles in einer Datei hatte:

Die index.php und die post.php wurden wieder schlank. Übersichtlich. So, wie es sich gehört.

So sieht die neue Struktur der Seite aus:

/
├── assets/
│   ├── style.css          # Zentrale Styles (monospace, darkmode, responsive)
│   └── script.js          # last.fm + Counter (fetch, update)
│
├── inc/
│   ├── functions.php      # Alle PHP-Helfer (getPosts, parseFrontmatter, 
│   └── header.php         # HTML-Kopf (title, meta, css, rss/sitemap-links)
│
├── posts/                 # Alle Markdown-Posts
│   ├── 2026-07-04-nocms.md
│   ├── 2026-06-15-cachyos.md
│   └── ...
│
├── vendor/                # Composer (CommonMark für Markdown→HTML)
│
├── index.php              # Startseite
├── post.php               # Einzelpost
├── footer.php             # Footer
│
├── counter.php            # API: zählt Besuche (counter.txt)
├── counter.txt            # Zählerstand (wird von counter.php inkrementiert)
│
├── lastfm.php             # API: holt aktuellen Song von Last.fm
│
├── sitemap.php            # Dynamische Sitemap (XML)
├── rss.php                # Dynamischer RSS-Feed (XML)
│
├── composer.json          # Composer-Dependencies (CommonMark)
├── composer.lock
│
├── images/                # (optional) Bilder für Posts

Die Herausforderung der Zeit

Dann gab es noch das Problem mit der Sortierung. Ich sortierte mit filemtime nach dem Änderungsdatum. Das führte dazu, dass ein alter Post, den ich überarbeitete, plötzlich wieder ganz oben stand. Als wäre er neu. Das verwirrt den etwaigen Leser, und mich selbst auch.

Also führte ich ein festes Datum im Frontmatter ein. date: 2026-07-04 18:30. Einfach, aber effektiv. Jetzt sortiert das System nach diesem Datum ganz unabhängig davon, wann ich die Datei zuletzt angefasst habe. touch

Sitemap und Feed

Und weil es jetzt eine Art Blog geworden ist, mussten noch zwei Dinge her:

Beides wird jetzt dynamisch generiert. Kein manuelles Pflegen mehr, kein Vergessen. Die PHP-Skripte machen das automatisch.

Caddy erledigt den Rest: rewrite /sitemap.xml /sitemap.php und rewrite /feed.xml /rss.php. Ich liebe Caddyserver. Wenn ich mir angucke was die htaccess da schon wieder hätte tun müssen.

Fazit

Aus meinem Festplattencrash wurde eine kleine, schöne Spielerei die ich noch nicht auf Github respektive Codeberg eingecheckt habe. Aus einer Notseite wurde sozusagen ein echtes Weblog. Aus wildem Code wurde fast eine ordentliche Struktur. Ich will immer Struktur, ich kriege es immer nur mäßig hin

Das ist mein NoCMS.

Kein CMS, was mir zuviel ist. Kein sinnloser Overhead. Nur ein Ordner mit Markdown-Dateien und ein bisschen PHP. Schauen wir doch mal, was Google Pagespeed dazu sagt (mein erste Bild):

Google Pagespeed Ergebnisse dieser Website

Herzlichst,
Jan Montag


  1. Unter Refaktorisierung (oder Refactoring) versteht man die Umstrukturierung von vorhandenem Quellcode, ohne dessen äußeres Verhalten oder seine Funktion zu verändern. Ziel ist es, die Lesbarkeit, Wartbarkeit und Erweiterbarkeit des Codes zu verbessern, um langfristig Zeit bei der Fehlersuche und der Integration neuer Funktionen zu sparen. 

cd ..