BMX

Burxt Markup Language, Extensible. You write markdown. You get a page. The difference is that BMX tells you when the document is wrong, instead of printing something that looks nearly right.

# Receipt {{ order.reference }}

Thank you, **{{ customer.name }}**. Your total is {{ order.total }}.

- Delivery: {{ order.delivery }}
- Paid: {{ order.paid_at }}

That is a whole document. If you have written a README you can already write BMX; the {{ … }} holes are the only new idea, and page 2 of the guide is about those.

Start here

1. Your first document — write one, render it, see the HTML that comes out. Five minutes.

Then:

Then look things up

   
Writing a document every construct, with the HTML it produces
Styling the output the tags you get, and how CSS, Tailwind and SCSS attach
When it refuses every error code, with the input that causes it
Turning it into a page the two rendering paths, in detail
Building on BMX for anyone writing a framework on top

Why it exists

Two reasons, and neither is the syntax.

It tells you when a document is wrong

Markdown never fails. Whatever you give it, something comes out — which is lovely in a comment box and dangerous when the document was generated, truncated, or written in a hurry.

Your balance is **£240.00

Markdown prints that with two stray asterisks and the page ships. BMX says:

BMX-E002 at 16: unterminated strong

Autocorrect quietly changes what you meant. Spellcheck stops and points. BMX is spellcheck.

The blanks can be checked before the page exists

{{ … }} is a hole, and BMX deliberately has no opinion about what goes in it — that belongs to whatever language is doing the rendering. Which means a language with types can check it:

  What happens to a typo like {{ order.custmer }}
Most template languages prints nothing; the page ships
BMX, rendering refuses; nothing renders
BMX, compiled a build error naming the field, and what the fields actually are

A template is the last place in most programs where nothing is checked. The database checks your data, the API checks it, your code checks it — and then the template prints whatever it is handed. That is the gap BMX closes.

In Burxt it goes further: a money value keeps its rounding rule all the way to the tag, so a template cannot quietly round £4.947525 to two places on your behalf.

Status

0.1, and honest about it: two implementations, both written by one author, so this is a format rather than a standard yet. VERSIONING.md says what 1.0 requires — an implementation by somebody who did not write the spec.

The grammar is SPEC.md, the conformance suite is tests/, and where they disagree the tests win. MIT OR Apache-2.0.