← Alle Beiträge
14.10.2026

IllusionCMS im Deep Dive

Ein Rundgang durch IllusionCMS: wie es gebaut ist, was der Seitenbaukasten kann und was in Version 0.7 neu ist.

IllusionCMS: Seitenbaukasten mit Hero, Text, Karten-Raster und globalem Block neben der Live-Vorschau

IllusionCMS ist das CMS, das ich mir selbst gewünscht habe: Ich schreibe HTML, CSS und JavaScript selbst, und das CMS nimmt mir alles ab, was drumherum nervt – Seitenbaum, Dateien, Daten, Formulare, Auslieferung. Seit dem ersten Release am 10. Oktober ist einiges dazugekommen. Dieser Artikel führt durch den aktuellen Stand (v0.7.3) und erklärt, warum ich Dinge so gebaut habe, wie sie sind.

Ein Programm, ein Ordner

IllusionCMS ist ein einzelnes Go-Programm mit eingebauter Admin-Oberfläche. Es legt seine Daten in einem Ordner ab: eine SQLite-Datenbank und die Uploads. Starten, Admin-Konto anlegen, loslegen. Ein Backup ist der Ordner. Zusätzlich schreibt das CMS nachts ab 3 Uhr ein Inhalts-Backup, wenn sich seit dem letzten etwas geändert hat; die Mediendateien sind darin nicht enthalten, die letzten sieben Sicherungen bleiben liegen.

Zu jedem Release gibt es Pakete für Windows, Linux und macOS sowie ein Paket für Docker und Coolify. Bei der Einrichtung lässt sich auf Wunsch eine Demo-Website installieren, die fast alle Funktionen zeigt.

Seiten: HTML gehört der Seite, CSS und JS gehören allen

Der Seitenbaum entspricht der URL-Struktur. Das HTML einer Seite bearbeite ich im Code-Editor, daneben läuft eine Live-Vorschau, die auch ungespeicherte Änderungen zeigt. CSS- und JS-Dateien liegen in einer gemeinsamen Bibliothek, werden Seiten zugeordnet und auf Wunsch an Unterseiten vererbt. Ändere ich eine Datei, ändert sie sich überall.

Die Templates nutzen pongo2, also die bekannte Django-/Twig-Syntax. Snippets lassen sich einbinden oder als Komponenten verwenden. Catch-All-Seiten beantworten zusätzlich alle Unterpfade – ideal für Detailseiten wie /blog/<slug>, so wie diese hier.

Collections, Verknüpfungen und Mehrsprachigkeit

Strukturierte Daten liegen in Collections mit typisierten Feldern. Collections lassen sich untereinander verknüpfen, Einträge werden im Template eine Ebene tief aufgelöst. Dazu kommen CSV-Import und -Export mit Abgleich und Singleton-Collections für Einstellungen, die es nur einmal gibt.

Sprachfassungen sind verknüpft: Das CMS weiß, welche Seite die englische Fassung der deutschen ist, und macht daraus hreflang, Sprachumschalter und Sitemap.

Der Seitenbaukasten

Das größte Feature der letzten Wochen. Ich definiere Bausteine: Ein Snippet bekommt ein Schema mit Parametern (Text, Markdown, Bild, Auswahl, Verknüpfung …) und Slots für verschachtelte Blöcke, jeweils mit Regeln, welche Bausteine erlaubt sind und wie viele. Redakteure setzen daraus Seiten zusammen, ohne je HTML zu sehen.

Der Seitenbaukasten: links die Blockliste, rechts die Vorschau. Der globale Block unten lässt sich je Verwendung anpassen. Der Seitenbaukasten: links die Blockliste, rechts die Vorschau. Der globale Block unten lässt sich je Verwendung anpassen.

  • Blöcke sind ein Feldtyp. Eine Seite hat einen Blockbaum, aber auch ein Blogeintrag kann einen haben.
  • Globale Blöcke pflege ich einmal und binde sie per Verweis ein, etwa einen Newsletter-Kasten. Gelöscht wird nur, was nirgends mehr verwendet wird.
  • Parameter-Überschreibungen (seit v0.6): Ein Verweis darf einzelne Parameter nur für diese Verwendung ersetzen, ohne den globalen Block zu kopieren.
  • Seitenlayouts bieten Snippets als Vorlage für neue Seiten an.

Gerendert wird mit einem Tag: {% blocks page.blocks %}. Der Baukasten bearbeitet nie HTML, nur strukturierte Daten.

Dateien: Ordner, Varianten, S3

Die Dateiverwaltung kennt Ordner, Drag & Drop, Alt-Texte und einen Schalter für private Dateien. Aus JPEG und PNG entstehen automatisch Bildvarianten in mehreren Breiten und eine WebP-Fassung, die image() per <picture> ausliefert. „Aufräumen“ listet auf, was nirgends verwendet wird; gelöscht wird nur, was ich ausdrücklich auswähle.

