Static site generators benchmarked by SSGBerk. Each generator lives in <Lang>/<name>/ with a dockerfile, a benchmark_config.json, the canonical build.sh, a minimal site in src/ and a generator.json. The generator contract is in docs/specs/001-canonical-build-runner/plan.md.
| Language | Name | Version | Content type | Output glob |
|---|---|---|---|---|
| Go | hugo | 0.167.0 | 3minus |
public/post/*/index.html |
| JavaScript | astro | 7.3.5 | 3minus |
dist/posts/*/index.html |
| JavaScript | eleventy | 3.1.6 | 3minus |
_site/posts/*/index.html |
| JavaScript | gatsby | 5.16.1 | 3minus |
public/posts/*/index.html |
| JavaScript | hexo | 8.1.2 | 3minus |
public/posts/*/index.html |
| JavaScript | metalsmith-handlebars | 2.7.0 | 3minus |
build/posts/*/index.html |
| JavaScript | metalsmith-nunjucks | 2.7.0 | 3minus |
build/posts/*/index.html |
| JavaScript | nextjs-export | 16.3.8 | 3minus |
out/posts/*/index.html |
| JavaScript | vitepress | 1.6.4 | 3minus |
.vitepress/dist/posts/*.html |
| PHP | jigsaw | 1.8.8 | 3minus |
build_local/posts/*/index.html |
| Python | mkdocs | 1.6.1 | none |
site/posts/*/index.html |
| Python | nikola-mako | 8.3.3 | 2dot |
output/posts/*/index.html |
| Python | pelican | 4.12.0 | 3minus |
output/posts/*/index.html |
| Ruby | jekyll | 4.4.1 | 3minus |
_site/posts/*/index.html |
| Ruby | middleman | 4.6.3 | 3minus |
build/posts/*/index.html |
| Ruby | nanoc | 4.14.8 | 3minus |
output/posts/*/index.html |
| Rust | zola | 0.23.6 | 3plus |
public/posts/*/index.html |
Versions come from generators.json; content type and output glob (relative to the build's output_folder) come from each benchmark_config.json.
- Create
<Lang>/<name>/and copy the canonicalbuild.shfromGo/hugo/build.shunchanged (CI fails if anybuild.shdiffers). - Write
<name>.dockerfilefollowing the skeleton indocs/specs/001-canonical-build-runner/plan.md(ubuntu:24.04, architecture viadpkg --print-architecture, pinned generator version). - Add a minimal site in
src/and abenchmark_config.json; setoutput_folderandoutput_globso the glob matches exactly one file per post. - Add
generator.jsonand runpython3 tools/build_index.py. - Run
./ssgberk --test <name> -nf 10from tools-benchmark with this repo checked out asframeworks/.
.github/workflows/ci.yml checks that every build.sh is identical to the canonical one and runs a smoke test (-nf 10) for each changed generator on amd64 and arm64 runners.
generators.json is a machine-readable index of every generator, including name, homepage, license, pinned version, benchmark settings and raw file URLs. It also lists the generators proposed in issues.
- Raw URL:
https://raw.githubusercontent.com/ssgberk/ssg-frameworks/master/generators.json - The format, field reference, versioning policy and examples are in
docs/metadata/README.md. - To regenerate it, run
python3 tools/build_index.py. CI runs--check.