mddiff — visual diff gallery

Every kind of markdown change mddiff renders, shown as a real before/after diff.

â–  removed   â–  added  Â·  12 sections, 125 cases

Coverage — entity × container

entity \ containerwordsentenceparagraphpageheadingblockquotecode blocklistTOCtable
Characteread✓✓✓eadeadeadeadeadead
Word—ead✓✓eadeadeadeadeadead
Phrase—ead✓✓eadeadeadeadeadead
Sentence——ead✓eadead—ead—ead
Paragraph———ead—ead—ead—ead
Hyperlink—ead✓✓eadead—eadeadead

ead = edit · add · delete: green = shown here · red = valid but no example yet.

✓ = equivalent class · — = invalid

Character

A single-character change marks just that word inline; the rest of the line stays clean.

One character changed in a word #character-edit

character · word · edit · consecutive

Dropping a letter (colour → color) word-diffs in place — no whole-line rewrite.

before

the colourcolor of the sky

after

the colourcolor of the sky

Scattered single-character changes → whole-block replace #character-edit-nonconsecutive

character · sentence · edit · non-consecutive

Typos fixed all over a line jump unchanged↔changed too many times to read inline, so it safely whole-blocks instead of scrambling.

before

teh cat aet teh fihs and teh dog rann home

the cat ate the fish and the dog ran home

after

teh cat aet teh fihs and teh dog rann home

the cat ate the fish and the dog ran home

One character added to a word #character-add

character · word · add

Inserting one letter (cat → cart). It renders identically to a character delete/edit, because htmldiff is word-level so any single-character change re-marks the whole word. The visual shows that expected sameness.

before

the catcart sat on the mat

after

the catcart sat on the mat

One character removed from a word #character-delete

character · word · delete

Removing one letter (cart → cat). The mirror of the add, and — by the same word-level mechanism — the same whole-word re-mark. The behaviour is uniform at the character level, and the visual shows it.

before

the cartcat sat on the mat

after

the cartcat sat on the mat

Word

A whole-word swap is marked inline; surrounding words are untouched.

One word swapped inside bold text #word-swap

word · sentence · edit

workspace → project, inside **bold** — only the word is marked.

before

assumes the workspaceproject root here

after

assumes the workspaceproject root here

A word added to a sentence #word-add

word · sentence · add

Inserting a word marks just the new word inline; the rest of the sentence is untouched.

before

the black cat sat on the mat

after

the black cat sat on the mat

A word removed from a sentence #word-delete

word · sentence · delete

Removing a word marks just that word inline; the rest stays clean.

before

the black cat sat on the mat

after

the black cat sat on the mat

Phrase

A reworded phrase keeps its identical lead-in unmarked even when the new text is much longer.

Reworded phrase keeps its shared opening #phrase-edit-common-leadin

phrase · paragraph · edit · consecutive

The bold label and path prefix stay unmarked; only the divergent tail is shown.

before

Assumed directory — ~/dev/awesomele/yi-yi-kitchen-strategy/strategy (the project root). The server bun scripts live in delivery/server; baked in with --cwd.

after

Assumed directory — ~/dev/awesomele/yi-yi-kitchen-strategy/strategy (the project root). The server bun scripts live in delivery/server; baked in with --cwd.

Scattered phrase changes → whole-block replace #phrase-edit-nonconsecutive

phrase · sentence · edit · non-consecutive

When changes are spread across the line with little shared text, an inline word-diff would scramble — so it whole-blocks instead.

before

The fast red car drove quietly down the long winding road

The slow blue truck rolled loudly along the short straight street

after

The fast red car drove quietly down the long winding road

The slow blue truck rolled loudly along the short straight street

A phrase inserted mid-sentence #sentence-phrase-add

phrase · sentence · add

An appositive phrase added between the subject and verb is marked inline; the rest of the sentence stays clean.

before

The serverserver, our only host, runs locally.

after

The serverserver, our only host, runs locally.

A phrase removed from mid-sentence #sentence-phrase-delete

phrase · sentence · delete

Dropping the appositive phrase struck inline; the surrounding sentence is untouched.

before

The server, our only host,server runs locally.

after

The server, our only host,server runs locally.

