A personal blog theme ported from the Hexo cactus theme to Hugo
portfolio-hugo-theme-cactus — Hugo Portfolio Template
By fu4303
A Hugo-based personal blog theme ported from the Hexo cactus theme, offering configuration options for color schemes, project lists, social links, comments, and math formulas.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 3
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Provides four color schemes: dark, light, white, and classic
Supports configuring the project list via yaml/toml/json files in the data directory
Social links are configured using Font Awesome icon names
Comments and MathJax can be set globally or overridden in a single post's front matter
Code highlighting uses Hugo's built-in syntax highlighting; analytics uses Hugo's built-in analytics template
Template Details
This is a Hugo theme for building personal blog sites, ported from @probberechts' Hexo theme cactus. The repository notes that some features are still under development and includes a TODO list.
The theme is configured through the site configuration file (config.toml). Options include: colortheme provides four color schemes: dark, light, white, and classic; the css parameter can load one or more custom stylesheets after the main theme CSS; menus are defined via [[menu.main]] for entries such as home, post list, tags, and about. The homepage can set description (supports Markdown), mainSection, and mainSectionTitle, and can choose to show only the most recent posts or all posts, as well as whether to display a tag overview and project list.
The project list reads projects.yaml, toml, or json data files from the data directory; if no data file is detected, this section is not displayed. Social links are configured via [[params.social]], where name must correspond to a Font Awesome icon name. Copyright information is written to .Site.Copyright, and the theme appends the current year in the header.
Comments are disabled by default and must be enabled in params.comments; currently only Disqus is supported, requiring a disqusShortname; they can also be controlled per post via the comments field in the front matter. Code highlighting uses Hugo's built-in syntax highlighting configuration. Analytics uses Hugo's built-in analytics template, requiring a googleAnalytics tracking ID, and can be switched to asynchronous code via googleAnalyticsAsync. RSS is not generated by default; set params.rss to true. MathJax can be enabled globally via params.mathjax or overridden in a single post's front matter. The post archive page can disable pagination via showAllPostsArchive, displaying all posts in chronological order.
Installation involves cloning the theme into the Hugo site's themes directory, setting theme to cactus in the site configuration, then previewing locally with hugo server; for publishing, see Hugo's hosting and deployment documentation. The repository uses the MIT license.
Is it right for your project?
Use Cases
- Building a personal blog focused on post lists and tags
- Displaying a personal project list on the homepage with links to external addresses
- Writing technical articles containing math formulas and enabling MathJax rendering
- Integrating Disqus comments for posts and controlling display per post
Suitable For
- Personal bloggers building static sites with Hugo
- Users migrating from the Hexo cactus theme who want to keep a similar layout
- Blog authors who need a project list, social links, and multiple color scheme switching
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
Clone the theme into the Hugo site's themes directory and set theme = "cactus" in the site configuration
- 2
The project list requires creating a projects.yaml, toml, or json file in the data directory; otherwise, this section will not display
- 3
To enable comments, set params.comments.enabled to true and provide a disqusShortname; currently only Disqus is supported
- 4
RSS is not generated by default; set rss = true in params; MathJax requires setting mathjax = true
- 5
The repository notes that I18n, local search, toc template, gallery, and other features are not yet complete; be aware before use
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope is the code of this version and does not imply that external services or third-party assets are free.
Must comply with when using
- Free use, modification, commercial use, and distribution of this version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- 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
- Enabling comments requires registering a Disqus account and obtaining a shortname, which is a third-party external service dependency, not a built-in capability of the theme.
- Using analytics requires providing your own Google Analytics tracking ID, depending on an external service.
- The name field for social links must be filled with a Font Awesome icon name, depending on that icon library's naming.
- The repository explicitly states that some features are still under development; I18n, local search, toc template, gallery, etc., are not yet complete and should not be considered a complete product.
- Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; they cannot be judged solely by the code's MIT license.
- External services such as domain, hosting, database, payment, or AI may incur additional charges.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
Before using disqus, you need to register and get your [disqus shortname](https://help.disqus.com/en/articles/1717111-what-s-a-shortname).
Original README
Add you tracking id in your site config.
Original README
The `name` key expects the name of a [Font Awesome icon](https://fontawesome.com/icons?d=gallery&s=brands).
Original README
https://github.com/fu4303/portfolio-hugo-theme-cactus/blob/main/LICENSEhttps://github.com/fu4303/portfolio-hugo-theme-cactus/blob/main/README.mdSome works are still in progress. See [TODOS](#todos) below.
Original README
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
- Partly documented · 70 / 100
- Technologies
- Hugo
- Website type
- Portfolio · Starter
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
- 2021-07-23
- 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.
Automatically checked against source and license rules; no manual editorial review.
Inspect the recorded source material
SHA-256: 73d7a58a1fe58c33ad72fef7224b4bb26320f6b34b686f5c0e9d814a8c825935
2026-10-03T03:04:04.642Z
Source file / repository## Cactus
A hugo theme for personal blog. Fork from hexo theme [cactus](https://github.com/probberechts/hexo-theme-cactus) created by @probberechts.
[Live demo on github pages](https://www.takuzen.me/hugo-theme-cactus/).
Some works are still in progress. See [TODOS](#todos) below.
## Install
1. clone cactus to your hugo site's `themes` folder.
```
git clone https://github.com/monkeyWzr/hugo-theme-cactus.git themes/cactus
```
2. change your theme to cactus in your site config
```toml
# config.toml
theme = "cactus"
```
3. config your site. See [Config] or a [complete config sample](exampleSite/config.toml)
4. test your site
```
hugo server
```
5. publish your site in your prefered way. See hugo's doc: [Hosting & Deployment](https://gohugo.io/hosting-and-deployment/)
## Config
### Color themes
```toml
[params]
colortheme = "white" # dark, light, white, or classic
```
### Custom CSS
```toml
[params]
css = ["css/custom.css"]
```
You can add multiple custom stylesheets which will be loaded after the main theme css.
For example, the above line will load the CSS-file placed at `/static/css/custom.css`.
### Navigation
```toml
# Main menu which appears below site header.
[[menu.main]]
name = "Home"
url = "/"
weight = 1
[[menu.main]]
name = "All posts"
url = "/posts"
weight = 2
[[menu.main]]
name = "Tags"
url = "/tags"
weight = 3
[[menu.main]]
name = "About"
url = "/about"
weight = 4
```
### Homepage settings
* description: description will be displayed in the homepage. Markdown syntax is supported in the description string.
```toml
[params]
description = "Hugo is a general-purpose website framework. Technically speaking, Hugo is a static site generator. Unlike systems that dynamically build a page with each visitor request, Hugo builds pages when you create or update your content. Since websites are viewed far more often than they are edited, Hugo is designed to provide an optimal viewing experience for your website’s end users and an ideal writing experience for website authors."
```
* set your main section (used as the link for the "writings" title on the homepage)
```toml
[params]
mainSection = "posts"
```
* change the default main section title from Writings, to something else:
```toml
[params]
mainSectionTitle = "Blog"
```
* Show only the 5 most recent posts (default)
```toml
[params]
showAllPostsOnHomePage = false
postsOnHomePage = 5
```
* show all posts
```toml
[params]
showAllPostsOnHomePage = true
postsOnHomePage = 5 # this option will be ignored
```
* show tagsoverview (default) or not
*
```toml
[params]
tagsOverview = true
```
* show projects list (default) or not.
```toml
[params]
showProjectsList = true
projectsUrl = "https://github.com/monkeyWzr"
```
Projects section will not be shown if no data file is detected. See [Projects list](#projects-list) below.
### Projects list
Create your projects data file `data/projects.yaml|toml|json`. Hugo support yaml, toml and json formats.
for former hexo cactus users: please assign your json array to a `list` key.
for example, `data/projects.json`:
```json
{
"list": [
{
"name":"Hexo",
"url":"https://hexo.io/",
"desc":"A fast, simple & powerful blog framework"
},
{
"name":"Font Awesome",
"url":"http://fontawesome.io/",
"desc":"The iconic font and CSS toolkit"
}
]
}
```
### Social media links
```toml
[[params.social]]
name = "github"
link = "https://github.com/monkeyWzr"
[[params.social]]
name = "email"
link = "[email protected]" # no need for "mailto:" at the start
[[params.social]]
name = "linkedin"
link = "https://www.linkedin.com/in/monkeywzr/"
```
The `name` key expects the name of a [Font Awesome icon](https://fontawesome.com/icons?d=gallery&s=brands).
### Copyright
Assign your copy right to `.Site.Copyright`. Cactus will append current year to the head.
TODO: Customizable copyright year
```toml
copyright = "Zeran Wu" # cactus theme will use site title if copyright is not set
```
### Comments
Comments is disabled by default. Enable comments in your `.Site.Params`.
```toml
[params]
[params.comments]
enabled = true
# engine = "disqus" # in progress
```
You can also enable/disable comments per post. in your posts' front matter, add:
```yaml
comments: true
```
The site config is ignored when `comments` option exists in front matter.
The default engine is disqus. **By now only disqus is supported in cactus.** I will add more options sooner or later. See [Comments Alternatives](https://gohugo.io/content-management/comments/#comments-alternatives)
Before using disqus, you need to register and get your [disqus shortname](https://help.disqus.com/en/articles/1717111-what-s-a-shortname). Assign your shortname in `.Site.disqusShortname`, or cactus will use `.Site.Title` by default.
```
disqusShortname = "wzr" # cactus will use site title if not set
```
### highlight
Use hugo's built-in [syntax highlighting](https://gohugo.io/getting-started/configuration-markup#highlight).
default config:
```toml
[markup]
[markup.highlight]
codeFences = true
guessSyntax = false
hl_Lines = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = true
style = "monokai"
tabWidth = 4
```
### Analytics
Cactus uses hugo's bulit in [analytics templates](https://gohugo.io/templates/internal#google-analytics)
Add you tracking id in your site config. By default cactus uses synchronous tracking code. You can switch to asynchronous tracking by set `googleAnalyticsAsync` to `true`.
```toml
googleAnalytics = "UA-123-45"
googleAnalyticsAsync = true # not required
```
### RSS
The rss feed is not generated by default. you can enable it in your site config:
```toml
[params]
rss = true
```
The rss link will be `https://example.com/index.xml` assuming your `baseURL` is set to `https://example.com/`
Please also check [Configure RSS](https://gohugo.io/templates/rss/#configure-rss)
### Mathjax
Cactus supports mathjax. Just add `mathjax` option in your site config:
```toml
[params]
mathjax = true # not required
```
You can also enable/disable mathjax per post. In your posts' front matter, add:
```yaml
mathjax: true # or false
```
The site config will be ignored when `mathjax` option exists in front matter.
### Archive
Pagination on posts archive can be disabled to show all posts in chronological order
```toml
[params]
showAllPostsArchive = true # or false (default)
```
## TODOS
- [ ] More comments engines
- [x] RSS
- [ ] I18n
- [x] Analytics
- [ ] Local Search
- [ ] toc template
- [ ] Customizable copyright year
- [ ] gallery
- [ ] expose [mathjax configuration](https://docs.mathjax.org/en/latest/web/configuration.html#web-configuration)
## License
MIT
Explore similar templates
Compare previews and descriptions within the same stack and category.

hugo-PaperMod
A fast, clean, responsive Hugo theme for blogs and lightweight portfolios, with three layout modes (Regular, Home-Info, Profile), automatic and manual light/dark themes, Fuse.js client-side search, multilingual support, and built-in Open Graph, Twitter Cards, and Schema.org data.
Hugo · Portfolio

Congo
Congo is a minimal Hugo content theme built on Tailwind CSS 3.0, designed for blogs, portfolios, and lightweight content sites. It offers multiple homepage layouts, customizable dark mode, multilingual support including RTL, and built-in client-side search, Mermaid, Chart.js, and KaTeX.
Hugo · Blog

toha
Toha is a Hugo theme for personal portfolios, featuring a minimalist, responsive design with configurable homepage sections such as about, experience timeline, and achievements gallery.
Hugo · Portfolio

hugo-profile
hugo-profile is a mobile-first Hugo theme for personal portfolios and blogs, with multilingual support, light/dark themes, categories and tags, Google Analytics, Disqus comments, and Formspree contact forms.
Hugo · Portfolio

hugo-xmin
hugo-xmin is an extremely minimal Hugo theme written by Yihui Xie for template beginners. HTML and CSS total about 140 lines, with no external dependencies, and it uses the MIT license.
Hugo · Starter

hugo-theme-gallery
A Hugo Extended photo gallery theme that organizes images with Page Bundles, automatically generating album lists and gallery pages with a Justified layout and PhotoSwipe lightbox.
Hugo · Starter
