Releases
Release history and changelog for seite.
v0.16.0
Agent guidance for gated content
Sites now ship a .claude/rules/private-collections.md context file so the AI agent working in your project knows what's possible — and what isn't — for gated content:
private = truecollections build their hub + pages but stay out of every discovery surface (sitemap, llms.txt, search, feeds, homepage, tags) and carrynoindex, nofollow.privatedoes not lock access. It only hides content from discovery — the HTML is still publicly fetchable. seite has no Cloudflare Access integration; gating who can load the pages is a separate step you configure (Cloudflare Access / Zero Trust, HTTP auth, etc.).- Subdomain hubs render the collection's own index template, and the custom-domain attach on a subdomain's Pages project is a manual one-time step (seite only auto-attaches the main site's domain).
New sites get the rule from seite init; existing sites get it on seite upgrade.
Docs
- Deployment gains "Custom domain for a subdomain" and "Gating a subdomain behind Cloudflare Access" sections.
- Configuration already warns that
privateis not access control — now cross-referenced from the deploy guide.
v0.15.2
Docs: subdomain collection hubs
Follow-up to the v0.15.1 fix. The docs now explain that a collection deployed to a subdomain renders its root page with the collection's own index template (and context), just like its index on the main domain:
- The Trust Center reference gains a "Deploying to a subdomain" section — serve the trust hub from
trust.example.com, optionally paired withprivate = truefor content behind Cloudflare Access. - The Configuration reference notes that the subdomain root uses the collection's index template (e.g.
trust-index.html).
No code changes.
v0.15.1
Subdomain hubs render the collection's index template
When a collection set subdomain = "x", its root page (x.example.com/) was generated with the generic site index template instead of the collection's own index template. For the bundled Trust Center this meant the data-driven hub (cert grid, subprocessor table, FAQ from trust-index.html) did not render on a subdomain — you got a plain listing with the bare site title.
The subdomain root now renders exactly like the collection's index page on the main domain: the same index template (e.g. trust-index.html, docs-index.html) and the same context (collections, data.*, t.*, items, nav), emitted to dist-subdomains/<name>/index.html and, per language, dist-subdomains/<name>/<lang>/index.html.
Main-domain behavior is unchanged, and collections that use a plain listing index keep working — each subdomain root uses whatever index template that collection would use on the main domain.
v0.15.0
Private collections (gated content)
Collections can now be marked private = true to build fully while staying out of every public discovery surface. This is the missing piece for putting a section — like the bundled Trust Center — behind Cloudflare Access or HTTP auth without leaking it.
[[collections]]
name = "trust"
private = true
url_prefix = "/trust"
default_template = "trust-item.html"
What private does
- Builds everything. Every item page and the auto-generated hub/index page render normally — with the collection's index template and full context (
collections,data.*) — for the default language and every/{lang}/variant. Unlikelisted = false, the hub is not suppressed. - Hidden from discovery. The collection's pages are excluded from the homepage listing,
sitemap.xml,llms.txt,llms-full.txt,search-index.json, RSS/Atom feeds, and tag pages. noindex, nofollow. Every private page is stamped with<meta name="robots" content="noindex, nofollow">unless the page sets its ownrobotsfrontmatter.- Still navigable. Internal links resolve normally, and the
.mdalternates keep generating (they live under the gated path).
private is independent of listed: the hub renders even when the collection is hidden from the homepage. The build logs how many pages were excluded, e.g. 12 private pages excluded from discovery.
Backward compatible
Absent private (or private = false) is the existing behavior, byte-for-byte. The flag composes with subdomain, paginate, and the rest.
v0.14.0
Per-language data values (i18n for data-driven templates)
Data files (data/**) can now provide language maps — values whose keys are your configured language codes — and they resolve to the language of the page being rendered. This makes data-driven templates like the bundled Trust Center bilingual without duplicating data files.
Language maps
Any data value may be a map keyed by language code:
# data/trust/faq.yaml - question: en: Where is data stored? de: Wo werden Daten gespeichert? answer: en: Data is stored in the EU. de: Daten werden in der EU gespeichert.
When the page renders for de, the value resolves to the German variant; for en, the English one. Resolution falls back to the default language, then to the first present entry, so a partially translated value still renders something sensible.
A map is only treated as a language map when all of its keys are configured language codes. A map like { icon: "shield", label: "Security" } is left untouched, and plain strings, numbers, and booleans pass through byte-for-byte — existing single-language sites produce identical output.
The i18n filter
Resolution is exposed as a Tera filter (alias localize) for use in any template:
{{ value | i18n(lang=lang) }}
The bundled trust-index.html and trust-item.html templates already apply it to all prose fields — certification name/description/scope/auditor, subprocessor name/purpose/location, and FAQ question/answer — so the Trust Center is bilingual out of the box.
Missing-translation warnings
When a value is present in some but not all configured languages, the build prints a warning that points at the path and the missing language(s), so gaps in translation are easy to spot:
⚠ Warning: data.trust.faq[0].answer: language map missing translation(s) for de
v0.13.0
Anonymous usage telemetry (opt-out)
seite now sends a small, anonymous event when you run a command, and the install scripts send one when seite is installed. This helps us see which commands and platforms matter so development can focus where it counts. It is opt-out and built to be privacy-preserving.
What is collected
Per command: the command name (e.g. build, deploy), the seite version, your OS and architecture, whether the command succeeded, and a coarse duration bucket (e.g. 1-5s). Install events add the install source (install.sh / install.ps1).
What is never collected
No file paths, no site domains or URLs you build, no page content, no command arguments or flag values, no environment variables, no usernames, and no stable identifier. Rough counts come from a server-side hash that rotates daily — you are counted within a day, never tracked across days.
How to turn it off
Any one of these disables telemetry completely:
seite telemetry off # persisted preference export SEITE_TELEMETRY=0 # per-shell / CI export DO_NOT_TRACK=1 # honored globally
It is also automatically disabled in CI (any non-empty CI variable). Check the current state with seite telemetry status. The first time seite records an event it prints a one-time notice so you know it's on.
Sending is best-effort and fully detached: it never blocks a command, never changes its exit code, and silently does nothing if the network is unavailable.
v0.12.2
Bug Fixes
A focused bug-fix release. No configuration changes are needed — existing sites build and deploy exactly as before.
MCP search no longer crashes on non-ASCII content
seite_search built its result excerpt by slicing the page body with byte offsets taken from a lowercased copy of the text. On any page containing multibyte characters — accents, CJK, emoji — those offsets could land in the middle of a character and panic, taking the whole MCP server down mid-session. Since the MCP server is how Claude Code talks to your site, a single search over international content could drop the connection.
The excerpt is now computed in character units, so it never splits a character and never panics, regardless of the content.
Frontmatter with --- inside a value now parses
The frontmatter parser looked for the closing --- delimiter with a plain substring search, so a value like description: "Before --- After" was mistaken for the end of the frontmatter block. That truncated the YAML and produced a confusing parse error on a perfectly valid file. The closing delimiter is now matched only when --- appears on its own line.
Self-update verifies checksums in-process
seite self-update previously shelled out to sha256sum / shasum to verify the downloaded binary. On systems without those tools (notably Windows) verification always failed, blocking the update. SHA-256 is now computed in-process with the sha2 crate — integrity verification works everywhere and can no longer silently produce an empty digest or panic on a missing temp directory.
GitHub Pages re-deploys are idempotent
seite deploy to GitHub Pages now creates the gh-pages branch with git checkout -B instead of -b, so a re-deploy over a stale .git directory in the output folder no longer fails with "branch 'gh-pages' already exists".
Subpath deploys rewrite single-quoted URLs
When deploying under a base path (e.g. GitHub Pages project sites), the base-path URL rewriter only handled double-quoted HTML attributes. Single-quoted attributes from custom templates — href='/about' — were left unprefixed and broke. Both quote styles are now rewritten.
Developer Experience
seite initnow listsseite agentin its "Next steps" so new users discover the Claude Code workflow immediately.seite agent "…" --onceprints a next-step hint on success, pointing toseite serve/seite build.
v0.12.1
Maintenance and Security
A small maintenance release. There are no user-facing behavior changes — sites build and deploy exactly as before.
Security
- Updated the transitive
randdependency to0.9.3, resolving GHSA-cq8v-f236-94qc (a low-severity soundness advisory inrand).
Dependencies
- Bumped
rustls-webpkiand the rest of the Rust dependency group to their latest patch releases. - Refreshed pinned GitHub Actions to current versions.
Internals
- Fixed two
clippy::unnecessary_sort_bylints in the build pipeline (sort_by→sort_by_key). Sort order is unchanged. - Updated
deny.tomlto acknowledgeRUSTSEC-2026-0105(core2is unmaintained and pulled in transitively by therav1eAVIF encoder, with no safe upgrade available), and bumpedcargo-deny-actionso the supply-chain audit job runs cleanly again.
v0.12.0
Subdomain Deploy Steps in Generated Workflows
seite init and seite deploy --setup now auto-generate deploy steps for subdomain collections. Previously, when a collection had subdomain and deploy_project configured, only the main site was deployed in CI — users had to manually add the subdomain deploy step.
Now the generated Cloudflare workflow includes steps like:
- name: Deploy docs to Cloudflare Pages uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: pages deploy dist-subdomains/docs --project-name my-docs
Netlify workflows get equivalent steps with per-collection site ID secrets (NETLIFY_SITE_ID_DOCS).
GitHub Pages is unchanged — it doesn't support multi-project deploys.
Always Install Latest seite in CI
Generated workflows no longer pin VERSION=x.y.z in the install command. Instead they use:
run: curl -fsSL https://seite.sh/install.sh | sh
The install script resolves the latest release via version.txt. This means your CI always uses the current seite version without needing to manually update the workflow or run seite upgrade.
If you need to pin a specific version, you can still set VERSION=0.12.0 manually in your workflow.
Upgrade Path
Run seite upgrade to apply both changes to existing projects:
- Version unpinning — removes
VERSION=from your deploy workflow and netlify.toml - Subdomain steps — adds missing deploy steps for collections with
deploy_project
Both are non-destructive: the upgrade regenerates the workflow from your current seite.toml configuration.
v0.11.0
AVIF Image Processing Fix
seite no longer attempts to decode .avif files in the image processing pipeline. The image crate's avif feature only enables AVIF encoding (generating AVIF variants from PNG/JPG/WebP sources), not decoding. Previously, .avif files in static/ would trigger a The image format Avif is not supported warning on every build.
AVIF files are still copied to dist/ and served correctly — they just skip the resize/optimize step. Since AVIF is already heavily compressed, re-processing provides no benefit.
Translatable Callout Shortcode Labels
The built-in callout shortcode now supports i18n. Previously, callout titles (Info, Tip, Warning, Danger) were hardcoded in English regardless of the site language.
Shortcode templates now receive the {{ t }} translation object, matching the convention used by page templates. Callout labels use these new UI string keys:
callout_info(default: "Info")callout_tip(default: "Tip")callout_warning(default: "Warning")callout_danger(default: "Danger")
Override them in data/i18n/{lang}.yaml:
# data/i18n/de.yaml callout_info: "Hinweis" callout_tip: "Tipp" callout_warning: "Warnung" callout_danger: "Gefahr"
You can also pass a title argument to any callout for a one-off override:
{{% callout(type="tip", title="Pro-Tipp") %}} Custom title regardless of language. {{% end %}}
User-defined shortcode templates can now use {{ t.any_key }} to access translated UI strings.
v0.10.1
Plausible New Snippet Format
Plausible replaced extension-based script URLs with unique per-site snippet URLs in October 2025. seite now fully supports the new format when script_url is set:
- Uses
asyncinstead ofdefer(matching Plausible's new snippet) - Drops
data-domainattribute (domain is encoded in the unique URL) - Injects the
plausible.init()bootstrapper for custom event support (tagged events, outbound links, etc.) - Works with both direct injection and cookie consent banner modes
New recommended config:
[analytics]
provider = "plausible"
id = "example.com"
script_url = "https://plausible.io/js/pa-XXXXXXXXXX.js"
The legacy extensions approach continues to work for existing setups. The id field is still required as a site identifier even when using script_url.
The seite.sh website has been migrated to the new snippet format.
v0.9.0
Developer experience overhaul — every interaction with seite now feels more polished and informative.
Build Progress Feedback
The build pipeline now shows animated spinners for each of its 15+ steps, with per-step timing. No more staring at a blank terminal during long builds.
Vite-Style Dev Server
seite serve now displays the URL prominently with network address, matching the visual style of Vite and Astro:
seite v0.9.0
➜ Local: http://localhost:3000/
➜ Network: http://192.168.1.5:3000/
Shell Completions
New seite completions <shell> command generates tab-completion scripts for Bash, Zsh, Fish, PowerShell, and Elvish.
Welcome Screen
Running seite with no arguments now shows a friendly welcome with context-aware commands instead of raw help text.
Smart Error Hints
- "Did you mean?" suggestions for misspelled collection names, theme names, and other identifiers (powered by
strsim) Config file not foundnow suggestsseite initinstead of a bare errorseite newnow tells you the dev server will auto-reload
Other Improvements
--hostflag on serve:seite serve --host 0.0.0.0binds to all interfaces for network access (default:127.0.0.1); handles hostnames likelocalhostwithout panicking--openflag on serve:seite serve --openlaunches your browser automatically- Init file tree:
seite initnow shows the project structure after scaffolding - Stable build output: Collection counts in build summary are now sorted alphabetically (no more random order)
- Theme gallery link:
seite theme listnow links to the theme gallery for visual previews; column alignment works correctly with ANSI color output - Network URL: only shown when the server is bound to all interfaces, not on loopback
- Completions: output is clean for shell redirection (
seite completions bash > file.sh)
v0.8.2
Heading HTML Injection (Security Fix)
Markdown headings containing HTML special characters (e.g., <, >, &) were rendered without escaping, allowing raw HTML injection into the page. A heading like ## Use <script> tags would inject a literal <script> element into the output.
Heading text is now HTML-escaped before being written into <h> tags, matching the behavior of all other inline content.
Multilingual site.language Incorrect for Non-Default Languages
SiteContext::for_lang() always set site.language to the default language from seite.toml instead of the language actually being rendered. This meant <html lang="..."> and any template logic using {{ site.language }} would show the wrong language code on translated pages.
site.language now correctly reflects the page's language for every render pass.
Plausible Deprecation Warning Printed Once Per HTML File
The Plausible extensions deprecation notice was emitted inside the per-file analytics injection loop, which runs in parallel via Rayon. On a site with 200 pages, the warning printed 200 times. The warning is now emitted once before the post-processing loop.
Image src Attribute Extraction Matched Partial Names
The extract_attr helper used during image post-processing matched attribute names by substring. Searching for src would match data-src if it appeared earlier in the tag, causing the wrong URL to be used for srcset generation and <picture> element construction.
Attribute matching now requires a whitespace boundary before the attribute name, so data-src no longer shadows src.
v0.8.1
PageSpeed Insights URL Encoding
seite perf now percent-encodes the target URL before passing it to the PageSpeed Insights API. Previously, URLs containing special characters (spaces, ampersands, query strings) would silently produce a malformed API request and return no results.
Atom Feed Author Compliance
Atom feeds (atom.xml) now always include a feed-level <author> element, satisfying RFC 4287 §4.1.1. Previously, if author was not set in seite.toml, the element was omitted — leaving entries without an author and producing a spec-invalid feed. The feed now falls back to the site title when no author is configured.
Set an explicit author in seite.toml to control the value:
[site]
author = "Your Name"
Tag Link URL Prefix
Tag archive links in the default post.html and posts-index.html templates were incorrectly hardcoded to /blog/tags/{tag}. Tag archive pages are always generated at /tags/{tag} regardless of the collection's url_prefix. The templates now use the correct path, so tag links work for any url_prefix setting.
CLAUDE.md Pagination Example
The CLAUDE.md scaffold generated by seite init and seite upgrade contained two hardcoded /posts/ examples in the Key Conventions section — one for clean URL format and one for pagination. These have been replaced with generic placeholders that won't contradict the actual url_prefix configured for a site. Existing CLAUDE.md files are not affected; run seite upgrade to get the updated scaffold.
v0.8.0
Atom 1.0 Feeds
Every collection with has_rss = true now generates both feed.xml (RSS 2.0) and atom.xml (Atom 1.0). Atom feeds include all required elements per RFC 4287: <updated>, <id>, <author>, and <link rel="self">.
- Per-collection and per-language feeds are generated automatically
- All 10 bundled themes include
<link rel="alternate" type="application/atom+xml">autodiscovery - No configuration changes needed — if you have RSS, you now have Atom too
Redirect Aliases via Frontmatter
Add aliases to any page's frontmatter to create redirects from old URLs:
--- title: My Post aliases: - /old-url - /legacy/path ---
During build, seite generates:
- A lightweight HTML redirect file at each alias path with
<meta http-equiv="refresh">and<link rel="canonical"> - A
_redirectsfile with 301 status codes for Netlify and Cloudflare Pages compatibility
Security: alias paths are validated against path traversal and HTML-escaped in redirect output.
Upgrade Path
seite upgradedocuments the new features in CLAUDE.md for existing projects- Custom
templates/base.htmlusers get a hint to add Atom autodiscovery (bundled themes are updated automatically)
v0.7.0
seite perf — PageSpeed Insights Audit
- New
seite perf [URL]command hits the PageSpeed Insights API and reports Performance score + FCP, LCP, TBT, CLS, and Speed Index — color-coded green/yellow/red - Defaults to
base_urlfromseite.tomlif no URL is provided --strategy desktopflag for desktop audits (default: mobile)--keyflag for a PSI API key (increases rate limit)- Production deploys (
seite deploy) now automatically run a PageSpeed audit on the live URL after deployment
CSS/JS Minification On by Default
seite initnow scaffoldsminify = truein[build]for new sitesseite upgradeaddsminify = trueto existing sites that don't have it set (non-destructive — skips if already configured either way)
Plausible Analytics Deprecation Warning
- Warns at build time when
extensionsis set withoutscript_url— Plausible deprecated the filename-based extension approach in October 2025 - Use
script_urlwith your unique snippet URL from Plausible → Settings → Installation
v0.6.0
Previous / Next Article Navigation
- Post pages now include
prev_postandnext_posttemplate variables linking to adjacent articles in the same collection - Adjacent posts are computed per language, so multilingual sites link within the same language
- Date-based collections link chronologically (newer/older); weight-based collections follow sort order
- Default
post.htmltemplate renders a minimal prev/next nav section - Custom templates can use
prev_post.title,prev_post.url,prev_post.date, andprev_post.description(same fields onnext_post) - New i18n keys
t.prev_postandt.next_postfor translatable labels
v0.5.0
Context Rules (.claude/rules/)
seite initnow generates a lean CLAUDE.md (~160 lines) plus path-scoped.claude/rules/*.mdfiles that Claude loads automatically when working with matching files- 8 always-present rules: SEO requirements, templates, i18n, data files, shortcodes, config reference, features, design prompts
- 2 conditional rules: contact form (when
[contact]configured), trust center (when trust collection present) - Rules use YAML frontmatter with
paths:for automatic scoping (e.g.,templates.mdonly loads when editingtemplates/**) - Follows Anthropic's recommendation of keeping CLAUDE.md under 200 lines for better instruction adherence
Upgrade
seite upgradecreates.claude/rules/files for existing projects (non-destructive — existing CLAUDE.md is not modified)- Post-upgrade hint suggests trimming CLAUDE.md if it's large, since detailed content now lives in rules files
v0.4.5
Bug Fix: File Watcher Rebuild Loop on Linux
- Fixed an infinite rebuild loop in
seite serveon Ubuntu and other Linux systems with strictatime or relatime mount options - The file watcher now ignores metadata-only events (atime updates,
IN_ATTRIB) that are triggered when the build reads files from watched directories - After each build completes, accumulated file events are drained to prevent stale events from immediately triggering another rebuild
- Fix applies to both standalone server and workspace server
v0.10.0
Incremental Builds
The dev server (seite serve) now uses incremental builds. A build cache (.seite/build-cache.json) tracks file modification times and content hashes across builds. When the file watcher triggers a rebuild:
- Nothing changed → build is skipped entirely (no wasted CPU, instant response)
- Only content changed → output directory is preserved, only changed pages are re-rendered (indexes, feeds, sitemap still regenerate — they're fast)
- Template, data, or config changed → full rebuild (correctness requires it)
This means editing a single blog post on a 200-page site no longer rebuilds all 200 pages.
How It Works
BuildCachestores per-file mtimes and FNV-1a content hashes in.seite/build-cache.json- On each rebuild, the cache diffs current file state against the stored snapshot
- Changed content items are re-processed through markdown rendering and template expansion
- Unchanged items keep their existing HTML in
dist/ - The cache is updated after every successful build
What Triggers What
| Change | Effect |
|---|---|
| Content file edited | Rebuild that page only |
| Content file added | Build the new page |
| Content file deleted | Remove from indexes |
| Template changed | Full rebuild |
| Data file changed | Full rebuild |
seite.toml changed | Full rebuild |
| Static file changed | Re-copy that file |
Build Output
The build stats now show whether a build was incremental:
Incremental build 42 posts, 12 docs in 0.3s (5 static files copied, 51 items unchanged)
Notes
seite build(production) always does a full clean build — incremental is dev-server only- Add
.seite/to.gitignoreif not already present (the cache is machine-local) - The cache uses FNV-1a hashing for speed — it's a build cache, not a security mechanism
v0.4.4
Bug Fix: Upgrade Version Stamping
- Fixed
seite upgradenot updating the version in.seite/config.jsonwhen no file-level actions were needed - Previously, if all upgrade step checks found nothing to create/merge/append (e.g., upgrading from 0.4.0 to 0.4.3 with no new upgrade steps), the version would remain at the old value even though the upgrade reported success
- Now the version is always stamped to the current binary version, even when there are no file changes to apply
- Fixed "page" references in upgrade success messages to say "seite"
v0.4.3
Collection Index Pages
- Added support for
content/{collection}/index.md: any collection can now have a custom index page that injects content into the collection's index template as{{ page.content }} - Works identically to how
content/pages/index.mdprovides homepage content, but for any collection - The
index.mdis extracted from the collection listing so it doesn't appear as a regular item - For paginated collections, the
index.mdcontent appears on page 1
Docs Index Template
- New default
docs-index.htmltemplate: docs collections now get a dedicated index page with sidebar navigation, matching individual doc pages - When
content/docs/index.mdexists, it renders as the landing page with full sidebar - When no
index.mdexists, auto-generates a section overview grouped by subdirectory - Sidebar nav (
{{ nav }}) is now passed to all collection index templates (both paginated and non-paginated), not just individual pages
Redirect Support
- Collection index pages now support
extra.redirect_toin frontmatter: set a URL to redirect/docs/to a specific doc page (e.g.,/docs/getting-started) - Works for both regular collection indexes and subdomain roots
- Generates an instant HTML redirect (meta refresh + JavaScript)
Subdomain Root Pages
- Subdomain collections now support root pages via
content/{collection}/index.md: e.g.,content/docs/index.mdrenders atdocs.example.com/ - Subdomain roots also support
redirect_tofor routing to a specific page
v0.4.2
Configuration
- Added
subdomain_base_urlfield on collections: explicit URL override for subdomain deploys (e.g.,subdomain_base_url = "https://docs.example.com"avoids thewwwprefix issue whenbase_urlishttps://www.example.com)
Developer Experience
- Dev server preview hints now show the resolved subdomain URL (including explicit overrides)
- Validation rejects
subdomain_base_urlwithoutsubdomainand non-HTTP URLs
v0.4.1
AI Integration
- MCP
seite://contentnow includessubdomain,subdomain_url, anddeploy_projectfields per collection - MCP
seite_buildresponse includessubdomain_buildsarray with collection name, subdomain, base URL, and output directory
Developer Experience
seite initscaffolded CLAUDE.md now documents subdomain collections (base URL, preview path, deploy project) and includesdist-subdomains/in project structureseite upgradeadds Subdomain Deploys section to CLAUDE.md anddist-subdomains/to .gitignore for existing projects upgrading to 0.4.x- Config reference scaffold documents
subdomainanddeploy_projectcollection fields - Features scaffold lists subdomain deploys
v0.4.0
Build Pipeline
- Per-collection subdomain support: set
subdomain = "docs"on a collection to build it intodist-subdomains/docs/with its own sitemap, RSS, robots.txt, llms.txt, and search index - Cross-subdomain link rewriting: internal links targeting subdomain collections are automatically rewritten to absolute URLs (e.g.,
/docs/setupbecomeshttps://docs.example.com/setup) - Reverse link rewriting for subdomain sites: links from subdomain content back to main-site collections resolve to absolute main-site URLs
Deploy
- Subdomain collections deploy independently to their own Cloudflare Pages or Netlify projects via per-collection
deploy_projectconfig seite deploy --setupauto-creates Cloudflare/Netlify projects for subdomain collections ({main-project}-{subdomain}naming) and writesdeploy_projectback to seite.toml- Dry-run output now shows subdomain deploy plan alongside main site
- GitHub Pages warning when subdomain collections are configured (subdomains not supported on GH Pages)
- Workspace deploy detects cross-site domain conflicts (e.g., subdomain overlapping another site's base_url)
Developer Experience
- Dev server previews subdomain content at
/{name}-preview/paths .gitignorenow includesdist-subdomains/for new projects- Config validation rejects duplicate subdomain values across collections
v0.3.3
Further build pipeline optimizations: eliminate redundant file walks and per-page allocations.
- Link checking folded into post-process pass: internal link validation now runs during the existing HTML post-processing walk instead of a separate file read pass
- Cached i18n context per language: the 37-key UI strings JSON object is now built once per language instead of reconstructed on every page render
- Hoisted shortcode site context: the identical
sc_siteJSON is pre-computed once instead of rebuilt per page during content processing - Removed redundant string clone:
expanded_body.clone()eliminated when math rendering is disabled
1k pages cold build: ~357ms → ~275ms on Apple M4 Pro (cumulative from v0.3.1: ~443ms → ~275ms, 38% faster).
v0.3.2
Parallelize the build pipeline with rayon and consolidate HTML post-processing for faster builds.
- Rayon parallelism across content processing (5x faster), image processing (3x faster), page rendering, markdown output, and HTML post-processing
- Single-pass HTML post-processing: image srcset rewriting, code copy button injection, base path URL rewriting, and analytics injection now run in one read-transform-write pass instead of four separate file walks
- New
bench/profile.shfor flamegraph profiling with samply - Enhanced
bench/run.shwith per-step timing capture and--with-imagesflag
1k pages cold build: ~443ms → ~357ms on Apple M4 Pro.
v0.3.1
Fix Windows build by switching KaTeX from quick-js to duktape backend. The quick-js JavaScript engine does not support Windows targets, causing release builds to fail.
v0.3.0
4 New Bundled Themes
- Landing: Light SaaS landing page theme with Fraunces/Outfit fonts. Hero section, feature cards with accent borders, 4-column stats grid, testimonial blocks, asymmetric post grid
- Terminal: Dark terminal aesthetic with IBM Plex Mono, green accent (
#00ff41), scanline effects, blinking cursor, monospace throughout - Magazine: Editorial newspaper theme with Playfair Display/Source Serif 4/DM Sans. 3-column article grid, full-width lead article, editorial masthead with diamond dividers
- Academic: Tufte-inspired scholarly theme with EB Garamond serif. Narrow reading column (60%), small-caps section headings, sidenote-style footnotes, section symbols
2026 Design Refresh for All Themes
Every bundled theme upgraded with:
- Google Fonts: Each theme gets a distinctive typeface: Outfit (default), Lora (minimal), Sora (dark), IBM Plex Sans/Mono (docs), Archivo + DM Mono (brutalist), Manrope (bento)
- Homepage content styles: Rich
.homepage-contentCSS for landing pages with styled headings, stat grids, blockquotes, and feature lists - Safe DOM search: Search JavaScript rewritten to use
createElement/textContent/appendChildinstead ofinnerHTML
Math/LaTeX Rendering
- New
math = trueoption in[build]config enables server-side KaTeX rendering $inline$and$$display$$math delimiters are rendered to HTML during the markdown pipeline- KaTeX CSS automatically loaded from CDN when math is enabled
- Code blocks and inline code spans are correctly skipped
- All 6 bundled themes include conditional KaTeX CSS and
.katex-displayoverflow handling - Available when built with the
mathfeature flag (enabled by default)
AVIF Image Format
- New
avif = trueoption in[images]config enables AVIF variant generation - Configurable AVIF quality via
avif_quality(default: 70, since AVIF compresses better than WebP) - AVIF source inputs (
.aviffiles) now accepted in the image pipeline <picture>elements emit<source type="image/avif">before WebP for optimal compression- Uses the
imagecrate'sravifbackend for pure-Rust AVIF encoding
SEO/GEO Improvements
- Skip
loading="lazy"on first image per page to preserve LCP performance - Improved AI crawler management in
robots.txt: allow search crawlers, block training crawlers
Fixes
- Fixed
test_self_update_checkintegration test that failed without network access: now uses--target-versionto avoid network dependency in CI
v0.2.4
Brand Identity Builder Skill
- New
/brand-identityskill scaffolded for every site onseite initandseite upgrade - 5-phase guided workflow: brand discovery, color palette design, SVG logo creation, favicon generation, and optional theme integration
- Color palette saved to
data/brand.yaml: available in templates as{{ data.brand.colors.primary }} - Output files:
static/logo.svg,public/favicon.svg,public/favicon.ico(optional),data/brand.yaml - Skill versioning via
# seite-skill-version: 1for automatic updates on future releases
v0.2.3
Plausible Analytics Extensions
- New
extensionsfield in[analytics]config for Plausible script extensions: enablestagged-events,outbound-links,file-downloads, and other Plausible extensions - Extensions are appended to the script filename automatically (e.g.,
script.tagged-events.outbound-links.js) - When
script_urlis set, extensions are ignored: full control stays with the user - Works with both direct injection and cookie consent banner modes
seite.sh Conversion Tracking
- Enabled
tagged-events,outbound-links, andfile-downloadsextensions on seite.sh - Added conversion events to homepage CTAs:
GetStarted,ViewGitHub,CopyInstall,CopyQuickstart,GetStartedCTA,ViewGitHubCTA
Image Processing
- PNG encoding now uses
CompressionType::Bestwith adaptive filtering instead of the default fast compression: resized PNGs are significantly smaller without any loss in quality - Previously, the
imagecrate's defaultCompressionType::Fastproduced poorly compressed PNGs, often larger than well-optimized source files
v0.2.2
Image Processing
- JPEG encoding now respects the
qualitysetting in[images]config (previously used default quality) - WebP encoding switched from lossless-only (
imagecrate) to lossy vialibwebp(webpcrate), producing significantly smaller files at the configured quality level - PNG encoding unchanged (lossless by nature, quality setting does not apply)
v0.2.1
Build Pipeline
- Added
public/directory support: files inpublic/are copied to the output root (dist/) before generation, enablingfavicon.ico,.well-known/,_redirects, and other root-level files without the/static/prefix - Conflict warnings when a
public/file would be overwritten by a generated file (e.g.,robots.txt,sitemap.xml) - New
public_dirconfig option in[build]section (defaults to"public") - Dev server and workspace server now watch the
public/directory for changes
Themes
- Added
<link rel="icon" href="/favicon.ico">to all 6 bundled themes - Added
title="Markdown"attribute to the markdown alternate link in all themes - Fixed
og:imageandtwitter:imageURLs: relative image paths are now absolutized withbase_urlduring build so social previews work correctly
Developer Experience
seite initnow creates apublic/directory alongsidestatic/anddata/seite upgradecreatespublic/for existing projects upgrading to v0.2.1- Link checker skips
/favicon.icosince it's theme-injected and the file is optional
v0.1.0
Initial public release.
Build Pipeline
- 13-step build pipeline producing HTML, markdown, RSS, sitemap, search index, and LLM discovery files
- Image processing: auto-resize to configured widths, WebP conversion,
srcset/<picture>injection,loading="lazy" - Asset pipeline with CSS/JS minification (
build.minify) and fingerprinted filenames (build.fingerprint) - Pagination with configurable items per page, generates
/posts/,/posts/page/2/, etc. - Tag pages: auto-generated
/tags/index and/tags/{tag}/archives - Table of contents auto-generated from heading hierarchy with anchor IDs
- Excerpts via
<!-- more -->marker or auto-extracted from first paragraph - Reading time (238 WPM) and word count on every page
- Internal link validation at build time
- 404 page auto-generated from
404.htmltemplate
Content
- 6 collection presets: posts, docs, pages, changelog, roadmap, trust center
- 5 built-in shortcodes:
youtube,vimeo,gist,callout,figure: plus user-defined shortcodes fromtemplates/shortcodes/ - Data files (YAML/JSON/TOML from
data/directory) injected into template context as{{ data.filename }} - Multi-language (i18n) with filename-based translations, per-language URLs, RSS feeds, sitemaps, hreflang tags, and language switcher UI
extra:frontmatter field for arbitrary key-value data accessible in templates- Draft exclusion with
--draftsflag to include during development
Themes
- 6 bundled themes: default, minimal, dark, docs, brutalist, bento
- AI-generated custom themes via
seite theme create "<description>"(requires Claude Code) - Theme install from URL (
seite theme install <url>) and export for sharing (seite theme export <name>) - All themes include SEO meta tags, Open Graph, Twitter Cards, JSON-LD structured data, accessibility features, and i18n support
AI Integration
seite agentspawns Claude Code with full site context: content inventory, frontmatter format, template list, available commandsseite agent "prompt"for non-interactive one-shot content generation- MCP server (
seite mcp) with 5 tools and 6+ resources for AI tool integration, auto-started by Claude Code - Every site ships
llms.txt,llms-full.txt, and raw markdown alongside HTML seite initgenerates.claude/CLAUDE.mdwith comprehensive site context for AI agents
Deploy
- GitHub Pages, Cloudflare Pages, and Netlify, all built in
- Guided setup via
seite deploy --setup(creates repos/projects, configures auth, generates CI workflows) - Pre-flight checks validate output dir, base_url, CLI tools, git state before deploying
--dry-runpreview,--previewfor staging/branch deploys- Custom domain management with DNS record display and auto-attachment
- Post-deploy verification (homepage 200, robots.txt, sitemap.xml, llms.txt reachability)
- Auto-commit and push before deploy with
auto_commit = true
Developer Experience
- Interactive dev server with REPL (new, agent, theme, build, status, stop) and live reload
- Analytics support: Google Analytics, GTM, Plausible, Fathom, Umami, with optional cookie consent banner
- Multi-site workspaces (
seite-workspace.toml) with unified dev server and per-site deploy - Collection management:
seite collection add <preset>andseite collection list - Project metadata and upgrades:
.seite/config.jsontracks version,seite upgradeapplies version-gated changes - Self-update from GitHub Releases with SHA256 checksum verification
- Shell installer for macOS/Linux (
curl | sh), PowerShell installer for Windows