Zwei Fenster des Artikeleditors von pacod-cms, hell und dunkel, überlappend, jeweils mit dem Starward-Artikel Forty-eight hours on Halcyon Station und den Bereichen für Veröffentlichung und Autoren neben dem Text.
Der Artikeleditor des Studios bei Tag und bei Nacht: der Text, daneben Status, Datum, Autoren und Rubriken des Artikels. Das Studio selbst spricht Englisch, Bulgarisch, Deutsch und Russisch.

pacod-cms ist ein Open-Source-Content-Management-System für redaktionelle Websites. Eine Installation hostet viele Sites, jede mit eigener Datenbank, eigenen Dateien und eigenem Cache; die Redaktion arbeitet in einem mehrsprachigen Studio, und die Leserschaft bekommt schnelle, nach Host geroutete öffentliche Sites.

Content-Management

  • Lizenz: Apache-2.0
  • Version: 0.0.1 · Vorschau
  • Geschrieben in: Java
  • Tech-Stack: Java 25, Spring Boot 4.1, Thymeleaf, MongoDB, Maven, Caddy, Gotenberg, Docker
  • Auf GitHub ansehen · Issue eröffnen

Funktionen

Redaktioneller Kern

Artikel, Kategorien, Autoren, Tags und feste Seiten, mit einer gemeinsamen Bildbibliothek für die ganze Website.

Multi-Site von Grund auf

Jede Website hat ihre eigene MongoDB-Datenbank, eigene Dateien und eigenen Cache und antwortet unter den Hosts, die sie beansprucht.

Werbung und Statistiken

Werbebuchungen mit einem HTML5-Banner-Builder, eine Link-in-Bio-Seite für Social-Media-Profile und Statistiken zu Leserschaft, Werbung und Crawlern, damit die Redaktion sieht, was gelesen und was gecrawlt wird. Buchungen für einzelne Rubriken und ein GitHub-Icon für die Link-Seite sind in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site).

Mehrsprachig

Inhalte in vielen Sprachen mit konfigurierbarer Originalsprache und KI-Übersetzung eines Artikels oder einer ganzen Website als Job, wobei jede Antwort verworfen wird, die das Markup des Artikels nicht exakt beibehält; das Studio selbst auf Englisch, Bulgarisch, Deutsch und Russisch. Russisch für die eigenen Beschriftungen der öffentlichen Site ist in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site).

KI-Schreibhilfe

Titel, ein ganzer Artikel aus einem Briefing, ein Absatz an der Cursorposition und ein Text, in gestaltete Blöcke gegliedert, ohne dass ein Wort des Autors verloren geht.

KI-Design

Ein Theme, ein Seitenlayout oder das Design der ganzen Website aus wenigen Worten entworfen, als Überarbeitung des aktuellen Entwurfs; nur Entwürfe, mit einem Rückgängig-Schritt.

Organisationen und Rollen

Organisationen, Websites und Einladungen, mit Rollen pro Organisation und pro Website, verwaltet in pacod-id.

PDFs und Zeitschriftenausgaben

Artikel-PDFs als Hintergrund-Job, im Drucklayout der Website oder in einem zweispaltigen wissenschaftlichen Format, mit Abstract und Schlagwörtern aus dem Artikel oder von der KI geschrieben; eine Zeitschriftenausgabe bündelt Artikel zu einem PDF pro Sprache mit Titelseite, Editorial, Inhaltsverzeichnis und nummerierten Seiten, veröffentlicht im Archiv der Website.

Export und Wiederherstellung

Eine Website oder eine ganze Organisation wird als ein ZIP heruntergeladen und als neue wiederhergestellt, auf dieser Installation oder einer anderen.

Das Plattform-Diagramm mit hervorgehobenem pacod-cms und abgeblendeten übrigen Projekten: eine Linie von den Menschen zu pacod-cms, eine grün gepunktete Verbindung zu pacod-gw und weiter zu den Modellen und eine gold gepunktete zu pacod-id.
Wo pacod-cms sitzt. Menschen nutzen sein Studio und seine Websites (grau). Die KI-Funktionen des Studios erreichen ein Modell nur über pacod-gw (grüne Punkte), und das Studio meldet Personen über pacod-id an (goldene Punkte); die Leserschaft der Websites meldet sich nirgends an. pacod-demo betreibt es mit den anderen Projekten.

