GEML survey, illustrated · the awesome-markdown list · 2026-09-30 · 中文 · all illustrated pages · GEML home

The Markdown Variants Map

mundimark/awesome-markdown collects projects that set out to patch or replace Markdown, and GEML itself is in its "Beyond Markdown" section. This page looks at them one by one: what each does, where it collides with GEML, and where it goes another way. A few projects off the list are closer to GEML; they are included too, marked separately.

Verdict. No project does all three of GEML's things at once: one typed block, an addressable id on every block, and references checked at build time and before every write, with an error stopping the write.

Taken one at a time, each has been done earlier or deeper than in GEML. Generic blocks with attributes are common ground for Djot, Pandoc, MyST and Markdoc; validation with rule ids exists in Markdoc, mystmd and Carve; and querying and rewriting Markdown by selector is more of a language in mq than in geml get. Where GEML differs is binding the three together, and adding a command line that writes by block, MCP, and per-block history.

Closest in features is Carve, but its reach is still small. It sits in the same section of the list as GEML, was created only this May, and already has lint, a JSON AST, patch-based editing, an MCP server and an agent skill — it is moving fast; but it has only 32 stars and no outside users could be found. Weighed by reach, it is a project worth tracking, not the main rival for now. It differs from GEML in three ways: its addresses are heading ids and AST paths, writes go through confirmed patches, and it is not Markdown-compatible.

Board

25 projects, and where each stands to GEML

Head-on the same problem, a similar answer. Partial overlap on the same road for one thing. Worth borrowing has something GEML lacks. Different path a different goal or layer, or GEML's foundation. The first four groups come from the list; the last was added from beyond it.

