A static content engine for .NET
A doc site your .NET project deserves.
Without leaving the SDK.
Markdown in, static site out. No Node, no npm, no YAML toolchain — just dotnet run.
Pennington ships docs at the speed of your build.
Zero to site in about 90 seconds. This is the whole video.
Quickstart
A site you can write to in 90 seconds.
.NET 11. Three commands. Markdown.
Walk through the full tutorialInstall the project templates
Scaffold a new docs site
Run it, write Markdown, watch it update
Familiar on purpose
Pick up where your dotnet habits already are.
No new CLI to learn, no build tool to babysit. Open the solution, hit F5, and you're shipping content. Your layouts are Razor components. Your config is a C# record. Your deploy target is whatever you'd deploy an ASP.NET app to.
No package.json. No node_modules. Your laptop’s battery will notice.
A POCO with real types. IntelliSense, refactoring, and compile errors instead of silent YAML typos.
Dev mode is a live ASP.NET app with hot reload. Build mode crawls its own routes and writes flat files. Same code, two outputs.
The dev loop
Edit. Save. See it.
Run dotnet run once. Markdown, front matter, navigation, cross-references, and Razor components all hot-reload. The feedback loop is the one you already trust for web apps — pointed at your content.
--- title: Release notes order: 1 --- ## Shipping v1.2 Now with <Badge Variant="Success">faster builds</Badge> and a rewritten navigation tree.
Shipping v1.2
Now with faster builds and a rewritten navigation tree.
Nav
Tree rebuilt
Search
Index refreshed
Xrefs
Resolved
Content-first
The shell stays out of your way.
Layout, navigation, search, dark mode — handled. Your attention belongs on the content: Razor components inside markdown, compiler-level C# highlighting, real xmldocid references.
Your components. In your markdown.
Write a Razor component. Drop it in prose. Rendered at build time, no JS bundle required.
## API Status The ingest endpoint is <Badge Variant="Warning">beta</Badge>. Read the <ApiLink Id="T:Ingest.Client" /> for the current shape.
Syntax highlighting from the actual compiler.
Reference a symbol by xmldocid. Pennington.Roslyn pulls the source and hands it to the real semantic highlighter. Renames don’t break your docs.
```csharp:xmldocid,bodyonly M:Pennington.BlogSite. BlogSiteServiceExtensions. AddBlogSite(IServiceCollection) ```
services.AddSingleton<IBlogContentService, BlogContentService>(); services.AddSingleton<BlogHomeRouteGenerator>(); services.AddSingleton<BlogArchiveRouteGenerator>(); services.AddSingleton<TagRouteGenerator>(); // … return services;
Front matter that types-check
Page metadata is a C# record, not YAML soup. IntelliSense on fields, compile errors instead of runtime surprises.
Rich Markdown
Tabbed code blocks, Mermaid, alerts, diff highlights, and focus lines. Shipped. Configurable.
All the boring parts
Search index, RSS, sitemap, llms.txt, structured data, locale routing. All opt-in, all zero-config.
Where to next
Four doors in. Pick one.
The docs are split by what you’re trying to do: learn, solve, understand, or look something up.
Tutorials
Build it alongside us.
Step through a working site, one piece at a time.
How-to
Solve one thing.
Short recipes to get unstuck and back to work.
Explanation
See how it fits together.
Context and reasoning behind the moving parts.
Reference
Look it up.
The dry, complete listings — for when you need a name.