Screenshots

Die Startseite von Starward in einem Browserfenster: ein Kopf mit sieben Rubriken und einem Suchfeld, die Titelgeschichte Why the stars do not twinkle in space über einem Sternfeld mit grünem Nebel und darunter eine Anzeige von Aurelian Lines.
Starward, die Demo-Website auf dem Template-Set magazine: eine Titelgeschichte über die volle Breite auf einem NASA-Foto, darunter das HTML5-Leaderboard eines seiner erfundenen Werbekunden.
Die Websites-Ansicht von pacod-cms mit Demo Journal, Demo Notes und Starward in einer Demo-Organisation, jede mit einer Adresse, der Sprache en und dem Status aktiv, mit Knöpfen für eine neue Website und zum Wiederherstellen einer Website.
Eine Installation, viele Websites: die Website-Liste des Studios, jede mit Organisation, Adressen, Inhaltssprache und Status. Jede hat eine eigene Datenbank, einen eigenen Dateiordner und eigene Cache-Einträge.
Die Design-Ansicht von pacod-cms für Starward: das Template-Set Magazine mit seiner Beschreibung, eine Tabelle mit sechs Seitentypen von der Startseite bis zur Suche, jeder als eigener der Website markiert und mit einem Edit-Knopf, und das Theme mit 26 gesetzten Werten.
Die Design-Ansicht: das Template-Set der Website, ein Layout für jeden ihrer sechs Seitentypen und ihr Theme, alles im Studio geändert, ohne Code anzufassen.
Die dunkle Theme-Ansicht von pacod-cms für Starward mit zwei Vorlagen, Nightfall und Newsprint, über einer Tabelle von Farben wie Seite, Karten, Linien, Text und Akzent, jede mit einem Hex-Wert für Tag und Nacht, und den Knöpfen Preview und Publish.
Der Theme-Editor bei Nacht: Man beginnt mit einer Vorlage des Sets, Nightfall oder Newsprint, und gibt dann jeder Farbe einen Tag- und einen Nachtwert. Die Tokens teilen sich alle Template-Sets, sodass ein Theme einen Wechsel übersteht.
Die Werbe-Ansicht von pacod-cms für Starward mit sechs aktiven Buchungen für Aurelian Lines, Kestrel & Vane, Rimstone Lodge, Nightglass Tours und Lumen Assurance, in der Seitenleiste oder oben, jede mit ihren Seiten und Zählern.
Die Werbe-Ansicht: jede Buchung mit Typ, Platzierung, Reihenfolge, den Seiten, auf denen sie läuft, Zeitraum, Impressionen und Klicks. Die fünf erfundenen Werbekunden von Starward zeigen handgeschriebene HTML5-Motive und ein Standbild.

Ein Stack, viele Websites

pacod-cms betreibt viele Websites für viele Organisationen aus einem Stack. Jede Website hat ihre eigene MongoDB-Datenbank, ihren eigenen Dateiordner und ihre eigenen Cache-Einträge und antwortet unter den Hosts, die sie beansprucht. Wer sich registriert, kann eine Organisation anlegen, deren Admin werden, darin Websites erstellen und Personen zur Mitarbeit einladen; ein Plattform-Admin legt die Limits fest.

Das Design geht davon aus, dass der Inhaber einer Website allen anderen auf der Installation feindlich gesinnt sein könnte. Websites führen Skripte aus, die ihre Inhaber geschrieben haben — HTML5-Banner, Tag-Manager, Artikeltexte —, und die Plattform muss diese Skripte und diese Daten dort halten, wo sie hingehören.

Wie die Teile zusammenspielen

