Hinter der Seite
Kolophon
Wie diese Seite gebaut ist — Stack, Pipelines und die Engineering-Entscheidungen hinter adrianromo.me.
Diese Seite ist ein funktionierendes Produkt, keine statische Broschüre. Alles unten stammt aus einer einzigen Next.js-Codebasis, die ich selbst entwerfe, baue und betreibe — zugleich eine Live-Fallstudie dafür, wie ich Backend-Systeme angehe.
Stack
Next.js 14 (App Router) mit TypeScript und Tailwind CSS, dahinter Prisma auf Postgres. Deployment auf Vercel; ein Docker-Compose-Stack reproduziert die komplette Umgebung lokal mit einem Befehl.
Content-Pipeline
Posts und Projekte liegen in Postgres und werden über eine unified/remark/rehype-Markdown-Pipeline gerendert. Die Suche nutzt Postgres-Volltextsuche. Open-Graph-Bilder werden pro Route generiert, RSS-Feed und Sitemap entstehen aus denselben Daten, und das Lebenslauf-PDF wird serverseitig mit PDFKit gerendert.
KI-Assistent
Das Chat-Widget ist ein Retrieval-Augmented-Assistent: Seiteninhalte werden zerlegt, in pgvector eingebettet, pro Frage abgerufen und mit OpenAI-Modellen beantwortet. Mit Prompt-Injection-Abwehr, Rate Limits pro IP und Besucher, einem täglichen Token-Budget und automatischem Re-Indexing per Cron.
Internationalisierung
Englisch, Spanisch und Deutsch. Quellinhalte entstehen auf Englisch; eine LLM-Übersetzungspipeline erzeugt die anderen Sprachen und erkennt veraltete Inhalte über Content-Hashes. Jede Seite liefert Canonical- und hreflang-Metadaten.
Sicherheit
Eine restriktive Content-Security-Policy (mit Nonces pro Request im Admin-Bereich), gehärtete Security-Header, Zod-Validierung an jeder Grenze, Redis-gestütztes Rate Limiting, ein Honeypot-geschütztes Kontaktformular und ein Admin-Bereich hinter Credentials plus WebAuthn-Passkeys.
Betrieb
Plausible liefert Cookie-lose, datenschutzfreundliche Analytics. Die CI führt bei jedem Commit Linting, Formatierung, Type-Checks und Tests aus. Datenbankmigrationen werden mit jedem Release automatisch deployt.