This site is built the same way as Fabio Akita’s blog (source), with two changes: the helper scripts are Python instead of Ruby, and mise controls everything — tool versions, the Python environment and every task.
The stack
- Hugo turns Markdown into static HTML. No database, no server.
- Hextra is the theme: dark mode, search (
Ctrl K), tags, RSS and code highlighting. - Netlify builds and publishes on every push to
main. - mise pins Hugo, Go and Python, so my laptop, GitHub Actions and Netlify run exactly the same versions.
Three languages
Each post is one folder with one file per language:
content/2026/10/30/new-website-how-i-built-it/
├── index.en.md → /en/2026/10/30/my-new-website-how-i-built-it/
├── index.es.md → /es/2026/10/30/mi-nueva-web-como-la-hice/
└── index.pt-br.md → /pt-br/2026/10/30/meu-novo-site-como-eu-fiz/Hugo links the translations, so the language switch takes you to the same post.
The workflow
mise install # Hugo, Go, Python
mise run setup # Python deps
mise run new "Post title" # creates the 3 language files as drafts
mise run tags:search "ai" # reuse existing tags
mise run dev # http://localhost:1313/en/
mise run check # what CI runs: tags, indexes, tests, build
git push # Netlify publishesThe home page and the archive are generated by scripts/generate_index.py (Akita’s generate_index.rb, ported), and scripts/tag_catalog.py keeps tags consistent across the three languages.