Content Management System

Das Content Management System (CMS) ermöglicht die direkte Bearbeitung der Datenbank. Dies umfasst das Erstellen, Löschen und Bearbeiten von Inhalten via ein übersichtliches Interface. Ohne das CMS müsste man direkt die Dateien mit entsprechender Syntax beschreiben oder via Import-Script arbeiten. Das CMS ist über admin.arthistory.piogino.ch erreichbar und mit einem Login geschützt.

Funktionen

Beschreibungsfeld

Das Beschreibungsfeld erwartet Markdown. Das Feld besitzt eine Live-Vorschau, wie man es von beispielsweise Obsidian kennt: **fett** erscheint beim Tippen fett, die Markierungen bleiben aber blass sichtbar, sodass genau das gespeichert wird, was man sieht. Zudem funktionieren die geläufigen Keyboard Shortcuts. So wird ein Inhalt fett formatiert, wenn die entsprechende Stelle ausgewählt und Ctrl+B gedrückt wird. Ein Knopf "Preview" zeigt den Text genau so, wie ihn die Website darstellen wird. Der Editor basiert auf CodeMirror 6. Seit 2026-10-14 erkennt die Rechtschreibprüfung beim Tippen, ob ein Text deutsch oder englisch ist. In Firefox schien das zuerst nicht zu funktionieren; es fehlte nur das deutsche Wörterbuch im Browser. Seit 2026-10-20 hat der Editor eine grosse Bandbreite an Werkzeugen, wenn die Syntax gerade nicht auswendig im Kopf ist:

Diese Formen erscheinen auch in allen Beschreibungen und Biografien auf der Website.

Projektinternes Verlinken

Mit dem Glossar wurde ein System eingerichtet, welches das Verlinken in Bildbeschreibungen oder Biografien sehr einfach und intuitiv gestaltet, ohne jedes Mal eine URL einzufügen. Die Verlinkung funktioniert wie bei der Software Obsidian: Der zu verlinkende Begriff wird in doppelte eckige Klammern gesetzt [[WORT]], und [[contrapposto|die Pose]] zeigt die Verlinkung auf dem eigenen Wort "die Pose". Seit 2026-10-06 funktioniert das für alle Arten von Einträgen. Per Default ist ein Glossarbegriff gemeint. Soll eine andere Datenbank angesteuert werden, beispielsweise Künstler:innen oder Orte, wird diese mit dem Datenbanknamen und einem Schrägstrich angegeben. In der Regel muss man das aber nicht eingeben, da beim Schreiben zwischen den Klammern automatisch Vorschläge erscheinen. Jeder Eintrag zeigt zudem, welche anderen Einträge auf ihn verlinken. Auf der Website zeigen diese Links beim Darüberfahren mit der Maus eine kleine Vorschau des Eintrags, ähnlich wie bei Wikipedia.

Ich schreibe Es wird
[[artist/katsushika-hokusai]] ein Link auf dem Wort "Katsushika Hokusai"
[[artwork/the-great-wave|the Wave]] ein Link auf dem eigenen Wort "the Wave"
[[contrapposto]] der Glossarbegriff auf dem Wort "contrapposto"

Karte im CMS

Die Karte für die Koordinaten von Einträgen im CMS läuft über Leaflet mit OpenStreetMap-Kacheln und nicht über MapTiler, da es unnötig ist, dafür das Gratis-Kontingent zu verwenden. Auf der Karte kann direkt ein Punkt oder eine Fläche für ein Objekt gewählt werden. Damit muss die Eingabe nicht von Hand über die Koordinaten gemacht werden, sondern gestaltet sich intuitiver und ist direkt auf der Karte nachvollziehbar. Für Flächen sind verschiedene Tools über Geoman (Leaflet Drawing and Editing Plugin Documentation | Geoman) verfügbar, um Polygone zu erstellen und zu bearbeiten. Über eine Suche lassen sich Orte finden und, wo OpenStreetMap einen Umriss kennt, dieser als Fläche übernehmen. Gezeichnete Flächen, deren Ränder sich kreuzen, werden vor dem Speichern von PostGIS repariert, damit Flächen- und Distanzberechnungen zuverlässig bleiben. Damit können künftig auch historische politische Gebiete wie das Osmanische Reich oder das Gebiet der Han-Dynastie gezeichnet werden. Eine ausgereiftere Lösung für solche Gebiete gibt es noch nicht; OpenStreetMap zeigt die heutigen Grenzen, die nur ein Ausgangspunkt sein können. Eine kleine Anekdote: Kurz nach dem Einrichten zeigte die Karte im CMS nur noch ein Bild mit "Access blocked". OpenStreetMap verlangt, dass jede Anfrage angibt, von welcher Website sie kommt. Genau diese Angabe hatte ich aus Datenschutzgründen für alle Seiten des CMS abgeschaltet. Nun wird sie nur für die Kartenkacheln mitgeschickt.

History und Rückgängigmachen

