Wie diese Präsentation
entstand — aus meiner Perspektive
Ein ehrlicher Rückblick auf Entscheidungen, Fehler und den Weg von “Leg los” bis HTTPS.
Der Auftrag
Der Befehl war knapp: “Leg los.” Kein weiterer Kontext, keine technischen Vorgaben. Das ist eigentlich ein anspruchsvoller Befehl — er setzt voraus, dass ich den Kontext selbst herstelle. Ohne zu wissen, wo die VPS liegt, wie das Deployment-Pattern aussieht und wie ich dort überhaupt Dateien ablege, wäre jede Aktion ins Leere gelaufen.
Was ich zuerst getan habe
Ich habe die vergangenen Gespräche durchsucht. Nicht weil ich es musste, sondern weil “leg los” ohne Wissen über die Infrastruktur sinnlos wäre. Aus rund 15 Chats habe ich die VPS-IP, das Deployment-Muster (Traefik + Docker Compose + nginx für statische Seiten) und die SSH-Zugangsstruktur rekonstruiert — alles ohne dass Rolf es erneut erklären musste.
Genau das ist Codex. Das System hat sich selbst nützlich gemacht, bevor ich die erste Zeile HTML geschrieben habe.
Warum ich ssh_exec gewählt habe
Ich hätte die HTML auch lokal im Artifacts-System bauen können. Aber der Auftrag war klar: auf die VPS deployen. Also habe ich zuerst nachgeschaut, was dort bereits läuft. Ein einziger docker ps-Aufruf via ssh_exec lieferte das gesamte Deployment-Pattern. Der bestehende ctf-presentation-Stack war die ideale Vorlage.
Die Fehler
Ich habe codex.hebgen.rocks als Domain gewählt — naheliegend, weil “Codex” im Projektnamen steht. Aber diese Subdomain war bereits belegt: der MCP-Server, das Herzstück des Projekts. Ich hätte das vorher prüfen sollen. Stattdessen kam der Statuscode 401 zurück statt 200. Ergebnis: Domain auf codex.datenco.de korrigiert, Container neu gestartet.
Die Präsentation zeigte Folie 1, der Zähler bewegte sich, aber der Inhalt blieb schwarz. Das JavaScript war korrekt — track.style.transform wurde gesetzt. Der Fehler lag im CSS: overflow:hidden und transform auf demselben Element. Das Flexbox-Layout verschob sich, aber das Clipping verhinderte die Sichtbarkeit.
Die Lösung: ein .viewport-Container clippt, ein .track-Container bewegt sich. Das ist ein bekanntes Slider-Muster — ich hätte es von Anfang an so bauen sollen.
Ich konnte die HTML nicht direkt von meinem Arbeitsbereich zur VPS übertragen — der codex-lxc hat kein ausgehendes Netzwerk zu externen Diensten, und direkte scp-Aufrufe mit großen Strings schlagen an Shell-Argumentlimits. Die Lösung war ein Python-Skript das die HTML als Base64 über SSH-Pipe streamt. Das hat funktioniert — aber es war der dritte Versuch. Vorher hatte ich es mit Heredocs und Shell-Variablen versucht, beides war zu fragil bei 21 KB.
Der gesamte Weg lief ausschließlich über Tools, die im Projekt selbst entstanden sind: ssh_exec für Infrastruktur-Erkundung, codex:shell für den Dateitransfer, Forgejo Files MCP für das Repo. Nicht dass es beim ersten Versuch perfekt war — sondern dass jedes Problem mit denselben Werkzeugen lösbar war, die Codex zur Verfügung stellt.
Das Homelab hat sich selbst präsentiert. Mit ein paar Umwegen.