July 3, 2026
How this portfolio works: Next.js 15, Postgres and a Gemini-powered admin
Every section you see on this site — experience, projects, skills, even this blog — lives in PostgreSQL and is editable from a custom admin panel. Here is how the pieces fit together.
The stack
- Next.js 15 (App Router, Server Components) served by a single Docker container on a VPS behind nginx.
- PostgreSQL stores content as JSONB documents: one row per section, with
enandesvariants side by side. - Gemini powers two things: one-click translation between English and Spanish in the admin, and the chat assistant you can try on the site.
Instant publishing, no redeploys
The landing page is a Server Component that reads content through Next.js's cache with a tag. When something is saved in the admin, the server action calls revalidateTag — the very next visitor gets the fresh content. The Docker image only rebuilds when code changes, never for content.
The RAG chat
The assistant answers questions about my experience using a knowledge base built at request time from the same database rows the admin edits, so it is never out of date. Guardrails keep it on topic, per-IP rate limits keep it safe, and every question is logged (with the visitor's IP stored only as an irreversible hash) for analytics.
Why build it instead of using a CMS?
Because the portfolio itself is the case study: content modeling, auth with roles, AI integration, i18n with proper hreflang, and security controls — all the things I do for clients, working in production on my own domain.