<p align="center">
  <strong>seite</strong>
</p>

<p align="center">
  <em>The AI-native static site generator.</em>
</p>

<p align="center">
  <a href="https://github.com/seite-sh/seite/actions/workflows/rust.yml"><img src="https://github.com/seite-sh/seite/actions/workflows/rust.yml/badge.svg" alt="CI"></a>
  <a href="https://codecov.io/gh/seite-sh/seite"><img src="https://codecov.io/gh/seite-sh/seite/branch/main/graph/badge.svg" alt="Coverage"></a>
  <a href="https://crates.io/crates/seite"><img src="https://img.shields.io/crates/v/seite.svg" alt="Crates.io"></a>
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
</p>

---

Managing a startup's web presence has always felt disproportionately painful. A CMS for the marketing site. A separate docs platform. A blog tool. A changelog app. Each with its own login, its own subscription, none of it connected to how you actually build the product.

Meanwhile your team ships software with AI assistance every day. seite closes that gap. One CLI tool for your landing page, docs, blog, changelog, and roadmap — managed with the coding agent you already use, with no new subscriptions required.

It was built with Claude Code. This site is managed with Claude Code. That's the point.

```bash
curl -fsSL https://seite.sh/install.sh | sh
seite init mysite --title "My Site" --collections posts,docs,pages
cd mysite && seite serve
```

## Why seite

Most static site generators produce HTML and stop there. seite builds for **three audiences at once**:

- **Browsers** get pages with full SEO metadata, Open Graph, Twitter Cards, and JSON-LD structured data
- **LLMs** get `llms.txt`, `llms-full.txt`, and a `.md` copy of every page for direct consumption
- **AI tools** get a built-in MCP server that exposes your entire site as structured resources

All from Markdown + YAML frontmatter. No JavaScript runtime. No build dependencies. One binary does everything. 331 tests, 139 unit and 192 integration.

## AI integration

This is where seite is different from every other SSG.

### Agent

`seite agent` spawns Claude Code with full site context — config, content inventory, templates, and available commands. No API keys, no setup. It uses your Claude Code subscription directly.

```bash
seite agent "write a post about our v1.2 release — here are the notes: ..."
seite agent "rewrite the homepage hero, our positioning shifted to B2B"
seite agent "generate docs stubs for each CLI command"
seite agent        # interactive session
```

The agent reads your schema, your templates, and your existing content before it writes anything. The output lands in the right directory, with the right frontmatter, following your conventions. You review a diff and ship it.

### MCP server

`seite mcp` runs a Model Context Protocol server over stdio. Claude Code auto-starts it via `.claude/settings.json`, generated by `seite init`. Any MCP-compatible AI tool can use it.

**Resources** — `seite://docs`, `seite://config`, `seite://content`, `seite://themes`, `seite://trust`

**Tools** — `seite_build`, `seite_create_content`, `seite_search`, `seite_apply_theme`, `seite_lookup_docs`

This means your AI tool doesn't just have read access to your site — it has a structured interface to build, search, and modify it.

### LLM discovery

Every build generates `llms.txt` (summary) and `llms-full.txt` (complete markdown) for LLM indexing, plus a `.md` copy of every page. Multilingual sites get per-language versions. Traditional SEO and GEO handled in one pipeline, automatically.

## Features

- **6 bundled themes** — default, minimal, dark, docs, brutalist, bento — or generate a custom one with `seite theme create "coral brutalist with lime accents"`
- **6 collection presets** — posts, docs, pages, changelog, roadmap, and trust center
- **Multi-language** — filename-based i18n with per-language URLs, RSS feeds, sitemaps, search indexes, and hreflang tags
- **Image pipeline** — auto-resize, WebP conversion, srcset/`<picture>` elements, lazy loading
- **Deploy anywhere** — GitHub Pages, Cloudflare Pages, Netlify with guided setup, pre-flight checks, and `--dry-run`
- **Analytics** — Google Analytics, GTM, Plausible, Fathom, Umami with optional cookie consent banner
- **Shortcodes** — `youtube`, `vimeo`, `gist`, `callout`, `figure` built-in, plus user-defined templates
- **Multi-site workspaces** — manage multiple sites from one directory with unified dev server
- **Self-update** — `seite self-update` fetches the latest release with SHA256 checksum verification

## Install

**macOS / Linux:**

```bash
curl -fsSL https://seite.sh/install.sh | sh
```

**Windows (PowerShell):**

```powershell
irm https://seite.sh/install.ps1 | iex
```

**From source (requires Rust):**

```bash
cargo install seite
```

**Pin a specific version:**

```bash
VERSION=v0.1.0 curl -fsSL https://seite.sh/install.sh | sh
```

## Quickstart

```bash
seite init mysite --title "My Site" --collections posts,docs,pages
cd mysite
seite serve
```

Open `http://localhost:3000`. Edit content in `content/`, templates in `templates/`. Live reload on every change.

```bash
# Create content
seite new post "Hello World" --tags intro,rust
seite new doc "Getting Started"
seite new changelog "v1.0.0" --tags new,improvement

# Deploy
seite deploy              # commit, push, build, deploy
seite deploy --dry-run    # preview what would happen
seite deploy --setup      # guided first-time setup
```

