Sergio Fernández's page and CV: cv.geiser.cloud
One HTML file, no build. index.html holds the page and its print stylesheet, and the CV PDF at /sergio-fernandez-cv.pdf is printed from that same page on every deploy, so the two cannot drift apart.
index.htmlis the whole site. Inline CSS, system fonts, no JavaScript.- Two blocks inside it are generated: the latest blog posts (from the blog RSS) and the top ten repositories by stars (from the GitHub API).
scripts/update_content.pyrewrites them and touches nothing else;.github/workflows/update-content.ymlruns it every twelve hours and commits only when something changed. Hand-written project descriptions survive a refresh. .github/workflows/pages.ymldeploys the site with GitHub Actions and prints the CV with headless Chrome. It fails if the CV runs past three A4 pages..github/workflows/portfolio.ymlrebuilds the blog's portfolio page from the same repository list every six hours through ghost-github-portfolio; its config isportfolio/config.yml.docs/redesign/,docs/about-redesign/anddocs/portfolio-redesign/keep the 2026 redesign material: the content brief, the audit of the old site, the alternative mockups for this page, the blog's About page and its Portfolio page, and their screenshots.
Edit index.html and push to main. To refresh the generated blocks by hand: python3 scripts/update_content.py index.html (--check exits 1 if the page is behind).