Personal site: CV + blog. Static site built with Hugo and the Blowfish theme, deployed to GitHub Pages.
- mise (
brew install mise) — installs the pinned Hugo extended version frommise.tomlviamise install - Clone with submodules:
git clone --recurse-submodules(or rungit submodule update --initafter a plain clone — the theme lives inthemes/blowfish)
| Task | How |
|---|---|
| Run locally | mise run serve → http://localhost:1313 (drafts included) |
| Add a CV entry | Append to experience: in data/cv.yaml (newest first) |
| Write a post | Create content/posts/<slug>/index.md (see below) |
| Add a project | uv run scripts/add_project.py owner/repo "Category" |
| Refresh projects data | mise run refresh-projects |
| Production build | mise run build |
content/posts/my-post/
└─ index.md
---
title: "My Post"
date: 2026-08-03
tags: ["java"]
draft: true # remove when ready to publish
---
Content here. Images go next to index.md and are referenced by filename.All CV content lives in data/cv.yaml — about, contacts,
skills, experience, education, languages. The page at /cv is rendered from
it by layouts/shortcodes/cv.html. Years of experience are computed from
first_working_year, so they never go stale.
The starred-projects catalog lives in data/projects.yaml
and data/categories.yaml. The page at /awesome is
rendered from them by layouts/shortcodes/projects.html, with a client-side
filter.
Add one repo (categories must already exist in data/categories.yaml; the
rest is fetched from GitHub and the file is re-sorted by stars):
uv run scripts/add_project.py apache/iceberg "Storage" "Java & JVM"
Refresh it with live GitHub metadata (requires gh auth status to be logged
in):
uv run scripts/refresh_projects.py
Run the script tests:
uv run --with pytest --with pyyaml pytest scripts/
scripts/migrate_readme.py was the one-shot import from the original
my-awesome-list README and must not be rerun — it would discard the
API-enriched topics and exact star counts that refresh_projects.py since
added.
The color scheme is set in config/_default/params.toml:
colorScheme = "ocean"Built-in schemes: blowfish, avocado, fire, ocean, forest,
princess, neon, bloody, terminal, marvel, noir, autumn,
congo, slate, github, one-light. To define your own palette, create
assets/css/schemes/<name>.css (copy one from
themes/blowfish/assets/css/schemes/ and change the color values), then set
colorScheme = "<name>". Docs: https://blowfish.page/docs/getting-started/#colour-schemes
Other appearance settings (light/dark default, homepage layout, header
style) are in params.toml; author name, headline, bio and social links are
in config/_default/languages.en.toml.
Every push to master triggers .github/workflows/deploy.yml, which builds
the site with Hugo and publishes it via the official GitHub Pages actions.
No deploy branch, no manual steps.
mise run serve for a live preview. For automated verification there is a
Claude Code skill at .claude/skills/test-site/ that builds the site and
drives it in a headless browser
(agent-browser) — in a
Claude Code session, ask it to "test the site".