This is version 7.0.0 of my website, scottwillsey.com — the Zola version. After years of Astro (versions 3 through 6.x), the site now builds with a single Rust binary and zero npm dependencies. The full migration story lives in ZOLA-MIGRATION.md and the evaluation that led here in SSG-ALTERNATIVES.md.
Pages inspired by fun trends on the web: a now page, a links page, a uses page, and reviews of books, movies, TV shows, and music.
- Authoring stays in
src/— YAML-frontmatter markdown insrc/content/, JSON data insrc/data/, images insrc/assets/images/. All the site automation scripts (~/Scripts/Sites/scottwillsey/, run from the dashboard) write here, unchanged from the Astro era. migrate/convert.py(zero-dependency Python) turns that into Zola content: TOML frontmatter, tags, precomputed display dates/titles, automatic Contents TOCs, social embeds and images as Tera components,{% raw %}protection.- Zola builds the site: Tera v2 templates in
templates/, taxonomies, pagination, sitemap, section RSS feeds. migrate/postbuild.pypost-processes the feeds (absolute URLs, script/style stripping) like ultrahtml used to.- Tailwind CSS standalone binary compiles
css/global.css→static/css/global.css(gitignored). - Pagefind (official PyPI package, extended build) indexes
dist/post-build and provides the search UI. - Barefoot still does the pop-up footnotes.
./build.sh # convert → tailwind → zola → postbuild → pagefind
./deploy.sh # build.sh + rsync deploy (update-site.sh)1. Writing/preview mode — ./dev.sh (the normal way):
./dev.sh # http://127.0.0.1:1111, live reload, opens the browser
./dev.sh --drafts # same, including draft postsOne command, leave it running. It starts the Zola dev server AND watches the src/ authoring tree, auto-running the converter on every save (plus Tailwind in watch mode for template/CSS edits) — so editing src/content/whatever.md just reloads in the browser like it did under Astro. Ctrl-C stops everything.
Caveats:
- Search boxes render but return nothing in dev mode — the Pagefind index only exists after a full
./build.sh. - Stop
dev.shbefore running./build.sh— Zola 0.23's serve mode rewritesdist/on every change and the two fight over the directory (build.sh refuses to run and tells you if it detects this).
2. Production preview — ./preview.sh (the real built site: search working, feeds post-processed — exactly what production will serve):
./preview.sh # builds, serves http://127.0.0.1:1818, opens the browserCtrl-C stops it. No live reload — re-run it after changes (or use ./dev.sh while actively writing).
brew install zola tailwindcss
uv venv .venv && uv pip install --python .venv/bin/python "pagefind[extended]"
./hooks/install.sh # pre-commit hook: date bumps, Recent Updates, content regenerationUpdating the toolchain: brew upgrade zola tailwindcss and uv pip install --python .venv/bin/python -U "pagefind[extended]". That's the entire supply chain.
All content © 2026 by Scott Willsey