A Hugo-inspired static site generator.
tsumo is implemented in TypeScript and compiled to native code with Tsonic (TS → C# → .NET).
docs/README.md — end-user docs (getting started, CLI, config, templates, docs mode)examples/basic-blog/README.md — minimal blog exampleexamples/docs-site/README.md — multi-repo docs example (mounts + nav + search)| Area | Feature | Status | Notes |
|---|---|---|---|
| Markdown | GitHub Flavored Markdown (GFM) | ✅ | Powered by Markdig (GitHub heading IDs, tables, task lists, autolinks, fenced code blocks, etc.) |
| Content | Sections + nested paths | ✅ | content/posts/series/part-1.md → /posts/series/part-1/ |
| Content | Leaf bundles (index.md) | ✅ | Copies non-.md bundle resources next to the built page |
| Content | Branch bundles (_index.md) | ✅ | Home and nested section list pages |
| Front matter | YAML / TOML / JSON | ✅ | title, date, draft, description, slug, type, layout, tags, categories, params |
| Taxonomies | tags + categories | ✅ | Generates terms + term pages |
| Templates | Hugo-like Go templates (subset) | ✅ | baseof, block, define, partial, if/else/else if, with, range, template |
| Templates | Render hooks | ✅ | layouts/_markup/*.html + layouts/_default/_markup/*.html |
| Shortcodes | {{< >}} + {{% %}} | ✅ | Loaded from layouts/shortcodes/ + layouts/_shortcodes/ |
| Menus | Config + front matter menus | ✅ | Merged + hierarchical (parent, weight) |
| Assets | Hugo-like pipeline (subset) | ✅ | resources.*, css.Sass, Fingerprint, ExecuteAsTemplate (Sass requires TSUMO_SASS/sass) |
| Outputs | index.xml, sitemap.xml, robots.txt | ✅ | Generated unless you provide your own static files |
| CLI | build, server, new site, new | ✅ | server supports watch + rebuild |
| Docs | Multi-repo mounts + nav + search | ✅ | Enabled by tsumo.docs.json (tsumo-specific) |
| Advanced Hugo | Multilingual builds, pagination | ❌ | Not implemented |
tsumo parses configuration, front matter, docs manifests, template contexts, and resource metadata into closed engine models. JSON input is accepted for supported schemas and then narrowed into typed Tsonic classes before build or template execution.
This keeps generated native code deterministic while preserving Hugo-style authoring for normal site content.
packages/engine — core build + server engine (Tsonic source package, user-owned Tsumo.Engine.csproj)packages/cli — tsumo CLI (Tsonic executable, user-owned Tsumo.Cli.csproj with NativeAOT publish)packages/tests — Tsonic-authored xUnit tests (user-owned Tsumo.Tests.csproj)packages/markdig — vendored Markdig source build (GFM Markdown; provider + target reference)examples/basic-blog — example site (Hugo-style layout)examples/docs-site — docs-mode example (mounts + nav + search)See CODING-STANDARDS.md.
npm install
npm run build
npm run build runs three ordered stages:
prepare:provider-references — builds the vendored Markdig assembly and
materializes the locked NuGet compile closure (PhotoSauce + codecs) into
an immutable .temp/provider-reference-snapshots/*/product directory and
atomically selects it through .temp/active-provider-references; these
exact assemblies are both the Tsonic
provider reflection input and the .csproj compile references.build:tsonic — tsonic build for the engine, CLI, and tests projects.
Tsonic emits C# source only into each package's ignored out/csharp/;
the user-owned .csproj files are never generated or modified.build:dotnet — dotnet build for the user-owned projects.Sibling checkouts are installed via file: dependencies (../tsonic,
../tsonic-csharp, ../csharp-runtime, ../csharp-js, ../csharp-nodejs).
npm run test:dotnet # Tsonic-authored xUnit tests through dotnet test
npm test # Node-driven end-to-end CLI/fixture tests
# Build the example site into examples/basic-blog/public
dotnet run --project packages/cli/Tsumo.Cli.csproj -- build --source ./examples/basic-blog
# Dev server (watch + rebuild)
dotnet run --project packages/cli/Tsumo.Cli.csproj -- server --source ./examples/basic-blog
tsumo new site <dir> — scaffold a new sitetsumo new <path.md> [--source <dir>] — create new content under content/tsumo build [--source <dir>] — build site into public/tsumo server [--source <dir>] — serve public/ (watch + rebuild by default)npm run -w tsumo-cli publish:aot
./packages/cli/bin/Release/net10.0/linux-x64/publish/tsumo --help
132 commits
C#
58.0%
TypeScript
40.3%
JavaScript
1.4%
A Hugo-inspired static site generator.
tsumo is implemented in TypeScript and compiled to native code with Tsonic (TS → C# → .NET).
docs/README.md — end-user docs (getting started, CLI, config, templates, docs mode)examples/basic-blog/README.md — minimal blog exampleexamples/docs-site/README.md — multi-repo docs example (mounts + nav + search)| Area | Feature | Status | Notes |
|---|---|---|---|
| Markdown | GitHub Flavored Markdown (GFM) | ✅ | Powered by Markdig (GitHub heading IDs, tables, task lists, autolinks, fenced code blocks, etc.) |
| Content | Sections + nested paths | ✅ | content/posts/series/part-1.md → /posts/series/part-1/ |
| Content | Leaf bundles (index.md) | ✅ | Copies non-.md bundle resources next to the built page |
| Content | Branch bundles (_index.md) | ✅ | Home and nested section list pages |
| Front matter | YAML / TOML / JSON | ✅ | title, date, draft, description, slug, type, layout, tags, categories, params |
| Taxonomies | tags + categories | ✅ | Generates terms + term pages |
| Templates | Hugo-like Go templates (subset) | ✅ | baseof, block, define, partial, if/else/else if, with, range, template |
| Templates | Render hooks | ✅ | layouts/_markup/*.html + layouts/_default/_markup/*.html |
| Shortcodes | {{< >}} + {{% %}} | ✅ | Loaded from layouts/shortcodes/ + layouts/_shortcodes/ |
| Menus | Config + front matter menus | ✅ | Merged + hierarchical (parent, weight) |
| Assets | Hugo-like pipeline (subset) | ✅ | resources.*, css.Sass, Fingerprint, ExecuteAsTemplate (Sass requires TSUMO_SASS/sass) |
| Outputs | index.xml, sitemap.xml, robots.txt | ✅ | Generated unless you provide your own static files |
| CLI | build, server, new site, new | ✅ | server supports watch + rebuild |
| Docs | Multi-repo mounts + nav + search | ✅ | Enabled by tsumo.docs.json (tsumo-specific) |
| Advanced Hugo | Multilingual builds, pagination | ❌ | Not implemented |
tsumo parses configuration, front matter, docs manifests, template contexts, and resource metadata into closed engine models. JSON input is accepted for supported schemas and then narrowed into typed Tsonic classes before build or template execution.
This keeps generated native code deterministic while preserving Hugo-style authoring for normal site content.
packages/engine — core build + server engine (Tsonic source package, user-owned Tsumo.Engine.csproj)packages/cli — tsumo CLI (Tsonic executable, user-owned Tsumo.Cli.csproj with NativeAOT publish)packages/tests — Tsonic-authored xUnit tests (user-owned Tsumo.Tests.csproj)packages/markdig — vendored Markdig source build (GFM Markdown; provider + target reference)examples/basic-blog — example site (Hugo-style layout)examples/docs-site — docs-mode example (mounts + nav + search)See CODING-STANDARDS.md.
npm install
npm run build
npm run build runs three ordered stages:
prepare:provider-references — builds the vendored Markdig assembly and
materializes the locked NuGet compile closure (PhotoSauce + codecs) into
an immutable .temp/provider-reference-snapshots/*/product directory and
atomically selects it through .temp/active-provider-references; these
exact assemblies are both the Tsonic
provider reflection input and the .csproj compile references.build:tsonic — tsonic build for the engine, CLI, and tests projects.
Tsonic emits C# source only into each package's ignored out/csharp/;
the user-owned .csproj files are never generated or modified.build:dotnet — dotnet build for the user-owned projects.Sibling checkouts are installed via file: dependencies (../tsonic,
../tsonic-csharp, ../csharp-runtime, ../csharp-js, ../csharp-nodejs).
npm run test:dotnet # Tsonic-authored xUnit tests through dotnet test
npm test # Node-driven end-to-end CLI/fixture tests
# Build the example site into examples/basic-blog/public
dotnet run --project packages/cli/Tsumo.Cli.csproj -- build --source ./examples/basic-blog
# Dev server (watch + rebuild)
dotnet run --project packages/cli/Tsumo.Cli.csproj -- server --source ./examples/basic-blog
tsumo new site <dir> — scaffold a new sitetsumo new <path.md> [--source <dir>] — create new content under content/tsumo build [--source <dir>] — build site into public/tsumo server [--source <dir>] — serve public/ (watch + rebuild by default)npm run -w tsumo-cli publish:aot
./packages/cli/bin/Release/net10.0/linux-x64/publish/tsumo --help
132 commits
C#
58.0%
TypeScript
40.3%
JavaScript
1.4%