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

<p align="center">
  A static site generator where Claude Code is the interface.
</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>

---

<p align="center">
  <img src="https://seite.sh/static/demo.svg" alt="seite demo" width="700">
</p>

You already have Claude Code. seite gives it something to work on.

```bash
seite agent "write a post about our v1 launch — here are the notes: ..."
seite agent "redesign the homepage hero, we just pivoted to B2B"
seite agent "create changelog entries for these release notes: ..."
seite agent        # interactive session
```

The agent reads your config, your templates, and your existing content before writing anything. Output lands in the right directory with the right frontmatter. You review a diff and ship it.

No new subscription. No new UI to learn. No new commands. Just the Claude Code subscription you already have — now it can manage your whole website.

```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

### Agent

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

`seite init` generates `.claude/CLAUDE.md` with your site's full schema so the agent is oriented before it writes a single character. Output lands in the right directory, with the right frontmatter, following your conventions. You review a diff and ship it.

```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
```

### 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

seite is early and issues, PRs, and feedback are genuinely welcome. Especially useful:

- **Bug reports** with a repro case (even a minimal `seite.toml` + content file)
- **New theme ideas** — open an issue first to align on direction before building
- **Docs improvements** — if something confused you, it'll confuse others
- **Real-world usage** — if you build something with seite, share it

```bash
git clone https://github.com/seite-sh/seite
cargo build
cargo test        # 331 tests (139 unit + 192 integration)
cargo clippy      # must be zero warnings
cargo fmt --all
```

Open an issue before starting a large PR — saves everyone time.

## License

[MIT](LICENSE)
