Kaffee spendieren (öffnet neues Fenster) EN · English

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

Der Gegenschein, englisch counterglow: ein schwaches Oval aus Sonnenlicht, das interplanetarer Staub genau gegenüber der Sonne zurückwirft. So schwach, dass man ihn nur sieht, wenn man weiß, wohin man schauen muss.

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.

/about
Datei · 1_about/about.txt
Title: Über uns
----
Text:
Wie diese Seite entstanden ist.
Status · gelistet

Über uns

Erscheint in Menüs und Feeds, steht an erster Stelle.

/notes/why-flat-files
Datei · 3_notes/1_why-flat-files/note.txt
Title: Warum Textdateien Datenbanken überleben
----
Date: 2026-02-14
----
Tags: architektur, inhalt
----
Text:
Hier steht Markdown, mit **fett**, Listen,
Tabellen und Codeblöcken.
Status · gelistet

Warum Textdateien Datenbanken überleben

Der Dateiname wählt die Vorlage: note.txt wird mit note.php dargestellt.

/imprint
Datei · imprint/default.txt
Title: Impressum
----
Text:
Wer für diese Seite verantwortlich ist.
Status · ungelistet

Impressum

Über die Adresse erreichbar, in Listen unsichtbar.

—
Datei · _drafts/idea/note.txt
Title: Eine Idee für später
----
Text:
Noch nicht fertig.
Status · Entwurf

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, $page und $site sind 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-title oder cg-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

  1. Du brauchst PHP 8.2 oder neuer. GD ist für Bildgrößen empfohlen.

  2. Starte im Projektordner den eingebauten Server:

    php -S localhost:8000 router.php
  3. Öffne localhost:8000/panel und 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:

  1. VersionenDie letzten zehn Fassungen jeder Seite, beim Speichern aufbewahrt.
  2. Weiterleitung beim UmbenennenEine neue Adresse schreibt eine Weiterleitung, alte Links funktionieren weiter.
  3. Inhalte exportierencontent/ als ZIP direkt aus dem Panel.
  4. 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