Stemma · changelog

What shipped, and when.

Stemma is a side project, built on evenings and weekends since 4 May 2026. This is the whole record — releases, not commits, and the repairs alongside the additions. The tool itself is described on the project page; where it is going next is the roadmap.

Latest
8 August 2026The headless half
Releases
7Since 4 May 2026
Built by
One personEvenings and weekends
Licence
PolyForm NoncommercialCommercial use needs a licence
22 days ago Link

The headless half

Everything Stemma could do, it could only do with a mouse in it. This release is the other authoring surface: a model written as text, rendered by a command, and checked by a build that has never opened the app.

  • stemma render — A workspace and a view become an image, with no browser of your own open and no mouse. It runs a short-lived backend of its own, so two renders can run at once and neither disturbs a workspace you have open.
  • A publication profile — Outline boxes, no kind chip, no icon, no shadow, no background grid, no status badge. Transparent by default; scale, padding and palette are options. Rendering for a screen and rendering for a page are different jobs, and Stemma only had the first.
  • Layout as a constraintgrid, row, column and stack, solved to coordinates. A view can now say two columns, these four, 56 apart instead of carrying the residue of somebody’s mouse. A later drag records an offset against the constraint rather than replacing it, so the arrangement survives being corrected. Authorable as text, or from the canvas selection.
  • stemma validate — Ids are strings and nothing checks them: a typo produces a missing node or a missing arrow, silently. This reports dangling endpoints, view members that do not exist, links with one end outside the view, and a warning past seven boxes. --json for something acting on the answer rather than reading it.
  • A render manifest, and --check — Every render writes a sibling manifest fingerprinting the model, the view, the layout and the profile it was drawn from. --check re-computes it and exits non-zero when a committed image has stopped matching its source — the drift guarantee, extended past the app window.
  • True vector SVG — The publication profile emits SVG primitives out of the same component tree the canvas renders, instead of wrapping serialised HTML in a foreignObject. The old export opened in Chrome and essentially nowhere else.
  • Concept and Relation — A box that asserts nothing about a system, and an arrow that claims nothing beyond its label. Drawing an argument previously meant declaring something like “what the repository can answer” as a bounded context — which compiles, validates, and is false.
  • A published schema, and a protocol referencestemma.layout.json has a JSON Schema, and every sidecar now carries a pointer to it. The protocol document explains the whole chain to someone who will never open the app, with three worked examples that were built and rendered exactly as written.
  • Diagnostics — A leveled, structured record of what the engine did, as JSON lines under ~/.stemma/logs/, capped and rotated without being asked. Shareable bundles are redacted by default. There is no network sink and none can be configured: a log record contains element names, ownership and sometimes your source.
  • fix The sidecar stopped dropping what it did not model — Free-form shapes and edge dock handles were discarded on their way to disk, so both survived only until reload. Unknown sections now round-trip verbatim.
  • fix Node titles wrap — They clipped at around thirty characters, which was quietly shaping what things could be called.
  • fix The draw.io export became usable — It ignored the view and the layout and emitted the whole model on a grid in default pastel. It now honours both. Six further defects, found by auditing the render pipeline end to end, went with it.
27 days ago Link

In the open

The repository, a licence, and two workspaces worth reading before writing your own.

  • github.com/batas2/Stemma — Source-available, with the engine and the round-trip fidelity suite in it.
  • PolyForm Noncommercial 1.0.0 — Free for personal use, study, hobby projects, and for charities, educational institutions, public research bodies and government. Commercial use of any kind needs a licence.
  • Aurora Rail — The reference workspace: a fictional rail-ticketing platform with 66 elements, four saved views and three narrative books, exercising every part of the DSL.
  • Stemma’s own architecture, as a Stemma workspace — The tool modelling itself, which is the cheapest honest test of whether the vocabulary is sufficient.
29 days ago Link

Stemma, and a workspace with no solution in it

A rename, and the removal of the largest thing standing between somebody and their first model.

  • Renamed from Verso — A stemma codicum is the family tree philologists draw for a manuscript: every surviving copy traced back to one archetype. That is the shape of the thing.
  • Model-only workspaces — A folder holding Architecture/ and nothing else opens with no MSBuild, no SDK, no restore and no NuGet. Until this, the first step was owning a .NET solution.
  • From scratch — Start a model by name; the empty canvas says what to do next instead of sitting there.
  • A desktop shell, decided — Photino, with a window flag and a renderer benchmark behind the choice.
3 months ago Link

The report

An answer to the question every modelling tool eventually meets: how do I show this to somebody who will never install it?

  • A single-file interactive HTML report — One file. It opens offline, with no server, no login and no seat. Audience modes (builder, stakeholder, reviewer), per-view layer toggles, element search, and element-anchored comments that export as a pack and import back into the workspace. Styled to match the canvas it came from.
  • Inline edge editing — A unified properties blade, sticky inspector tabs, and a floating direction toolbar on a selected relationship.
  • Keyboard shortcuts — Delete, rename, zoom, view switching, selection.
  • fix Dependency links appeared on the module map — They were being computed and not drawn. Default-coloured arrowheads were invisible against the canvas, too.
3 months ago Link

Docking, routing, and the rail

The month the canvas stopped feeling like a prototype.

  • draw.io-style edge docking — Relationships anchor to connection dots on a node and reconnect to another box.
  • Four routing modes — Curved, elbow, step and straight, with per-end markers and predefined relationship types that carry their own styling.
  • The inspector became an icon rail — One panel at a time — properties, appearance, text, lifecycle, ownership, custom properties, comments, layout — plus a full-screen rich editor for notes.
  • Per-view layout modes — Organic, hierarchical, by-type and custom, each tunable and remembered for the view it belongs to.
  • .doc/ became the single source of truth — Product, architecture, UX and UI as four pillars, with the pre-refactor specs archived rather than left to rot beside them.
3 months ago Link

Books, and a second adapter

Modelling a system is half the job. This is the half about getting a room to agree.

  • Story books — Ordered, audience-tagged sequences of pages, each naming a view and carrying the narrative you would actually say out loud. Present mode drives the canvas from the page; the whole thing exports as a multi-page PDF.
  • A YAML adapter that preserves trivia — Comments and formatting survive a write, which is the same rule the C# writer follows and the reason either one can be trusted.
  • Free-form shapes and a comments sidecar — Ink that carries no architectural meaning, kept out of the model on purpose.
  • Data-layer kinds, and two more built-in views — A data model and a resource tree, alongside the module map and the dependency graph.
4 months ago Link

The first workspace

Five spikes in a day, answering one question: can the C# on disk be the model database, rather than an export of it?

  • C# source as storage — The model read off the syntax tree by name, and written back through Roslyn — the foundation everything since has rested on.
  • The canvas — A drag-and-drop palette, custom views stored as code, two auto-arrange algorithms, snapping, alignment and multi-select.
  • The layout sidecar — Positions and styling committed beside the model, so presentation never enters it.
  • Lifecycle, undo, and a file watcher — Plus a validation engine with fixtures, and export to PNG, SVG and draw.io.

Dates are when the work landed in the repository, not when it was announced — there is nothing here to announce it to. Anything described as shipped has a feature record and, where it touches the engine, round-trip fixtures behind it; that is the whole quality bar, stated plainly so you can discount it accordingly.

Reading this with a machine? This page is also plain markdown, and the site's context file is llms.txt.

The project page The repository