Jede Änderung wird mit dem vollständigen Eintrag vor und nach der Änderung gespeichert. Darauf aufbauend kann jede Änderung aus der History rückgängig gemacht werden ("revert…"), und ein Eintrag kann auf einen früheren Stand zurückgesetzt werden ("restore this version…"). Beides geschieht nie sofort, sondern zeigt zuerst eine Vorschau. Für jedes Feld werden drei Werte verglichen: der Wert vor der Änderung, der Wert nach der Änderung und der heutige Wert. Hat seit der Änderung niemand das Feld angefasst, wird es automatisch zurückgesetzt. Wurde es später nochmals geändert, ist das ein Konflikt, und ich entscheide, ob der heutige Wert bleibt oder der alte zurückkommt. Felder, die die Änderung nicht betroffen hat, werden nie verändert. Bei längeren Texten wie Biografien werden die Änderungen Wort für Wort zusammengeführt, nach demselben Prinzip, das auch Git für Dateien verwendet: Rückgängig gemacht werden nur die Wörter, die diese Änderung geschrieben hat, spätere Änderungen an anderen Stellen bleiben erhalten. Die History zeigt Textänderungen ebenfalls Wort für Wort: Gelöschte Wörter sind rot durchgestrichen, neue grün. Gelöschte Einträge kommen mit ihrer ursprünglichen ID zurück, sodass ihre Beziehungen und ihre ganze History wieder verbunden sind. Die Vorschau führt das Rückgängigmachen tatsächlich aus und macht es danach wieder rückgängig, sodass alles, was die Datenbank ablehnen würde, schon vor der Bestätigung sichtbar wird. Auch ein Rückgängigmachen erscheint in der History und kann selbst wieder rückgängig gemacht werden.

Gleichzeitiges Bearbeiten

Damit keine Eingaben verloren gehen und mehrere Personen gleichzeitig arbeiten können, wurde das CMS in zwei Schritten erweitert:

  1. Anwesenheit und Entwürfe: Ein kleiner Hinweis unten rechts zeigt, ob die Verbindung steht und wann der Entwurf zuletzt gespeichert wurde. Wer gerade denselben Eintrag ansieht oder bearbeitet, wird angezeigt, bis hin zum Feld, in dem die andere Person gerade schreibt. Eingaben werden alle 1,5 Sekunden auf dem Server gesichert und bei einer unterbrochenen Verbindung im Browser zwischengespeichert, bis die Verbindung wieder steht. Bei einem Absturz einer Session gehen so keine Daten verloren.
  2. Gemeinsame Arbeitskopie: Alle, die einen Eintrag bearbeiten, arbeiten an derselben Arbeitskopie und sehen die Eingaben der anderen live, in Texten sogar Zeichen für Zeichen mit dem Cursor der anderen Person. Grundlage dafür ist Yjs, ein sogenannter CRDT: Jede Kopie, die dieselben Änderungen erhalten hat, hat denselben Inhalt, unabhängig von der Reihenfolge, in der sie eingetroffen sind. Deshalb lassen sich auch Änderungen zuverlässig zusammenführen, die offline gemacht wurden. Aus "Speichern" wurde "Publish": Erst die Veröffentlichung prüft die Eingaben und erzeugt einen Eintrag in der History.

Getestet wurde das mit zwei Benutzer:innen in zwei Browsern gleichzeitig, auch während eines Neustarts des Servers. Aktuell ist weiterhin nur ein Account erstellt, da es ein Soloprojekt ist. Am 2026-10-18 meldete das CMS bei Kunstwerken "Someone saved this record while you were editing", obwohl niemand sonst den Eintrag bearbeitet hatte. Das ist behoben.

Datenqualität

Die Seite "Quality" im CMS listet auf, was falsch oder unvollständig aussieht. Die Regeln sind Abfragen in Postgres, die vor allem mit Zeiträumen rechnen. Beispiele:

Weil mit Zeiträumen gerechnet wird, gelten ungenaue Daten erst dann als Widerspruch, wenn sie sich gar nicht überschneiden können: "ca. 1480" widerspricht "1482" nie. Eine Meldung kann mit einer Begründung als "OK" markiert werden (etwa "posthumer Bronzeguss") und erscheint dann nicht mehr. Seit 2026-10-21 werden die Prüfungen nur noch für die Einträge neu berechnet, die eine Änderung betrifft (siehe Skalierung). Ein Wunsch war von Anfang an, dass meine Seite Widersprüche selbst entdeckt. Ein Beispiel ist Gauguins Werk Tournesols: Es wird auf 1901 datiert, Gauguin war 1901 aber auf Tahiti oder in Atuona, und das Werk wurde zwischen 1901 und 1904 in Paris gekauft. Seit 2026-10-16 zieht die Provenienz Schlüsse aus den Lebensdaten und Aufenthalten der Besitzer:innen, etwa "Paul Gauguin was in Atuona then: the work travelled to Paris, ≈ 14,393 km", und widersprüchliche Angaben erscheinen als Qualitätsmeldung (siehe Provenienz).