Templates sind jetzt Plugins. Das erste offizielle Template, Summer, wird zusammen mit zwei neuen optionalen UI-Features ausgeliefert — Cookie-Zustimmung und eine Ankündigungsleiste — direkt eingebaut in @docmd/ui. Außerdem enthält dieses Release einen Docker-:latest-Fix, damit der Quickstart out of the box funktioniert, sowie eine Reihe weiterer Härtungs-Fixes nach der Veröffentlichung (siehe unten).

✨ Was ist neu

Templates sind jetzt Plugins

Ein Template-Paket deklariert capabilities: ['template'] und liefert Layout-Overrides sowie eigene CSS/JS. Der neue Resolver prüft vier Ebenen und fällt auf jeder Stufe auf den Standard zurück:

frontmatter.template  →  config.templates[glob]  →  config.theme.template  →  eingebauter Standard
// template-summer/index.js
export default {
  plugin: { name: 'template-summer', version: '0.1.0', capabilities: ['template'] },
  templates: [
    { type: 'layout', templatePath: '...' },
    { type: 'sidebar', templatePath: '...' },
  ],
  templateAssets: [
    { type: 'css', path: '.../summer.css', priority: 10, position: 'head' },
  ],
};

Templates können jeden der 14 unterstützten Slots überschreiben (layout, 404, sidebar, header, footer, banner, cookie-consent und weitere) und können pro Seite über Frontmatter oder seitenweit über die Config gesetzt werden. Das customCss des Nutzers hat immer Vorrang — Templates dürfen kein !important verwenden.

Templates — Architektur & Authoring-Guide

☀️ Summer — das erste offizielle Template

Ein helles, luftiges Layout mit Suchleiste oben, sanften Halo-Akzenten und einem dichteren Karten-Raster.

docmd add summer       # installiert und schaltet die Config um
docmd remove summer    # kehrt zum Standard zurück

Im Standard-UI eingebaut. Deaktiviert, bis Sie ihn aktivieren.

{
  "cookie": {
    "enabled": true,
    "message": "We use cookies to ensure you get the best experience.",
    "policyUrl": "/privacy",
    "position": "bottom-right",
    "expiryDays": 180
  }
}

Löst bei Auswahl ein docmd:cookie-consent-Event aus, auf das Plugins und Templates reagieren können.

📢 Seitenweite Ankündigungsleiste

Sitzt über der Menubar. Unterstützt Inline-Markdown oder rohes HTML.

{
  "layout": {
    "banner": {
      "content": "**v0.9 erscheint am Freitag** — lesen Sie die Ankündigung.",
      "type": "info",
      "link": { "text": "Mehr lesen", "url": "/blog/v0-9" }
    }
  }
}

Der Schließ-Zustand wird pro Session gespeichert, sodass die Leiste bei einem neuen Besuch wieder erscheint.

Behoben

Problem Lösung
Docker-:latest-Tag wurde nie veröffentlicht Der Workflow versieht Releases jetzt automatisch mit dem :latest-Tag
Quickstart stürzte bei leerem /docs in Docker ab Der Entrypoint seedet /docs aus dem mitgelieferten Template, wenn leer
Docker-Healthcheck meldete stets „unhealthy" Prüft jetzt die Ports 3000–3005, um der Auto-Inkrementierung des Dev-Servers zu folgen
i18n-Strings wurden in Sidebar/Nav-Partials nicht übersetzt t() wird jetzt an alle Layout-Partials übergeben; 13 fehlende Schlüssel in allen 7 Sprachen ergänzt
Code-Kopierschaltfläche schwebte über dem Code-Block Die Schaltfläche verankert sich nun am äußeren Wrapper statt an einem inneren
Mermaid-Diagramme brachen bei SPA-Navigation (nicht bei vollem Reload) Plugin-<script>-Tags werden nun bei jedem Seitenwechsel ins Live-DOM synchronisiert, nicht nur beim ersten Laden
Sidebar-Gruppen mit echten Links wurden nur erweitert, nie navigiert Der Klick-Handler matcht nun auch echte Links, nicht nur das Toggle-Icon
appearance: "system" bewirkte nichts Das Default-Theme-Partial liest nun DOCMD_APPEARANCE (den kanonischen Namen) und übernimmt localStorage nur dann, wenn es einen konkreten Light/Dark-Wert enthält
Nicht-englische Suchergebnisse sprangen an den Seitenanfang statt zur Überschrift Der semantische Such-Client verwendet nun eine Unicode-bewusste Slug-Reguläre, passend zum Parser-seitigen Generator (behebt Chinesisch, Japanisch, Koreanisch, Kyrillisch, Diakritika)
Dev-Server baute alle paar Sekunden ohne Änderungen neu auf Ein neuer Inhalts-Signatur-Tracker ignoriert Phantom-fs.watch-Events von Spotlight/iCloud/Time Machine; der Config-Watcher beobachtet nun das übergeordnete Verzeichnis statt der Datei selbst
tag-Container akzeptierte weder Anführungszeichen-URLs noch das external:-Präfix Die Parser-Reguläre unterstützt nun "..." und '...' um Optionswerte; url: ist der kanonische Eigenschaftsname, link: bleibt als Alias erhalten