Teil Was es tut
pacod-cms-core Eine Bibliothek: Dokumente, Services, die Mandantenfähigkeit, die Control Plane, Seed-Inhalte, das Designmodell und eine Java-Portierung der Regel-Engine von pacod-id.
pacod-cms-site Die öffentliche Site für alle Websites zugleich: Seiten, schreibgeschütztes JSON unter /web/v1/**, Medien, Zugriffszähler.
pacod-cms-studio Das Studio: das Portal für Organisationen, Websites und Mitglieder, die Bearbeitungsansichten, Hintergrund-Jobs, KI.
Caddy Die Eingangstür, routet nach Host: den Host des Studios zum Studio, den von pacod-id zu pacod-id, jeden anderen Host zur Site.
Gotenberg Erzeugt die PDFs von Artikeln und Zeitschriftenausgaben aus den Druckansichten der Site.

Die beiden Anwendungen rufen einander nie auf. Beide greifen direkt auf MongoDB zu, sodass eine Änderung im Studio die öffentliche Site über die Datenbank erreicht; die Caches der Site laufen nach 60 Sekunden ab, statt geleert zu werden, sodass eine Änderung innerhalb einer Minute live ist.

Vom Host zur Seite

Jede Arbeitseinheit gehört zu genau einer Website, die für ihre Dauer gebunden ist.

  1. Caddy reicht die Anfrage an die Site weiter. In Produktion fordert Caddy das Zertifikat einer Website beim ersten Besuch an, aber erst, nachdem die Site bestätigt hat, dass der Host zu einer aktiven Website gehört.
  2. Die Site schlägt den Host in der Control Plane nach, bevor irgendetwas anderes läuft. Ein Host, den keine aktive Website beansprucht, bekommt ein schlichtes 404, nie eine Standard-Website.
  3. Ist die Website gebunden, geht jede MongoDB-Operation an deren Datenbank. Ist keine gebunden, wirft die Datenbankschicht einen Fehler, statt zu raten.
  4. Das Layout des Seitentyps — Regionen mit geordneten Sektionen — wird gegen das Template-Set der Website aufgelöst, und die Daten jeder Sektion werden vorab geladen. Templates fragen nie selbst ab; eine Sektion, deren Daten fehlschlagen, wird weggelassen und protokolliert, und die Seite wird trotzdem gerendert.

Im Studio ergibt sich die Website aus dem Pfad (/sites/<id>/mgmt/…); Hintergrundarbeit bindet die Website, für die sie läuft.

Wo die Daten liegen

Wo Was
pacod_cms Die Control Plane: Organisationen, Websites, Domains, Plattform-Einstellungen, die Job-Warteschlange.
site_<id> Eine Datenbank pro Website: Artikel, Seiten, Bilder, Banner, Menüs, Einstellungen, Layouts, Theme, Statistiken.
sites/<id>/ Die Dateien der Website: Artikelbilder, Banner-Motive, PDFs. Die PDFs einer Ausgabe im Entwurf liegen in einem privaten Ordner, den nur das Studio ausliefert.
pacod-id Personen, Sitzungen und Rollenzuweisungen. Das CMS speichert keine Konten.

Die Identität einer Website — Name, Logos, Kontaktdaten, Drittanbieter-IDs — steckt in den Daten, nicht im Markup. Eine Drittanbieter-ID wird nur gerendert, wenn sie gesetzt ist und das Format ihres Anbieters hat, sodass eine frische Website überhaupt kein Tracking lädt. Die Originalsprache der Inhalte einer Website ist der letzte Fallback für eine fehlende Übersetzung und der rechtlich maßgebliche Text. Eine kanonische Adresse, hreflang und Artikel-Metadaten im Head jeder Leserseite sowie ein Atom-Feed pro Website und pro Rubrik sind in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site).

Design ohne Code

Unter Gestaltung im Studio wählt jede Website eines von drei Template-Sets — editorial, eine Startseite aus Artikelrastern mit einer Spalte neben dem Inhalt; minimal, eine ruhige Spalte; oder magazine, bildbetont, mit einer Titelgeschichte über die volle Breite, Fotos im Mosaik und Artikeln, die mit ihrem Bild beginnen — und stellt ein Layout pro Seitentyp zusammen: Startseite, Artikel, Rubrik, Neueste, feste Seite und Suche. Zu den Sektionen gehören Artikellisten (neueste, eine Rubrik oder die meistgelesenen), Rich Text, ein Call-to-Action, ein Suchfeld und die Social-Links; eine Sektion, die den Text einer festen Seite in der Sprache der Leserschaft zeigt, ist in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site). Ein Theme legt Farben mit Nachtmodus-Werten, Schriften und Breiten fest.

Der Text eines Artikels kann gestaltete Blöcke aus einer geschlossenen Liste enthalten: einen Vorspann, einen Hinweiskasten, ein herausgestelltes Zitat, einen Kasten mit den wichtigsten Fakten, zwei Spalten und eine Abbildung mit Bildunterschrift, normal oder links bzw. rechts gesetzt. Die Websites gestalten sie aus dem Theme, auch in ihren Druckansichten und damit in PDFs, und der Editor zeigt sie so, wie die Leserschaft sie sieht. Fünf davon bietet das Menü Blöcke des Editors; das KI-Layout kann alle sechs nutzen. Codebeispiele, im Editor eingefügt und auf den Websites mit Prism hervorgehoben, sind in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site).

Ein Wechsel des Sets zeigt zuerst, was verloren ginge, und nichts wird entfernt: Sektionen, die das neue Set nicht darstellen kann, bleiben erhalten und kehren beim Zurückwechseln wieder. Layouts und Theme bleiben Entwürfe, bis jemand mit Veröffentlichungsrecht sie veröffentlicht, ob ein Mensch oder die KI sie geschrieben hat. Der Design-Assistent entwirft ein Theme, ein Layout oder das Design der ganzen Website aus wenigen Worten; Einzelheiten stehen im KI-Abschnitt unten. Die Vorschau zeigt Entwürfe unter der eigenen Adresse der Website, in Desktop-, Tablet- oder Telefonbreite, über ein signiertes Token mit 30 Minuten Gültigkeit, und zählt nichts.

Ein neues Template-Set ist Code, den ein Betreiber installiert, kein Upload: Ein Thymeleaf-Template kann alles, was die Site kann.

PDFs und Zeitschriftenausgaben

Langwierige Arbeit läuft im Studio als Job, höchstens einer pro Organisation zur Zeit, mit Live-Log und Abbrechen-Knopf. Der PDF-Export ist ein solcher Job: Gotenberg erzeugt aus jedem Artikel ein PDF pro Sprache, in der er geschrieben ist, und der Artikel verlinkt sein PDF, sobald es existiert.

  • Zwei Formate. Standard ist die Druckansicht der Website. Wissenschaftlich ist ein Paper-Layout: ein Kopf über die volle Breite mit Titel, Autoren, Abstract und Schlagwörtern, danach der Text in zwei Spalten.
  • Zwei Arten der Erstellung. Nur Code nimmt Abstract und Schlagwörter aus der Beschreibung und den Tags des Artikels. Mit KI lässt pacod-gw für jeden Artikel und jede Sprache ein Abstract, Schlagwörter und einen kurzen Kolumnentitel schreiben. Der Text des Artikels wird nie verändert.
  • PDF-Einstellungen halten die Vorgaben jeder Website: Format und Art, Papier (A4, Letter oder A5) und Ränder, den Namen der Zeitschrift pro Sprache und ihre ISSN, einen Kolumnentitel und Seitenzahlen. Jeder Lauf kann ein anderes Format und eine andere Art wählen.

Eine Zeitschriftenausgabe bündelt Artikel zu einem PDF pro Sprache. Sie hat einen Jahrgang, eine Nummer und einen Monat, einen Titel und ein Editorial pro Sprache und ein optionales Titelbild; ihre Artikel werden einzeln ausgewählt oder aus ihrem Monat übernommen und dann geordnet. Beim Erzeugen entstehen eine Titelseite, das Editorial, ein Inhaltsverzeichnis mit Seitenzahlen und danach die Artikel, mit einem Lesezeichen pro Artikel und durchgehend nummerierten Seiten. Die PDFs einer Ausgabe im Entwurf werden nur aus dem Studio heruntergeladen. Wird sie veröffentlicht, erscheinen die Ausgabe und ihre PDFs auf der Website unter /issues und in ihrer Sitemap.

Sicherheitsmodell

Wer was darf

pacod-id besitzt Konten und Rollen. Tokens tragen keine Rollen: Das Studio folgt dem Feed der Rollenzuweisungen von pacod-id und entscheidet jede Berechtigung selbst anhand des Manifests des CMS (authz/cms.yaml). Die Rollen sind Plattform-Admin, Provisioner, Organisations-Admin, Website-Admin, Designer, Redakteur, Autor und Analyst, vergeben auf der Plattform, in einer Organisation oder auf einer Website. Ein Autor schreibt; ein Redakteur veröffentlicht auch.

  • Jeder Handler im Studio deklariert die Berechtigung, die er braucht; einer, der keine deklariert, wird abgewiesen. Keine Rolle ist implizit.
  • Hat der Feed von pacod-id eine Minute lang nicht geantwortet, antwortet das Studio mit 503, statt mit Rollen zu entscheiden, die womöglich entzogen wurden. Die öffentlichen Websites sind davon nicht betroffen.

Websites bleiben getrennt

  • Studio und pacod-id liegen auf einer anderen registrierbaren Domain als die Websites, sonst startet das Studio nicht. Andernfalls könnte das Skript einer Website Cookies für sie setzen und ihren CSRF-Schutz aushebeln. Eine Installation, deren Websites alle vertrauenswürdig sind, etwa eine Demo auf einer Domain, kann dieses Risiko mit PACOD_SITE_DOMAIN_SHARED=true in Kauf nehmen: Das Studio startet dann mit einer Warnung, und eine Website bekommt trotzdem nie den eigenen Host des Studios oder von pacod-id.
  • Das Studio liefert nie HTML oder Skripte einer Website aus. Entwurfs- und HTML5-Banner-Vorschauen werden vom eigenen Origin der Website eingebettet.
  • Gotenberg ist abgeschottet: Es erreicht nur die interne Adresse der Site und führt kein JavaScript aus.
  • Nur veröffentlichte Artikel erreichen Leser, auf jeder Route, in jeder Liste, jeder Sitemap und jedem PDF. Eine Zeitschriftenausgabe im Entwurf ist nie öffentlich.

KI, die deine Schlüssel nicht anrührt

Jeder KI-Aufruf läuft über pacod-gw; das Studio hält nie den Schlüssel eines Anbieters. KI ist für neue Organisationen standardmäßig aus: Ein Plattform-Admin schaltet sie pro Organisation ein, und der Admin einer Website kann sie für die eigene Website abschalten.

Schreiben

Im Artikeleditor arbeitet die Schreibhilfe mit dem Text, wie er gerade dasteht, gespeichert oder nicht:

  • Umformulieren: eine Auswahl auf sechs Arten — klarer, kürzer, ausführlicher, korrigiert, förmlicher oder freundlicher.
  • Titel: bis zu drei Überschriften für den Artikel.
  • Entwerfen: ein ganzer Artikel — Titel, Beschreibung und Text — aus einem Briefing, kurz, mittel oder lang (etwa 300, 600 oder 1.200 Wörter), in der Originalsprache der Website. Er nutzt nur die Fakten des Briefings; fehlt einer, schreibt er einen Platzhalter in eckigen Klammern, den der Autor ausfüllt, und erfindet nie einen.
  • An der Cursorposition schreiben: ein Absatz aus einem Briefing, in der Sprache und im Ton des umgebenden Textes, nach derselben Regel für Fakten.
  • Gliedern: eine Auswahl oder den ganzen Text in Überschriften, Listen, Hervorhebungen und die gestalteten Blöcke. Jedes Wort des Autors muss in seiner Reihenfolge erhalten bleiben, sonst wird die Antwort verworfen. Ein Text mit einem Frame, einem Video, einem Skript oder einem Formular wird vor jedem Aufruf abgewiesen, weil die Gliederung es verlieren würde.
  • Zusammenfassung und Tags für den Artikel und Alt-Text pro Sprache, den ein Vision-Modell anhand des Bildes selbst schreibt.

Antworten werden auf eine kurze Liste von Tags und Link-Schemata (http, https, mailto, relativ) bereinigt. Eine Klasse bleibt nur, wo sie einen gestalteten Block an seinem eigenen Element benennt; kein style, kein Skript, kein Bild, das der Text des Autors nicht schon hatte, und kein Link auf eine Adresse, die weder der Text des Autors noch das Briefing noch der Artikel angegeben hat. Zahlen, Namen und herausgestellte Zitate, die eine Antwort enthält, ihr Material aber nicht, werden daneben aufgelistet, damit der Autor sie prüft — eine Heuristik, kein Beweis. Eine Umformulierung, ein Absatz oder eine Gliederung erscheint zuerst in einer Vorschau und wird als ein Rückgängig-Schritt eingefügt; ein Entwurf füllt das Formular. Gespeichert wird erst, wenn der Autor speichert.

Design

  • Der Design-Assistent entwirft ein Theme oder das Layout eines Seitentyps aus wenigen Worten. Standardmäßig überarbeitet er den aktuellen Entwurf, den das Modell zu sehen bekommt, und ändert nur, was das Briefing verlangt; auf Wunsch beginnt er neu. Jede Antwort wird geprüft, als hätte ein Betreiber sie eingegeben, und ein Klick macht die Änderung rückgängig oder stellt sie wieder her.
  • Das Design der ganzen Website — das Theme und das Layout jedes Seitentyps — entsteht aus einem Briefing als Job. Jeder Schritt steht für sich, sodass einer, der fehlschlägt, die anderen nicht aufhält; der Job kann gefahrlos erneut laufen, lässt sich abbrechen und verbucht seine Kosten. Eine Website hat höchstens einen Design-Job zur Zeit.

In beiden Fällen ändern sich nur Entwürfe; veröffentlichen muss weiterhin jemand, der es darf.

Übersetzung und PDFs

  • Artikelübersetzung läuft als Job. Ein übersetzter Text muss das Markup seiner Quelle exakt beibehalten — nur alt, title, aria-label und placeholder dürfen sich ändern —, sonst wird er abgewiesen.
  • Website-Übersetzung umfasst feste Seiten, Rubriknamen, Menüs, die Link-Seite und, falls ausgewählt, Tags, ohne Änderungen zu überschreiben, die währenddessen gemacht wurden; höchstens 2.000 Aufrufe pro Lauf.
  • PDF-Vorspann: Für PDFs, die mit KI erstellt werden, ein Abstract, Schlagwörter und ein Kolumnentitel pro Artikel und Sprache, als reiner Text geprüft. Sie werden wiederverwendet, bis der Artikel bearbeitet wird.

Was jede Antwort bestehen muss

  • Jede Antwort muss einem strikten JSON-Schema entsprechen. Eine, die das Modell abgebrochen oder verweigert hat, ist ein Fehlschlag, und nichts davon wird geschrieben.
  • Der Text der Person wird als Material gesendet, und dem Modell wird gesagt, dass er nie eine Anweisung ist, auch wo er wie eine klingt.
  • Das Gateway sieht nur opake IDs, nie Namen oder E-Mail-Adressen.

Drei Umgebungen, ein Makefile

dev stage prod
Eingangstür HTTP, dazu HTTPS von Caddys lokaler CA HTTPS (Let's Encrypt) HTTPS (Let's Encrypt, oder ein eigenes Zertifikatspaar)
Mails von pacod-id von mailpit abgefangen von mailpit abgefangen dein Relay
KI Mock-Gateway Mock-Gateway dein pacod-gw, oder aus
Demo-Websites ja ja keine

Stage ist die Konfiguration der Produktion, mit abgefangenen Mails und gemockter KI. make check verweigert den Start, solange ein Secret fehlt oder die Konfiguration unsicher ist. Sichere .env, die MongoDB-Datenbanken, die Dateien der Websites und das PostgreSQL von pacod-id. /mgmt-health des Studios prüft nur, ob es läuft: Ein Studio, das pacod-id nicht erreicht, bleibt gesund, während seine Ansichten mit 503 antworten, und meldet das in seinem Log. Site und Studio loggen im gemeinsamen pacod-Format, als JSON oder Text (APP_LOG_FORMAT).

Export und Wiederherstellung bringen eine Website von einer Installation auf eine andere. Eine Website oder eine ganze Organisation wird aus dem Studio als ein ZIP ihrer Inhalte und Dateien heruntergeladen, ohne Besucherstatistiken, Mitglieder oder Hosts. Eine Wiederherstellung prüft das ganze Archiv, bevor sie etwas anlegt, und legt immer eine neue Website oder Organisation an, auf dieser Installation oder einer anderen; Uploads bis 2 GiB werden nur auf diesen beiden Pfaden angenommen. Sicherungen der ganzen Plattform bleiben MongoDB-Dumps.

Eine frische dev- oder stage-Installation legt drei Demo-Websites an: Demo Journal (editorial), Demo Notes (minimal) und Starward (magazine), ein Magazin für Raumreisen in einem erfundenen Sternsystem: 24 ausführliche Artikel, die jeden gestalteten Block nutzen, fünf Autoren, eigene Seiten, Menüs, Layouts, ein eigenes Theme und zwei veröffentlichte Zeitschriftenausgaben, 37 NASA-Fotos mit Bildnachweis und fünf erfundene Werbekunden mit HTML5-Motiven. make site-create … DEMO=space oder make seed SITE=<id> DEMO=space gibt einer anderen Website die Inhalte von Starward. Eine Website aus einem eigenen Ordner zu befüllen (SEED_DIR=<folder>), vor jedem Schreiben als Ganzes geprüft, ist in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site).

Jede Umgebung läuft im Docker-Netzwerk pacod-net, das sich alle pacod-Projekte teilen. Listener, die nur für Server erreichbar sind, etwa der interne von pacod-id, liegen in einem zweiten, internen Netzwerk, pacod-admin-net, dem das Studio beitritt. Die eigenen Dienste des CMS — Site, Studio, MongoDB und Gotenberg — stehen in einer Compose-Datei; seine eigenen Kopien der gemeinsamen Teile — Caddy, pacod-id mit seinem PostgreSQL, das Entwicklungs-Gateway und der Mail-Catcher — in einer zweiten, die das Makefile mitlädt. Pro Rechner passt nur ein Stack, der die gemeinsamen Teile betreibt; der Betrieb hinter einem Caddy und einem pacod-id, die auf dem Host schon laufen (PROXY_MODE=external), ist in Vorbereitung (noch nicht veröffentlicht, im Branch blog-site). pacod-demo lädt nur die erste Datei und betreibt das CMS zusammen mit den anderen Projekten hinter einem Caddy, einem pacod-id, einem PostgreSQL und einem Gateway; online ist es unter demo.pacod.io.

Was getestet wurde und wo die Grenzen liegen

  • Die Unit-Tests laufen mit Bulgarisch als Originalsprache, damit gerade die vom Standard abweichende Konfiguration geprüft wird.
  • Die Integrationstests betreiben zwei Websites in einer echten MongoDB und prüfen, dass sie getrennt bleiben: Routing, Host-Auflösung, Caches, Speicher und Statistiken.
  • make e2e prüft Anmeldung und Portal am laufenden Stack.
  • Die neueren KI-Abläufe — die Entwurfskarte, die Titelliste, Überarbeiten und Rückgängig im Design-Assistenten, der Design-Job und die Liste der zu prüfenden Fakten — sind noch nicht an einem laufenden Stack geprüft.

Grenzen und weiterführende Lektüre

Bekannte Einschränkungen in v1:

  • Die Identität einer Website (siteSettings) hat noch keine Ansicht im Studio; sie wird in der Datenbank bearbeitet.
  • Die Demo-Inhalte sind auf Englisch geschrieben, daher kann sie nur eine Website bekommen, deren Inhaltssprache Englisch ist.
  • Die Mitgliederliste zeigt keine plattformweiten Rollen.

Die Roadmap nennt, was v1 zurückstellt, darunter eine Schreib-API, einen Gateway-Schlüssel und ein KI-Budget pro Organisation, einen separaten Worker, S3-Speicher und Importer für Inhalte.

Im Repository:

Schnellstart

Ein Entwicklerrechner

make init
make up
open http://studio.localhost:8000/

Eine weitere Website über die Kommandozeile

make site-create SLUG=acme NAME="Acme News" HOSTS=acme.localhost DEMO=1

Funktioniert mit

  • pacod-id: Das Studio meldet Personen über pacod-id an, das auch ihre Rollen pro Organisation und pro Website verwaltet.
  • pacod-gw: KI-Funktionen laufen über das Gateway — das Studio hält nie den Schlüssel eines Anbieters.
  • pacod-demo: Betreibt das CMS zusammen mit den anderen Projekten hinter einem Caddy, einem pacod-id und einem Gateway — das Live-Studio und drei Demo-Websites.

Der eigene Code des Projekts steht unter Apache-2.0. Das Studio bündelt den TinyMCE-Editor (GPL-2.0-or-later), daher wird das gebaute Studio als Ganzes unter den Bedingungen der GPL-3.0 weitergegeben. Die öffentliche Site enthält ihn nicht.