tiennm99 1eafaefff8 fix: post-v0.2.0 review P1s + CI hygiene (v0.2.1)
Security:
- render-link: drop `| safeHTML` on .Text (self-XSS surface w/ Goldmark unsafe:true)
- projects.html: safeURL + noreferrer + target=_blank on repo/demo
- comments: require repo+repoId+categoryId in gate (prevent broken Giscus iframe)
- htmltest-action: pin to commit SHA 31be84a (supply-chain)

Fixed:
- seo.html: nil-safe \$authorURL chain (no nil.url template error)
- nav.html: relURL on Menu.URL (sub-path deploy correctness)
- pages.yml: drop dead if-find Pagefind guard
2026-05-10 03:04:58 +07:00
2026-05-07 20:27:07 +07:00
2026-05-07 20:27:07 +07:00
2026-05-07 20:27:07 +07:00
2026-05-07 20:25:16 +07:00
2026-05-07 20:27:07 +07:00

tsuki (月)

build license Hugo CSS

A Hugo blog + personal portfolio theme. The homepage is the portfolio — bio, featured projects, recent posts. Posts live at /post/. Vietnamese-first typography, View Transitions on navigation, Pagefind search, Giscus comments.

月 (tsuki): the moon. Quiet, observed, returned to. Companion to bonsai in the same naming family.

Live demo

Status

v0.1.0 — initial release. See CHANGELOG.md.

Features

  • Blog — posts, tags, categories, year-grouped archive, paginated post list
  • Personal portfolio on the homepage — driven by data/profile.yaml + data/projects.yaml, no separate /portfolio section
  • SearchPagefind, zero-runtime, indexed at build time
  • CommentsGiscus (GitHub Discussions)
  • Vietnamese-first — diacritic-safe typography, native vi date formats, ASCII heading IDs
  • Dark modeprefers-color-scheme + persistent toggle, no flash of wrong theme
  • View Transitions API — smooth same-document navigation in supporting browsers
  • Table of contents — auto-mounted on long posts, sticky on wide viewports, IntersectionObserver active highlight
  • No build step — pure Hugo + browser ES modules. No SCSS, no TypeScript, no bundler in the theme
  • Light — CSS ≤ 4 KB gz, JS ≤ 1 KB gz (excluding Pagefind UI)

Quick start

git submodule add https://github.com/tiennm99/tsuki.git themes/tsuki
echo 'theme: tsuki' >> hugo.yaml

Full installation guide (submodule, Hugo Module, Pagefind setup, required site config): docs/installation.md.

exampleSite/hugo.yaml is a complete working example.

Documentation

Search and comments

Search uses Pagefind, built post-Hugo via npx pagefind --site public. tsuki pins Pagefind in its own package.json for submodule consumers; Hugo Module consumers install Pagefind in their own site (see docs/installation.md). No runtime dependency.

Comments use Giscus. Generate config at giscus.app and add to params.comments.giscus.* to enable. Defaults to off.

Browser support

Modern evergreen browsers. View Transitions and :has() are progressive enhancements; the theme remains functional without them.

License

Apache-2.0

S
Description
月 — Hugo blog + personal portfolio theme. Vietnamese-first typography, View Transitions API, Pagefind search, Giscus comments. Companion to bonsai.
Readme Apache-2.0 550 KiB
Languages
HTML 47.6%
CSS 36.7%
Shell 9.9%
JavaScript 5.8%