Head-on 2 Partial overlap 9 Worth borrowing 3 Different path 11
ProjectWhat it isWhere it stands to GEMLVerdict
A new generation of lightweight markup · the list's "Beyond Markdown" section
1Carve2026-05 · 32 starsA "post-Markdown" built on Djot. It has an EBNF grammar, 2,200 test cases and three implementations (JS, Rust, PHP), plus lint, a JSON AST, patch-based editing, an MCP server and an agent skill.The most overlap in its section: it checks broken references and lets agents select and edit. Addresses are heading ids or AST paths, not ids an author writes on any block; cross-references can only point at headings and numbered captions.Head-on
2Djot2022 · 2,046 starsJohn MacFarlane's fix for CommonMark's hard parsing cases, adding attributes, generic containers and inline containers. Pandoc reads and writes it since 3.1.12.On the same road with "a generic block plus attributes". No block addressing, #id references are not checked, no embed syntax, and extending it means writing AST filters.Partial overlap
3VersaDok2025 · 17 starsA new language from kramdown's author: <<< >>> generic blocks, and ::name: extension blocks that can take over the raw body. The author calls it alpha.Its extension blocks are the only one of the four close to "the type decides how the body is read". No checks, no addressing.Partial overlap
4Texti2017 · 9 starsA proposal merging Markdown, wiki markup and LaTeX; headings become == Title ==.A 2017 draft whose parser is an empty module, untouched since.Different path
Long-standing syntax extensions · the list's "Markdown Syntax Extensions" and "Libraries"
5MultiMarkdownAdds metadata, tables, footnotes, cross-references and whole-file transclusion {{file}}. Version 7 is in pre-release.Its feature list overlaps GEML's, but every feature is a special-case syntax.Different path
6Markdown ExtraPHP Markdown's extensions: heading {#id}, fenced code, tables, definition lists, abbreviations.The {#id} on GEML headings comes from this line.Different path
7Markdown ExtendedA PHP parser meant to merge Extra and MultiMarkdown into one spec. No updates since 2024.As above.Different path
8CriticMarkupRevisions written in the text: additions, deletions, substitutions, comments, highlights.GEML has revision history but cannot express "a suggestion not yet accepted".Worth borrowing
9kramdown · Pandockramdown's attribute lists {: #id}; Pandoc's fenced divs, JSON AST and filters.Forerunners of the generic block, and of "the document becomes an AST first".Partial overlap
Specified dialects · the list's CommonMark, GFM and VFMD sections
10CommonMarkAn unambiguous Markdown spec and test suite.GEML's prose inherits from it: a foundation, not a rival.Different path
11GFMCommonMark plus tables, task lists, strikethrough and autolinks.When GEML reads a .md directly, it follows Markdown's rules where the two syntaxes disagree, and GitHub's heading anchors work as link targets.Different path
12VFMDAnother unambiguous spec.Not updated since 2016.Different path
Tools · across the list
13mq2025 · 1,040 starsQueries and rewrites Markdown with a jq-like syntax, with an MCP server.Does the same job as geml get/find/list. Addresses are derived from selectors and heading text, and its MCP is read-only by design.Head-on
14darnlink2026-07 · 19 starsAnchors files with UUIDs and fixes links after a file moves; usable as a CI gate.File-level reference checking and repair. GEML notices that a cross-document reference broke, but does not repair it.Worth borrowing
15mdcode2024 · 28 starsTwo-way sync between code blocks and source files, taking snippets by region.The same job as code {src=}, and it can push changes back to the source file.Worth borrowing
16markedppA Markdown preprocessor: table of contents, heading numbers, !include.A coarse-grained embed; a missing file is left as written, with no error.Different path
17Slidev48,891 starsVue components in Markdown slides. Since 2026-07 it ships an MCP that reads and writes by slide.On the same road with an MCP that reads and writes by unit. The unit is a slide and the address its number, which shifts once a slide is inserted.Partial overlap
18demarkus2026-02 · 16 starsA QUIC-based Markdown protocol and server, as versioned memory for agents.On the same road with agent reads and writes and version history. It reads a section by heading slug, but writes only whole documents.Partial overlap
19MarkWayA convention for websites to return Markdown instead of HTML to agents.Only the premise "Markdown is the format for agents" is shared. No code.Different path
20mk-notesOne-way sync from Markdown to Notion.Hardly any overlap; untouched since 2025-12.Different path
Beyond the list · a few closer to GEML
21MarkdocStripe · 8,494 starsDocuments hold only tags and attributes; their meaning is defined by the host's schema and validated item by item, and errors have stable ids.Closest to GEML in design: declarative, closed, checkable. No block addressing and no write commands.Partial overlap
22MySTJupyter Book's Markdown: a directive registry and labelled cross-references.On the same road with generic blocks and rule ids; a broken reference only warns.Partial overlap
23QuartoA Pandoc-based scientific publishing system with executable code blocks and cross-referenced figures.Computational documents; GEML has only computed columns and summary rows in tables.Partial overlap
24AsciiDocBlocks with attributes, include::, <<xref>>: a complete document language.On the same road with blocks and embeds; a broken reference is hidden by default.Partial overlap
25MDX19,809 starsJSX components written in Markdown.The document is a program: a different road from GEML's closed vocabulary.Different path
Blocks

Everyone arrived at "one generic block plus attributes"

Markdown's blocks are special cases, one by one: code, quotes, lists and tables each have rules of their own. Nearly every successor converged on the same fix: one generic container, told apart by attributes. Where they differ is whether the set of types is open or closed, whether ids have rules, and how the body inside a block is parsed.