Sentence

When one sentence in a paragraph changes, the others stay clean.

One sentence changed; the other stays clean #sentence-edit-in-paragraph

sentence · paragraph · edit

The first sentence is untouched; only the second sentence’s tail is marked.

before

The server runs locally. Deploys happen nightly.on every merge.

after

The server runs locally. Deploys happen nightly.on every merge.

A sentence added to a paragraph #sentence-add

sentence · paragraph · add

A new trailing sentence is marked inline; the existing sentence stays clean.

before

Deploys run nightly. Rollbacks are automatic.

after

Deploys run nightly. Rollbacks are automatic.

A sentence removed from a paragraph #sentence-delete

sentence · paragraph · delete

A dropped trailing sentence is struck inline; the remaining sentence stays clean.

before

Deploys run nightly. Rollbacks are automatic.

after

Deploys run nightly. Rollbacks are automatic.

Paragraph

Whole paragraphs add/delete/replace with row-aligned gaps; a near-total rewrite is a clean whole-block swap, never a scramble.

Near-total rewrite → whole-block replace #paragraph-rewrite-whole

paragraph · page · edit

When almost every word changes, mddiff replaces the whole paragraph instead of scrambling it.

before

Every path inside command_body MUST be relative to the workspace root. No cd is ever permitted, and absolute paths to interpreters are forbidden everywhere.

It MUST be runnable as-is from the project root, with the location baked in so the operator never has to cd. There are exactly two cases for how it finds its work.

after

Every path inside command_body MUST be relative to the workspace root. No cd is ever permitted, and absolute paths to interpreters are forbidden everywhere.

It MUST be runnable as-is from the project root, with the location baked in so the operator never has to cd. There are exactly two cases for how it finds its work.

Edited middle, unchanged start and end #paragraph-edit-prefix-suffix

paragraph · page · edit

A heavily edited paragraph that shares a long prefix and suffix keeps both ends unmarked.

before

Tell the operator, in plain language, that the command assumes the workspace root as the working directory. Do NOT bake the absolute path into the command — keep all paths relative to the workspace root soproject root as the working directory. The command must run as-is from there with the location baked in — a script path relative to the root or the runner option, per Inputs. Never put a cd before it; the shell stays there after it finishes.

after

Tell the operator, in plain language, that the command assumes the workspace root as the working directory. Do NOT bake the absolute path into the command — keep all paths relative to the workspace root soproject root as the working directory. The command must run as-is from there with the location baked in — a script path relative to the root or the runner option, per Inputs. Never put a cd before it; the shell stays there after it finishes.

Added paragraph leaves an aligned gap #paragraph-add-gap

paragraph · page · add

An inserted paragraph is a gap (no anchor); the shared heading below stays row-aligned across columns.

before

H

intro

INSERTED

Steps

after

H

intro

INSERTED

Steps

Deleted paragraph: struck out, with an aligned gap #paragraph-delete-gap

paragraph · page · delete

A removed paragraph renders struck-through on the left and leaves an empty slot on the right.

before

keep

DELETE THIS whole paragraph

tail

after

keep

DELETE THIS whole paragraph

tail

Heading

A heading is a container: editing its text word-diffs in place, and a whole heading added/removed is a clean block change with an aligned gap.

Heading text changed #heading-edit-text

word · heading · edit

A reworded heading keeps its shared words; only the changed word is marked.

before

Deployment guiderunbook

body stays

after

Deployment guiderunbook

body stays

Heading added #heading-add

block · heading · add

A new heading is a whole-block addition; the heading kept on both sides stays row-aligned.

before

Intro paragraph here.

New Section

Section A

after

Intro paragraph here.

New Section

Section A

Heading removed #heading-delete

block · heading · delete

A removed heading renders struck-through and leaves an aligned gap on the right.

before

Intro paragraph here.

New Section

Section A

after

Intro paragraph here.

New Section

Section A

One character changed in a heading #heading-character-edit

character · heading · edit · consecutive

A single-letter fix (colour → color) word-diffs in place inside the heading.

before

the colourcolor guide

body

after

the colourcolor guide

body

One character added to a heading word #heading-character-add

character · heading · add

