← back to blog

$ cat ~/blog/hello-world.md

hello-world: how this site is built

published on · ~1 min read #astro#yaml#ssg#meta

This portfolio is, in itself, a sample of how I work. The decisions:

100% static Astro

Portfolio content rarely changes. Generating HTML at build time means: 0 JavaScript by default, 100 Lighthouse score, and a site that can be served from any nginx with a 5 MB Docker image.

YAML content validated with Zod

All content lives in src/content/*.yaml. Every file has a Zod schema: if I break the structure while editing, the build fails with the exact error instead of publishing something broken. Fail-fast, as it should be.

patio:
  order: 1
  company: El Patio de mi Casa
  start: "2025-09"
  end: null # current job

A terminal that actually works

The hero terminal is not a GIF: it accepts real commands (help, whoami, projects…) and reads the same YAML files as the rest of the site, so it never goes out of sync with the content.

Deployment

Multi-stage Docker -> nginx -> docker-compose with Traefik labels on my VPS. But that’s a topic for another post.