Das Problem
One Mind Agency ist eine Kreativagentur, die eine zweisprachige Website auf Englisch und Italienisch brauchte, um ihre Arbeiten zu zeigen und Neukunden zu gewinnen. Das Team wollte Fallstudien über ein vertrautes Backend veröffentlichen, und jede Anfrage sollte in einer Vertriebspipeline landen, nicht in einem Posteingang. Das Hosting war geteilt: Node konnte Builds ausführen, aber keinen dauerhaft laufenden Server.
Was ich gebaut habe
Ich habe drei Bausteine gebaut, die nebeneinander auf einer Domain leben.
- Statisches Frontend in Next.js – Startseite, Arbeiten, einzelne Fallstudie, Über uns und Kontakt, als einfache Dateien unter /en/ und /it/ exportiert. Schnell ausgeliefert, nichts, was dauerhaft laufen muss.
- Headless WordPress unter /cms – ein eigenes Plugin registriert den Beitragstyp Case Study mit seinen Feldern (Kunde, Jahr, Kategorie, Akzentfarbe, Zusammenfassung, Credits) und stellt sie samt Übersetzungen über die REST API bereit. Öffentliche WordPress-Seiten leiten auf die eigentliche Website weiter.
- Automatische Neubauten – speichert jemand in der Redaktion Inhalte, setzt WordPress eine Markierung. Ein Server-Job greift sie innerhalb von etwa 5 Minuten auf, baut die Website neu und tauscht die Dateien aus, mit einer Sperre, damit sich zwei Builds nie überschneiden.
- Kontaktformular ins CRM – eine kleine PHP-Brücke macht aus jeder Anfrage einen Lead in EspoCRM, mit Budgetrahmen und Sprache. Der CRM-Schlüssel bleibt auf dem Server und erreicht nie den Browser.
- Schutz vor Spam und Missbrauch – ein verstecktes Honeypot-Feld, eine Anfrage alle 30 Sekunden pro IP-Adresse, eine Allowlist für Herkunftsdomains und eine strenge Prüfung jedes Felds.
- Keine kaputten Bilder – verweist eine Fallstudie auf eine Bilddatei, die nicht mehr existiert, liefert die API nichts zurück, und die Seite zeigt stattdessen einen farbigen Platzhalter.
Womit es gebaut ist
Next.js 15 mit statischem Export, React 19, Tailwind CSS, Framer Motion und Lenis. WordPress mit ACF und Polylang. EspoCRM. PHP 8.2 und MariaDB 10.11 bei Hetzner.
Warum so gebaut
Der Server erlaubt Node nur für Builds, ohne dauerhaft laufende Prozesse. Deshalb wird die Website beim Build erzeugt und als statische Dateien ausgeliefert, während WordPress und das CRM auf dem PHP laufen, das der Server ohnehin bot. Die Redaktion behält ein normales Backend, und Besucher bekommen schlichtes HTML.


