The docmd 0.7.8 release introduces the Git plugin for repository-aware metadata, a completely redesigned terminal interface with live progress feedback, parallel page processing for dramatically faster builds, automatic plugin installation for official plugins, and container syntax compatibility for users migrating from other documentation engines.
✨ Highlights
Build Engine - Parallel Processing
The page rendering pipeline has been redesigned from sequential to batched parallel processing, delivering significant speedup on documentation sites of all sizes.
What changed:
- Batched file I/O: Files are now read 64 at a time and written 128 at a time via
Promise.all, instead of one-by-one sequential reads - Pipeline overlap: File reading, markdown parsing, and HTML writing phases now overlap across batches
- Parallel writes: All rendered HTML files are written to disk concurrently in batches instead of sequentially
Projected performance (simple pages):
| Scale | Before (0.7.7) | After (0.7.8) | Improvement |
|---|---|---|---|
| ~1,000 pages | ~22s | ~12s | ~45% faster |
| ~10,000 pages | ~4 min+ | ~1.5 min | ~60% faster |
| File read phase | Sequential | 64-file batches | 64x concurrency |
| File write phase | Sequential | 128-file batches | 128x concurrency |
| Progress feedback | None (silent) | Live progress bar | Real-time |
The performance improvement scales with documentation size. Larger sites (1,000+ pages) with heavy I/O benefit the most from batched parallel processing.
Terminal Interface - Unified TUI
All terminal output has been redesigned into a unified, high-signal design system shared across every command. No more silent waits, inconsistent formatting, or cluttered multi-line output.
New TUI primitives:
| Feature | Description |
|---|---|
| Progress bar | ━━━━━━━━━━━━───────── 42/100 (42%) - single-line, updates in-place |
| Spinner | ⠋ ⠙ ⠹ - braille-dot animation during long operations |
| Timer | Every build, rebuild, and project shows elapsed time |
| Sections | Consistent ┌─ Section / └── framing across all commands |
Unified output across all commands:
Commands unified:
docmd build- section header with source/output/versions/locales, progress bar, timingdocmd dev- animated spinner during initial build and rebuilds, timing per-rebuild- Multi-project builds - per-project spinner animation, per-project timing, total summary
docmd live- consistent section framing matching all other commands
Git Plugin
The new Git plugin brings repository-aware metadata to your documentation pages, last-updated timestamps, commit history tooltips, and edit links, all derived directly from your Git history with zero configuration.
// Configure edit links
plugins: {
git: {
repo: 'https://github.com/your-org/docs',
branch: 'main'
}
}
Features:
- Last Updated Timestamps: Shows when each page was last modified, using relative formatting for recent changes
- Commit History Tooltip: Hover to see recent commits with author names and messages
- Edit Links: Automatically constructs “Edit this page” links for GitHub, GitLab, and Bitbucket
- Graceful Degradation: Automatically disables itself if the project is not in a Git repository
The plugin replaces the legacy editLink configuration option with a more feature-rich alternative.
See the Git plugin documentation for full details.
Auto-Installation for Official Plugins
Official plugins listed in your docmd.config.js are now automatically installed if missing. When you add a plugin to your config that isn’t installed, docmd downloads it from npm on the next build.
// docmd.config.js
plugins: {
pwa: {}, // Not installed? docmd auto-installs it
threads: {} // Same here
}
Security features:
- Only works for official
@docmd/plugin-*packages in the registry - Installs the exact version matching your
@docmd/coreversion - Uses your project’s package manager (npm, pnpm, yarn, or bun)
- Shows progress in the terminal
Container Syntax Compatibility
Users migrating from VitePress, Docusaurus, or similar documentation engines can now use familiar container syntax without modification.
VitePress-style containers now work:
:::tip
This renders as a tip callout.
:::
:::warning
This renders as a warning callout.
:::
:::details Click to expand
This renders as a collapsible section.
:::
Docusaurus-style containers now work:
:::note
This renders as an info callout.
:::
:::caution
This renders as a warning callout.
:::
Additionally, spaceless syntax is now supported for all containers:
:::callout info
Works the same as ::: callout info
:::
:::tabs
Works the same as ::: tabs
:::
This allows documentation to be migrated from other engines with minimal changes.
Migration-Friendly Aliases
| Alias | Maps To | Origin |
|---|---|---|
:::tip |
callout tip |
VitePress |
:::warning |
callout warning |
VitePress |
:::danger |
callout danger |
VitePress |
:::info |
callout info |
VitePress |
:::details |
collapsible |
VitePress |
:::note |
callout info |
Docusaurus |
:::caution |
callout warning |
Docusaurus |
These aliases work silently alongside the standard docmd syntax. Your existing documentation continues to work unchanged, whilst imported content from other engines renders correctly.
Internal Improvements
British English Standardisation
Documentation has been updated to use British English spelling consistently throughout. This includes terminology like “optimised”, “centralised”, “localisation”, and “colour” where appropriate.
Code Quality
- Replaced em-dashes with standard hyphens across documentation and code comments for improved readability
- Standardised comment formatting in source files
- Improved TypeScript type definitions for plugin APIs
📝 Complete Changelog
Features
- Git Plugin (Core): New core plugin for last-updated timestamps, commit history, and edit links with graceful degradation
- Auto-Install: Official plugins in config are automatically installed if missing
- Container Aliases: VitePress and Docusaurus container syntax now works out of the box
- Spaceless Containers: All containers now accept syntax with or without space after
::: - Parallel Processing: Batched file I/O with 64-file read and 128-file write concurrency
- Unified TUI: Progress bar, spinner, timer, and consistent section output across all commands
Improvements
- Build Performance: Up to ~60% faster builds on large sites through parallel I/O batching
- Live Progress: Real-time progress bar during page processing
- Animated Spinners: Visual feedback during builds, rebuilds, and multi-project processing
- Build Timing: Every operation reports elapsed time
- Git Widget UI: Tooltip uses CSS
:hover/:focus-withinfor smooth, jitter-free display - Code Block Styling:
docmd-code-block-wrappernow uses the universal--shadow-smvariable, matching all other container blocks - Live Editor TUI: Unified section framing and graceful shutdown
- Documentation: British English spelling standardisation
- Code Style: Consistent formatting across codebase
- Plugin Registry: Added Git plugin to official registry
Deprecations
- editLink Config: The standalone
editLinkconfiguration option is deprecated in favour of the Git plugin
Migration Guide
Adopting the Git Plugin
If you were using the editLink configuration, replace it with the git plugin. The new approach is smarter, it automatically detects your git repository root and computes the correct file path, so you no longer need to hardcode a directory in the URL.
Before (deprecated):
export default defineConfig({
editLink: {
enabled: true,
baseUrl: 'https://github.com/org/repo/edit/main/docs' // ← hardcoded dir
}
});
After:
export default defineConfig({
plugins: {
git: {
repo: 'https://github.com/org/repo', // ← just the repo, no path needed
branch: 'main'
}
}
});
The plugin resolves the correct file path relative to the git root automatically. This means edit links work correctly in monorepos and multi-project setups without any manual path configuration.
Additional options:
| Option | Default | Description |
|---|---|---|
repo |
- | Repository URL (any provider) |
branch |
'main' |
Branch to link to |
editPath |
'edit' |
URL segment for edit page. Use '-/edit' for GitLab, 'src' for Bitbucket |
editLink |
true |
Set false to disable the edit link |
editLinkText |
i18n string | Custom label for the edit link |
For Users Migrating from Other Engines
If you are importing documentation from VitePress, Docusaurus, or similar engines:
- Your existing
:::tip,:::warning,:::notecontainers will render correctly - Spaceless syntax like
:::tabsworks alongside the standard::: tabs - No changes to your markdown files are required
We recommend gradually transitioning to the standard docmd syntax (::: callout tip) for new content, as it provides more flexibility with titles and icons.