What it was measured at
Four results, newest first. Each one is a subject this format was asked to hold, the number it came out at, and what that number was paid for with. The finding document behind each is linked and can be read here in full — including the parts that went badly, which are the reason the numbers are worth anything.
Every figure was produced by a tool in this project over an artefact this site serves. Nothing here is an estimate, a projection, or a comparison against a straw opponent: where a rival format is named, the number beside it is that format's own file, converted.
Newest first, which is the one ordering a page like this may use. Ordering by impressiveness would put the largest ratio at the top and quietly teach the reader that the small ones were not reported.
- September 2026A path became two arrays, and the artwork halved
An Ottoman coat of arms: 1.9 MB of SVG, converted.
- September 2026A whole git repository, carried in without changing the format
This project's own repository, converted by tools/git2umsg and read back by tools/repocheck.
- September 2026A diff you can apply, invert, and refuse
An undo stack made of patches, over a real document in this project, driven a keystroke at a time.
- August 2026A resolved 3D scene, smaller than the glTF it came from
Four transcripts, resolved by tools/sptx, with and without typed arrays.
A path became two arrays, and the artwork halved
September 2026
The kernel gained a typed array — a homogeneous run of numbers stored at its actual width. The vocabulary with the most to gain from it was the one least able to take it: a path was a single flat array of opcodes interleaved with numbers, and a typed array is homogeneous. The opcodes and the coordinates had to part company first.
THE PREREQUISITE WAS NOT THE TYPED ARRAY. Scaled integers need a scale, so the artwork needed a DECLARED COORDINATE GRID before it could hold any. The graphic vocabulary had parked that as a question for v1 and had given the right reason to want it — a resolution is a thing an author should have to state rather than a thing an encoding does quietly — and had no reason to pay for it. The 3D vocabulary supplied the first reason and the typed array supplied the second. It would have been worth adding on its own.
An Ottoman coat of arms: 1.9 MB of SVG, converted.
| what | the figure | what it says |
|---|---|---|
| the encoding, as it was | 2,082,610 bytes | 7% LARGER than the SVG it was converted from |
| the encoding, with typed arrays | 1,065,817 bytes | 49% smaller — and 45% smaller than the SVG |
| the text form | 2% larger | a scaled integer is a longer numeral than the decimal it replaces |
| the opcodes, now numbers | 13,733 bytes | the cost of one code per command, against a saving of a million |
The finding, in full and including what went badly: docs/58-typed-arrays-in-the-graphic-vocabulary.umsg raw. Measured over examples/graphic-crescent-and-star.umsg raw.
A whole git repository, carried in without changing the format
September 2026
The question was whether every single part of what a git repository contains can be represented in one document. The answer is yes for what a repository CONTAINS and no for what it IS — a document is not a mutable thing — and the second half is a property of documents rather than a gap.
THE SUBJECT CHECKS THE CONVERSION ITSELF, which nothing else carried into this format can do. Git names every object by the hash of its own bytes. So a document holding a PARSED object — a commit split into its headers and its message, a tree into its entries — can be re-serialised, hashed, and compared against the name it is stored under. Fidelity stops being a claim about a converter and becomes a check anybody can run with no repository present.
This project's own repository, converted by tools/git2umsg and read back by tools/repocheck.
| what | the figure | what it says |
|---|---|---|
| objects, and the content in them | 3,935 / 190,138,733 | every one parsed; every parse reproduced its own name; not one stored as opaque bytes |
| what the kernel needed | nothing | the four vocabularies before this one each found a hole in the format. This one found none |
| what the structure cost | 940,125 bytes | 0.5% — 182.2 MiB of document against 181.3 MiB of object content |
| compressed, against git's own store | 69.8 / 92.0 MiB | 0.76x with xz -9, and no delta encoding anywhere in the document |
| one commit later, as a link | 448,521 bytes | a successor pinned to its base by digest: a factor of 657, and the pair checks in seven seconds |
The finding, in full and including what went badly: docs/55-repository-vocabulary.umsg raw. Measured over examples/repository-scratch.umsg raw, examples/repository-scratch-link.umsg raw.
A diff you can apply, invert, and refuse
September 2026
Four separate wants turned out to be asking for one artefact: an undo stack is a list of invertible structural changes, semantic history is a query over the changes between two versions, a merge driver is a function on changes, and an intensional edit is a change carrying the rule that made it.
WHAT EXISTED WAS A REPORT. Text on a terminal, which can be read once and never applied, inverted, composed or refused. A patch carries the value it DISPLACED, so it inverts; it carries a digest of the result, so it refuses before writing and verifies after.
An undo stack made of patches, over a real document in this project, driven a keystroke at a time.
| what | the figure | what it says |
|---|---|---|
| the document being edited | 6,740 bytes | an article already in this project, not a fixture |
| 800 keystrokes, uncoalesced | 902,779 bytes | 134 times the document it edits, and still growing |
| 800 keystrokes, coalesced | 1,128 bytes | a sixth of the document, for the whole stack |
| 200 characters typed, then all undone | byte for byte | back to the starting document, checked by digest rather than by inspection |
The finding, in full and including what went badly: docs/57-the-patch-vocabulary.umsg raw. Measured over examples/patch-tenancy-clause.umsg raw.
A resolved 3D scene, smaller than the glTF it came from
August 2026
The 3D vocabulary holds a scene as one declared frame graph and resolves it into a TRANSCRIPT: every number an exact integer count of quanta on the document's declared precision, with a float refused rather than tolerated. That is a rule and not a limitation — a writer resolving in float64 would break the one thing the vocabulary exists to enforce, which is that two implementations resolving the same motion agree EXACTLY rather than closely.
IT IS ALSO THE PLACE A TYPED ARRAY COSTS NOTHING TO TAKE. The integer was already there; the decimal form was that integer multiplied back out. And a transcript is never read by a person deciding where a vertex is, which is the argument against scaled integers that reaches a document and does not reach this.
Four transcripts, resolved by tools/sptx, with and without typed arrays.
| what | the figure | what it says |
|---|---|---|
| the DamagedHelmet scene | 1,051,481 to 559,040 bytes | 47%, which puts it BELOW the 560,692 bytes of glTF geometry it was converted from |
| a walk cycle, 17 ticks | 1,256,077 to 651,443 bytes | 48% — the artefact the design had recorded as its own largest open risk |
| the fox scene | 91,990 to 38,466 bytes | 58% |
| the arm scene | 2,016 to 1,999 bytes | 1%. Six instances and a five-vertex mesh: there is nothing here to pack |
The finding, in full and including what went badly: docs/43-the-transcript-writer.umsg raw. Measured over examples/spatial-arm.umsg raw.