This site provides a machine-readable index at /llms.txt.

Skip to main content

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.

my-site — bash
$ dotnet new install Pennington.Templates
The template "Pennington Doc Site" was installed successfully.
$ dotnet new pennington-docs -o my-site
The template "Pennington Doc Site" was created successfully.
$ cd my-site && dotnet run
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5000
— your site is live. start writing markdown.

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 tutorial
1

Install the project templates

$ dotnet new install Pennington.Templates
2

Scaffold a new docs site

$ dotnet new pennington-docs -o my-site
3

Run it, write Markdown, watch it update

$ cd my-site && dotnet run

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.

One .csproj

No package.json. No node_modules. Your laptop’s battery will notice.

Config in C#

A POCO with real types. IntelliSense, refactoring, and compile errors instead of silent YAML typos.

Live in dev. Flat in prod.

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.

Content/index.md saved • just now
---
title: Release notes
order: 1
---

## Shipping v1.2

Now with <Badge Variant="Success">faster builds</Badge>
and a rewritten navigation tree.
localhost:5000 live

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.

guide.md
## API Status

The ingest endpoint is <Badge Variant="Warning">beta</Badge>.
Read the <ApiLink Id="T:Ingest.Client" />
for the current shape.
rendered

API Status

The ingest endpoint is beta. Read the 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.

writing.md
```csharp:xmldocid,bodyonly
M:Pennington.BlogSite.
  BlogSiteServiceExtensions.
  AddBlogSite(IServiceCollection)
```
rendered
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.