1
0 Comments

shipped sitemd 0.1.1 today - first public update!

If you haven't been following along (and no one is yet...), I shipped my first product this week, sitemdΒ β€” a static site generator / website building toolkit for AI coding agents like Claude, Codex, Cursor, Gemini, OpenClaw, etc. that runs on markdown files.

Today was my first "public" new version release. While I don't have any paying users yet, it still feels good to publicly show that there's still progress being made. I even built out a full release management workflow with Claude that helps document and stage all feature release notes and doc updates so everything can neatly roll out in one pass when I'm ready.

Here's the full changelog entry for anyone nerdy enough to peruse it (and yes Claude writes this for me as we code). Quite a bit of stuff for only 3 workdays! Onward and upward...

v0.1.1 β€” April 8, 2026

AI Agent Integration

  • new /release skill β€” stages a running log of changelog entries and pending doc page updates between releases, then publishes them atomically; the end-of-session ritual is /release, and /release finalize writes the section to your changelog page, copies staged docs into pages/docs/, and deploys

  • write skill gains a staged-output mode (--output <dir>) so other skills can redirect doc page writes into a staging directory instead of the live pages/ tree; used by /release to stage docs updates

  • /release skill now tracks new docs that need a sidebar nav entry β€” staging classifies each staged doc as new vs updated, drafts the planned sub-anchor list from H2 headings, and persists it as a Pending nav additions: block in UNRELEASED.mdso finalize can auto-insert the nav entry via sitemd_groups_add_pages after copying the doc into pages/docs/; no more hand-editing groups.md for new docs, and the plan survives across sessions

Distribution

  • npm package and GitHub repo now ship a top-level CHANGELOG.md so users get release notes locally without visiting sitemd.cc

  • npm install @sitemd-cc/sitemd and npx @sitemd-cc/sitemd init my-site now download the platform binary automatically via a postinstall hook β€” no separate ./sitemd/install step required; users get a fully working install in one command

  • new cross-platform install.js Node bootstrap ships alongside the existing shell install script β€” works on Windows without WSL, runs as the npm postinstall hook, and serves as a manual recovery command on any platform when --ignore-scriptswas used; both scripts read the wanted version from the local package.json so the download always matches the installed package

  • both install scripts (install.js and install) are now idempotent β€” re-running with a matching binary version is a silent no-op (~50ms), and version mismatches trigger an in-place upgrade; pass --force to skip the version check and reinstall

  • plugin manifest descriptions for Claude Code, Codex, Cursor, and OpenClaw now make clear that sitemd is a full product requiring the binary, not just an MCP shim β€” and point users at npx @sitemd-cc/sitemd init as the recommended bootstrap path

Content

  • per-page sidebar nav β€” declare a custom sidebar directly in any page's frontmatter without touching groups.md; supports an explicit nested item list (with the same Label: /url syntax as nav/groups, including +newtab and other modifiers), sidebar: none to suppress an inherited group sidebar, and sidebar: self as a shortcut that auto-builds a table-of-contents sidebar from the page's own headings β€” each ## becomes a top-level item, ### headings nest as anchors under their parent ##, and standalone {#anchor} tags map in as anchors too (alt-id anchors that immediately precede a heading are skipped to avoid duplication); the shortcut expands itself into the equivalent nested explicit list on first build so you can edit, reorder, or remove entries, and per-page sidebars get the search button and full active-state highlighting just like group sidebars

  • device variants β€” wrap any markdown in mobile: ... /mobile or desktop: ... /desktop fences to show different content per viewport (768px breakpoint); the canonical use is embedding a portrait video for mobile and a landscape one for desktop, but it works for any content (text, images, copy, sections)

  • self-hosted videos now embed with native markdown β€” ![alt](/media/marketing.mp4) renders a <video> element with sensible defaults (controls, playsinline, preload metadata), works inside gallery: and image-row:blocks alongside images, inherits the same width/corner/shape modifiers as images, respects /center and /right alignment fences (centered videos wider than the content column overhang equally on both sides on desktop, and shrink to fit the viewport on mobile), and adds video-only modifiers +autoplay, +muted, +loop, +nocontrols, and +poster:filename; videos in media/ are uploaded to your configured media CDN (R2/S3) automatically, just like images

  • comprehensive markdown syntax reference at /docs/markdown-syntax β€” single-page lookup for every standard markdown feature, frontmatter field, component block (button:, card:, embed:, gallery:, image-row:, form:, data:, modal:, author:), inline modifier (image options, link +newtab/+sametab, tooltips, hard line breaks, inline anchors), and layout fence (center:, right:, left:, hidden:, mobile:, desktop:, gated:); cross-links to every component-specific deep dive and includes a quick-reference cheat-sheet table for fast lookup

  • sitewide header search is faster and more responsive β€” typing into ⌘K is debounced to the trailing edge of typing bursts, the fuzzy/typo-tolerance fallback now runs only against titles and headings (not full page bodies, which previously dominated the typing hot path), and the underlying Levenshtein implementation reuses preallocated Int16 row buffers instead of allocating a 2D JS array per call; ships in the default theme so any deployed site picks it up after the next sitemd deploy. Behavior change: typo tolerance no longer surfaces words that appear only in body text β€” exact substring matches against bodies still work as before, just not fuzzy ones

