Releases: LitMDX/litmdx
Release list
v0.4.0
Changelog
All notable changes to the LitMDX monorepo are documented here.
This changelog tracks the state of the overall project — docs, template, workspace
and the integration between packages. Individual package changelogs are maintained
separately in each packages/*/CHANGELOG.md.
The format follows Keep a Changelog.
Versioning follows Semantic Versioning.
[0.4.0] — Unreleased
Summary
Internal refactoring for maintainability: separation of concerns in
packages/cli/src/search/ and packages/cli/src/vite/, plus a significant
expansion of the test suite (30 → 32 test files, 613 → 625 tests passing).
No user-facing behaviour changes.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.2.0 |
litmdx |
0.4.0 |
create-litmdx |
0.1.7 (unchanged) |
Added
Environment variable support for agent config (@litmdx/core)
resolveAgentConfignow readsLITMDX_AGENT_URLas a fallback for
agent.serverUrlbefore defaulting tohttp://localhost:8000.
Priority:agent.serverUrlin config →LITMDX_AGENT_URLenv var → default.
Docs site env vars (litmdx.dev)
litmdx.config.tsnow readsLITMDX_SITE_URL,LITMDX_GITHUB_URL, and
LITMDX_AGENT_URLfrom the environment instead of hardcoded values..env.exampleadded to the repo root documenting all three variables.
Changed
SoC refactoring — packages/cli/src/search/ (litmdx)
- Extracted
src/search/mdx-parser.ts— pure functionparseMdxSource(source, fallbackName)that handles frontmatter extraction and prose cleaning.
Previously duplicated betweendocs-index.tsandpagefind-index.ts. - Extracted
src/search/route-resolver.ts— pure functions
resolveDocRoute,resolveIndexedRoutes,isMultiSectionMode, and
rewriteHomeRoutesshared by both indexers. Previously duplicated between
the two files. src/search/docs-index.tsslimmed to I/O + orchestration only:
walkMdx → parseMdxSource → resolveDocRoute → writeFileSync.src/search/pagefind-index.tsslimmed to Pagefind API wiring only,
delegating all parsing and routing to the shared modules.src/search/index.tsbarrel unchanged — public API unaffected.
SoC refactoring — packages/cli/src/vite/ (litmdx)
- Extracted
src/vite/plugins/docs-index-middleware.ts— the
docsIndexMiddlewarePlugin(docsDir)Vite plugin that serves
/docs-index.jsonduring dev is now a standalone file alongside the other
plugins underplugins/. - Extracted
src/vite/user-config.ts—loadUserConfig(root)has its own
module with single responsibility: read and returnlitmdx.config.tsvia
Vite'sloadConfigFromFile. Previously inlined inconfig.ts. src/vite/config.tsis now a pure assembler: imports plugins and
loadUserConfig, only exportsbuildViteConfig.src/vite/index.tsbarrel updated to re-exportloadUserConfigfrom
user-config.jsdirectly (backward-compatible —build.tsimport unchanged).
Documentation fix (@litmdx/core → 0.2.0)
- JSDoc comment on
ResolvedAgentConfig.serverUrlcorrected: previously stated
the field was "NOT sent to the browser" which was inaccurate — the entire
ResolvedAgentConfigis serialized intovirtual:litmdx-config. The field
is not a secret (it is a URL) but the comment was misleading. - Version bumped to
0.2.0to reflect the agent config integration
(AgentConfig,ResolvedAgentConfig,resolveAgentConfig) introduced in
previous sessions.
Tests
tests/search/mdx-parser.test.ts— 20 unit tests forparseMdxSource
(pure function, no mocks needed).tests/search/route-resolver.test.ts— tests for all four route resolver
functions covering single-section, multi-section, and home rewrite scenarios.tests/vite/plugins/docs-index-middleware.test.ts— 8 tests covering plugin
shape, middleware registration (including failure path), response headers, and
response body.tests/vite/user-config.test.ts— 4 integration tests forloadUserConfig:
absent config, basic fields, full fields, empty export.tests/commands/init.test.ts— 27 tests forinitCommandcovering
scaffolding, file writes, directory creation, and error paths.tests/commands/build.test.ts— 21 tests forbuildCommandcovering
conditional Pagefind, docs-index, sitemap, and robots invocations.
[0.3.0] — Unreleased
Summary
SEO per-page metadata (roadmap item 5), automatic robots.txt generation,
Core Web Vitals improvements (lazy images, logo preload, async decoding,
per-route canonical on SPA navigation), Structured Data / JSON-LD support,
mobile-first UI polish, and two publish-pipeline bug fixes from the previous
unreleased patch.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.2.0 |
litmdx |
0.3.2 |
create-litmdx |
0.1.7 (unchanged) |
Added
Per-page SEO metadata (litmdx)
imagefrontmatter field — absolute URL to a page-specific Open Graph image.
OverridesopenGraph.imagefrom config for that route only. During
litmdx build, injects<meta property="og:image" content="...">into the
prerendered HTML for the matching route.noindexfrontmatter field — whentrue, injects
<meta name="robots" content="noindex">into the prerendered HTML for that
route. Useful for internal drafts or pages not ready for public indexing.PrerenderHeadextended withogImageandnoindexfields so both values
flow from frontmatter throughrenderStaticRouteintoinjectStaticMarkup.<meta name="robots" content="index, follow" />added to every generated
page by default. Pages withnoindex: truein frontmatter override this with
content="noindex".<link rel="canonical" href="...">injected per route during SSG using the
route's absolute URL (siteUrl+ path). The template base also sets it to
<siteUrl>/so crawlers always have a canonical even before JS hydrates.
A newupsertLinkhelper inssg/helpers.tshandles insertion and replacement.
robots.txt generation (litmdx)
litmdx buildnow always writesrobots.txttooutDir. WhensiteUrlis
configured, the file includes aSitemap:directive pointing to
<siteUrl>/sitemap.xml. Generation never fails the build (caught + warned,
same pattern as sitemap and pagefind).- New module
packages/cli/src/sitemap/robots.tswith exported
renderRobots(siteUrl?)andbuildRobots(outDir, siteUrl?)functions.
Core Web Vitals (litmdx)
- Lazy image loading — every standard Markdown image (
) in an
MDX page is now rendered through a built-inMdxImagecomponent registered
as theimgoverride inmdxComponents. Default attributes:
loading="lazy"(deferred download) anddecoding="async"(off-thread
decode). Both can be overridden per-image with MDX JSX syntax. - Logo preload —
generateIndexHtmlnow emits
<link rel="preload" as="image" fetchpriority="high">for the configured
logoasset(s) inside<head>, so the browser starts fetching the logo
image before the JS bundle executes. Themed logos (light/darkvariants)
emit media-query-qualified preload links. - Logo async decoding — the
<img>elements rendered byHeader's
renderLogofunction now carrydecoding="async"so image decoding does
not block the main thread during initial render. - SPA canonical update —
usePageMetanow callssetLink('canonical', href)
on every navigation, keeping the<link rel="canonical">in sync with
window.location.hrefduring client-side routing. Previously onlyog:url
was updated.
Documentation SEO (litmdx.dev)
litmdx.config.tsdescription rewritten for search discoverability;
keywordsexpanded withlitmdx,open source,docs framework,
static site generator,react documentation,developer docs.public/robots.txtcreated withSitemap: https://litmdx.dev/sitemap.xml.- Frontmatter
titleanddescriptionimproved across all 11 public pages
(home, getting-started, configuration, components, search, SSG, sitemap,
frontmatter, reference index, CLI reference, configuration reference) with
product name, relevant keywords, and longer descriptions that match search
intent.
Structured Data / JSON-LD (litmdx)
schema_typefrontmatter field — sets the@typeof the auto-generated JSON-LD
block. Accepts any string; defaults to"TechArticle".- Auto-generation: every page with a
titlenow emits a
<script type="application/ld+json">block automatically. The generated object
uses@context: https://schema.org,@typefromschema_type(default
TechArticle),headlinefromtitle, anddescriptionwhen present.
No frontmatter changes required for the default behaviour. - During
litmdx build, the schema is serialized and emitted in the<head>of
the prerendered HTML for that route.</script>sequences inside the payload are
escaped to<\/script>to prevent early tag termination (XSS guard). - In SPA mode,
usePageMetamanages a single
<script type="application/ld+json" data-litmdx-schema>element: inserted on
navigation to a page with a schema, updated in-place on re-render, removed when
navigating to a page without one. - New
buildPageSchema(frontmatter)helper intemplate/src/lib/schema.ts. PrerenderHeadextended with optionalschema?: string(pre-serialized JSON).Frontmattertype extended withschema_type?.- Docs site updated:
home/index.mdxand bothreference/index.mdxand
features/customization/index.mdxuseschema_type: WebPage; all other pages
auto-generateTechArticle.
Documentation (litmdx.dev)
frontmatter.mdx— Structured data section documentsschema_typefor
customising the auto-generated JSON-LD type. Includes@typereference table
and callout on per-pag...
v0.3.0
Changelog
All notable changes to the LitMDX monorepo are documented here.
This changelog tracks the state of the overall project — docs, template, workspace
and the integration between packages. Individual package changelogs are maintained
separately in each packages/*/CHANGELOG.md.
The format follows Keep a Changelog.
Versioning follows Semantic Versioning.
[0.3.0] — Unreleased
Summary
SEO per-page metadata (roadmap item 5), automatic robots.txt generation,
Core Web Vitals improvements (lazy images, logo preload, async decoding,
per-route canonical on SPA navigation), Structured Data / JSON-LD support,
mobile-first UI polish, and two publish-pipeline bug fixes from the previous
unreleased patch.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.3 (unchanged) |
litmdx |
0.3.2 |
create-litmdx |
0.1.7 (unchanged) |
Added
Per-page SEO metadata (litmdx)
imagefrontmatter field — absolute URL to a page-specific Open Graph image.
OverridesopenGraph.imagefrom config for that route only. During
litmdx build, injects<meta property="og:image" content="...">into the
prerendered HTML for the matching route.noindexfrontmatter field — whentrue, injects
<meta name="robots" content="noindex">into the prerendered HTML for that
route. Useful for internal drafts or pages not ready for public indexing.PrerenderHeadextended withogImageandnoindexfields so both values
flow from frontmatter throughrenderStaticRouteintoinjectStaticMarkup.<meta name="robots" content="index, follow" />added to every generated
page by default. Pages withnoindex: truein frontmatter override this with
content="noindex".<link rel="canonical" href="...">injected per route during SSG using the
route's absolute URL (siteUrl+ path). The template base also sets it to
<siteUrl>/so crawlers always have a canonical even before JS hydrates.
A newupsertLinkhelper inssg/helpers.tshandles insertion and replacement.
robots.txt generation (litmdx)
litmdx buildnow always writesrobots.txttooutDir. WhensiteUrlis
configured, the file includes aSitemap:directive pointing to
<siteUrl>/sitemap.xml. Generation never fails the build (caught + warned,
same pattern as sitemap and pagefind).- New module
packages/cli/src/sitemap/robots.tswith exported
renderRobots(siteUrl?)andbuildRobots(outDir, siteUrl?)functions.
Core Web Vitals (litmdx)
- Lazy image loading — every standard Markdown image (
) in an
MDX page is now rendered through a built-inMdxImagecomponent registered
as theimgoverride inmdxComponents. Default attributes:
loading="lazy"(deferred download) anddecoding="async"(off-thread
decode). Both can be overridden per-image with MDX JSX syntax. - Logo preload —
generateIndexHtmlnow emits
<link rel="preload" as="image" fetchpriority="high">for the configured
logoasset(s) inside<head>, so the browser starts fetching the logo
image before the JS bundle executes. Themed logos (light/darkvariants)
emit media-query-qualified preload links. - Logo async decoding — the
<img>elements rendered byHeader's
renderLogofunction now carrydecoding="async"so image decoding does
not block the main thread during initial render. - SPA canonical update —
usePageMetanow callssetLink('canonical', href)
on every navigation, keeping the<link rel="canonical">in sync with
window.location.hrefduring client-side routing. Previously onlyog:url
was updated.
Documentation SEO (litmdx.dev)
litmdx.config.tsdescription rewritten for search discoverability;
keywordsexpanded withlitmdx,open source,docs framework,
static site generator,react documentation,developer docs.public/robots.txtcreated withSitemap: https://litmdx.dev/sitemap.xml.- Frontmatter
titleanddescriptionimproved across all 11 public pages
(home, getting-started, configuration, components, search, SSG, sitemap,
frontmatter, reference index, CLI reference, configuration reference) with
product name, relevant keywords, and longer descriptions that match search
intent.
Structured Data / JSON-LD (litmdx)
schema_typefrontmatter field — sets the@typeof the auto-generated JSON-LD
block. Accepts any string; defaults to"TechArticle".- Auto-generation: every page with a
titlenow emits a
<script type="application/ld+json">block automatically. The generated object
uses@context: https://schema.org,@typefromschema_type(default
TechArticle),headlinefromtitle, anddescriptionwhen present.
No frontmatter changes required for the default behaviour. - During
litmdx build, the schema is serialized and emitted in the<head>of
the prerendered HTML for that route.</script>sequences inside the payload are
escaped to<\/script>to prevent early tag termination (XSS guard). - In SPA mode,
usePageMetamanages a single
<script type="application/ld+json" data-litmdx-schema>element: inserted on
navigation to a page with a schema, updated in-place on re-render, removed when
navigating to a page without one. - New
buildPageSchema(frontmatter)helper intemplate/src/lib/schema.ts. PrerenderHeadextended with optionalschema?: string(pre-serialized JSON).Frontmattertype extended withschema_type?.- Docs site updated:
home/index.mdxand bothreference/index.mdxand
features/customization/index.mdxuseschema_type: WebPage; all other pages
auto-generateTechArticle.
Documentation (litmdx.dev)
frontmatter.mdx— Structured data section documentsschema_typefor
customising the auto-generated JSON-LD type. Includes@typereference table
and callout on per-page scope.
Mobile-first UI (litmdx)
- Action buttons (search, GitHub, theme toggle) moved from the header to the
mobile sidebar drawer, freeing full header width for the project title.
On desktop (≥ 1280 px) they remain in the header as before; the in-sidebar
row is hidden via CSS. Sidebarcomponent accepts three new props required for the in-drawer
actions:onOpenSearch,theme, andonToggleTheme.- Header title (
app-brand-title) now truncates with an ellipsis when the
project name is too long to fit. The title<span>carries
white-space: nowrap; overflow: hidden; text-overflow: ellipsiswhile the
wrapping flex containers carrymin-width: 0so the truncation propagates
correctly. app-sidebar-togglegainsflex-shrink: 0so the hamburger icon is never
squeezed by a long title.app-header-actionsisdisplay: noneon mobile and shown with
display: flexat ≥ 1280 px, preventing the double-action-bar layout.- Mobile sidebar (
app-sidebar-frame) is now centered on screen with
left: 50%; transform: translateX(-50%)and opens with a fade + subtle
scale animation instead of sliding in from the left edge. - Header background is
var(--bg-surface)(solid) on mobile so the dark
overlay behind the sidebar does not bleed through. Thebackdrop-filterblur
is restored at ≥ 1280 px where no overlay is shown. sidebar-mobile-actionsCSS block added: a flex row of icon buttons at the
top of the sidebar drawer; hidden at ≥ 1280 px alongsidesidebar-mobile-nav.html { font-size: 16px }inbase.cssprevents iOS auto-zoom on inputs.- Tap-target minimum height (
min-height: 2.75rem≈ 44 px) on
sidebar-link,sidebar-mobile-nav-link, andsidebar-group-triggeron
mobile; unset at ≥ 1280 px. app-layoutpadding tightened to1remon mobile, restored to1.25remat
≥ 1280 px.- Responsive
clamp()typography for.prose h2and.prose h3.
Fixed
create-litmdxassets not found onnpx create-litmdx:ASSETS_DIR
was resolved using'../assets'relative todist/index.js, which pointed
to the package root (no assets there). Changed to'./assets'so it
correctly resolves todist/assets/where the build script copies them.workspace:^leaked into publishedlitmdxpackage: the release
workflow usednpm publishwhich does not resolve pnpmworkspace:protocols,
causing@litmdx/core: "workspace:^"to be written verbatim into the
publishedpackage.json. Users installinglitmdxoutside a pnpm workspace
gotERR_PNPM_WORKSPACE_PKG_NOT_FOUND. Fixed by switching the release
workflow topnpm publish --no-git-checksand pinning@litmdx/coreto
^0.1.3inpackages/cli/package.jsonso the resolved version is always
written correctly on publish.
[0.2.0] — 2026-04-03
Summary
Sidebar overrides, WebMCP hardening, workspace ergonomics, developer tooling
improvements, and several bug fixes. Roadmap items 3, 4, and 5 are complete.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.3 |
litmdx |
0.3.0 |
create-litmdx |
0.1.6 |
Added
Sidebar overrides
sidebar_hiddenfrontmatter field — settingsidebar_hidden: truein any
.mdxfile removes it from the sidebar tree entirely- Group labels now read
sidebar_label/titlefrom the group'sindex.mdx
frontmatter before falling back to the directory name - Empty groups (all children hidden) are filtered out of the rendered sidebar
WebMCP hardening
list_pagestool now returnsdescriptionalongsidepathandtitle,
allowing agents to pre-filter pages without additional tool calls- Input validation in
navigate_toandget_page_content: both throw
"path is required"when the argument is empty or missing search_pagesreturns[]immediately for an empty query instead of
searching for the string"undefined"
Workspace ergonomics
@litmdx/coreresol...
v0.2.1
Changelog
All notable changes to the LitMDX monorepo are documented here.
This changelog tracks the state of the overall project — docs, template, workspace
and the integration between packages. Individual package changelogs are maintained
separately in each packages/*/CHANGELOG.md.
The format follows Keep a Changelog.
Versioning follows Semantic Versioning.
[0.2.1] — Unreleased
Fixed
create-litmdxassets not found onnpx create-litmdx:ASSETS_DIR
was resolved using'../assets'relative todist/index.js, which pointed
to the package root (no assets there). Changed to'./assets'so it
correctly resolves todist/assets/where the build script copies them.workspace:^leaked into publishedlitmdxpackage: the release
workflow usednpm publishwhich does not resolve pnpmworkspace:protocols,
causing@litmdx/core: "workspace:^"to be written verbatim into the
publishedpackage.json. Users installinglitmdxoutside a pnpm workspace
gotERR_PNPM_WORKSPACE_PKG_NOT_FOUND. Fixed by switching the release
workflow topnpm publish --no-git-checksand pinning@litmdx/coreto
^0.1.3inpackages/cli/package.jsonso the resolved version is always
written correctly on publish.
0.2.0 — 2026-04-03
Summary
Sidebar overrides, WebMCP hardening, workspace ergonomics, developer tooling
improvements, and several bug fixes. Roadmap items 3, 4, and 5 are complete.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.3 |
litmdx |
0.3.0 |
create-litmdx |
0.1.6 |
Added
Sidebar overrides
sidebar_hiddenfrontmatter field — settingsidebar_hidden: truein any
.mdxfile removes it from the sidebar tree entirely- Group labels now read
sidebar_label/titlefrom the group'sindex.mdx
frontmatter before falling back to the directory name - Empty groups (all children hidden) are filtered out of the rendered sidebar
WebMCP hardening
list_pagestool now returnsdescriptionalongsidepathandtitle,
allowing agents to pre-filter pages without additional tool calls- Input validation in
navigate_toandget_page_content: both throw
"path is required"when the argument is empty or missing search_pagesreturns[]immediately for an empty query instead of
searching for the string"undefined"
Workspace ergonomics
@litmdx/coreresolved viaworkspace:^inside the monorepo so the local
source is always used during developmentengines: { "node": ">=18.0.0" }declared inpackages/cliand
packages/core
Developer tooling
checkscript: full local CI mirror in fail-fast order —
lint → format:check → typecheck → build:packages → publish:dry → testpublish:dryscript (pnpm -r --filter './packages/*' pack --dry-run) to
verify package tarballs without touching the registry
CI / release
ci.yml: monorepo-level CI running on every push / PR tomainanddevelopmonorepo-release.yml: tag-based GitHub Release workflow (v*tags),
validates tag against rootpackage.jsonversion, auto-marks pre-releasesCHANGELOG.mdintroduced
Fixed
sidebar_hiddensilently dropped:page-meta.tsextracted frontmatter
through a closedallowedKeysSet that did not includesidebar_hidden,
causing the field to be discarded before reaching runtime; added to
GeneratedFrontmattertype andallowedKeyswebmcpdefault wrong in docs:docs/reference/configuration.mdx
documented thewebmcpfield with defaulttrue; the real default has
always beenfalse(user.webmcp ?? falseinresolveConfig)list_pagesexample missingdescription: the example in
docs/home/features/webmcp.mdxdid not show thedescriptionfield in the
list_pagesresponse; updated to reflect the actual response shape- Stale header comment in
WebMCPIntegration.tsx: the opening comment
listed 3 tools while the implementation registers 5; corrected - Dev server crash on port conflict:
strictPort: truein the Vite config
caused a hard crash when port 5173 was occupied; changed tostrictPort: false
so Vite falls back to the next available port pnpm devnot starting Vite: the thirdconcurrentlyprocess was
runningpnpm --filter litmdx run dev(a secondtsc --watch) instead of
node packages/cli/dist/bin/cli.js dev; corrected- Cloudflare Pages build failure: root
buildscript was invoking
pnpm --filter litmdx run build(compiles the CLI package) instead of
node packages/cli/dist/bin/cli.js build(builds the docs site); corrected publish:dryshowing "no new packages":publish --dry-runchecks the
registry and skips already-published versions; replaced withpack --dry-run- Group label ignoring frontmatter: sidebar groups always used the
directory-derived label; now readssidebar_label/titlefromindex.mdx create-litmdxduplicateassets/in published tarball: removed the
redundant top-level"assets"entry fromfiles(assets are already
included underdist/assets/)
Changed
SidebarGroupnow computesisActivewithuseMemoand uses the exported
hasActiveDescendanthelper fromsidebar/helpers.ts
0.1.0 — 2026-04-02
Summary
Initial stable baseline of the LitMDX monorepo. This release establishes the
core product architecture, the opt-in component system, custom user components,
WebMCP integration, and the full workspace structure.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.2 |
litmdx |
0.2.3 |
create-litmdx |
0.1.5 |
Added
Core product
- MDX compilation pipeline via
@litmdx/corewith remark/rehype plugin chain - File-system router with automatic sidebar generation from
docs/structure defineConfigAPI for type-safe configuration inlitmdx.config.ts- Vite plugin integration handling MDX transformation and virtual modules
- Static site generation (SSG) with prerender across all routes
- Pagefind integration for zero-dependency full-text search
- Sitemap generation on build
- WebMCP integration — exposes the docs as a structured interface consumable
by AI agents vianavigator.modelContextwhenwebmcp: trueis set in config - Frontmatter support:
title,description,order,sidebar,noindex
CLI (litmdx)
litmdx dev— development server with HMRlitmdx build— full production build with SSG, search index and sitemaplitmdx init— initialise a new project from the built-in template- Vite configuration managed internally; user projects need no
vite.config.ts
Scaffolder (create-litmdx)
npm create litmdxinteractive scaffolder- Generates a ready-to-use project with template, config and dependencies
Opt-in component system
- Built-in heavy components are opt-in to keep the default bundle small
- Mermaid diagrams available as opt-in (
components.mermaid: true) - Formal eligibility rules for future opt-in components (>50 KB gzip, >5 chunks,
or irrelevant to the majority of sites) - JSDoc on
ComponentsConfigdocuments cost per component - Tests verify that disabled components are excluded from the bundle
Custom user components
- Users can register their own MDX components via
src/components/index.ts|tsx|js|jsx - Generated bridge file merges user components into
mdxComponentsautomatically - Watcher in
devmode regenerates the bridge on file changes - Explicit React alias prevents duplicate React instances in workspaces/monorepos
Docs site
- Documentation site built with LitMDX itself, covering:
- Getting started, routing, project structure
- Features: components, configuration, deployment, frontmatter, search,
sitemap, SSG, WebMCP - Customisation: custom components, Tailwind CSS
- Reference: CLI, configuration, contributing
Workspace
- pnpm workspace monorepo with
packages/core,packages/cli,packages/create-litmdx - Shared
tsconfig.base.jsonandeslint.config.base.js - Root scripts:
dev,build,build:packages,test,typecheck,
lint,format,clean,setup - CI workflows per package (core, cli, create-litmdx) on
mainanddevelop - Release workflow for npm publishing (
workflow_dispatch) - Monorepo CI (
ci.yml) and monorepo release workflow (monorepo-release.yml)
Notes
- Internal roadmap targets 0–30 day priorities: sidebar overrides, SEO per page,
search UX improvements, WebMCP hardening, monorepo workspace ergonomics versionado de docsandi18nare explicitly deferred features; will only
proceed if real repeated demand exists
v0.2.0
Changelog
All notable changes to the LitMDX monorepo are documented here.
This changelog tracks the state of the overall project — docs, template, workspace
and the integration between packages. Individual package changelogs are maintained
separately in each packages/*/CHANGELOG.md.
The format follows Keep a Changelog.
Versioning follows Semantic Versioning.
0.2.0 — 2026-04-03
Summary
Sidebar overrides, WebMCP hardening, workspace ergonomics, developer tooling
improvements, and several bug fixes. Roadmap items 3, 4, and 5 are complete.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.3 |
litmdx |
0.3.0 |
create-litmdx |
0.1.6 |
Added
Sidebar overrides
sidebar_hiddenfrontmatter field — settingsidebar_hidden: truein any
.mdxfile removes it from the sidebar tree entirely- Group labels now read
sidebar_label/titlefrom the group'sindex.mdx
frontmatter before falling back to the directory name - Empty groups (all children hidden) are filtered out of the rendered sidebar
WebMCP hardening
list_pagestool now returnsdescriptionalongsidepathandtitle,
allowing agents to pre-filter pages without additional tool calls- Input validation in
navigate_toandget_page_content: both throw
"path is required"when the argument is empty or missing search_pagesreturns[]immediately for an empty query instead of
searching for the string"undefined"
Workspace ergonomics
@litmdx/coreresolved viaworkspace:^inside the monorepo so the local
source is always used during developmentengines: { "node": ">=18.0.0" }declared inpackages/cliand
packages/core
Developer tooling
checkscript: full local CI mirror in fail-fast order —
lint → format:check → typecheck → build:packages → publish:dry → testpublish:dryscript (pnpm -r --filter './packages/*' pack --dry-run) to
verify package tarballs without touching the registry
CI / release
ci.yml: monorepo-level CI running on every push / PR tomainanddevelopmonorepo-release.yml: tag-based GitHub Release workflow (v*tags),
validates tag against rootpackage.jsonversion, auto-marks pre-releasesCHANGELOG.mdintroduced
Fixed
sidebar_hiddensilently dropped:page-meta.tsextracted frontmatter
through a closedallowedKeysSet that did not includesidebar_hidden,
causing the field to be discarded before reaching runtime; added to
GeneratedFrontmattertype andallowedKeyswebmcpdefault wrong in docs:docs/reference/configuration.mdx
documented thewebmcpfield with defaulttrue; the real default has
always beenfalse(user.webmcp ?? falseinresolveConfig)list_pagesexample missingdescription: the example in
docs/home/features/webmcp.mdxdid not show thedescriptionfield in the
list_pagesresponse; updated to reflect the actual response shape- Stale header comment in
WebMCPIntegration.tsx: the opening comment
listed 3 tools while the implementation registers 5; corrected - Dev server crash on port conflict:
strictPort: truein the Vite config
caused a hard crash when port 5173 was occupied; changed tostrictPort: false
so Vite falls back to the next available port pnpm devnot starting Vite: the thirdconcurrentlyprocess was
runningpnpm --filter litmdx run dev(a secondtsc --watch) instead of
node packages/cli/dist/bin/cli.js dev; corrected- Cloudflare Pages build failure: root
buildscript was invoking
pnpm --filter litmdx run build(compiles the CLI package) instead of
node packages/cli/dist/bin/cli.js build(builds the docs site); corrected publish:dryshowing "no new packages":publish --dry-runchecks the
registry and skips already-published versions; replaced withpack --dry-run- Group label ignoring frontmatter: sidebar groups always used the
directory-derived label; now readssidebar_label/titlefromindex.mdx create-litmdxduplicateassets/in published tarball: removed the
redundant top-level"assets"entry fromfiles(assets are already
included underdist/assets/)
Changed
SidebarGroupnow computesisActivewithuseMemoand uses the exported
hasActiveDescendanthelper fromsidebar/helpers.ts
0.1.0 — 2026-04-02
Summary
Initial stable baseline of the LitMDX monorepo. This release establishes the
core product architecture, the opt-in component system, custom user components,
WebMCP integration, and the full workspace structure.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.2 |
litmdx |
0.2.3 |
create-litmdx |
0.1.5 |
Added
Core product
- MDX compilation pipeline via
@litmdx/corewith remark/rehype plugin chain - File-system router with automatic sidebar generation from
docs/structure defineConfigAPI for type-safe configuration inlitmdx.config.ts- Vite plugin integration handling MDX transformation and virtual modules
- Static site generation (SSG) with prerender across all routes
- Pagefind integration for zero-dependency full-text search
- Sitemap generation on build
- WebMCP integration — exposes the docs as a structured interface consumable
by AI agents vianavigator.modelContextwhenwebmcp: trueis set in config - Frontmatter support:
title,description,order,sidebar,noindex
CLI (litmdx)
litmdx dev— development server with HMRlitmdx build— full production build with SSG, search index and sitemaplitmdx init— initialise a new project from the built-in template- Vite configuration managed internally; user projects need no
vite.config.ts
Scaffolder (create-litmdx)
npm create litmdxinteractive scaffolder- Generates a ready-to-use project with template, config and dependencies
Opt-in component system
- Built-in heavy components are opt-in to keep the default bundle small
- Mermaid diagrams available as opt-in (
components.mermaid: true) - Formal eligibility rules for future opt-in components (>50 KB gzip, >5 chunks,
or irrelevant to the majority of sites) - JSDoc on
ComponentsConfigdocuments cost per component - Tests verify that disabled components are excluded from the bundle
Custom user components
- Users can register their own MDX components via
src/components/index.ts|tsx|js|jsx - Generated bridge file merges user components into
mdxComponentsautomatically - Watcher in
devmode regenerates the bridge on file changes - Explicit React alias prevents duplicate React instances in workspaces/monorepos
Docs site
- Documentation site built with LitMDX itself, covering:
- Getting started, routing, project structure
- Features: components, configuration, deployment, frontmatter, search,
sitemap, SSG, WebMCP - Customisation: custom components, Tailwind CSS
- Reference: CLI, configuration, contributing
Workspace
- pnpm workspace monorepo with
packages/core,packages/cli,packages/create-litmdx - Shared
tsconfig.base.jsonandeslint.config.base.js - Root scripts:
dev,build,build:packages,test,typecheck,
lint,format,clean,setup - CI workflows per package (core, cli, create-litmdx) on
mainanddevelop - Release workflow for npm publishing (
workflow_dispatch) - Monorepo CI (
ci.yml) and monorepo release workflow (monorepo-release.yml)
Notes
- Internal roadmap targets 0–30 day priorities: sidebar overrides, SEO per page,
search UX improvements, WebMCP hardening, monorepo workspace ergonomics versionado de docsandi18nare explicitly deferred features; will only
proceed if real repeated demand exists
v0.1.0
Changelog
All notable changes to the LitMDX monorepo are documented here.
This changelog tracks the state of the overall project — docs, template, workspace
and the integration between packages. Individual package changelogs are maintained
separately in each packages/*/CHANGELOG.md.
The format follows Keep a Changelog.
Versioning follows Semantic Versioning.
0.1.0 — 2026-04-02
Summary
Initial stable baseline of the LitMDX monorepo. This release establishes the
core product architecture, the opt-in component system, custom user components,
WebMCP integration, and the full workspace structure.
Packages
| Package | Version |
|---|---|
@litmdx/core |
0.1.2 |
litmdx |
0.2.3 |
create-litmdx |
0.1.5 |
Added
Core product
- MDX compilation pipeline via
@litmdx/corewith remark/rehype plugin chain - File-system router with automatic sidebar generation from
docs/structure defineConfigAPI for type-safe configuration inlitmdx.config.ts- Vite plugin integration handling MDX transformation and virtual modules
- Static site generation (SSG) with prerender across all routes
- Pagefind integration for zero-dependency full-text search
- Sitemap generation on build
- WebMCP integration — exposes the docs as a structured interface consumable
by AI agents vianavigator.modelContextwhenwebmcp: trueis set in config - Frontmatter support:
title,description,order,sidebar,noindex
CLI (litmdx)
litmdx dev— development server with HMRlitmdx build— full production build with SSG, search index and sitemaplitmdx init— initialise a new project from the built-in template- Vite configuration managed internally; user projects need no
vite.config.ts
Scaffolder (create-litmdx)
npm create litmdxinteractive scaffolder- Generates a ready-to-use project with template, config and dependencies
Opt-in component system
- Built-in heavy components are opt-in to keep the default bundle small
- Mermaid diagrams available as opt-in (
components.mermaid: true) - Formal eligibility rules for future opt-in components (>50 KB gzip, >5 chunks,
or irrelevant to the majority of sites) - JSDoc on
ComponentsConfigdocuments cost per component - Tests verify that disabled components are excluded from the bundle
Custom user components
- Users can register their own MDX components via
src/components/index.ts|tsx|js|jsx - Generated bridge file merges user components into
mdxComponentsautomatically - Watcher in
devmode regenerates the bridge on file changes - Explicit React alias prevents duplicate React instances in workspaces/monorepos
Docs site
- Documentation site built with LitMDX itself, covering:
- Getting started, routing, project structure
- Features: components, configuration, deployment, frontmatter, search,
sitemap, SSG, WebMCP - Customisation: custom components, Tailwind CSS
- Reference: CLI, configuration, contributing
Workspace
- pnpm workspace monorepo with
packages/core,packages/cli,packages/create-litmdx - Shared
tsconfig.base.jsonandeslint.config.base.js - Root scripts:
dev,build,build:packages,test,typecheck,
lint,format,clean,setup - CI workflows per package (core, cli, create-litmdx) on
mainanddevelop - Release workflow for npm publishing (
workflow_dispatch) - Monorepo CI (
ci.yml) and monorepo release workflow (monorepo-release.yml)
Notes
- Internal roadmap targets 0–30 day priorities: sidebar overrides, SEO per page,
search UX improvements, WebMCP hardening, monorepo workspace ergonomics versionado de docsandi18nare explicitly deferred features; will only
proceed if real repeated demand exists