Skip to content
Ferromark

Absurdly fast. Fully compatible.

Ferromark renders Markdown faster than every library we measured, and it does not bend a single rule of CommonMark or GFM to get there. Native for Rust and Node.js, with a stack of extras on top when you want them.

Speed you can measure.

Ahead of every library in our 57-document benchmark, on Linux and macOS, from Rust and from Node.js. Fast enough that rendering stops being a step you think about.

See the numbers
Version
2.1.2
Crates.io total downloads
5,390

Ahead of every measured library.

Twenty Markdown libraries. 57 real documents. Both macOS and Linux. Ferromark delivered more throughput than every library in our comparison, from Rust and from Node.js.

In native Rust, Ferromark delivered 2.3–2.7× the throughput of pulldown-cmark. Through Node.js, it delivered 9.5–9.7× that of marked, including binding overhead. These ranges cover both recorded hosts, using fresh calls across the full corpus.

Your workload and enabled features affect the result. Some libraries also produce different output for these inputs. The detailed comparison keeps those differences, configurations and source measurements in view.

And not one shortcut.

Speed is easy if you cut corners. Ferromark keeps the full CommonMark and GFM behavior, and every result below is backed by specification fixtures you can run yourself.

CommonMark 0.31.2
652 / 652

Every single example in the specification renders exactly like the reference.

GFM extensions
Covered

The official GitHub Flavored Markdown extension examples run in the conformance suite.

CR and CRLF input
1,304 variants

Every example again with CR and with CRLF line endings, and the output must not change.

Original cmark corpus
Covered

The upstream cmark comparison corpus stays in the regression suite.

Then come the extras.

Plain Markdown runs out of words exactly where publishing gets interesting: who said this, what does this table show, which cells belong together. Ferromark Flavored Markdown fills those gaps with a few small additions that still read like plain text. All of them are opt-in, so plain documents stay plain and fast.

Write this. Get this.

One Markdown source with the FFM preset, rendered by Ferromark itself.

Source

> Simplicity is prerequisite for reliability.
: Edsger W. Dijkstra, *1975*

| Plan | Monthly | Yearly |
| :--- | ---: | ---: |
| Starter | 9 € | 90 € |
| Team | 29 € | 290 € |
| Enterprise | On request ||

: Pricing *per seat*

Captions and credits are ==plain Markdown==.^[No HTML, no shortcodes.]
This sentence was ++added in the second edition++.

Result

Simplicity is prerequisite for reliability.

Edsger W. Dijkstra, 1975
Pricing per seat
Plan Monthly Yearly
Starter 9 € 90 €
Team 29 € 290 €
Enterprise On request

Captions and credits are plain Markdown.1 This sentence was added in the second edition.

No HTML, no shortcodes.

↩

Credit under a quote.

A line starting with : right after a quotation becomes its source. Readers see who said it, and the credit stays outside the quoted words.

Tables that explain themselves.

The same : line under a table becomes its caption. A doubled pipe || merges a cell across columns, so “On request” spans both prices.

Small marks with meaning.

==…== highlights, ++…++ marks an insertion, and ^[…] drops a footnote right where the thought happens.

Your application stays in charge.

Ferromark parses and renders, and does that one job really well. Trust, translation, routing and presentation remain your decisions.

Memory-safe by design

Written in Rust, so whole classes of memory bugs never compile. Unsafe code fails the build, except in a few small, documented SIMD and allocator spots.

Safe until you say otherwise

Node.js escapes authored HTML and filters unsafe URL schemes until you trust the source. Rust keeps raw HTML unless you enable sanitizing. Either way, you decide.

Small core, open edges

Typography, GitHub references and emoji are optional passes. Highlighting and diagrams plug in through rendering hooks, so you pick the tools.

Parse once. Use it everywhere.

The document Ferromark already parsed for rendering can do more. Check links, feed your search index, or export clean Markdown, without parsing a second time.

Reference inventories

Every link, image and static MDX URL, with its destination and source range. Broken-link checks become a loop over a list.

Text and search sections

Plain text and ordered heading sections, with the final heading IDs and hierarchy your search index needs.

Static Markdown export

Strip dynamic MDX, keep the original Markdown and code. Diagnostics tell you exactly what was left out.

Your next document deserves this.

Choose your runtime and follow the getting-started guide. Rust gives you the parser and document tree directly, Node.js a typed JavaScript API on top of the same native engine.

GitHub repository · Documentation · Integration and support