Dev Server

  • dev server rebuilds are dramatically faster on multi-page sites β€” /{slug}/seo-preview pages used to be regenerated for every page on every rebuild (regex keyword extraction over rendered HTML, sync fs.statSync per page, ~40KB of HTML assembly per page), but they're now lazy-generated by the dev server on first request and cached until the next rebuild; editing one markdown file no longer pays the cost of re-rendering preview HTML for every other page in the site

  • live-reload no longer compounds with the number of open browser tabs β€” the hydrate script and dev panel script used to each open their own SSE connection per tab (so 5 tabs meant 10 sockets to broadcast against on every rebuild), and back-to-back rebuilds (e.g. settings change β†’ CSS sync β†’ content rebuild) used to fan out as multiple reload events; hydrate now skips its connection when the dev panel is present, and reload broadcasts are coalesced via a 50ms trailing-edge throttle so multiple rebuilds within the throttle window collapse into a single reload event

Dev Panel

  • dev panel markdown editor now spellchecks your prose β€” wavy underlines appear on misspellings with native browser suggestions on right-click, and a new spellchecktoggle in the editor toolbar (top-right, next to comments) lets you mute it; preference persists across sessions, and spellcheck re-evaluates when you open a new file so you don't have to type to wake it up

Fixed

  • settings parsers (groups.md, header.md, footer.md, and in-page form blocks) now accept 4-space indentation in addition to canonical 2-space β€” previously a 4-space file would silently parse to nothing, producing surprises like an empty sidebar; the build also auto-rewrites such files to 2-space on the next run so on-disk style stays canonical

  • clicking a hash-only sidebar link (e.g. table-of-contents anchors) no longer triggers a brief content/sidebar flash from a spurious SPA reload, and the clicked item now correctly highlights as active

  • npx @sitemd-cc/sitemd init my-site no longer fails with ENOENT when run from a fresh npm install β€” the compiled binary's init and scratch commands now resolve their product directory via process.execPath instead of __dirname (which yao-pkg snapshots into a virtual path that doesn't exist on the user's filesystem)

  • projects created by sitemd init now ship with install and install.jsalongside the binary, so the new project's own npm install triggers the binary download via its inherited postinstall hook

  • sitemd_content_validate no longer flags false positives on syntax-reference doc pages β€” fenced code blocks and inline code spans are now stripped before scanning for broken links, missing image alt text, and undefined modal references, so example markdown inside code blocks (like [link](/url) or ![alt](/media/foo.png)shown as a teaching example) no longer trips validation; the internal-link check also gained the /media/ exemption that the button check already had

  • code_language_hints validator now tracks fence length so a 4-backtick code block wrapping a 3-backtick example (````markdown containing ```js) no longer confuses the in-block toggle into reporting the inner closing fence as a missing-language-hint block

  • sitemd_pages_create no longer creates a phantom lowercase group when an agent calls it with groupMember containing case variants like ["docs", "Docs"] β€” addPageToGroup now resolves group references via name- and slug-equivalence (so docs matches the existing Docs group), and only creates a new group when no equivalent match exists

posted toAvatar for product sitemd.cc
sitemd.cc