Claude Code und Publii für die Websitemodernisierung

(Überarbeiteter Bericht auf Github: https://github.com/GetPublii/Publii/discussions/2538)

Zwei Ereignisse haben mich zum Handeln gebracht.

Keno von ct3003 hat ein Video zu agentischem Programmieren gemacht:
https://www.youtube.com/watch?v=tN8hTsJt6BU

Und dann hat noch ein zahnärztlicher Kollege berichtet, daß seine WordPress-Instanz wiederholt gehackt worden war von einem illegalen Medikamentenvertrieb. Konnte mir nicht passieren, denn meine Website mit ca. 12 statischen Webseiten war seit 30 Jahren fast unverändert – geschrieben mit Homepage Maker 3:
Archivansicht der alten Website

Meine Website war wegen fehlenden Responsive Designs schon vor Jahren von Google im Ranking abgestraft worden. Außerdem war Homepage Maker 3 meiner Meinung nach deutlich zu aufwendig in der Bedienung, so daß ich nur das Allernotwendigste alle paar Jahre verändert hatte.

Die Idee: Claude Code + Publii

Also dachte ich: Warum nicht mit Claude Code die alte Website auf das Format einer modernen, anfängerfreundlichen Software für Websiteerstellung umstellen? Geminis Wahl dafür fiel auf Publii (Mac, Windows, Linux) und auf Linux Mint Cinnamon:

Installation und Start

Auf meinem Windows 11-Host läuft schon meine produktive Windows 11-VM (VMware Workstation Pro). Die Installation der Linux-VM dauerte 10 Minuten. Debian-Version von Publii heruntergeladen, Geminis Installationsbefehle für Claude Code ausgeführt (siehe Fußnote 1), mit Publii etwas herumgespielt, Website angelegt, beendet. Dann mußte ich Claude Code nur im „sites"-Verzeichnis von Publii starten.

Gemini hatte mir bis dahin gut geholfen, aber sein Prompt für Claude Code war ein Schuß in den Ofen. Den hätte ich besser selbst und simpler formuliert, z. B.:
„Hole Dir alle Webseiten, Bilder und verlinkte Dateien von www.logies.de, konvertiere sie in das Format von Publii, in dessen Verzeichnis ich Dich gerade gestartet habe!"

Ablauf und Kosten

So mußte ich mit Claude Code ein paar Umwege gehen. Die Umstellung hat am Wochenende ca. 15 Stunden gedauert. Abgerechnet über die Claude-Code-API:

Die Zusammenarbeit

Die Zusammenarbeit zwischen Claude Code und Publii war stets komfortabel: Claude Code veränderte direkt in der Datenbank von Publii etwas und forderte mich dann zum Auslösen der neuen Vorschau auf. Wenn ich in Publii direkt Texte geändert hatte, hat Claude Code diese bei der nächsten Überarbeitung nicht mehr angefaßt, weil es selbständig vor jeder Änderung die vorhandenen Daten nochmals gelesen hatte.

Meine Aufgabe war das Testen und Prüfen, denn natürlich sind erst einmal Fehler aufgetreten – wurden gemeldet, wurden behoben. Manchmal wiederholten sie sich später allerdings.

Am Ende war es kein Problem zu sagen: „Hier hast Du 5 Bilder eines Falles in Bilder.zip im Downloadverzeichnis, bitte erstelle mir eine weitere Webseite nach dem Vorbild der anderen, inklusive Text und verlinke sie wie gehabt." Das ging auch mit 3 Fällen gleichzeitig, je Fall eine ZIP-Datei. Oder auch: „Schaue Dir die Optionen von Publii an und optimiere im Sinne von SEO."

Qualität der Texte

Die Texte sind fachlich teils gut, teils halbgar oder falsch – was einem Fachmann auffällt, einem Laien eher nicht. Muß ich hier und da noch etwas überarbeiten.

Plattformwahl und Fazit

Das Backup der Website von Publii unter Linux ließ sich unter Publii für Windows problemlos öffnen, aber ich werde für die Website bei Linux bleiben, um jederzeit auf Claude Code zugreifen zu können. Gemini empfahl 60 GB für die virtuelle Festplatte – tatsächlich ist sie jetzt auf 26 GB gewachsen.

Das Ganze wäre wohl auch unter Windows zu realisieren gewesen (sagte eine KI), allerdings mit mehr Installationsaufwand. Und ich halte es für eine gute Idee, einen Software-Agenten von meinen Patienten- und Geschäftsdaten getrennt zu halten.

Änderungen sind jetzt trivial und schnell: Text ändern, „Sync" anklicken, dann schiebt der FTP-Client in Publii die geänderten Dateien auf den Webserver. Und für komplexere Änderungen nehme ich weiter Claude Code.

Ich sehe da potentiell Interesse von Kleinstunternehmen oder Privatleuten für eine Lösung wie oben – es dürfte viele technisch veraltete Websites geben, die ungern angefaßt werden.

Grüße
M.


Fußnote 1: Installation von Claude Code unter Linux

Mehr mußte ich nicht machen, aber Claude Code zeigt mir beim Starten gelegentlich an, daß NPM überholt sei:

# System aktualisieren und Basis-Tools installieren
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget

# Node.js 20 (aktuelle stabile Version) installieren
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

# Claude Code global installieren
sudo npm install -g @anthropic-ai/claude-code

Fußnote 2: Technischer Hintergrund (von Claude Code)

Was wurde gemacht?

Die alte Website (ca. 2005, erstellt mit „HomepageMaker 300") wurde automatisch in ein modernes Publii-CMS-Projekt umgewandelt. Das Ergebnis ist eine vollständige Publii-Site mit SQLite-Datenbank, Konfigurationsdateien und heruntergeladenen Bildern.

Verwendete Python-Bibliotheken

  • sqlite3, json, re, shutil, pathlib – Python-Standardbibliothek; Zweck: SQLite-Datenbank lesen/schreiben, Dateien, JSON, Reguläre Ausdrücke
  • requests (pip install requests) – Zweck: HTTP-Anfragen an www.logies.de stellen
  • beautifulsoup4 (pip install beautifulsoup4) – Zweck: HTML parsen und manipulieren

logies-modern-builder.py – Erstellt die Site von Grund auf

  • Schritt 1 – Verzeichnisstruktur anlegen: Erzeugt die exakte Verzeichnishierarchie, die Publii erwartet: input/config/, input/media/posts/, input/themes/simple/ etc.
  • Schritt 2 – Theme kopieren: Kopiert das „simple"-Theme von einer bestehenden Publii-Site.
  • Schritt 3 – Bilder herunterladen: requests.get() lädt die Bilddateien direkt von www.logies.de in die richtigen media/-Unterordner.
  • Schritt 4 – Seiten crawlen & konvertieren: Jede Seite wird per HTTP abgerufen und von BeautifulSoup geparst. Die Kernfunktion find_main_td() sucht das <td>-Element mit dem meisten Textinhalt – nötig, weil die alte Seite ein reines Table-Layout hatte. td_to_html() bereinigt das rohe HTML: entfernt <font>-Tags und veraltete Attribute, schreibt interne Links um.
  • Schritt 5 – SQLite-Datenbank befüllen: Das Skript erstellt die Datenbank mit dem genauen Publii-Schema und trägt alle Seiten mit Status published is-page ein. Config-Dateien werden geschrieben: site.config.json, menu.config.json, theme.config.json.

logies-update.py – Ergänzungen in einem zweiten Durchgang

  • Crawlt alle Seiten nochmals, sammelt alle <img src>-Pfade und lädt fehlende Bilder nach
  • Fügt die neuen Unterseiten zur Datenbank hinzu
  • Korrigiert in allen bereits gespeicherten Seiten die Bild-Pfade und internen Links
  • Baut das Menü mit verschachtelten Untermenüs neu auf
  • Schreibt die vollständige theme.config.json mit Designeinstellungen

Warum Python und nicht ein CMS-Import-Plugin?

Publii hat keine Import-Schnittstelle für beliebige HTML-Seiten. Die einzige Möglichkeit, Inhalte programmatisch einzuschleusen, ist das direkte Beschreiben der SQLite-Datenbank und der JSON-Config-Dateien – was Python mit sqlite3 und json sehr gut kann. Das Dateiformat wurde durch Analyse einer bestehenden Publii-Site reverse-engineered.