Aufräumen: Das CMS zeigt ungenutzte Dateien mit Größe und löscht nur, was ich auswähle. Aufräumen: Das CMS zeigt ungenutzte Dateien mit Größe und löscht nur, was ich auswähle.

Private Dateien sind nur über signierte Adressen erreichbar, deren Gültigkeit man selbst wählt. Wahlweise liegen die Dateien in einem S3-Speicher (ich teste gegen Garage); ausgeliefert wird weiter über das CMS, der Bucket bleibt privat. Ordner verschieben, Dateien an Ort und Stelle ersetzen und abfragen, wo eine Datei verwendet wird, gibt es über die API – genutzt von IllusionPublish, das dafür eine eigene Dateigalerie mitbringt.

Daten von außen: IllusionDB, REST und Workflows

Das CMS bindet Daten aus beliebigen REST-APIs per Template ein. Mit der IllusionDB-Brücke liest es Datensätze direkt aus IllusionDB, auch für tausende Landingpages samt Sitemap. Die Verbindung hinterlege ich einmal in den Einstellungen.

Eine Seite der Website zeigt Projekte, die live aus IllusionDB gelesen werden. Eine Seite der Website zeigt Projekte, die live aus IllusionDB gelesen werden.

Workflows sind ein Node-Editor für Abläufe wie ein Kontaktformular: Eingang, Prüfung auf Spam, Speichern in einer Collection, E-Mail-Versand, Weiterleitung. Push-Nachrichten lassen sich über die HTTP-Anfrage an einen Dienst schicken. Eigene Nodes kann ich selbst schreiben. Der Workflow unten ist das Beispiel für die Seite oben: Er holt die Projekte aus IllusionDB.

Ein Workflow liest Datensätze direkt aus IllusionDB und liefert sie als Antwort – genau das, was die Seite oben anzeigt. Ein Workflow liest Datensätze direkt aus IllusionDB und liefert sie als Antwort – genau das, was die Seite oben anzeigt.

Integrations-API

Wer das CMS aus anderen Systemen steuert, bekommt eine Schnittstelle mit Substanz: POST /batch führt mehrere Änderungen atomar aus, Idempotenzschlüssel machen Wiederholungen sicher, GET /schema beschreibt den Aufbau, und Webhooks melden Änderungen signiert (seit v0.7.0 zusätzlich mit Zeitstempel). Genau darauf baut IllusionPublish auf – für mich der beste Beweis, dass die API für echte Anwendungen taugt.

Betrieb und Komfort

  • Remote-Modus: Eine lokale Admin-Oberfläche steuert eine Live-Instanz, mit Versionsabgleich und deutlicher Warnfarbe.
  • Bundles (.icb) transportieren eine Website samt Medien zwischen Instanzen.
  • Statistik zählt nur Tageswerte, ohne Cookies und ohne gespeicherte IP-Adressen. Die Länderkarte ermittelt das Land lokal aus den Vergabelisten der Registries; gespeichert wird nur der Ländercode, keine Stadt.
  • Schutz-Header, gzip und ein Seiten-Cache sind eingebaut.
  • Hell und Dunkel, Oberfläche und Handbuch in Englisch, Deutsch, Französisch, Italienisch und Spanisch.

Neu in v0.7.0

Die Version ist klein, aber sie macht den Alltag spürbar angenehmer. Im 404-Protokoll löscht „Ignorieren“ nichts mehr: Die Adresse bleibt samt Zähler im Reiter Ignoriert und taucht nicht wieder als offen auf. Das hilft vor allem bei den Bot-Anfragen auf /wp-login.php und /.env, die nach dem Leeren früher sofort wiederkamen.

Ignorierte Adressen bleiben im Reiter „Ignoriert“ und lassen sich zurückholen. Ignorierte Adressen bleiben im Reiter „Ignoriert“ und lassen sich zurückholen.

Außerdem gibt es für frisch veröffentlichte Instanzen ein optionales Einrichtungs-Geheimnis (IC_SETUP_TOKEN), die Webhook-Signatur mit Zeitstempel und einige Optimierungen bei Rechten, Dateiauslieferung und gespeicherten Zugangsdaten. Eine Änderung musst du kennen: Workflows haben keinen Zugriff mehr auf Umgebungsvariablen; Werte trägst du direkt im Node oder Skript ein. REST-Quellen behalten {env.NAME}.

Fazit und Download

IllusionCMS bleibt klein im Betrieb und hat in der Tiefe, was ich an einem CMS vermisst habe: Kontrolle über das HTML, einen sauberen Baukasten für Redaktionen und eine API, die man gern benutzt. Die aktuelle Version ist v0.7.3. Funktionen, Handbuch und Downloads stehen auf illusioncms.com, die Release Notes im Changelog.