The same "warning box", five ways Head-on The four on the left are Djot, Pandoc, MyST and Markdoc; GEML is on the right.
Djotgeneric div + attributes
{#warn .warning}
::: warning
Don't run this command on the production database.
:::
Pandoc Markdownfenced div
::: {#warn .warning}
Don't run this command on the production database.
:::
MySTdirective, beyond the list
```{warning}
:name: warn
Don't run this command on the production database.
```
Markdoctag, beyond the list
{% callout type="warning" #warn %}
Don't run this command on the production database.
{% /callout %}
GEMLone typed block
=== note {#warn}
Don't run this command on the production database.
===

=== table {#cost format=csv header=1}
Item,Cost
Hosting,120
===

=== data {#vars format=json}
{"owner": "docs"}
===
TypesidBody
DjotOpen; any classAttribute #id, optionalAlways parsed as Djot
CarveFixed names for admonitions; the rest become divsAttribute #id or heading slugAlways parsed as Carve
VersaDok::name: extension blocks, defined by the processorAttribute #idAn extension can take over the raw lines
PandocOpen; left to filtersAttribute #id, optionalAlways parsed as Markdown
MySTA registry; an unknown directive warns:name: or (label)=Each directive decides
MarkdocDeclared in a schema; an unknown tag is an errorAttribute #idParsed as Markdoc
GEMLListed in the spec, extended by profiles; an unknown type warns{#id}; a duplicate is an errorBy type: code, tables and data are raw text, a note is prose
Overlap
"One block syntax for every special case" is not GEML's idea alone. Djot's author, John MacFarlane, also wrote CommonMark and Pandoc, and the direction he set out in "Beyond Markdown" is almost exactly where GEML starts.
Difference
In GEML a block's type decides how its body is read: the body of a table or a data block is raw text, handed to its own parser and never read as Markdown. A div in Djot, Carve or Pandoc is only a container, always holding markup; only VersaDok's extension blocks can take over raw lines. That is what lets GEML compute columns in a table and pick values out of data by coordinate. None of the four new languages has one block syntax covering code, tables, math and data alike: tables and math keep their own special syntax.
Takeaway
Djot, Carve and VersaDok hang attributes on any element, inline ones included. GEML hangs them only on blocks and headings, and inline elements have no id. Whether inline content should be addressable deserves a place among the open questions.
References

Everyone has ids; few treat a broken reference as an error

Nearly every variant can give a block an id and link to it. Where they part is what the tool says when a link points at an id that does not exist.

A reference to a target that does not exist Partial overlap The same mistake, as seven toolchains treat it. Messages are quoted from each project's source and docs.
How each writes it
Djot / Pandoc: See [Budget](#budjet)
MyST: See {ref}`budjet`
Quarto: See @fig-budjet
AsciiDoc: See <<budjet>>
ToolWhen the target is missing
Djot#id not checked djot.js warns only about reference-style links it cannot find
Pandocnot checked Outputs a broken link as usual
Carvelint carve lint reports broken-crossref and exits non-zero; cross-references can only point at headings and numbered captions
mystmdwarning Rule id referenceTargetResolves
Quartowarning Unable to resolve crossref
Asciidoctorinfo possible invalid reference, hidden by default
Markdoclinks not checked Validates only tags, attributes and variables; errors have stable ids such as attribute-undefined
GEML
# Budget {#budget}

Hosting is 120 a month.

# Appendix {#appendix}

See [[#budjet]].
$ geml check refs.geml
error: unresolved reference `#budjet` (line 7)
1 error(s)                                     exit 1

$ geml set refs.geml '#budget' --in new.geml
error: refused by an error the document ALREADY had, which
this edit did not cause: unresolved reference `#budjet` …;
not written — repair it first

The edit is to the #budget section and the broken reference is in #appendix, yet the write is still refused. The diagnostic unresolved-reference is in the spec's Appendix A, at severity error. A writer does not keep stacking changes on a document that is already broken.

Overlap
Giving an error a stable rule id is something Markdoc (tag-placement-invalid and the like), mystmd (referenceTargetResolves) and Carve (broken-crossref) all do, the same idea as the diagnostic catalogue in GEML's Appendix A. Carve's lint also exits non-zero and can serve as a CI gate, as geml check does.
Difference
Most tools treat a broken reference as a reminder; GEML treats it as an error. The bigger difference is where: elsewhere the check is a separate command, while GEML puts it on the write path and rechecks the whole document before every write. For a person that is a little stricter; for an agent changing one block at a time, it is how it confirms it broke nothing elsewhere.
Query

Query and rewrite: by selector, or by id

Taking or changing one part instead of writing the whole file is the core of GEML's command line. Two tools on the list do neighbouring things: mq queries and rewrites Markdown with a jq-like syntax, and darnlink anchors links with UUIDs, so they can be fixed after a file moves.

Take the "Install" section, then change it Head-on mq's examples come from its README and cookbook; the GEML side is real output.
mqRust · 1,040 stars
$ mq '.h(2)' README.md                     # every level-2 heading
$ mq '.code("rust")' README.md              # every rust code block
$ mq 'section::section("Installation")' README.md
$ mq -U '…' README.md                     # rewrites, printing the whole file to stdout
Address
Node types, content predicates, heading text. No stable id: rename the heading, and section("Installation") finds nothing.
Write-back
-U prints to stdout only; writing back to the file takes the companion mq-mount with --write, or mq-db with --write-back. Nothing is checked before writing.
Agents
There is mq-mcp, and the README lists "LLM workflows" first. Its MCP deliberately allows no writes, on the grounds that an agent's tool calls may run unattended.
GEMLreal run
$ geml list doc.geml
#install                 heading  h1    L1-8   Install
#install-before-upgrade  prose          L3-3
#upgrade                 heading  h2    L5-8   Upgrade
#usage                   heading  h1    L9-12  Usage

$ geml find Upgrade .
doc.geml	#upgrade

$ geml get doc.geml '#install' --head
# Install {#install}

$ geml rename doc.geml '#install' '#setup'
# Install {#setup}
See [[#setup]].                  # references change with it

$ geml list doc.geml --within '#install'
#install-before-upgrade  prose          L3-3
#upgrade                 heading  h2    L5-8  Upgrade

$ geml get complex-form.geml '=== form-field {type=date}'
4 `form-field` blocks (L48-49 #founded · L99-101 #iso-expiry · …)

The address is the #id the author wrote, untouched when the heading is renamed; a paragraph without an id still gets an address derived from its position, such as #install-before-upgrade. Selectors can also filter by attribute and narrow to one section with --within; the last command is run on the repository's GEP-0008 form example. Every write rechecks the whole document first.

Overlap
mq is the tool on the list closest to geml get/find/list, and likewise has both a command line and an MCP. GEML's selectors filter by type, attribute and content address, such as === code {lang=rust} or {.warn}, and narrow to one section with --within; what mq has besides is pipes and map, and selecting by heading level as in .h(1..3).
Difference
mq queries "any Markdown", so its addresses can only be derived from content. GEML has the author write ids, which is what makes addresses stable and writes checkable. mq-mcp allows no writes; GEML allows them but puts every one through the check, with per-block history as the fallback. These are two answers to "may an agent write on its own".
A link's target moved Worth borrowing darnlink puts identity on files, GEML on blocks. Each covers half.
darnlinkPython · created 2026-07
<!-- the target file's frontmatter -->
---
uuid: 7f3a1e2c-…
---

<!-- the referring side -->
[Design doc](docs/design.md) <!-- uuid: 7f3a1e2c-… -->
$ darnlink check .      # 0 clean · 2 integrity problems · 3 unanchored links
$ darnlink . --write    # after a file moves, rewrites its path by UUID
GEML
See [[design.geml#arch]].
What happenedGEMLdarnlink
A block's id was renamedgeml rename updates every referenceDoes not deal with blocks
The target file movederror Reported, but not repairedFinds the new path by UUID and rewrites it
As a CI gategeml check exits non-zerodarnlink check exits non-zero, with a pre-commit hook
Takeaway
GEML notices that a cross-document reference broke, but after a file moves the path can only be fixed by hand. darnlink gives a file an identity that does not change with its path. GEML could borrow the idea: a document id in the meta, which geml uses to find a moved file under the root. Nothing in GEML has a place for this today; it belongs on the to-do list.
Embedding

Embedding and sync: pull in, or push back

Putting content from elsewhere into a document is the most common extension people ask for. On the list, mdcode, Slidev, markedpp and MultiMarkdown each have a syntax for it, and AsciiDoc, beyond the list, has one too. They part in two places: whether they refer by line number or by name, and whether a miss is an error.

Take a piece of code from a source file, and a section from another document Partial overlap
mdcodetwo-way sync
```go file=main_test.go region=example
…
```

A #region example comment marks a piece of the source file. mdcode update pulls the source into the document; mdcode extract pushes changes in the document back to the source file.

Slidev
<<< @/snippets/demo.ts#region-name {2,3|5}
---
src: ./other.md#2,5-7      slides from another deck, by number
---
markedpp · MultiMarkdown · AsciiDoc
!include (test.js lang=javascript)   markedpp: left as written if missing
{{chapter2.md}}                      MultiMarkdown: the whole file
include::part.adoc[tag=intro]        AsciiDoc: one piece, by tag
GEML
=== code {#add lang=js src=src/math.js#L1-3}
===

=== code {#gone lang=js src=src/math.js#L40-45}
===

=== embed {src=guide.geml#install part=intro}
===
$ geml check code.geml
error: code source `src/math.js#L40-45`: the file has 7 line(s),
so lines 40-45 no longer exist — the range is stale (line 6)
1 error(s)

embed takes a section of another document by id, and part= picks the whole section, its heading, its intro or its body. The embedded document is first parsed on its own rules, and its references are checked too.

Overlap
All four take code from a source file, and taking a piece by name (mdcode's and Slidev's regions, AsciiDoc's tags) resists drift better than GEML's line numbers.
Difference
GEML reports an error when line numbers drift; markedpp silently keeps the original text when nothing is found. GEML's embed takes content by block id; Slidev takes it by slide number, MultiMarkdown by whole file.
Takeaway
Two things to learn. One: refer to a piece of source by name rather than by line numbers, for instance by recognising region comments in the source, so a few added lines do not shift it. Two: mdcode's reverse sync, which writes a change to example code in the document back to the source file.
Extensions

Components and extension points: code into the document, or vocabulary into the document

There are two ways to put a chart, a form or something interactive into Markdown. One lets the document contain component code; the other has the document write only declarations, which a renderer interprets against a vocabulary.

Put a chart in a document Different path MDX and Slidev let a document import components; GEML has the document declare a type whose attributes and meaning a profile defines.
MDXbeyond the list
import { Chart } from './Chart.jsx'

# Quarterly revenue

<Chart data={rows} type="bar" />
Slidevon the list
---
layout: two-cols
---
# Quarterly revenue
<BarChart :data="rows" />
GEML
=== table {#q format=csv header=1}
Quarter,Revenue
Q1,120
Q2,180
===

=== diagram {#rev format=geml-chart data=#q type=bar x=Quarter y=Revenue}
===

The chart's data is a table in the same document, referred to as #q, and the reference is checked. There is no executable code: section 1 of the spec says "There is no raw-HTML escape hatch".

Difference
MDX and Slidev have no ceiling on expressiveness, at the price that the document is a program: it needs a runtime and a bundler, and trust in the author's code. GEML chooses closure: types and attributes are written in the spec or a profile, an unknown type warns, and the document itself can always be parsed, checked and handed to an agent safely.
Overlap
Markdoc takes GEML's road: a document holds only tags and attributes, and a tag's meaning is defined by the host's schema and validated. It is the project beyond the list closest to GEML's design, only without block addressing and write commands.
Agents

For agents: in 2026 everyone shipped an MCP

"Let an agent read and write one part instead of rewriting the whole" became common ground this year. Slidev added an MCP in July, Carve's MCP was created in September, and mq and demarkus each have one. They differ in three places: whether the address is stable, whether a write is checked first, and whether a bad change can be rolled back.

Five MCP servers, one set of questions Head-on From each project's README and MCP source, as of 2026-09-30.
ServerReads byHow it writesAddressBefore a writeHistory
Carve
carve-mcp, 14 tools
Heading, footnote, a kind of node, AST pathMakes a revertible patch carrying a source hash; never writes the file itselfHeading id or AST pathLint on request; a patch is void once the source changesPatch reverts
Slidev
built in, 2026-07
One slideEdits, inserts, deletes or moves a slide, written back to the .mdSlide number; inserting a slide shifts every one after itNoneNone
demarkus
15 tools
A whole document, or a section by heading slug; an outline first for large onesPublishes or appends a whole document with an expected version; offers merge candidates on conflictPath, content hash, heading slugVersion-conflict detectionWhole documents, a server-side hash chain
mq
mq-mcp
A section, or a kind of nodeNo writesSelector, heading textn/aNone
GEML
11 tools
A block, a section, a coordinateWrites the file directly, by block or by sectionThe #id the author wroteRechecks the whole document and refuses a broken one; with a content address in the selector, a block whose content changed is not writtenPer block, .gemlhistory
Overlap
GEML's "read and write by block, over MCP" is no longer a selling point of its own. The weightiest evidence is Slidev, with nearly 50,000 stars, which already ships an MCP that reads and writes by slide; Carve even has an agent skill, though its community is still small.
Difference
Only GEML's address is an id the author writes, independent of position and heading text, and only GEML checks the whole document at the moment of writing. Carve takes a different kind of safety: it does not write, it hands over a hashed patch for a person or a program to confirm.
Takeaway
Carve's source hash and demarkus's expected version guard against an agent reading a block, someone else changing it, and the agent writing back over the change. GEML's selector === note@<hex> {#id} does the same check: once the content changes it no longer matches, and nothing is written. What is missing is get --json and the MCP handing that hash straight to the caller.
Revisions

Record a change in the text, or beside it

CriticMarkup is the only project in the list's syntax-extensions section that deals with revisions.

A suggested change Worth borrowing
CriticMarkup
Hosting is {~~120~>150~~} a month.
{>>revised to the new quote<<}
{++Backups included.++}

Insert {++ ++}, delete {-- --}, substitute {~~ ~> ~~}, comment {>> <<}, highlight {== ==}. The marks stay in the text and go only once the change is accepted or rejected.

GEML
$ geml history save doc.geml -m "revised to the new quote"
$ geml history get doc.geml --json
[ { "id": "20260930T…", "summary": "revised to the new quote", "offset": 0, "current": true }, … ]
$ geml revert doc.geml '#cost' --rev 20260930T…

History lives in the .gemlhistory sidecar and rolls back by block. The text stays clean, but GEML cannot express the state "a suggestion not yet accepted".

Takeaway
GEML has revision history but no pending suggestions. An agent that proposes a change and waits for a person to confirm it can today only write it in and roll it back. CriticMarkup's "proposed" state could be a candidate for a profile: a suggestion hangs on a block id, and accepting it is an ordinary write.
Takeaways

What it means for GEML

Four things: what is really unique, which rival to face squarely, what is worth borrowing, and what is no cause for worry.

Unique Three things bound together

Typed blocks, stable ids the author writes, and a whole-document check before every write: each has been done on its own, but only GEML puts them together. Add a command line and an MCP that write by block, per-block history, and reading existing .md directly: Carve and Djot both need the document converted first, and GEML does not.

Closest Carve: close in features, small in reach

Same section, same story: lint, a JSON AST, patch-based editing, MCP, an agent skill. Created only this May, it already has 64 repositories, 2,200 test cases and three implementations, with dozens of commits a day at the end of September; but it has only 32 stars, and no outside users could be found. Weighed by reach, it is a project to track, not today's main rival. It differs from GEML in a stable address on any block, a check on every write, and compatibility with existing Markdown; whenever GEML is presented, those three should come before the syntax.

Reach Weighed by reach

The two head-on projects are both small: Carve has 32 stars, mq 1,040. The big ones are Slidev (48,891), Pandoc (46,456), MDX (19,809) and Markdoc (8,494). Judge the effect on GEML by the latter: Slidev shows that an MCP reading and writing by unit is already in a mainstream tool, and Markdoc is the best frame of reference for presenting GEML.

Worth borrowing Six things GEML does not have yet

Attributes and ids on inline elements (Djot, Carve); referring to a source snippet by name (mdcode's and Slidev's regions, AsciiDoc's tags); pushing code changes in a document back to the source file (mdcode); repairing cross-document references after a file moves (darnlink); pending suggested changes (CriticMarkup); handing the content hash to the caller for a check before writing (Carve, demarkus).

No cause for worry The foundation, and another layer

CommonMark, GFM and VFMD are where GEML's prose comes from; old extensions like MultiMarkdown and Markdown Extra are collections of special-case syntax, which GEML has folded into one kind of block. MDX is the other road, "the document is a program". MarkWay and mk-notes sit at the layer of protocols and sync, not of document formats.

Proposal
By the project's rules, each of the six "worth borrowing" items should have a name and a phase in a design document. Two are the smallest and closest to what exists: have get --json and the MCP return the content hash, for a check before writing with the content address in a selector; and refer to source by region, added to code {src=}.
Evidence

Repository data and probes

Repository data comes from the GitHub API, on 2026-09-30. "Last push" is the date of the repository's last push, not necessarily its last feature commit.

ProjectRepositoryStarsCreatedLast pushLicense
Carvemarkup-carve/carve322026-05-132026-09-30MIT
Djotjgm/djot2,0462022-07-112026-07-01MIT
VersaDokgettalong/versadok172025-01-092026-07-05MIT
Textitexti/texti.github.io92017-07-142018-08-04CC0
MultiMarkdown 6 / 7fletcher/MultiMarkdown-7678 / 562017-01-192026-09-22See repo
Markdown Extramichelf/php-markdown3,4622010-06-062025-06-17See repo
Markdown Extendede-picas/markdown-extended382013-06-022024-03-02See repo
CriticMarkupCriticMarkup/CriticMarkup-toolkit8492013-01-102021-03-04See repo
kramdowngettalong/kramdown1,7822008-11-302026-01-31See repo
Pandocjgm/pandoc46,4562010-03-202026-09-29GPL-2.0
CommonMarkcommonmark/commonmark-spec5,1492014-08-142026-04-27See repo
GFMgithub/cmark-gfm1,1332016-12-012026-09-28See repo
VFMDvfmd/vfmd-spec322013-09-012016-10-29None stated
mqharehare/mq1,0402025-02-242026-09-30MIT
darnlinktxemi/darnlink192026-07-112026-09-27GPL-3.0
mdcodeszkiba/mdcode282024-01-082026-02-23MIT
markedppcommenthol/markedpp392014-09-012025-08-18MIT
Slidevslidevjs/slidev48,8912021-04-242026-09-16MIT
demarkuslatebit-io/demarkus162026-02-142026-09-30AGPL-3.0 per README
MarkWayRaysunKR/MarkWay22026-03-312026-06-03MIT
mk-notesMyastr0/mk-notes1252025-01-292025-12-23MIT
Markdocmarkdoc/markdoc8,4942022-05-092026-09-16MIT
MySTjupyter-book/mystmd5252020-07-212026-09-28MIT
Quartoquarto-dev/quarto-cli6,0332020-09-252026-09-30See repo
AsciiDocasciidoctor/asciidoctor5,2182012-06-012026-09-01See repo
MDXmdx-js/mdx19,8092017-12-242026-09-29MIT
GEML probeCoversResultWhere on this page
refs.geml · new.gemlA broken reference in another section, an edit to this one1 error Write refusedids and reference checks
code.geml · src/math.jsCode taken by line range, the range stale1 error Stale rangeEmbedding and sync
doc.geml · complex-form.gemllist, list --within, find, get --head, rename; attribute filters0 diagnosticsQuery and rewrite
samples.gemlHow note, table, data and geml-chart are written0 diagnosticsGeneric blocks · Components and extension points