NYC

creating-zola-static-sites

SKILL.md

Creating Zola Static Sites

Single-binary static site generator. Built-in Sass, image processing, Tera templating.

Quick Start

New Project:
- [ ] zola init my-site && cd my-site
- [ ] Edit config.toml: set base_url
- [ ] IF using theme: skip next step (theme provides templates)
- [ ] IF no theme: copy templates from skill assets/
- [ ] zola serve → http://127.0.0.1:1111 loads
- [ ] zola check → exit code 0

Commands

Command Purpose Verify Success
zola init Create project ls config.toml exists
zola serve Dev server :1111 Browser loads site
zola build Output to public/ ls public/index.html exists
zola check Validate links Exit 0, no errors printed

Core: Sections vs Pages

_ prefix = section (listing); no prefix = page (content):

Filename Type Template Example URL
_index.md section section.html /blog/ (listing)
index.md page page.html /about/ (with assets)
post.md page page.html /blog/post/
content/
├── _index.md        # section: /
├── about.md         # page: /about/
└── blog/
    ├── _index.md    # section: /blog/
    └── post.md      # page: /blog/post/

Frontmatter

section (_index.md):

+++
title = "Blog"
sort_by = "date"        # date|title|weight|none
paginate_by = 10
+++

page (*.md):

+++
title = "My Post"
date = 2024-01-15       # NO QUOTES or sorting breaks
[taxonomies]
tags = ["rust"]
+++

Internal Links

Build-validated with @/ prefix:

[About](@/about.md)
[Blog](@/blog/_index.md)

Workflows

Create Blog

Blog Setup:
- [ ] Create content/blog/_index.md with sort_by="date"
- [ ] Create post: content/blog/2024-01-15-hello.md
- [ ] IF multilingual: add blog/_index.fr.md per language
- [ ] zola serve → /blog/ shows listing (empty if no posts yet)
- [ ] zola serve → /blog/hello/ shows post
- [ ] IF pagination: add more posts than paginate_by to test
- [ ] zola check → passes

Add Taxonomies

Taxonomy Setup:
- [ ] config.toml: taxonomies = [{name = "tags", feed = true}]
- [ ] Page frontmatter: [taxonomies] tags = ["value"]
- [ ] IF need categories: add {name = "categories"} to array
- [ ] IF term has spaces: use slugified URL (/tags/my-tag/)
- [ ] zola serve → /tags/ lists tags
- [ ] zola serve → /tags/rust/ shows posts

Deploy

Production Deploy:
- [ ] zola check → passes (use --skip-external-links if slow)
- [ ] zola build → no errors
- [ ] ls public/index.html → exists
- [ ] IF feeds enabled: ls public/atom.xml → exists

Reference Files

Task Reference Load When User Asks About
Config config-reference.md Feeds, taxonomies, highlighting, search, link checker
Templates tera-templates.md Filters, loops, variables, macros, shortcodes
Content content-organization.md _index.md vs index.md, frontmatter, multilingual
Deploy deployment-guides.md Netlify, Cloudflare, GitHub Actions, Vercel, Firebase
Hybrid astro-integration.md Zola+Astro, Firebase export, shared navigation

Assets

Copy from skill assets/ directory:

Asset Use For
templates/base.html Base layout
templates/section.html Listings with pagination
templates/page.html Articles with TOC
templates/404.html Error page
templates/shortcodes/ youtube.html, figure.html
config-templates/blog.toml Blog preset
config-templates/docs.toml Docs preset

Common Mistakes

Wrong Right Why
date = "2024-01-15" date = 2024-01-15 Quoted dates are strings, break sorting
[About](about.md) [About](@/about.md) Missing @/ means no build validation
index.md in blog/ _index.md in blog/ Without _ it's a page, not a section
templates/blog.html templates/section.html Zola looks for section.html by default

Troubleshooting

Error Fix Verify
Template not found Check spelling; ensure templates/ exists ls templates/*.html shows files
Dates not sorting Use date = 2024-01-15 (no quotes) Posts appear in date order
Broken @/ links Path from content/, include .md extension zola check passes
Slow check Skip external: zola check --skip-external-links Completes in <10s

Debug: {{ __tera_context }} in template shows all variables.

Verbose: RUST_LOG=zola=info zola build

When Not to Use

  • Other SSGs: Hugo, Jekyll, Eleventy use different syntax
  • General Markdown: Questions without Zola context
  • Pure Astro: Projects without Zola integration
Weekly Installs
3
First Seen
Jan 30, 2026
Installed on
opencode3
claude-code3
github-copilot3
codex3
gemini-cli3
kode2