Zwei Ebenen, und die Trennung ist nicht kosmetisch: im Repo-Root liegt die Infrastruktur (docker-compose.yml, eine einzige .env), darunter in frontend/ die Anwendung. Die .env muss neben Compose liegen, weil Compose ${POSTGRES_PORT} und die Zugangsdaten nur aus einer Datei neben sich auflöst; frontend/.env ist ein Symlink darauf. Zwei getrennte Dateien wären zwei Wahrheiten — und die erste Folge davon ist eine DATABASE_URL, die auf einen anderen Port zeigt als den, den Postgres veröffentlicht.
Die Anwendung ist ein Next.js-Projekt mit drei Routenbereichen: (landing) für die öffentliche Website, (default) für angemeldete Nutzer und (admin) für die Redaktion. Dazu ein /setup-Pfad für die Erstinstallation.
Der Kern ist das Modulsystem. Zwölf Funktionsbereiche — Blog, Testimonials, Termine, Events, Quiz, Newsletter, Shop, Kunden, Schnittstellen, QR-Codes, Analyse, Bug Tracker — lassen sich einzeln zuschalten. Ein Modul ist an genau einer Stelle definiert: Beschriftung, Beschreibung, Voreinstellung, betroffene Menüpunkte und Abhängigkeiten stehen in einem Objekt, alles andere wird daraus abgeleitet. Abgeschaltete Bereiche antworten mit 404 und verschwinden aus Menü und Sitemap.
Wichtig dabei: ein Modulschalter räumt die Oberfläche auf, er ist keine Sicherheitsgrenze. Der Admin-Guard läuft davor, und ein Admin kann jeden Schalter ohnehin umlegen.
Jede Admin-Route trägt neben ihrer page.tsx eine eigene doc.md mit Datenfluss, Berechtigungen und Fallstricken für genau diesen Bildschirm — gelesen im Editor, nicht ausgeliefert.