## Build output

`seite build` runs a 13-step pipeline and produces:

```
dist/
├── index.html
├── posts/
│   ├── hello-world.html       # HTML for browsers
│   └── hello-world.md         # Markdown for LLMs
├── docs/
│   └── getting-started.html
├── feed.xml
├── sitemap.xml
├── search-index.json
├── robots.txt
├── llms.txt
├── llms-full.txt
├── 404.html
└── static/
```

Every HTML page includes canonical URLs, Open Graph tags, Twitter Cards, JSON-LD structured data, and a link to its markdown alternate.

## Collections

| Preset | Dated | RSS | Nested | Use case |
|--------|:-----:|:---:|:------:|----------|
| **posts** | ✓ | ✓ | — | Blog posts, articles |
| **docs** | — | — | ✓ | Documentation with sidebar navigation |
| **pages** | — | — | — | Standalone pages (About, Contact) |
| **changelog** | ✓ | ✓ | — | Release notes with colored tag badges |
| **roadmap** | — | — | — | Public roadmap with status tracking |
| **trust** | — | — | ✓ | Compliance hub (SOC 2, ISO 27001, GDPR) |

```bash
seite collection add changelog
seite new changelog "v2.0" --tags new,breaking
```

## Themes

Six themes ship with the binary — no downloads, no CDNs:

| Theme | Description |
|-------|-------------|
| **default** | Clean centered column, system fonts, blue links |
| **minimal** | Georgia serif, literary feel, generous whitespace |
| **dark** | True black `#0a0a0a`, violet accents, visible focus rings |
| **docs** | Fixed sidebar with auto-scrolling nav, GitHub-style |
| **brutalist** | Cream background, thick black borders, hard shadows, yellow accents |
| **bento** | CSS grid cards, rounded corners, mixed sizes, soft shadows |

```bash
seite theme list
seite theme apply dark
seite theme create "neon cyberpunk on black"
seite theme install https://example.com/t.tera
seite theme export my-theme
```

## Multi-language

Filename-based translations. Single-language sites need no config.

```
content/posts/
├── hello-world.md        → /posts/hello-world
├── hello-world.es.md     → /es/posts/hello-world
└── hello-world.fr.md     → /fr/posts/hello-world
```

```toml
[languages.es]
title = "Mi Sitio"

[languages.fr]
title = "Mon Site"
```

## Configuration

```toml
# seite.toml — minimal
[site]
title = "My Site"
base_url = "https://example.com"

[[collections]]
name = "posts"
```

<details>
<summary><strong>Full reference</strong></summary>

```toml
[site]
title = "My Site"
description = "A site built with seite"
base_url = "https://example.com"
language = "en"
author = "Your Name"

[[collections]]
name = "posts"
# name = "docs" | "pages" | "changelog" | "roadmap" | "trust"
# paginate = 10

[build]
output_dir = "dist"
data_dir = "data"
minify = true
fingerprint = true

[deploy]
target = "github-pages"   # or "cloudflare" or "netlify"
auto_commit = true

[images]
widths = [480, 800, 1200]
quality = 80
webp = true
lazy_loading = true

[analytics]
provider = "plausible"    # or "google", "gtm", "fathom", "umami"
id = "example.com"
cookie_consent = false

[languages.es]
title = "Mi Sitio"

[trust]
company = "Acme Corp"
frameworks = ["soc2", "iso27001"]
```

</details>

## Data files

Drop YAML, JSON, or TOML in `data/` and access in any template:

```yaml
# data/nav.yaml
- title: Blog
  url: /posts
- title: Docs
  url: /docs
```

Available as `{{ data.nav }}` in all templates.

## Workspaces

```bash
seite workspace init my-workspace
seite workspace add blog --collections posts,pages
seite workspace add docs --collections docs
seite build --site blog
seite serve
seite deploy
```

## Deployment

```bash
seite deploy
seite deploy --dry-run
seite deploy --setup
seite deploy --domain example.com
```

```toml
[deploy]
target = "cloudflare"    # or "github-pages" or "netlify"
```

`seite init` auto-generates the CI workflow for your chosen target.

## Documentation

Full docs at **[seite.sh/docs](https://seite.sh/docs/getting-started)**

- [Getting Started](https://seite.sh/docs/getting-started)
- [Configuration](https://seite.sh/docs/configuration)
- [Collections](https://seite.sh/docs/collections)
- [Templates](https://seite.sh/docs/templates)
- [Shortcodes](https://seite.sh/docs/shortcodes)
- [Multi-language](https://seite.sh/docs/i18n)
- [Deployment](https://seite.sh/docs/deployment)
- [CLI Reference](https://seite.sh/docs/cli-reference)
- [Trust Center](https://seite.sh/docs/trust-center)

## Contributing

Contributions are welcome. Open an issue to discuss larger changes before submitting a PR.

```bash
cargo build
cargo test        # 331 tests (139 unit + 192 integration)
cargo clippy      # must be zero warnings
```

## License

[MIT](LICENSE)
