Install a theme from the hub: Papermood in five minutes
Papermood is a blog theme in
the spirit of hugo-PaperMod.
It gives you post cards, a dark-mode toggle, archives, tag pages, and
client-side search. It loads no webfonts and no frameworks. The theme is on
the hub, together with a starter
template named papermood-blog.
This post takes three steps. First, we scaffold the starter template. Second, we install the theme by itself, into a site you already have. Third, we open the theme’s demo site and read it like a textbook. The demo is the best teacher here, because every feature you see has its source one file away. Every transcript below comes from a recorded session.
Step 1: start with the template
You want a Papermood blog and you have no site yet? Then the starter template is your fastest path:
accent init my-blog --template papermood-blog cd my-blog accent serve
That is a complete blog. You get a card feed, dark mode, archives, client-side search, and a language switcher. The starter speaks English, German, and French.
The CLI did more than a download. It resolved papermood-blog through the
hub registry’s signed index. It then compared the archive with the SHA-256
checksum from the signed manifest. A tampered archive does not install.
The starter ships Papermood in its themes/ directory, and its content
already binds to the theme. The rest of this post shows those parts one by
one, so you can apply them to your own site.
Step 2: install the theme on an existing site
You do not need the starter. One command adds the theme to any Accent site – no git clone, no ZIP:
accent theme install papermood
Resolving papermood from https://raw.githubusercontent.com/AccentCMS/hub-registry/main...
papermood@1.0.0 by accentx
Installed theme 'papermood@1.0.0' to ./themes/papermood
Note: this project's active theme is 'simple', so the new theme is not in use yet.
Set `theme.name: papermood` in config.yaml to activate it.
Activation is one config key, exactly as the note says. In config.yaml:
theme: name: papermood directory: ./themes
The registry route gives you three things that a manual copy does not:
- Provenance. The index and each version manifest carry a registry
signature, and the checksum pins the archive. What lands in
themes/is what the registry entry describes, or the install fails. - Versions.
accent theme outdatedtells you when a new release exists.accent theme updatemoves you forward when you decide. - Compatibility. Each registry entry declares the Accent versions it
supports. Papermood 1.0.0 declares
>=0.28.0, and the CLI refuses an install that your binary cannot serve.
One honest step remains on an existing site: your pages must use
Papermood’s template names. accent validate is your feedback loop. It
names each gap, for example Missing template: "blog" not found in current theme, and it reports a clean site once the names match. The next section
shows which names the theme expects.
Step 3: learn from the demo
The theme repository carries a full demo site in its demo/ directory.
The live demo is a build of
exactly that content. Clone the repository and start the demo locally:
git clone https://github.com/AccentCMS/Papermood cd Papermood/demo accent serve --no-tls # http://127.0.0.1:4477
The demo is small, but it exercises almost every option of the theme and
many features of Accent. When you want to know how a page on the demo
works, open its source file under demo/content/. Here is the tour.
One config block controls the theme
All theme options live under site.extra.papermood in demo/config.yaml.
A trimmed excerpt:
site: languages: [en, de, fr] extra: papermood: default_theme: auto show_reading_time: true show_breadcrumbs: true show_toc: true show_share_buttons: true home_limit: 5 menu: - name: Posts url: /posts - name: Archives url: /archives - name: Search url: /search social: - name: github url: https://github.com/AccentCMS/accent
The header menu, the social icons, the reading time, the breadcrumbs, the
table of contents – each is one key. The demo also sets edit_post,
which puts an edit link on each post. That link points at the source file
on GitHub. The theme’s README
documents the full list.
Pages select their template by name
A theme defines a set of template names. A page selects one with the
template: key in its frontmatter. The demo’s four section pages show the
whole set:
# content/home/default.md -> the homepage card and feed template: home # content/posts/default.md -> the card list template: list # content/archives/default.md -> posts by year and month template: archives # content/search/default.md -> client-side search template: search
These names are the contract between your content and the theme. This is
the part accent validate checks for you after a theme switch.
The posts page also declares its collection in frontmatter. It lists its child pages, newest first, five per page:
content: items: "@self.children" order: by: date dir: desc limit: 5
One model sets site-wide defaults
The demo sets the site-wide author once, in models/default.yaml, not in
every post:
name: Post extends: post defaults: author: Jane Doe
This project model replaces the theme’s default model and extends the
theme’s post model. It keeps the same fields and the same validation,
and it adds inherited values. A post without an author: line shows
“Jane Doe”. The post /posts/writing-fast-sites writes its own
author: John Smith line and keeps it. Use the same mechanism for a
shared tag, a toc: true, or a cover policy.
The posts show the feature set
Each demo post teaches one area. Read the rendered page and its source side by side.
- Covers. The
getting-startedpost keeps acover.svgnext to itsdefault.md. The frontmatter names it withcover:,cover_alt:, andcover_caption:. - Components. The
components-tourpost uses the canonical Accent components: callouts, tabs, accordions, cards, and buttons. The theme dresses them, so your content stays portable between themes. - Diagrams. The
diagrams-tourpost writes Mermaid and Svgbob sources in fenced code blocks. The demo setsdiagrams.render_mode: server, so each diagram arrives as inline SVG. The page loads no diagram JavaScript. - Three languages. A translation is one file next to the original:
default.md,default.de.md,default.fr.md. The language switcher appears whensite.languageslists two or more entries. - Canonical links. The
writing-fast-sitespost setscanonical_url:, the right move for a post that first appeared somewhere else.
Where to go next
Start from the template, then make the site yours. When you are not sure
how to do something, the demo probably already does it: find the page,
open its source, and copy the pattern. The
README documents every option,
and the hub tracks every
release. From an empty directory to a trilingual blog is one
accent init – the other five minutes are yours.