| Inline |
| Italic | /x/ | *x* | Different design | Carve takes it from Org-mode; GEML keeps Markdown |
| Bold | *x* | **x** | Same form, different meaning | *x* is bold in Carve and italic in GEML (probe P7) |
| Bold italic | /*x*/ | no dedicated form | Carve only | Carve's own |
| Underline | _x_ | none; _x_ stays literal | Carve only | Probe P7 |
| Strikethrough | ~x~ | ~~x~~ | Different design | GEML uses the GFM spelling; a single tilde is not syntax in GEML |
| Highlight | =x= | none | Carve only | ==x== in Init; single character since 06-11 |
| Superscript / subscript | {^x^} {,x,} | none | Carve only | Braced forced form from Djot |
| Intraword forced delimiters | H{,2,}O etc. | none | Carve only | Djot style |
| Code span | `x` | `x` | Shared heritage | Markdown (2004) |
| Inline literal | !`x` | none | Carve only | Added to Carve 07-21 |
| Inline math | $`x` | $x$ | Different design | Carve moved to Djot's form on 05-21; GEML uses the LaTeX/Pandoc $…$ |
| Raw inline output | `x`{=html} | none; the spec forbids it | Carve only | From Djot / Pandoc RawInline |
| Link | [t](url) | [t](url) | Shared heritage | Markdown (2004) |
| Reference link | [t][ref] + [ref]: url | none | Carve only | Markdown has it; GEML left it out |
| In-document anchor link | [t](#id) | [t](#id) | Shared heritage | Markdown spelling in both; only GEML checks that the target exists (probe P1) |
| Cross-reference with automatic text | </#id> | [[#id]] | Different design | The concept is LaTeX \ref and AsciiDoc <<id>>; GEML's first draft cites AsciiDoc for it |
| Cross-document reference | a plain link [t](a.crv#id), unchecked | [t](a.geml#id) [[a.geml#id]], checked | Different design | Probe P3: Carve accepts a missing target; GEML reports it |
| Wiki-style link | [Heading text][]; optional extension [[Heading]] | [[#id]], naming an id rather than heading text | Different design | [[ ]] comes from MediaWiki / Obsidian / Logseq |
| Image / media |  image |  image, audio or video, inferred from the extension | Shared heritage | Markdown; GEML widened it to in-place media (06-17) |
| Inline content projection | {{ path #id }} include processor, outside the core | ![[#id]] core syntax, projecting a text block | Different design | ![[ ]] is Obsidian's embed spelling |
| Footnote reference | [^l], defined by [^l]: …; inline ^[…] | [^id], pointing at any block with that id | Shared heritage | PHP Markdown Extra (2005); the definitions differ |
| Metadata interpolation | dismissed | {{key}}, escaped as \{{ | GEML only | Carve rejects it in dismissed-syntax.md; GEML added it 06-18, and an undefined key is an error (probe P5) |
The {{ … }} pair | file include {{ path #id @lines:N-M }} | metadata interpolation {{key}} | Same form, different meaning | Carve requires inner spaces, so {{path}} is plain text; GEML's {{key}} has the same shape as Mustache or Hugo templates |
| Inline span and attributes | [t]{.c}, /x/{.c} | only links and media take attributes | Carve only | Djot's span |
| Semantic spans | [Tab]{kbd} {abbr=…} {time=…} | none | Carve only | Carve's own |
| Language tag | {:fr} {:} | none | Carve only | BCP 47 |
| Inline extension | :name[x]{a} | none | Carve only | Resembles remark-directive |
| Symbol | :rocket: | none | Carve only | Djot symbol |
| Mention / tag | @user #tag | none | Carve only | Social-platform convention |
| Editorial marks | {+ +} {- -} {~a~>b~} {#note#} | none | Carve only | CriticMarkup |
| Smart typography | -- ... --> (c) | no substitution | Carve only | Djot / SmartyPants |
| Escape | \ + ASCII punctuation | \ + ASCII punctuation | Shared heritage | CommonMark (2014) |
| Hard line break | \ at line end | \ at line end | Shared heritage | CommonMark |
| No-break space | \␠ mid-line | none | Carve only | Djot |
| Blocks |
| Heading | #…###### | #…###### | Shared heritage | Markdown ATX headings; neither has setext |
| Explicit heading id | on the line above: {#id}⏎# Title | at the line end: # Title {#id} | Different design | Carve dropped the trailing form on 06-04; GEML settled on the line end on 06-17 (Pandoc / kramdown style) |
| Automatic heading id | keeps case: id="Intro" | normative derivation: lower-case, NFD, strip diacritics, whitespace to - | Different design | Probe P1 renders <section id="Intro">; GEML spec §4 gives a six-step derivation |
| Prose addresses | none | #prev-between-next, #container-before-next | GEML only | Prose between two blocks gets a unique address from both ends; inserting a block makes the old address stop resolving |
| Paragraph / bullet list | - * | - * | Shared heritage | Markdown |
| Ordered list | 1. 1) a. i. and auto-numbered . | 1. | Different design | Carve's is richer |
| Task list | [ ] [x] plus [-] [>] [?] [_] | [ ] [x] | Shared heritage | GitHub (2013); Carve's extra states come from Org TODO |
| Block quote | >, ::: >, ^ attribution | none | Carve only | GEML's syntax inventory has no block quote |
| Thematic break | --- *** ___ | left out on purpose | Carve only | GEML's 06-17 fence rationale: - clashes with breaks, frontmatter, setext and lists, so the fence uses = |
| Code block | ```lang "Header" [Label] | === code {lang=… src=…} | Different design | In GEML a backtick run is only a shield and never opens a code block |
| Raw block | ```=html, passed through by default | none | Carve only | Probe P8: <script> comes out unchanged |
| Container / admonition | ::: note "Title" … ::: | === note … === | Different design | ::: is the Pandoc / MyST / Djot fence; GEML's first draft used it for seven minutes and switched to === at 07:17 |
| Fence closing and nesting | exact colon count; inner fences add a colon | exact equals count; outer fences are longer | Different design | Equal-length closing is the common fence rule (CommonMark code fences) |
| Unknown type | ::: word → <div class="word"> | === word → warning, body kept | Different design | GEML's first draft (§3) already made it a forward-compatible warning |
| One typed-block primitive | none | === type {attrs} + a type registry (raw / flow / key-value) | GEML only | Code, math, tables, views, data, diagrams, embeds, notes, text and metadata share one fence |
| Line block (verse) | ::: | | none | Carve only | reST / Djot |
| Definition list | :: term / : definition | none | Carve only | |
| Continuation marker | a lone + line | none | Carve only | Carve's own |
| Display math | $$`…` | === math | Different design | |
| Comment line | %%, plus %%% blocks, trailing %%, {% %} | line-start %% only | Shared heritage | Obsidian %%…%% and Mermaid %% comment lines (GEML hosts Mermaid). GEML added it 06-18 to replace the forbidden <!-- --> |
| Hidden but checked block | none | {hidden} | GEML only | A source table that only feeds a chart: in the model, reference-checked, not rendered |
| Metadata | --- YAML frontmatter (---toml ---json) | === meta key-value, typed, mergeable, addressable as #meta | Different design | GEML explicitly has no --- frontmatter |
| Caption | ^ text on the next line, auto-numbered Figure # | caption="…" attribute | Different design | Carve's is stronger: numbering, listings, equation captions |
| Composite figure | ::: figure, panels "Figure 2a" | none | Carve only | |
| Attribute object contents | {#id .class key=val} | {#id .class key=val} | Shared heritage | Long established in PHP Markdown Extra, kramdown, Pandoc and MyST; in GEML's 06-17 draft EBNF |
| Where attributes attach | the line above a block, floating past invisible blocks | in the fence line === t {…}, at a heading's line end | Different design | GEML lets a long attribute object continue over lines with \ |
| Bare attribute word | word → word="" | word → boolean true; values are string, number or boolean | Different design | An open question in GEML's first draft: borrow TOML's typing discipline |
| Abbreviation definition | *[HTML]: … | none | Carve only | PHP Markdown Extra |
| Include / embed | {{ path #id @lines:N-M @shift:N }} | === embed {src=doc.geml#id}; code src=f#L10-20 | Different design | Carve has more parameters; in GEML an out-of-range line span is an error (probe P4) |
| Placement directives | ::: toc ::: footnotes etc. | none | Carve only | |
| Tabs / citations | ::: tab, [@key] (optional) | none | Carve only | |
| Tables |
| Table shape | a bare pipe table, |= marks header cells | a GFM pipe table inside === table | Different design | |= comes from Creole; pipe tables from PHP Markdown Extra / GFM |
| Alignment | glued < ~ >, vertical ^ ~ v, inherit ? | GFM delimiter row :--: | Different design | Carve's is stronger |
| Merged cells | ^ up, < left | none | Carve only | |
| Continuation rows / header rows | + rows, {header-rows=N} | none | Carve only | |
| Data-form body | none | format=csv|tsv header= delim= | GEML only | "Two table forms" in the 06-17 draft |
| External data source | none | src=data.csv or http(s) | GEML only | |
| Derived view | none | === view {src=#t compute=… summary=…} | GEML only | Computed columns, a summary row, printf display formats (probe P6) |
| Data block | none | === data {format=json|jsonl schema=…} | GEML only | A record array can feed a chart directly |
| Graphics |
| Hosting an external diagram DSL | ```mermaid etc., optional feature (06-21) | === diagram {format=mermaid} (06-17 draft) | Different design | GitLab, GitHub and Obsidian had mermaid code blocks first; GEML's draft rule is "host a DSL, never invent one" |
| Charts | ```chart Chart.js JSON, numbers written into the body | format=geml-chart data=#table x= y=, checked by column | Different design | Only GEML's charts bind to data in the document (probe P6) |
| Code graph | none | format=geml-code-graph | GEML only | GEP-0002 / 0003 (07-01) |
| Addressing |
| Labeled closing fence | none; colons are counted | === #id | GEML only | Added 06-29: the closing line names the block it closes, so nothing has to be counted |
| Inner-unit coordinates | none | #fy[2] #fy[2]["Q1"] #fy["Q1"] #fy[summary] | GEML only | GEP-0011 (09-03): reference one row, cell or column of a table, across documents too, and have it checked |
| Address for content without an id | AST path (JSON Pointer), session-scoped node id | content address @<hex> (first 8 hex of SHA-256), derived prose addresses | Different design | GEML's @<hex> arrived 08-04 and finds a block by its content; Carve's paths move when the structure changes |
| Selecting blocks by type / attribute | carve_select_ast_nodes (MCP, 09-09) | '=== code {lang=py}' {.warn} --within (09-30) | Different design | GEML's commit message cites mq's query language |
| Characters and files |
| Input normalization | strip one BOM, unify line endings, U+0000→U+FFFD | the same (§0, 07-25) | Shared heritage | CommonMark §2, "Insecure characters"; GEML added it after a bug where a BOM turned # Title into a paragraph |
| Extension / media type | .crv, clipboard text/x-carve | .geml, text/vnd.geml (IANA registration pending) | Different design | |