Adrian RomoAdrian Romo

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.

Entworfen, gebaut und gepflegt von mir. GitHub