Il problema
One Mind Agency è un’agenzia creativa a cui serviva un sito bilingue, in inglese e in italiano, per mostrare i suoi lavori e conquistare nuovi clienti. Il team voleva pubblicare i case study da una bacheca familiare, e ogni richiesta di contatto doveva finire in una pipeline commerciale, non in una casella di posta. L’hosting era condiviso: Node poteva eseguire le build, ma non un server sempre acceso.
Cosa ho costruito
Ho costruito tre parti che convivono sullo stesso dominio.
- Front end statico in Next.js: home, lavori, singolo case study, chi siamo e contatti, esportati come semplici file sotto /en/ e /it/. Veloci da servire, niente da tenere acceso.
- WordPress headless sotto /cms: un plugin su misura registra il tipo di contenuto Case Study e i suoi campi (cliente, anno, categoria, colore di accento, sintesi, crediti) e li espone, con le loro traduzioni, tramite la REST API. Le pagine pubbliche di WordPress reindirizzano al sito vero.
- Ricostruzioni automatiche: quando un redattore salva un contenuto, WordPress alza un segnale. Un processo sul server lo raccoglie entro circa 5 minuti, ricostruisce il sito e sostituisce i file, con un blocco che impedisce a due build di sovrapporsi.
- Dal modulo di contatto al CRM: un piccolo ponte in PHP trasforma ogni richiesta in un Lead in EspoCRM, con fascia di budget e lingua. La chiave del CRM resta sul server e non arriva mai al browser.
- Protezione da spam e abusi: un campo honeypot nascosto, una richiesta ogni 30 secondi per indirizzo IP, un elenco delle origini consentite e una validazione rigorosa di ogni campo.
- Nessuna immagine rotta: se un case study punta a un file immagine che non esiste più, l’API non restituisce nulla e la pagina mostra al suo posto un riquadro colorato.
Con cosa è fatto
Next.js 15 con esportazione statica, React 19, Tailwind CSS, Framer Motion e Lenis. WordPress con ACF e Polylang. EspoCRM. PHP 8.2 e MariaDB 10.11 su Hetzner.
Perché è fatto così
Il server consente Node solo per le build, senza processi sempre attivi. Per questo il sito viene generato in fase di build e servito come file statici, mentre WordPress e il CRM girano sul PHP che il server aveva già. I redattori hanno una bacheca normale, e i visitatori ricevono semplice HTML.


