HugoPortfolioBlog

tsuki — Hugo Portfolio Template

By tiennm99dev

Tsuki is a Hugo blog and personal portfolio theme where the homepage is the portfolio, posts live under /post/, and Vietnamese-first typography, Pagefind search, and Giscus comments are supported.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

2 previews
Desktop homepage1 / 2
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 2

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-03View source

What stands out

A quick read of the recorded project description.

01

The homepage is the portfolio, driven by data/profile.yaml and data/projects.yaml, with no separate /portfolio section

02

The blog supports posts, tags, categories, archives grouped by year, and paginated lists

03

Pagefind generates the index at build time, so search has no runtime dependencies

04

Giscus comments are based on GitHub Discussions, disabled by default and enabled after configuration

05

Vietnamese-first typography: diacritic handling, Vietnamese date formats, ASCII heading IDs

06

Dark mode and View Transitions as progressive enhancements, with a table of contents automatically mounted for long articles

Template Details

Tsuki is a Hugo theme that combines a blog and a personal portfolio in one site: the homepage itself is the portfolio, showing a personal introduction, selected projects, and recent posts. Posts are all placed under the /post/ path, with no separate /portfolio section. Homepage content is driven by two data files, data/profile.yaml and data/projects.yaml.

Blog features include posts, tags, categories, archives grouped by year, and paginated post lists. Search uses Pagefind, generating an index after the build with no runtime dependencies; comments use Giscus, based on GitHub Discussions, disabled by default and requiring parameters generated at giscus.app to be filled into the site configuration before enabling.

The theme targets Vietnamese-first typography: handling diacritics, using native Vietnamese date formats, and ASCII-form heading IDs. It also provides dark mode (following prefers-color-scheme with a persistent toggle), same-document navigation transitions based on the View Transitions API, and a table of contents automatically mounted for long articles (sticky on wide viewports, highlighting the current section with IntersectionObserver). The theme itself uses no SCSS, TypeScript, or bundler—only Hugo templates and browser ES modules.

The current state is the initial v0.1.0 release. View Transitions and :has() are progressive enhancements, and the theme remains usable in browsers that do not support them. Licensing for third-party assets such as demo images, fonts, and icons must be checked separately.

HugoPortfolioBlog

Is it right for your project?

Use Cases

  • Building a personal blog that also presents a personal introduction and selected projects
  • A writing site whose primary content language is Vietnamese
  • A blog that needs a build-time static search index without introducing a search service
  • A site that uses GitHub Discussions to host post comments

Suitable For

  • Personal blog and portfolio authors building with Hugo
  • Writers whose content is primarily in Vietnamese
  • Users who want the homepage to present the portfolio directly without maintaining a separate portfolio page
  • Developers who prefer a build process with no SCSS, no TypeScript, and no bundler

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Add the theme as a git submodule and set theme: tsuki in the site configuration

  2. 2

    Search requires running npx pagefind --site public after the Hugo build to generate the index; Hugo Module users must install Pagefind themselves

  3. 3

    Comments are disabled by default; generate a configuration at giscus.app and fill in params.comments.giscus.*

  4. 4

    exampleSite/hugo.yaml is a complete working configuration example; installation and configuration details are in docs/installation.md and docs/config.md

  5. 5

    The theme code is Apache-2.0; third-party assets such as demo images, fonts, and icons must be checked separately under their respective licenses

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the Apache-2.0 license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution are permitted; the Apache-2.0 license must be included with distributions.
  • Modified files must carry prominent notices of the changes, and relevant copyright, patent, trademark, and attribution notices must be retained.
  • If the original project includes a NOTICE file, applicable attribution notices in it must be retained when distributing derivative works.
  • The license includes an applicable contributor patent grant; initiating patent litigation as described in the license terminates that patent grant, and no trademark rights are granted.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • The comment feature depends on the third-party service Giscus (based on GitHub Discussions) and is disabled by default; it must first be enabled by generating a configuration at giscus.app and filling in params.comments.giscus.*, making it an external service dependency.
  • The search feature requires running npx pagefind --site public after the Hugo build to generate the index; Hugo Module users must install Pagefind themselves, making it an extra build step and external tool dependency.
  • Demo images, fonts, icons, and other third-party assets must be checked under their respective licenses and cannot be judged solely by the code's Apache-2.0 license.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
View Original Text Basis

no-charge, royalty-free, irrevocable copyright license

Original License Text

Comments use Giscus. Generate config at [giscus.app](https://giscus.app) and add to `params.comments.giscus.*` to enable. Defaults to off.

Original README

Search uses Pagefind, built post-Hugo via `npx pagefind --site public`.

Original README
https://github.com/tiennm99dev/tsuki/blob/main/LICENSEhttps://github.com/tiennm99dev/tsuki/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-03. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 85 / 100
Technologies
Hugo
Website type
Portfolio · Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-07-25
Screenshot last checked
2026-10-03

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Hugo as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-04

Inspect the recorded source material

SHA-256: 0bfe55898e96f402b19796d78c370d9ed55b8d72923d6fd90c23df9484af05da

2026-10-03T22:38:10.160Z

Source file / repository
# tsuki (月)

[![build](https://github.com/tiennm99/tsuki/actions/workflows/pages.yml/badge.svg)](https://github.com/tiennm99/tsuki/actions/workflows/pages.yml)
[![license](https://img.shields.io/github/license/tiennm99/tsuki)](LICENSE)
[![Hugo](https://img.shields.io/badge/hugo-%E2%89%A50.146-ff4088?logo=hugo)](https://gohugo.io)
[![CSS](https://img.shields.io/badge/CSS-%E2%89%A44KB%20gz-blue)](https://github.com/tiennm99/tsuki/actions/workflows/pages.yml)
[![a11y](https://img.shields.io/badge/a11y-WCAG%202.2%20AA-success)](docs/accessibility.md)

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`](https://github.com/tiennm99/bonsai) in the same naming family.

**→ [Live demo](https://tiennm99.github.io/tsuki/)**

## Status

`v0.1.0` — initial release. See [CHANGELOG.md](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
- **Search** — [Pagefind](https://pagefind.app), zero-runtime, indexed at build time
- **Comments** — [Giscus](https://giscus.app) (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

```bash
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`](docs/installation.md).

`exampleSite/hugo.yaml` is a complete working example.

## Documentation

- [`docs/installation.md`](docs/installation.md) — submodule + Hugo Module + Pagefind setup
- [`docs/config.md`](docs/config.md) — full params reference
- [`docs/data-schemas.md`](docs/data-schemas.md) — `profile.yaml` + `projects.yaml`
- [`docs/customization.md`](docs/customization.md) — override layouts, tokens, fonts, callouts
- [`docs/migrating-from-stack.md`](docs/migrating-from-stack.md) — for users coming from `hugo-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`](docs/installation.md)). No runtime dependency.

Comments use Giscus. Generate config at [giscus.app](https://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](LICENSE)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.