Notable changes to Sarde, grouped by release. Bug fixes, new features, and breaking changes are listed separately within each release.
1.0.0 - 2026-07-24
The first stable release. Everything below has accumulated since the 0.1.x previews.
Breaking
- The
static/project directory is renamed topublic/. Files placed inpublic/are copied as-is to the output directory, exactly asstatic/worked before. Rename your project'sstatic/directory topublic/before your next build.
Fixed
- Frontmatter date fields (
date,updated,publish_date,expiry_date) may now be left empty. An empty value means "not set" instead of aborting the build, which is what an editor writes when a date field is cleared. - Frontmatter parse errors now name the file they came from, instead of reporting a bare parse failure with no location.
- Page cache now re-validates link targets on every build, even for cached pages. Warm builds report the same link coverage as cold builds, and renaming a linked page is detected without editing the source file.
- Custom heading IDs (
## Heading {#custom-id}) are now preserved. Previously, all heading IDs were overwritten with auto-generated slugs, causing links to custom anchors to be falsely reported as broken. - The
site.heading_linksconfig option is now functional. It controls whether clickable anchor links appear next to headings. Heading IDs are always assigned (required by the TOC, search, and link validation), but the visible anchor element is now toggled by this setting. - Content lint rules no longer trigger false positives inside fenced code blocks or inline code spans. Example syntax shown in documentation (e.g.,
in a code block) is skipped. - Content lint line numbers now match the source file on disk. Previously, line numbers were offset by the frontmatter block's height.
- The
same_site_policylink validation option works correctly on incremental rebuilds.
Improved
- Multi-language sites reuse taxonomy structures on body-only incremental rebuilds, skipping redundant taxonomy and data file processing per language.
- WebSocket hub uses ping/pong keepalive (30-second interval) to detect stale connections.
- Unchanged headings are reused during incremental rebuilds, and link validation is scoped to changed pages only.
Added
- External plugin system: install declarative
plugin.yamlpackages intoplugins/<slug>/withsarde plugin install, supporting conditional CSS/JS injection, template contributions (partials, components, shortcodes), and asset copying to the build output. No plugin code executes at build time. - New
plugins.disabledconfig list that turns off any plugin (built-in, client-side, or external) without replacing theplugins.enabledlist. - Offline license verification for premium external plugins, managed with
sarde license installandsarde license list. A missing or invalid license deactivates the plugin with a warning; the build never fails. - Announcement banners plugin with three display modes (stack, first, rotate), date scheduling, page targeting via glob patterns, and i18n message resolution.
- Social card auto-generation (1200x630 PNG/JPEG) with theme-aware colors, Inter font embedding, and title auto-sizing.
llms.txtgeneration for LLM discoverability, with optional blog content exclusion.- RTL CSS layout support.
- Language switcher and fallback notice components for multi-language sites.
- Tab state persistence across page navigation via
localStorage. - Collapsible sidebar groups with
collapsed_by_defaultconfiguration. - Mobile sidebar drawer.
- 16 client-side plugins: scroll to top, copy section link, external links, image lightbox, focus mode, reading progress, reading preferences, reading position memory, search highlighter, text highlighter, and last updated badge.
- 24 Markdown extensions: aside, accordion, badges, cards, details, figure, file tree, gallery, image compare, link buttons, link card, math, mermaid, steps, tabs, terminal, timeline, video, annotation, copy text, highlight, icon, kbd, and spoiler.