The Markdown framework
Markdown that runs
Not just pages — full websites. Routing, state, server calls, embeds, and reactive islands, all from plain Markdown files. No JavaScript or CSS required. Your docs and your code are all just text.
A whole framework, in text
Everything a site needs, expressed as Markdown directives. No components, no config, no JSX, no special files:
- Routing — folders are routes. Drop a file in, it's a page. Prefix with
.or-to hide it. - State & reactivity —
:state,:button,:if, and keyed@loops patch the DOM directly. No virtual DOM. - Server calls —
:fetchpulls JSON into state;:form action=round-trips to any backend and degrades to a native POST without JS. - Composition —
@includeembeds one Markdown file into another, passing values down Liquid-style. - Styling, optional — colocate a
.skinfile for design tokens, or ship none and let the browser default.
What to try
TryA whole live app in one .wd file: fetch, loops, nested ifs, a form TryThe docs route — a .wd page built from includes TryA plain .md page where directives stay inert text TryReactive page: state, keyed loops, scoped sections TryData page: fetch, forms, server round-trips, persistence TryA hidden route, to confirm it 404sLoops that read like prose
@loop is the only loop. Point it at a JSON file, an in-scope value, or a :state list, and the body repeats once per row. Includes inside the loop inherit the loop value:
@loop /features.json into card
@include /feature-card.wd
@endloop
Folder routing without config
Pages come from site/pages, and hidden work is just dot or minus prefixed.
One loop, @loop
Loop a JSON file, an in-scope value, or a :state list — includes inside inherit the loop value.
Colocated behavior
A matching .skin or .js file beside the page is picked up automatically.
Colocated behavior
This button is powered by site/pages/index.js, discovered by matching the page basename:
Deploy in one click
npm run build emits a plain static dist/ — no server, no special runtime — so it deploys anywhere that serves files. This very site is a Darkmown build:
Deploy to Vercel Deploy to Cloudflare Star on GitHub
Built in the open
Darkmown itself was built by a small agent team. The board below is a live @loop over real data — itself a demo of the framework rendering this page:
Long-running session sprinting
Darkmown treats sprinting as a visible operating loop, not as hidden recursion inside Markdown.
- PM keeps the acceptance checklist and decides whether the demo proves the promise.
- Development owns compiler, router, runtime, and demo integration.
- Research checks the theory against prior art and keeps naming or platform drift from leaking in.
- Testing owns route, include, asset, and browser smoke evidence.
- Review inspects the final diff and blocks sloppy completion.
The standing team size is 4 to 6. If work expands, add a design or architecture lane; if work shrinks, keep PM, development, testing, and review active.