Inserting a letter (cat → cart) re-marks the whole word, as htmldiff is word-level.

before

the catcart manual

body

after

the catcart manual

body

One character removed from a heading word #heading-character-delete

character · heading · delete

The mirror (cart → cat) — the same whole-word re-mark.

before

the cartcat manual

body

after

the cartcat manual

body

A word added to a heading #heading-word-add

word · heading · add

A new word in the heading is marked inline; the surrounding words stay clean.

before

Deployment field guide

body

after

Deployment field guide

body

A word removed from a heading #heading-word-delete

word · heading · delete

A dropped word is struck inline; the rest of the heading stays clean.

before

Deployment field guide

body

after

Deployment field guide

body

A phrase reworded in a heading #heading-phrase-edit

phrase · heading · edit · consecutive

The shared opening of the heading stays unmarked; only the divergent tail is shown.

before

Setup for the local serverproduction cluster

body

after

Setup for the local serverproduction cluster

body

A phrase appended to a heading #heading-phrase-add

phrase · heading · add

A trailing phrase is marked inline; the original heading text is untouched.

before

Setup guide for new contributors

body

after

Setup guide for new contributors

body

A phrase removed from a heading #heading-phrase-delete

phrase · heading · delete

A trailing phrase struck inline; the kept heading text stays clean.

before

Setup guide for new contributors

body

after

Setup guide for new contributors

body

A sentence-long heading reworded #heading-sentence-edit

sentence · heading · edit

A heading that reads as a full clause keeps its shared opening; only the changed tail is marked.

before

Deploys happen nightlyon every merge

body

after

Deploys happen nightlyon every merge

body

A clause added to a heading #heading-sentence-add

sentence · heading · add

A second clause extends the heading; the new text is marked inline.

before

Install the tooltool. Then restart the daemon

body

after

Install the tooltool. Then restart the daemon

body

A clause removed from a heading #heading-sentence-delete

sentence · heading · delete

The trailing clause is dropped; the old text is preserved struck-through.

before

Install the tool. Then restart the daemontool

body

after

Install the tool. Then restart the daemontool

body

Blockquote

Text inside a blockquote word-diffs in place; a whole blockquote added/removed is a clean block change with an aligned gap.

Text changed inside a blockquote #blockquote-edit-text

word · blockquote · edit

The quote is word-diffed in place — only the changed word is marked, the rest of the quote stays clean.

before

The originalrevised note about deploys.

after

after

The originalrevised note about deploys.

after

Blockquote added #blockquote-add

block · blockquote · add

A new callout is a whole-block addition; surrounding paragraphs stay aligned.

before

A normal paragraph.

A new callout to read.

after

after

A normal paragraph.

A new callout to read.

after

Blockquote removed #blockquote-delete

block · blockquote · delete

A removed callout renders struck-through and leaves an aligned gap on the right.

before

A normal paragraph.

A new callout to read.

after

after

A normal paragraph.

A new callout to read.

after

One character changed inside a blockquote #blockquote-character-edit

character · blockquote · edit · consecutive

A single-letter fix word-diffs in place inside the quote.

before

the colourcolor of dawn

after

after

the colourcolor of dawn

after

One character added inside a blockquote #blockquote-character-add

character · blockquote · add

Inserting a letter (cat → cart) re-marks the whole word.

before

the catcart naps here

after

after

the catcart naps here

after

One character removed inside a blockquote #blockquote-character-delete

character · blockquote · delete

The mirror (cart → cat) — same whole-word re-mark.

before

the cartcat naps here

after

after

the cartcat naps here

after

A word added inside a blockquote #blockquote-word-add

word · blockquote · add

A new word is marked inline; the rest of the quote stays clean.

before

The short note about deploys

after

after

The short note about deploys

after

A word removed inside a blockquote #blockquote-word-delete

word · blockquote · delete

A dropped word is struck inline; the rest stays clean.

before

The short note about deploys

after

after

The short note about deploys

after

A phrase reworded inside a blockquote #blockquote-phrase-edit

phrase · blockquote · edit · consecutive

The shared lead-in stays unmarked; only the changed tail is shown.

before

Keep all paths relative to the workspaceproject root for portability