Verbessert

  • Sinnvolle Config-Defaults — eine frische docmd.config.json (oder gar keine Config) liefert jetzt eine voll ausgestattete Site: Seitennavigation, Code-Kopierschaltflächen, Brotkrumen, Suche, Theme-Switch und mehr sind alle standardmäßig aktiv. Vollständige Defaults-Tabelle →
  • Bedingtes Laden von Plugin-Assets — Plugins können jetzt eine condition für ihre Assets deklarieren, sodass JS/CSS nur auf Seiten geladen werden, die sie tatsächlich benötigen. Auf dem Playground verifiziert: Mermaids ~500 KB Bibliothek wird nun auf 3/11 Seiten geladen (vorher 11/11) und KaTeX’ ~30 KB CSS auf 1/1 Mathe-Seite (vorher 11/11).
  • Schlankere UI — Header- und Menubar-Höhe von 52px auf 44px reduziert; kleinere Heading-Anchor-Icons; dichteres Karten-Raster.
  • Neue Standard-404-Seite — Glaskarten-Layout mit weichem Halo-Hintergrund, Aktionen „Return Home" / „Go Back", vollständig übersetzt und RTL-fähig.
  • Kontrast-Pass — Text- und Link-Farben in Light- und Dark-Theme wurden angepasst, um WCAG AA zu erfüllen.
  • Aktiver Sidebar-Link neu gestaltet — eine „Knoten-am-Faden"-Pille ersetzt den alten linken Rand.
  • Tastatur-Fokus ist jetzt sichtbar:focus-visible erhält seitenweit einen Halo-Glow.
  • Schritt-Permalinks — jedes <li> in einer docmd-Steps-Liste trägt nun eine global eindeutige id="step-N" und ein verstecktes Link-2-Icon, das bei Hover oder Fokus eingeblendet wird, sodass sich einzelne Schritte leicht teilen und direkt verlinken lassen.
  • Changelog-Eintrags-Permalinks — spiegelt das Schritt-Permalink-Muster: jedes Changelog-Eintragsdatum trägt nun eine id und ein verstecktes Link-2-Icon, das bei Hover eingeblendet wird, sodass sich einzelne Releases leicht teilen und direkt verlinken lassen.
  • --verbose ist nun universell — zuvor nur von add/remove beachtet. Setzt nun DOCMD_VERBOSE=true in der Umgebung, sodass jeder Unterbefehl (build, dev, live, init, validate) auf ausführliche Logs opt-in kann, und wird zusätzlich an buildSite und buildLive für den strukturierten Pfad weitergereicht.
  • Docker-Image funktioniert ohne weitere Einrichtungdocker run ghcr.io/docmd-io/docmd:latest seedet jetzt automatisch eine Demo-Site; kein Volume-Mount erforderlich.
  • Sidebar-Nav-Doppelklick-Bug — das Haupt-UI-Skript konnte unter bestimmten Serving-Bedingungen doppelt geladen werden, wodurch Klick-Handler zweimal feuerten und der Nav-Zustand stecken blieb. Jetzt gegen Doppel-Ausführung geschützt.
  • xdg-open-Absturz im Dev-Server — eine fehlende Browser-Start-Binary bringt docmd dev nicht mehr zum Absturz.
  • Fehlende Runtime-Dependency in @docmd/plugin-searchmarkdown-it war fälschlicherweise als dev-only gelistet; die Plugin-Installation funktioniert nun auf Anhieb.
  • Docker-Tags vereinfacht — Releases veröffentlichen jetzt genau zwei Tags: die Versionsnummer und :latest.

Ausblick — Node 20+ in v0.9.0

Das nächste Minor-Release hebt den Floor auf Node.js 20+ (von 18+) an und bringt die Engine-Anforderung, die ausgelieferte Docker-Laufzeit und die CI-Umgebung alle auf Node 22. Node 18 ist im April 2025 EOL gegangen; so bleibt docmd auf einer unterstützten Laufzeit mit ausreichend Puffer.

Dieses Release (0.8.7) ist nicht betroffen — der >=18-Floor bleibt bestehen, bis 0.9.0 erscheint.

Jetzt (0.8.x) Nächste (0.9.0)
Minimum Node 18+ 20+
Docker-Basis 20-alpine 20-alpine
Type Node ^24 ^24
CI-Ziel 24 24

Skills-Update (docmd-skills@1.1.0)

Skills wurden mit 0.8.7 auf 3 spezialisierte Skills aktualisiert, die zusammenarbeiten. Der Agent wählt automatisch den relevantesten Skill basierend auf der aktuellen Aufgabe und dem Kontext aus, was den Token-Verbrauch reduziert und gleichzeitig die Genauigkeit erhält.

npx docmd-skills [dir]

Ersetzen Sie [dir] durch das Verzeichnis, in dem Sie Agent-Skills ablegen — gängige Optionen sind ~/.claude/skills/, ~/.cursor/skills/ oder ein projektlokaler Ordner wie ./.skills/.