- README: add a11y badge linking to docs/accessibility.md. - CHANGELOG: full v0.3.0 entry under Unreleased (Added/Changed/Fixed/ Deferred-to-v0.3.1). Documents per-kind CSS bundles, Tier A features, Lighthouse-relevant polish, contrast-token visual diff, tap-target sizing decisions, and Hugo CI matrix. - docs/accessibility.md: new — WCAG 2.2 AA conformance summary, Lighthouse measurement instructions, projected baseline (TBD entries to fill after first production deploy), known limitations. - docs/customization.md: cover-image override snippet (v0.4.0 native pipeline promise); document breadcrumbs/prev-next/lang-switcher opt-ins. - plans/260510-0144-tsuki-v0.3.0/: mark all phases completed; note narrow-TOC <details> deferral to v0.3.1; record audit-pass scope additions integrated into Phases 2–6. - plans/reports/: add researcher-260515-tsuki-vs-stack-papermod-feature -gap.md (verdict: feature parity on must-haves; Tier A gaps shipped this round) + code-reviewer-260515-lighthouse-80-baseline-audit.md (projected ≥80 on all 4 categories; ≥95 a11y achievable with shipped fixes).
tsuki (月)
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
bonsaiin the same naming family.
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/portfoliosection - Search — Pagefind, zero-runtime, indexed at build time
- Comments — Giscus (GitHub Discussions)
- Vietnamese-first — diacritic-safe typography, native vi date formats, ASCII heading IDs
- Dark mode —
prefers-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
docs/installation.md— submodule + Hugo Module + Pagefind setupdocs/config.md— full params referencedocs/data-schemas.md—profile.yaml+projects.yamldocs/customization.md— override layouts, tokens, fonts, calloutsdocs/migrating-from-stack.md— for users coming fromhugo-theme-stack
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.