after

after

Keep all paths relative to the workspaceproject root for portability

after

A phrase appended inside a blockquote #blockquote-phrase-add

phrase · blockquote · add

A trailing phrase is marked inline; the original text is untouched.

before

Read the deployment guide before you start

after

after

Read the deployment guide before you start

after

A phrase removed inside a blockquote #blockquote-phrase-delete

phrase · blockquote · delete

A trailing phrase struck inline; the kept text stays clean.

before

Read the deployment guide before you start

after

after

Read the deployment guide before you start

after

One sentence changed inside a blockquote #blockquote-sentence-edit

sentence · blockquote · edit

The first sentence stays clean; only the second sentence’s tail is marked.

before

The server runs locally. Deploys happen nightly.on every merge.

after

after

The server runs locally. Deploys happen nightly.on every merge.

after

A sentence added inside a blockquote #blockquote-sentence-add

sentence · blockquote · add

A new trailing sentence is marked inline; the existing sentence stays clean.

before

Deploys run nightly. Rollbacks are automatic.

after

after

Deploys run nightly. Rollbacks are automatic.

after

A sentence removed inside a blockquote #blockquote-sentence-delete

sentence · blockquote · delete

A dropped trailing sentence struck inline; the remaining sentence stays clean.

before

Deploys run nightly. Rollbacks are automatic.

after

after

Deploys run nightly. Rollbacks are automatic.

after

One paragraph rewritten inside a multi-paragraph blockquote #blockquote-paragraph-edit

paragraph · blockquote · edit

The blockquote holds two paragraphs; the first stays clean while the second is reworded in place.

before

Intro line stays.

Every path inside command_bodyIt MUST be relative torunnable as-is from the workspace root.project root with the location baked in.

after

after

Intro line stays.

Every path inside command_bodyIt MUST be relative torunnable as-is from the workspace root.project root with the location baked in.

after

A paragraph added inside a blockquote #blockquote-paragraph-add

paragraph · blockquote · add

A second paragraph appended to the callout is marked added; the first stays clean.

before

First paragraph stays.

A second paragraph was added to the callout.

after

after

First paragraph stays.

A second paragraph was added to the callout.

after

A paragraph removed inside a blockquote #blockquote-paragraph-delete

paragraph · blockquote · delete

A dropped second paragraph struck inside the callout; the first stays clean and the old text is preserved.

before

First paragraph stays.

A second paragraph was added to the callout.

after

after

First paragraph stays.

A second paragraph was added to the callout.

after

Code block

Code is literal, so changes are line-level: an edited, added, or removed line word-diffs in place (unchanged lines stay clean), and a whole code block added/removed is a clean block change.

One code line changed #code-line-edit

word · codeblock · edit

Only the changed token on the changed line is marked; the other lines stay clean.

before
const a = 1;
const b = 2;3;
after
const a = 1;
const b = 2;3;
A line added to a code block #code-line-add

phrase · codeblock · add

A new line is marked inline inside the code block; existing lines stay clean.

before
const a = 1;
const b = 2;
after
const a = 1;
const b = 2;
A line removed from a code block #code-line-delete

phrase · codeblock · delete

A removed line is struck inline inside the code block; remaining lines stay clean.

before
const a = 1;
const b = 2;
after
const a = 1;
const b = 2;
A whole code block added #code-block-add

block · codeblock · add

A new fenced block is a whole-block addition; surrounding paragraphs stay aligned.

before

Run it:

npm start

after

after

Run it:

npm start

after

A whole code block removed #code-block-delete

block · codeblock · delete

A removed fenced block renders struck-through and leaves an aligned gap on the right.

before

Run it:

npm start

after

after

Run it:

npm start

after

One character changed on a code line #code-character-edit

character · codeblock · edit · consecutive

A single-digit change is word-diffed in place; the rest of the line stays clean.

before
port = 80808081
after
port = 80808081
One character added to a code token #code-character-add

character · codeblock · add

Inserting a letter (x → xs) re-marks the whole token; the rest of the line stays clean.

before
let xxs = 1;
after
let xxs = 1;
One character removed from a code token #code-character-delete

character · codeblock · delete

