What exists to work with it
What exists around the format: the implementations you can read or take, the two editors that understand a document, five applets you can run here, the highlighting, and the sites that are not this one. Nothing here is a product and none of it is sold; the list is short and every entry says how finished it is.
An entry names something that is in this project and that a reader could use today. A plan is not an entry. Where a thing is packaged, the page states the digest the project publishes for it, because a binary named on a website with no digest beside it is an invitation and not an offer.
The implementations
The fleet, as a roster: what exists and what each one is written in. Every one of them was written from the specification alone by a different author who could not see the others, which is the argument the bootstrapping page makes at length and this page only points at.
11 maintained implementations, no two of them in the same language, and 3 more kept in the archive. Every number about them — what each scores, on what, and when it was last measured — is on the bootstrapping page, read from the same document this roster is.
| written in | in the project |
|---|---|
| Go | implementations/go |
| JavaScript | implementations/js |
| C99, for microcontrollers | implementations/esp32 |
| C++20 | implementations/cpp |
| Rust | implementations/rust |
| Dart | implementations/dart |
| Kotlin | implementations/kotlin |
| C# | implementations/dotnet |
| Python | implementations/python |
| Swift | implementations/swift |
| Julia | implementations/julia |
A DELIBERATE PROPERTY AND NOT AN ACCIDENT. A second implementation in a language already covered is a second reading of the same standard library and the same habits; a new language is a new set of things the specification can be silently wrong about. Every one of these found something, and the C++ one found a question no earlier author could have asked, because C++ is the first of them whose standard library has no Unicode categories.
Three implementations are archived rather than deleted, and they are on the bootstrapping page with their scores. A superseded implementation that still fails documents is evidence about what is hard, and deleting it would be deleting the evidence.
The editors
Two editors can open a .umsg file and show it as a document rather than as text. Both of them do it by handing the buffer to an implementation in this project, so what they show is what a conformant reader sees — and when they cannot parse, they say where and recover as soon as it parses again, rather than showing a stale rendering of something that no longer exists.
Visual Studio Code
tools/vscode
Two views of one file. STRUCTURE is the normal editable text editor with unimsg highlighting, comments, bracket matching, indentation and folding. DOCUMENT is a live read-only rendering — contents outline, section cards, prose, fields, value styling and responsive tables — which reads the unsaved buffer and refreshes as you type.
Structure stays the default, so installing it never replaces the normal editor unexpectedly.
VS Code 1.75 or newer. Node.js is needed only to build, bundle and test it, never to use it.
Version 0.2.0. Packaged as unimsg-language-0.2.0.vsix, sha256:6740bb06c81f516f8ae1bad4b417952e2be91ed911ffbd3ddfb9cdd0ca556b65, in tools/vscode/dist.
Notepad++
tools/notepadpp
A native docked pane that turns the active buffer into a readable preview: a contents outline, a centred reading surface with document spacing and section dividers, uniform sequences of maps as measured aligned tables, maps of comparable numbers as small bar summaries, and a recursive field view for anything that earns no special treatment. It follows Notepad++'s own light and dark mode.
Notepad++, with the plugin architecture matching the installation. A Visual Studio developer shell and CMake 3.20 or newer to build another architecture.
Packaged as UniMSGViewer.dll, sha256:fe4c266f57f0d3385b5b885e62c979f6fcbf44495616491991ecfd91d8ab32e3, in tools/notepadpp/dist/x64.
THE RULE BOTH OF THEM FOLLOW, and it is the one that makes a generic reader worth having. Neither renderer has a table of key names it recognises. A one-entry map envelope becomes the title, authored order becomes the page order, a uniform sequence of maps becomes a table — every rule is about the SHAPE of the value. A renderer that special-cased title would be a viewer for the documents its author happened to have.
The applets
Five interactive applets, running here. Press the button and the applet arrives as one file that then asks the network for nothing — no server, no relay, no store, and no request of any kind after the file has landed.
A PROTOCOL FOR PORTABLE INTERACTIVE DOCUMENTS. An applet is a WebAssembly module exporting a state machine — a fresh state, a transition on an event, and a projection — and a host executes it and owns every effect on the world. The module computes; it cannot reach anything.
WHAT CROSSES THAT BOUNDARY IS UNIMSG IN CANONICAL CBOR, in both directions and without exception. So the same value encodes to the same bytes on every host, every number arrives exact, and an event going in and a surface coming back are documents rather than conventions two programs happen to agree on.
AND THIS IS THE PART THIS SITE CARES ABOUT. What an applet returns from render is a DOCUMENT a host builds an interface from, never a picture of one. Three kinds are named: an interface, a drawing, and an interface with a document inside it — and there is an applet below for each. A host reading one builds real controls with real focus and a real accessibility tree, because what it was handed says what the things ARE rather than where to paint them.
THE MANIFEST IS A UNIMSG DOCUMENT AND THE MODULE SITS INSIDE IT. The bytes are carried inline, beside the sha256 that pins them, together with the applet's identity, its version, the modes a host may open it in, and the intents it will accept with their defaults. A host needs nothing else: no second artefact to pair, no relative path to resolve, no fetch to perform, and nothing that can go missing between the two halves.
THE HASH IS VERIFIED WHATEVER THE BYTES CAME FROM, including when they arrived in the same file as the hash. Trusting one half of a file because you trust the other leaves no way to notice a broken artefact, and the protocol says so in those words.
IT IS ALSO A LESSON THIS PROJECT KEEPS RELEARNING. Carrying the module was permitted from the start and nothing did it, so every generator produced two files and every host author concluded that was what an applet WAS — until one asked. A default nobody states is a default somebody else picks.
A HOST, NOT AN APPLET. Each page below carries the module's bytes, the manifest, the open path, the ABI, the drawing projector and a unimsg codec, all inlined into one file: no src, no href, no URL, no fetch. That is a bundle built to prove the protocol needs no transport, and the proof is that it runs at all. The applet inside it is the one document.
NO TRANSPORT, NO IDENTITY SYSTEM, NO RELAY AND NO STORAGE. A host supplies all four. An identity is an opaque value a host attributes an event to — a key, a username, a device id, or the constant local — and the protocol compares two of them for equality and asks nothing further. A reader should not be able to tell from the specification which host was written first, which is the same discipline the format itself is held to.
BECAUSE IT IS THE ARGUMENT RUNNING RATHER THAN BEING MADE. Everywhere else this site shows a document beside its bytes and asks a reader to accept that the second form is worth something. Here it is being decoded, stepped and projected in the reader's browser by a program written in another language for another project, and what is on the screen is what came back.
AND NEITHER RESTATES WHAT IT CARRIES. The chess module contains no chess: it interprets a ruleset document and draws through a board-presentation document, both of which are in this project, are checked by tools that are not the applet, and can be opened on this site. The prose applet renders a document it did not write, carried whole as canonical CBOR. That is the strongest form of the claim this whole site makes — a document being acted on by something that was not written to make its argument.
checklist
an interface — applets/checklist.html
THE ONE THAT IS AN INTERFACE RATHER THAN A DRAWING, and the first applet built against the protocol for exactly that reason. A titled list of items, added, renamed, ticked and removed — and what comes back from the module is an interface document, so the host builds real controls with real focus and a real accessibility tree. There is nothing drawn anywhere in it.
chess
a drawing — applets/chess.html
THE MODULE CONTAINS NO CHESS. It interprets a ruleset document and draws through a board-presentation document, and both of those are documents in this project that other tools already check. The applet is the interpreter; the game is the data it was handed. That is the point of it rather than a detail.
It carries examples/chess-ruleset.umsg raw, examples/chess-board.umsg raw, unchanged.
dots and boxes
a drawing — applets/dotsboxes.html
A board is a drawing and not a stack of controls: there is nothing here to announce and nothing to focus, and a coordinate is the honest input. So this applet returns a drawing where the checklist returns an interface, and its events carry points where the checklist's carry intents. The two together are the protocol's whole answer to what a surface is.
hexa
a drawing, on a clock — applets/hexa.html
THE FIRST ONE WHOSE WORLD MOVES WHILE NOBODY IS TOUCHING IT. Every other applet is a function of what a person did; this one is a function of that and of how much time has passed since, which is the tier the protocol had left out because nothing had been built against it. Two players run over a hex field laying a beam behind them, and coming home turns everything the beam shut in into territory.
prose
an interface with a document in it — applets/prose.html
THE THIRD KIND OF SURFACE. The applet renders a rich document through controls that reorder it — and the document is not the applet's. It is one of this project's own examples, carried whole as canonical CBOR, the same way the chess applet carries a ruleset it did not write. Nothing in the applet restates it and nothing in the applet can disagree with it.
It carries examples/document-prose-profile.umsg raw, unchanged.
Each one verifies its module against the sha256 in its own manifest and prints the result under itself, in the reader's browser, while they watch. That is where the digest on this page comes from — there is no second copy of it here to go stale against the first.
Highlighting
Four things colour unimsg in this project, and three of them are real implementations being asked what the tokens are rather than patterns that approximate the answer.
| in the project | colours | by reading it with |
|---|---|---|
tools/site | every coloured fragment on this site, emitted at build time | its own reading of the grammar, in Go |
site/assets/unimsg/lexer.js | the playground and the document viewer, in the reader's browser | the JavaScript implementation's lexer, shipped unmodified |
tools/vscode/syntaxes/unimsg.tmLanguage.json | the editable Structure view in VS Code | a TextMate grammar — patterns, because that is the only thing the interface accepts |
tools/notepadpp | the Notepad++ preview pane | the C++20 implementation's parser, called directly |
So the highlighting follows whichever theme the reader already chose. An extension that ships a palette is an extension that looks wrong in every theme but the one its author uses.
Two independent readings of the same grammar colour this site — the generator's, in Go, at build time, and the JavaScript implementation's lexer, in the browser — and the playground shows one document coloured by each. If they ever disagree, a reader can see it. That is this project's whole method pointed at its own website.
Elsewhere
A companion is linked because it exists and is about this format, not because anything on it is stable or blessed. The status travels with the link, so the sentence a reader gets is what the thing is and how finished it is, in that order.
ribosome.unimsg.net — a generic renderer and presentation layer for unimsg documents. Experimental, and a separate project from this site.