Derzeit habe ich mit Contentstack, einem Headless CMS zu tun. Contentstack ist zusammen mit Contentful einer der beiden Platzhirsche in Sachen gemietetem headless-CMS.
Im Folgenden werden die überraschenden Limitierungen und seltsamen UI Entscheidungen dokumentiert, die mir inzwischen untergekommen sind. Ich werde den Artikel später noch updaten, da natürlich auch Contentstack (die Firma) nicht untätig ist und weiter an ihrem Produkt feilt.
Stacks
Diese Limitierung ist erstmal eher finanzieller Natur. Daten werden in Contentstacks in sogenannten Stacks einsortiert. Damit die Übersicht bei größeren Projekten nicht verloren geht, möchte man da eher mehrere haben und nicht alles mittels Präfixes und ähnlichen Hacks in einen Stack packen.
Allerdings: die Stacks sind richtig teuer. Das führt schnell mal dazu, dass hier gespart wird und doch alles in einem Stack landet. Hier sollte man vorher gut planen.
Weißraum
Die UI von Contentstack erinnert an das Konstrukt in der Matrix oder den weißen Raum, in dem sich Bernd das Brot regelmäßig befindet:

Weiß, soweit das Auge reicht. Kaum Kontrast, viele versteckte Elemente und an jeder Ecke wird Platz gespart. Der Platz wird allerdings nicht genutzt, um eine kompakte Ansicht auf mobilen Endgeräten zu ermöglichen. Nein, man hat einfach nur so viel Platz ...
Viele Menüs und Buttons sind versteckt und erscheinen erst, wenn man diese unsichtbaren Elemente mit der Maus findet - wie bei frühen Point & Click Adventures ohne Interaktionshilfen. Wo Platz für hilfreiche Informationen ist, klafft oft eine große, weiße Lücke. Menüs sind nur durch ein graues Icon gekennzeichnet und offenbaren erst beim Darüberfahren mit der Maus ihre eigentliche Bestimmung.
Dabei hat Contentstack es einmal besser gemacht: Es gibt eine alte GUI, die aktiviert werden kann. Neue Features werden allerdings nur noch für die alte umgesetzt und man ist quasi gezwungen die neue Oberfläche zu benutzen. Ähnlich wie bei Reddit.
Als Poweruser (und dazu wird man zwangsläufig, wenn man das System nutzt - egal ob man Redakteur, Admin oder Entwickler ist) ist die Erfahrung extrem frustrierend.
Nun habe ich mir in solchen Fällen oft das Leben mit Userstyles erleichtert. Das sind CSS-Schnipsel, die man in seinen eigenen Browser laden kann, um diverse Webseiten zu verändern. Allerdings verwendet Contentstack größtenteils Zufalls-generierte IDs und Klassen, wodurch diese Möglichkeit stark limitiert ist.
Felder und Blöcke
Felder sind Eingabe-Elemente, in denen Informationen gespeichert werden. Zum Beispiel hat ein Artikel ein Feld für die Überschrift, ein Feld für das Artikelbild, eines für den Fließtext und so weiter. Die Anzahl der Felder ist pro Inhalts-Typ auf 100 begrenzt. Das hört sich erstmal nach viel an, aber diese Grenze ist sehr schnell erreicht. Das fällt gerne erst auf,, nachdem die Grenze gerissen wurde. Die dann folgenden hacks sind sehr unschön. Beim initialen Verkaufsgespräch wurden solche Limits jetzt eher weniger erwähnt. In der Dokumentation sind diese zwar erwähnt, aber man stolpert eher zufällig darüber. Einen Zähler am Inhaltstyp selbst gibt es zwar, jedoch listet dieser nicht das Maximum mit auf. Zudem wird die Verwendung von globalen Feldern (siehe unten) zwar intern mit angerechnet, jedoch nicht angezeigt. Somit kann man sich kaum auf den Zähler verlassen.
Das Limit kann auf Wunsch etwas hochgesetzt werden (200). Auf Anfrage wurde klar, dass das Limit vor allem der Performance des Contentstack Backends geschuldet ist ...
Auch Blöcke haben ein Limit. Ein Block ist eine wiederverwendbare Sammlung verschiedener Felder, die beliebig oft generiert und untereinander angeordnet werden können. So kann ein Redakteur beispielsweise den Inhalt einer Seite oder eines Artikels aus diesen Blöcken aufbauen. (Z.b. einen für Text, einen für eine Galerie, einen für ein Video etc.).
Nun kann man jedoch lediglich 20 Blöcke in so einem Block-Container konfigurieren. Auch hier ist das Limit sehr viel schneller erreicht als einem lieb ist. Auch hier kann das Limit auf Anfrage etwas hochgesetzt werden (30).
Globale Felder
Das Konzept der globalen Felder ("global Fields") sieht wie folgt aus: Benötigt man ein Set an Feldern in gleicher Form immer wieder, kann man hierfür ein globales Feld anlegen. Dieses kann mehrere Felder beinhalten und als ganzer Conteiner dann immer wieder verwendet werden. Statt also überall die 10 gleichen Felder für z.B. Metadaten anzulegen, kann man diese nun zentral in einem globalen Feld anlegen/verwalten und diese dann verwenden.
Aber: globale Felder können nicht in globale Felder gepackt werden. Das hört sich jetzt nicht nach einer schlimmen Limitierung an, deshalb ein Beispiel:
Es gibt in Contentstack ein Link-Feld. Dieses ist aber lediglich auf Titel und URL beschränkt. Zusätzliche Felder und Optionen für das Öffnen des Links in einem neuen Tab (nervige Sache, aber die Redaktion verlangt danach ...) oder das Setzen von nofollow-Attributen sind nicht möglich. Lösung: Ein globales Feld, in dem man sich all diese Optionen einfach konfiguriert. Leider kann man dann dieses Link-Feld nicht in globalen Feldern verwenden. Braucht man also in einem globalen Feld so einen Link-Konfigurator, ist man erstmal aufgeschmissen. Hier muss man sich mit einem selbst programmierten Feld behelfen. Und das führt mich zum nächsten Punkt: die nicht sehr gute Dokumentation.
Dokumentation
Kurzum: Zu kurz, zu wenig, zu ungenau, zu wenig Beispiele. Die Dokumentation der PHP-Bibliothek von Contentstack ist quasi nicht vorhanden - genau wie die Dokumentation der Möglichkeiten in selbstgeschriebenen Feldern.
Live Preview
Live Preview ist eine Funktion, mit der man den frisch geschriebenen Inhalt mittels einer Vorschau überprüfen kann, ohne dass der Inhalt bereits online gestellt wurde. Naturgemäß sind Headless Systeme hier dank ihrer Entkoppelung von der Ausgabeschicht im Nachteil gegenüber teilweise entkoppelten oder monolithischen Systemen. Im Grunde genommen wird hier ein leeres Template vom Live-System aufgerufen, und die Inhalte (dank vorher verteilter Marker) ersetzt. Ein richtiges Rendering der echten Templates findet also nicht statt. Das kann z.B. bei dynamischen Inhalten wie Artikel, die hinter einer Paywall existieren, zu Herausforderungen führen. Einen Login oder eine Session kann man hier nicht so einfach durchschleifen.