The mirror (xs → x) — the same whole-token re-mark.

before
let xsx = 1;
after
let xsx = 1;
A token added to a code line #code-word-add

word · codeblock · add

A trailing comment appended to the line is marked added; the code before it stays clean.

before
const a = 1; // ok
after
const a = 1; // ok
A token removed from a code line #code-word-delete

word · codeblock · delete

A dropped trailing comment is struck; the code before it stays clean.

before
const a = 1;
// ok
after
const a = 1;
// ok
A phrase reworked within a code line #code-phrase-edit

phrase · codeblock · edit · consecutive

Several tokens of a string literal change at once; each changed run is word-diffed in place, the line stays inline.

before
const url = "http:https://a.b.example/v1v2";
after
const url = "http:https://a.b.example/v1v2";

List

Items diff at item level: a light edit stays inline, a heavy rewrite splits cleanly, and an added/removed item leaves an aligned gap with numbering preserved.

Small edit to a list item stays inline #list-item-edit-light

word · list · edit

A small wording change is a word-diff inside the bullet, not a removed + added pair.

before
  • Use the workspaceproject root here
after
  • Use the workspaceproject root here
Heavily rewritten item → shown as removed + added #list-item-rewrite-scramble

paragraph · list · edit

Scattered shared vocabulary would scramble a word-diff, so the item becomes a clean removed + added pair; neighbours survive.

before
  • alpha
  • Every path inside command_body MUST be relative to the workspace root and no cd is ever permitted there
  • It MUST be runnable as-is from the project root with the location baked in so cd is never needed at all
  • omega
after
  • alpha
  • Every path inside command_body MUST be relative to the workspace root and no cd is ever permitted there
  • It MUST be runnable as-is from the project root with the location baked in so cd is never needed at all
  • omega
Expanded item keeps its shared opening (stays one bullet) #list-item-expand-prefix

phrase · list · edit

An item that roughly tripled in length keeps its shared lead-in unmarked and stays a single bullet.

before
  • alpha
  • command_body (required) — the actual command path, kept relative to the workspace root with no absolute paths allowed anywhere.which must run as-is from the project root with its location baked in, using either a relative path or the runner cwd option, where absolute paths stay forbidden because they break portability across machines, and there are exactly two distinct mechanisms to choose between here.
  • omega
after
  • alpha
  • command_body (required) — the actual command path, kept relative to the workspace root with no absolute paths allowed anywhere.which must run as-is from the project root with its location baked in, using either a relative path or the runner cwd option, where absolute paths stay forbidden because they break portability across machines, and there are exactly two distinct mechanisms to choose between here.
  • omega
Removed item leaves an aligned gap; numbering preserved #list-item-delete-gap

paragraph · list · delete

A removed bullet shows an empty slot at the matching row in the new column; the ordered list still reads 1, 2.

before
  1. keep one
  2. DROP ME
  3. keep two
after
  1. keep one
  2. DROP ME
  3. keep two
Added item leaves an aligned gap on the left #list-item-add-gap

paragraph · list · add

A new bullet shows on the right; the old column gets an aligned empty slot. Mirror of the deletion case, numbering preserved.

before
  1. keep one
  2. NEW MIDDLE
  3. keep two
after
  1. keep one
  2. NEW MIDDLE
  3. keep two
One character changed in a list item #list-character-edit

character · list · edit · consecutive

A single-letter fix word-diffs in place inside the bullet.

before
  • the colourcolor swatch here
after
  • the colourcolor swatch here
One character added in a list item #list-character-add

character · list · add

Inserting a letter (cat → cart) re-marks the whole word; the bullet stays one item.

before
  • the catcart naps here
after
  • the catcart naps here
One character removed in a list item #list-character-delete

character · list · delete

The mirror (cart → cat) — same whole-word re-mark.

before
  • the cartcat naps here
after
  • the cartcat naps here
A word added to a list item #list-word-add

word · list · add

A new word is marked inline inside the bullet; the rest stays clean.

before
  • Use the project root here
after
  • Use the project root here
A word removed from a list item #list-word-delete

word · list · delete

A dropped word is struck inline; the rest of the bullet stays clean.

before
  • Use the project root here
