Markdown-based static site publishing — no server, no database required. Write in markdown, build with Python, deploy anywhere.
Find a file
Claude 737049f19e
Add configurable nav section toggle icons
Two new top-level theme.yml keys — nav-section-expand-icon and
nav-section-collapse-icon — replace the hardcoded arrow_right/arrow_drop_down
used on collapsible nav sections. Defaults preserve existing behaviour.

Eight new icon SVGs added to app/assets/icons/:
  keyboard_arrow_right / keyboard_arrow_down     (chevrons)
  keyboard_double_arrow_right / keyboard_double_arrow_down
  expand_content / collapse_content              (corner arrows)
  add / minimize                                 (plus/minus)

All eight added to STANDARD_ICONS so fetch-deps bundles them correctly.
CLAUDE.md key reference and docs/claude-design.md updated with the full
icon catalogue, pairing guidance, and style notes for Claude Design.

https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
2026-05-18 15:08:59 +00:00
.github/workflows Opt into Node.js 24 for GitHub Actions 2026-05-08 17:10:02 +00:00
app Add configurable nav section toggle icons 2026-05-18 15:08:59 +00:00
docs Add configurable nav section toggle icons 2026-05-18 15:08:59 +00:00
latest Updated sample-sites. 2026-05-18 14:30:49 +07:00
sample-sites Updated sample-sites. 2026-05-18 14:30:49 +07:00
.gitignore v0.2.2 migrated to GitHub 2026-04-20 00:02:43 +07:00
CLAUDE.md Add configurable nav section toggle icons 2026-05-18 15:08:59 +00:00
CONTRIBUTING.md Add LICENSE, CONTRIBUTING.md, and SECURITY.md 2026-05-09 02:55:19 +00:00
LICENSE Update copyright year and owner in LICENSE file 2026-05-10 08:59:36 +07:00
mdcms.py Add full Apache 2.0 licence notice to all relevant files 2026-05-18 07:11:00 +00:00
pyproject.toml Bump to v0.4.0 — milestone release 2026-05-17 20:38:21 +00:00
README.md Updated readme and release structure 2026-05-10 09:00:34 +07:00
SECURITY.md Add LICENSE, CONTRIBUTING.md, and SECURITY.md 2026-05-09 02:55:19 +00:00

MD-CMS

Write your content as .md files, run one command, and deploy to any static host. All rendering happens in the browser at runtime.

With the GitHub Actions workflow, you can automatically rebuild the navigation structure and search index on each commit.


How it works

MD-CMS has two parts:

The web app:

  • index.html — a single-file browser renderer. It reads your markdown, config, and nav at runtime and renders everything client-side. No compilation, no framework.
  • config.yml — contains site configuration.
  • nav.yml — navigation tree.
  • search.json — supports site-wide search on static host.

The local app: mdcms — a CLI tool that scans your content, generates nav.yml and search.json, and can wire up automatic builds via GitHub Actions.

Installation

Standalone binary

  1. Download from the latest release.
  2. Move the binary and make it executable
    • Linux
      • Download the latest mdcms
      • Move it to /usr/local/bin/: sudo mv mdcms /usr/local/bin/mdcms
      • Make it executable: sudo chmod +x /usr/local/bin/mdcms
    • Mac
      • Download the latest mdcms
      • Move it to /usr/local/bin/: sudo mv mdcms /usr/local/bin/mdcms
      • Make it executable: sudo chmod +x /usr/local/bin/mdcms
      • Remove the quarantine flag: xattr -dr com.apple.quarantine /usr/local/bin/mdcms
    • Windows
      • Download the latest mdcms
      • Move it to a permanent folder, e.g. C:\tools\mdcms.exe
      • Add C:\tools\ to your PATH: Start → search "Environment Variables" → edit the Path user variable → add C:\tools\
      • Open a new PowerShell window and verify: mdcms --version

Use

To get started, run mdcms register mysite to register the current working directory as the mysite MD-CMS project directory. You can also specify the project path: mdcms register mysite /path/to/mysiteNote.

If there is an existing MD-CMS instance in your specified directory, the app will register this site; if there is no MD-CMS instance present, it will download the latest version from the GitHub repo.

Add your pages, posts, and assets. Once you're ready to upload your site, run mdcms build mysite to update nav.yml and search.json. You can also run mdcms build --path to build the website without registering the site.

The final project directory can be uploaded to a static host of your choice.

File structure

[project directory]/
	index.html			← renderer
	config.yml			← site configuration and theme
	nav.yml				← navigation structure
	search.json			← search index
	
	pages/				← Put your permanent pages here
		home.md			← Main page
		...						

	posts/				← Put your time-bound posts here
		...						

	assets/				← Holds directories for non-content files
		required/		← Logo, favicon, and icons go here.
			...

		images/			← Images
			...

		fonts/			← Fonts referenced in config.yml
			...

		files/			← Files for download
			...

IMPORTANT: All links are read from index.html in the root. Therefore, you must provide full paths for each file from the root.

Example: You want to put a link to page2.md in home.md. page2.md is in the same directory as home.md.

The correct link is therefore:

[Link text](pages/page2.md)

This does not link to page2.md:

[Link text](page2.md)

Further reading

For further documentation, refer to:

  • docs/: Documentation relevant to this repo
  • docs.benestad.net: Further help -- including an example of an MD-CMS site.

Licence

This software is © 2026 Kristian Benestad. Licensed under the Apache License, Version 2.0.