Flat-File-CMS · PHP 8.2+ · MIT
Counterglow Seiten sind Ordner.
Ein Content-System ohne Datenbank. Jede Seite ist ein Ordner, jeder Text eine einfache Datei. Kopier sie, committe sie, bearbeite sie im Flugzeug, gib sie jemandem, der die Software nie gesehen hat. Es läuft weiter.
In Arbeit · offener Quellcode
Auf einen Blick
Counterglow ist ein kostenloses Open-Source-Flat-File-CMS in reinem PHP 8.2 oder neuer, entwickelt von Dirk Gerber (Gerber.Media). Seiten sind Ordner, Inhalte sind Klartext. Es gibt keine Datenbank, keinen Build-Schritt und keinen vendor-Ordner. Dazu kommen ein Web-Panel, elf Themes, responsive Bilder, SVG-Layoutvorlagen sowie eingebaute Sitemap, RSS-Feed und JSON-Suche. Die Inhaltsdateien sind bytegleich mit Kirby. Lizenz: MIT.
- Sprache
- PHP 8.2 oder neuer, GD empfohlen
- Datenbank
- keine
- Abhängigkeiten
- keine, nicht einmal Composer-Pakete
- Lizenz
- MIT
- Stand
- in Arbeit
Der Ordner ist die Seite
Der Ordnername trägt Adresse, Reihenfolge und Status. Wer im Panel den Status ändert, benennt nur den Ordner um. Wähl einen Ordner und sieh, was Besucher bekommen.
content/
Daneben liegen cover.jpg und cover.jpg.txt: das Bild und sein Alternativtext.
Title: Über uns ---- Text: Wie diese Seite entstanden ist.
Über uns
Erscheint in Menüs und Feeds, steht an erster Stelle.
Title: Warum Textdateien Datenbanken überleben ---- Date: 2026-02-14 ---- Tags: architektur, inhalt ---- Text: Hier steht Markdown, mit **fett**, Listen, Tabellen und Codeblöcken.
Warum Textdateien Datenbanken überleben
Der Dateiname wählt die Vorlage: note.txt wird mit note.php dargestellt.
Title: Impressum ---- Text: Wer für diese Seite verantwortlich ist.
Impressum
Über die Adresse erreichbar, in Listen unsichtbar.
Title: Eine Idee für später ---- Text: Noch nicht fertig.
Eine Idee für später
Nur sichtbar, wenn du angemeldet bist.
Was drinsteckt
YAML-Parser, Markdown-Parser, Bildverarbeitung und Panel sind alle eigens für dieses Projekt geschrieben.
Content-Tags
Reichhaltige Bausteine ohne HTML:
(image: cover.jpg caption: …), Galerien, Video, Dateien. Eigene Tags meldest du per Plugin an.Vorlagen
Eine Vorlage ist eine PHP-Datei,
$pageund$sitesind schon da. Felder sind verkettbar und nie null, Sammlungen filtern, sortieren und blättern.Responsive Bilder
image()schreibt srcset, Maße und Lazy Loading. Bildgrößen entstehen einmal und liegen danach als statische Dateien bereit.SVG-Layoutvorlagen
Zeichne ein Layout in Inkscape, Figma oder Illustrator, nenne Ebenen etwa
cg-text-titleodercg-link-notes, und das CMS füllt sie mit dem Inhalt.Jede SVG bereinigt
Uploads werden beim Hochladen gereinigt, Vorlagen bei der Ausgabe, jeweils gegen eine Positivliste. Keine Skripte, keine Event-Handler, keine Ressourcen von fremden Seiten.
Headless, wenn du willst
/sitemap.xml,/feed.xml,/robots.txt,/search.json?q=…und jede Seite als.json.Das Panel
Auf dem Server gerendert, rund neun Kilobyte JavaScript. ⌘K-Befehlspalette, ⌘S speichert, geteilte Markdown-Vorschau, Drag-and-drop. Das Wichtigste geht auch ohne JavaScript.
Konten und Rollen
Admin, Editor, Autor. Konten sind PHP-Dateien mit bcrypt-Hashes, jede Anfrage trägt ein CSRF-Token, Fehlversuche bremsen exponentiell.
Elf Themes, ein Inhaltsordner
Ein Theme liefert nur, was es ändert. Alles andere kommt aus /site. Umschalten im Panel unter System → Theme.
- HaloRedaktionell: Serifen, Initialen, Papiergefühl.
Akzent #b4402c - UmbraDunkel und monospaced für Doku und Changelogs.
Akzent #5fd68a - PrismBild zuerst: geteilter Aufmacher, randlose Fotos.
Akzent #7b5cf0 - Counter NewsTech-News: Aufmacher, Kartenraster, Lesefortschritt.
Akzent #e5372b - HandbookDokumentation mit Seitenleiste über die ganze Site.
Akzent #2563eb - MeridianGroße Grotesk, viel Weißraum.
Akzent #2f5bff - PorcelainLuftig, Haarlinien, ein ruhiges Salbeigrün.
Akzent #5f7a58 - BoardroomStrukturiert für Berichte und Geschäftstexte.
Akzent #1a56db - GraphiteModern dunkel mit einem Signal-Limette-Akzent.
Akzent #c6f24a - GripSkate-Zine: schmale Versalien, dicke Linien.
Akzent #ff4d17 - EyelinerNachts: Tintenschwarz, Magenta, kursive Serifen.
Akzent #ff2d76
Startklar mit einer Zeile
Du brauchst PHP 8.2 oder neuer. GD ist für Bildgrößen empfohlen.
Starte im Projektordner den eingebauten Server:
php -S localhost:8000 router.phpÖffne
localhost:8000/panelund leg das erste Konto an. Das ist die ganze Installation.
Auf einem echten Server
Ordner hochladen, content/, media/, site/accounts/ und logs/ beschreibbar machen. Nichts zu kompilieren, zu migrieren oder zu befüllen. Regeln für Apache liegen in .htaccess, ein nginx-Beispiel steht im README.
Sicherst du content/ und site/, hast du die ganze Website gesichert.
Was als Nächstes kommt
Counterglow ist in Arbeit. Die nächsten Schritte, in dieser Reihenfolge:
- VersionenDie letzten zehn Fassungen jeder Seite, beim Speichern aufbewahrt.
- Weiterleitung beim UmbenennenEine neue Adresse schreibt eine Weiterleitung, alte Links funktionieren weiter.
- Inhalte exportierencontent/ als ZIP direkt aus dem Panel.
- Landingpage-GeneratorAufgebaut auf den SVG-Slots.
Fragen
Braucht Counterglow eine Datenbank?
Nein. Seiten sind Ordner, Inhalte sind Textdateien. Wer den Ordner sichert, hat die ganze Website gesichert.
Kann ich vorhandene Kirby-Inhalte übernehmen?
Ja. Die Inhaltsdateien sind bytegleich mit Kirby, ein Inhaltsordner lässt sich ohne Migrationsskript übernehmen.
Was kostet Counterglow?
Nichts. Es ist Open Source unter der MIT-Lizenz, der Quellcode liegt auf Codeberg.
Welches Hosting brauche ich?
Jeden Webspace mit PHP 8.2 oder neuer. Kein Composer, kein npm, kein Build. Den Ordner hochladen genügt.
Geht das auch headless?
Ja. Jede Seite gibt es zusätzlich als JSON, die Suche läuft über /search.json.
Code lesen, Ordner behalten.
Fragen, Ideen oder Fehler gefunden? Schreib mir. hello@gerber.media