after
  • Use the project root here
A phrase appended to a list item #list-phrase-add

phrase · list · add

A trailing phrase is marked inline; the item stays one bullet.

before
  • Keep all paths relative to the project root
after
  • Keep all paths relative to the project root
A phrase removed from a list item #list-phrase-delete

phrase · list · delete

A trailing phrase struck inline; the kept text stays clean.

before
  • Keep all paths relative to the project root
after
  • Keep all paths relative to the project root
One sentence changed in a list item #list-sentence-edit

sentence · list · edit

The first sentence stays clean; only the second sentence’s tail is marked.

before
  • The server runs locally. Deploys happen nightly.on every merge.
after
  • The server runs locally. Deploys happen nightly.on every merge.
A sentence added to a list item #list-sentence-add

sentence · list · add

A new trailing sentence is marked inline; the existing sentence stays clean.

before
  • Deploys run nightly. Rollbacks are automatic.
after
  • Deploys run nightly. Rollbacks are automatic.
A sentence removed from a list item #list-sentence-delete

sentence · list · delete

A dropped trailing sentence struck inline; the remaining sentence stays clean.

before
  • Deploys run nightly. Rollbacks are automatic.
after
  • Deploys run nightly. Rollbacks are automatic.

Table of contents

A TOC is a list of links: an added or removed entry leaves an aligned gap so it is clear where the section was inserted or dropped.

Added TOC entry leaves a gap on the left #toc-entry-add-gap

hyperlink · toc · add

A new link is inserted on the right; the old column gets an aligned empty slot, and the entries below stay row-aligned.

Removed TOC entry leaves a gap on the right #toc-entry-delete-gap

hyperlink · toc · delete

A dropped link is struck on the left; the new column gets an aligned empty slot, and entries below stay aligned.

