Skip to content

Markdown that runs.

A .md file is already a page. Rename it to .wd and that same file gets loops, state, fetched data, and forms. No components, no JSX, no config. Pages with no state ship zero framework JavaScript.

npx @zvndev/darkmown init my-site

One file. Here is the source.

A store with a live search filter, add-to-cart, and a running total.

store.wd, the whole file

:state products = [
  { "id": 1, "name": "Aurora Lamp", "price": 49 },
  { "id": 2, "name": "Briza Fan", "price": 39 },
  { "id": 3, "name": "Cove Speaker", "price": 89 },
  { "id": 4, "name": "Dune Mug", "price": 12 }
]
:state cart = []
:state q = ""
:computed count = cart.length

:bind q placeholder="Search products…"

@loop products into p where p.name contains q
::: card .product
**{ p.name }** · ${ p.price }
:button "Add" -> cart += p
:::
@endloop

Cart: { count } item(s)

that same file, running (type in the box)

Aurora Lamp · $49

Briza Fan · $39

Cove Speaker · $89

Dune Mug · $12

Cart: 0 item(s)

This page is built in Darkmown

Not a screenshot, and not a React site describing a Markdown tool. site/pages/index.wd is a .wd file with no raw HTML in it. The first two numbers below are live: a :fetch reading api/stats.js, a serverless function in this same repo.

latest release, live from npm

npm installs last month

7,654 B

the whole runtime, gzipped

0 KB

JS on a static page

Say hello and the form round-trips to a real serverless function, then renders the reply:

Three rules, no escape hatch

A whole framework, in text

See it for real

TryA whole live app in one file: fetch, loops, nested ifs, a form TryThe docs, a .wd page built from includes TryA plain .md page, where directives stay inert text

npm run build emits a plain static dist/ (no server, no special runtime), so it deploys anywhere that serves files. This site is a Darkmown build.

Deploy to Vercel Read the docs How it compares to Markdoc