This portfolio

Open source, Nuxt 4

Under the hood
Architecture & infrastructure

How this portfolio was built

This portfolio is also a technical demo. Here are the architecture, security and infrastructure choices that make it tick.

Overview

7 technical domains

Each section details a specific aspect of how this site was built and deployed.

Foundations

Application architecture

Nuxt 4 with SSR, app/ structure and reusable components.

Nuxt 4 + SSR

Server-side rendering for optimal performance and SEO. App/ structure for clear layer separation.

Reusable components

Component library: base/ (Button, Card, Badge...) and main/ (Header, Footer), all TypeScript typed.

i18n FR + EN

Full internationalization with @nuxtjs/i18n v10, prefix strategy, automatic hreflang and lazy-loaded translations.

Structured data

Schema.org JSON-LD on all pages: Person, WebSite, BreadcrumbList, SoftwareApplication.

Protection

Security

Protection applied at every layer: headers, forms, rate limiting.

Security headers

CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy configured via Nitro middleware.

Rate limiting

Request limiting on the contact API to prevent abuse and spam.

Cloudflare Turnstile

Contact form protection with Turnstile (privacy-respecting alternative to reCAPTCHA).

Server validation

Validation and sanitization of all inputs server-side with Yup.

Deployment

Infrastructure

Deployed on Docker with automated CI/CD.

Docker

Containerized application with optimized Dockerfile and docker-compose for deployment.

Automated CI/CD

GitHub Actions with self-hosted runner to automatically deploy on every push to main.

Traefik + Cloudflare

Traefik reverse proxy for HTTPS routing, Cloudflare for DNS and DDoS protection.

Maintenance mode

Maintenance mode configurable via environment variable, no redeployment needed.

Monitoring

Observability

Structured logs and monitoring built in from the start.

Structured logs

Every request is logged with a unique request ID, IP, status and duration.

Health check

Endpoint /api/health exposing status, version and environment information.

Grafana + Loki

Logs sent to Loki and visualized in Grafana with dedicated dashboards.

Error tracking

Centralized server error handling with full context for easy debugging.

Search

Technical SEO

Advanced technical SEO: structured data, hreflang and dynamic sitemap.

SSR for SEO

Server rendering ensures crawlers receive complete content on the very first request.

hreflang

hreflang tags on all pages to signal the appropriate language version to search engines.

Dynamic sitemap

Automatically generated sitemap with all FR/EN URLs, priorities and hreflang alternatives.

Schema.org JSON-LD

Semantic markup on all pages: Person, WebSite, BreadcrumbList for rich snippets.

Metrics

Analytics & privacy

Visit metrics without sacrificing privacy.

Rybbit

Lightweight, GDPR-friendly, self-hosted analytics. No cookies, no cross-site tracking.

Privacy first

No tracking cookies, no data sold. Analytics stays for internal use only.

First-party data

Data stays on my infrastructure. Full control over what is collected.

Useful metrics

Page views, traffic sources, countries and devices. The essentials, without the noise.

Ops

Automation

No manual action needed to deploy or monitor.

Continuous deployment

Every push to main automatically triggers build, tests and deployment via GitHub Actions.

Alerting

Automatic alerts on critical errors or downtime detected by monitoring.

Versioning

Version number automatically injected into the build, visible on the health check.

Infra as config

All infrastructure defined via docker-compose.yml and environment variables.

Technologies

Full stack

Nuxt 4Vue 3TypeScriptTailwind CSSNitroBunDockerGitHub ActionsTraefikCloudflareGrafanaLokiPrometheusRybbitYupTurnstile

Want to discuss it?

Questions about the architecture?

Happy to talk about the technical choices behind this portfolio or any other project.