Reordered entries (moves aren't detected) #toc-reorder

hyperlink · toc · edit

An honest limitation: mddiff does not detect a move, so swapping two entries shows as each position’s link changing in place rather than a clean reorder.

One character changed in a TOC entry #toc-character-edit

character · toc · edit · consecutive

A TOC entry is a link, so a same-href text fix returns no marks from htmldiff — the safe floor swaps the whole entry, keeping the old text.

One character added to a TOC entry #toc-character-add

character · toc · add

Adding a letter to the entry text (Setup → Setups) is still a same-href text change, so the whole entry is swapped.

One character removed from a TOC entry #toc-character-delete

character · toc · delete

The mirror (Setups → Setup) — the whole entry is swapped, old text kept.

A word changed in a TOC entry #toc-word-edit

word · toc · edit

Renaming one word of the entry text (development → deployment), same href — the whole entry is swapped, old text kept.

A word added to a TOC entry #toc-word-add

word · toc · add

Inserting a word into the entry text, same href — the whole entry is swapped.

A word removed from a TOC entry #toc-word-delete

word · toc · delete

The mirror — dropping a word from the entry text swaps the whole entry, old text kept.

A phrase reworded in a TOC entry #toc-phrase-edit

phrase · toc · edit · consecutive

Rewording the whole entry label, same href — the entry is swapped, old label kept.

A phrase appended to a TOC entry #toc-phrase-add

phrase · toc · add

Extending the entry label, same href — the entry is swapped.

A phrase removed from a TOC entry #toc-phrase-delete

phrase · toc · delete

The mirror — shortening the entry label swaps the whole entry, old label kept.

Table

Tables diff structurally (columns / rows / cells). Each projected side-by-side column stays rectangular — no phantom empty cells, the way a naive HTML word-diff produces.

Added column; table stays rectangular #table-add-column

column · table · add

A new column is marked added; the old column keeps its original width with no phantom cell.

before
ABNote
12
34hi
after
ABNote
12
34hi
Added row appears only on the new side #table-add-row

row · table · add

The new row is highlighted and present only in the new column; no phantom blank row on the old side.

before
AB
12
34
after
AB
12
34
Removed row appears only on the old side #table-remove-row

row · table · delete

A deleted row is marked and present only on the old side; the new column has no phantom row.

before
A
1
2
after
A
1
2
Removed column; table stays rectangular #table-remove-column

column · table · delete

A deleted column is marked; the new column shows only the surviving column and stays rectangular.

before
AB
12
after
AB
12
One cell changed, marked in place #table-change-cell

word · table · edit

A single changed cell is a word-diff inside the cell — no structural row/column change, columns stay rectangular.

before
AB
1oldnew value
after
AB
1oldnew value
Renamed header keeps its column #table-rename-header

word · table · edit

A renamed header is a cell edit, not an add + remove — the column is kept and its rows stay aligned.

before
DateSzSize score
d19
after
DateSzSize score
d19
Cells render their markdown (bold, links) #table-cell-content

phrase · table · edit

Cells render their markdown — bold, links — not raw source.

before
Run
plain
bold and x
after
Run
plain
bold and x
One character changed in a cell #table-character-edit

character · table · edit · consecutive

A single-letter fix word-diffs in place inside the cell; the table stays rectangular.

before
NameStatus
apicolourcolor
after
NameStatus
apicolourcolor
One character added in a cell #table-character-add

character · table · add

Inserting a letter (cat → cart) re-marks the whole cell word; the table stays rectangular.

before
NameStatus
apicatcart
after
NameStatus
apicatcart
One character removed in a cell #table-character-delete

character · table · delete

The mirror (cart → cat) — same whole-word re-mark inside the cell.

before
NameStatus
apicartcat
after
NameStatus
apicartcat
A word added in a cell #table-word-add

word · table · add

A new word inside the cell is marked inline; the surrounding cell text stays clean.

before
KeyValue
modeold default value
after
KeyValue
modeold default value
A word removed in a cell #table-word-delete

word · table · delete

A dropped word is struck inline; the rest of the cell stays clean.

before
KeyValue
modeold default value
after
KeyValue
modeold default value
A phrase appended in a cell #table-phrase-add

phrase · table · add

A trailing phrase inside the cell is marked inline; the cell stays one cell.

before
StepNote
buildkeep paths relative to the root
after
StepNote
buildkeep paths relative to the root
A phrase removed in a cell #table-phrase-delete

phrase · table · delete

A trailing phrase struck inline; the kept cell text stays clean.

before
StepNote
buildkeep paths relative to the root
after
StepNote
buildkeep paths relative to the root
One sentence changed in a cell #table-sentence-edit

sentence · table · edit

The first sentence in the cell stays clean; only the second sentence’s tail is marked.

before
TopicDetail
deployRuns locally. Ships nightly.on merge.
after
TopicDetail
deployRuns locally. Ships nightly.on merge.
A sentence added in a cell #table-sentence-add

sentence · table · add

A new trailing sentence inside the cell is marked inline; the existing sentence stays clean.

before
TopicDetail
deployShips nightly. Rollbacks are automatic.
after
TopicDetail
deployShips nightly. Rollbacks are automatic.
A sentence removed in a cell #table-sentence-delete

sentence · table · delete

A dropped trailing sentence struck inline; the remaining sentence stays clean.

before
TopicDetail
deployShips nightly. Rollbacks are automatic.
after
TopicDetail
deployShips nightly. Rollbacks are automatic.
A whole cell reworded #table-paragraph-edit

paragraph · table · edit

A paragraph-length cell rewritten in place; each changed run is word-diffed and the table stays rectangular.

before
FieldDescription
bodyEvery path inside command_bodyIt MUST be relative torunnable as-is from the workspace root.project root with its location baked in.
after
FieldDescription
bodyEvery path inside command_bodyIt MUST be relative torunnable as-is from the workspace root.project root with its location baked in.
A line added inside a cell #table-paragraph-add

paragraph · table · add

A cell with a hard line break (`<br>`) gains a second line; it is marked added and the table stays rectangular.

before
FieldDescription
bodyFirst line of the note.
A second line was added below it.
after
FieldDescription
bodyFirst line of the note.
A second line was added below it.
A line removed inside a cell #table-paragraph-delete

paragraph · table · delete

The second line of a `<br>`-split cell is struck; the first stays clean and the table stays rectangular.

before
FieldDescription
bodyFirst line of the note.
A second line was added below it.
after
FieldDescription
bodyFirst line of the note.
A second line was added below it.