Changelog

0.10.0-alpha.1, 2026-10-12

A first look at the model designer: shape a model on screen instead of writing a file.

Releases are numbered by plan, not by date, so a higher number can ship before a lower one. All releases

Full changelog

Interim release, published 2026-10-12. This release was not tagged in the repository. This is the changelog's own text for the release; its links to files point at those files at the tag.

The model designer, released on its own (D14): everything since 0.9.0, Base 0.10 packages A0, N1, A2, A4a, A4b, A4c and the designer checkpoint T1. Schema language 0.10. The spreadsheet onboarding line (A3, A5–A8) follows in 0.10.0. One migration since 0.9.0 (20261011_01, the draft operation history); a database of 0.9.0 upgrades on start.

Added

  • Base 0.10 A0 (design, no product code): decisions D1–D10, D17–D21 and A-D5–A-D9 accepted; the model authoring API designed in API.md (draft operations and their kinds, history, undo and redo, source files and their profiles, the dry-run summary, inferences); ADR-041, model drafts change through recorded operations; journeys J33–J35 and their planned routes in the API inventory; the synthetic workbooks W1–W3 defined in test terms; the editor mock-up and the W1 sample approved.
  • Base 0.10 N1: schema language 0.10, opened with navigation groups (D1, D22–D27; J33.9). An application may declare navigation.groups (key, label, collections, collapsed); the sidebar shows the collections in no group first, then each group as a foldable section whose fold a reader's browser remembers, marks a folded group holding the open collection, and opens a group's page (/apps/{app}/groups/{group}) listing its collections with a search by name. A group naming no collection of its application (INVALID_REFERENCE), a collection in two groups (INVALID_MODEL), a group key twice (DUPLICATE_KEY) and navigation below schema 0.10 (INVALID_MODEL) are refused at their pointers; a 0.9 model is unchanged, with the same hash. The browser runner test:browser:authoring-n1.
  • Base 0.10 N1, at the user's request: on a phone (below 760px) the data-context band is one line whose workspace, application (with its tile) and data context (Live, change sets, publications, with the line saying what an edit does) each open their choice; the top bar shows no application tabs in any area and the drawer no workspace selector. A group page's rows show a chevron and a pressed state.
  • Base 0.10 A2: model drafts change through recorded operations (ADR-041, D29–D35; J33.1–J33.8, J33.12, J08.9). POST /model-drafts/{id}/operations applies a request of typed operations all or none at expectedVersion as one step of the draft's history, answering the new version, the entries with their inverses and the compiler's diagnostics (a draft may be invalid between steps). 34 model-side kinds: names and keys (every reference rewritten; an element a consumer API names is refused, D29), the release identity and schema version, applications, object types (with a generated table view and detail page, containment by parent, D30), split, merge and conversion to a list type, attribute types and bindings, relation types and the relations allowed between types, views, panels and their lists, navigation groups. A removal takes what exists only for the removed element (D31). GET …/operations pages the history; POST …/undo (a step, or steps together) and POST …/redo apply stored inverses as new steps (D32); a step later steps build on is refused OPERATION_HAS_DEPENDANTS. A draft-only change of an element of the draft's base release is refused OPERATION_REQUIRES_MIGRATION with the records, values and relationships it would touch, live and in change sets (D33). A whole-model PATCH is recorded as one replaceModel step; installation makes the installed release the draft's base, leaving its version (D17, D34). New codes INVALID_OPERATION, OPERATION_REQUIRES_MIGRATION, OPERATION_HAS_DEPENDANTS, NOTHING_TO_UNDO, NOTHING_TO_REDO, OPERATION_BATCH_TOO_LARGE; setting MODEL_OPERATION_MAX_ITEMS (500); migration 20261011_01 (model_draft_operations).
  • Base 0.10 A4a: the model editor's model pane (D36–D42; J33 in the browser). A draft opens in the editor from Settings › Model (Open in editor; New draft opens it too), full width under the top bar: the model pane (applications with their types in their containment tree, navigation groups, relation types, attribute types, each marked new, changed or released), the selected element with its operations, the relationship matrix, the issues linked to their elements and the history in plain words with undo and redo. Every model-side operation is in a menu, through one dialog; Move to… moves an attribute or a type, and a drag in the model pane opens it with its target. A released element's draft-only change is refused with what it would affect; a step on a draft another editor moved on is held and offered again. Install and activate in one confirmed step, with the proposed version, the differences and the compatibility. On a phone the panes are tabs. GET /model-drafts/{id}/outline serves the draft's structure, the marks against the base release and the diagnostics with their elements. New draft from an empty model now starts a document of the newest schema language with a release identity, instead of {}. The browser runner test:browser:authoring-a4a.
  • Base 0.10 A4b: the preview and layout editing (D43–D50; J33.10). Preview in a type's header shows its record page and table in the editor's centre, drawn by the record screen's own renderers from the draft before it is installed, over a record read live in a workspace and record chosen in the band (or an empty record for a new type); the page's controls are shown and disabled, and nothing the preview shows writes. Edit layout opens the layout editor over the whole editor, marked by its own band with Undo, Redo and Back to the model editor: panels moved within and between main and side, hidden or shown, renamed, their columns and sort; fields moved, grouped into new field groups and added; a table view's columns, filters and default sort; by menu and keyboard, or by dragging with mouse or pen. Each change is one step of the draft. A draft that does not compile is not previewed. GET /model-drafts/{id}/model answers a draft compiled as GET /model serves the active model, with its placements; the operations addDetailPage and removeDetailPage give a type without a declared detail page the page a new type gets. The browser runner test:browser:authoring-a4b.
  • Base 0.10 A4c: the consumer API editor (D51–D59; J33.13, J33.14). The editor's left pane has Model and Consumer APIs tabs, + adding within the open one. A consumer API opens with its tabs: the exposed types and public names and the related records it serves; its fields with their sources (chosen in order from a picklist of what the exposed types and the types above them hold), role and default, edited in place (no field name is typed by hand anywhere in the tab: match fields, related fields, XREF fields, sort fields, routes and watched outputs are chosen from what is valid there); the operations it offers, its lists, XREF match rules and custom events; its filters; and two documents with Copy and Download, the Schema of the message consumers receive and a Message example. Six operation kinds change definitions, each step with undo: addConsumerApi (a starting definition from the exposed types), removeConsumerApi and four part verbs naming a part by a JSON pointer (setConsumerApiPart, insertConsumerApiPart, moveConsumerApiPart, removeConsumerApiPart). The outline lists each definition with its contract against the active release, shown as "Needs v2" with a step that raises the version; the install dialog lists each consumer API's result and activates only when none needs a higher version. GET /model-drafts/{id}/consumer-apis/{consumerApi} and its schema.json, example.json and openapi.json serve a draft's definition and documents before it is installed. setKey on an element a consumer API names now rewrites the definition instead of refusing (D54, replacing A2's D29). Switching XREF off asks first, since its match rules go with it, and stops Resolve too. The browser runner test:browser:authoring-a4c.
  • Base 0.10 T1, the designer checkpoint (D60–D64): US-P05 walked end to end in the browser on both designer models by test:browser:authoring-t1. An application designed from an empty draft, and the active model extended with a consumer API change that needs a higher contract version, are each installed, used on the record screen and served by the consumer tier. Each walk is taken once by keyboard alone and once by clicking every button. Each step is checked on the server, and the run fails on a console error or a failed request. The designer's surfaces (the editor, the matrix, its dialogs, history and install dialog, the preview and layout editor, a consumer API's fields and schema, the sidebar's groups, a group page, and the phone band, drawer and editor tabs) join the accessibility gate in light and dark and the visual gate.

Fixed

  • After a model draft was installed, the editor marked everything the draft had added, and the types and applications around it, as changed against the release just installed from it. The release holds each element with its defaults written out, and the outline compared it with the draft's authored form; marks now compare both in the release's form (0.10 T1, from A4a).
  • The preview of a new type's empty record asked the server for the history of a record that does not exist (a 404 in the browser); the record page's History panel now reads through the page's client, which answers the preview's empty record itself (0.10 T1, from A4b).
  • Every dialog's labelled fields: a label stood further from its own control than from the field before it; the label now sits right above its control with a clear step to the next field, and a dialog's buttons keep a margin from its bottom edge (0.10 A4a).
  • setRelationRule refused a change of which records a released relationship may choose (candidates) as needing a migration; it is compatible (0.9 K7) and now applies (0.10 A4a).
  • The model editor can remove a relation type that type pairs still use: the pairs and the type go in one step (0.10 A4a); every relation, a parent link included, has Remove relation in its menu.
  • A relation allowed on a model draft joined a relations panel set up for other records (a translations panel sorted by its language) and made the draft invalid; it now joins only a plain relations panel or gets its own (0.10 A4a, A2's generated layout).
  • Every table's cut-off cell shows its whole value, wrapped, on hover, focus or a long press (0.10 A4a).
  • Every menu (⋯ and the like): items show hover, may carry a glyph, a second line and a section heading (0.10 A4a).
  • Supported schema versions are listed oldest first by number (0.10 after 0.9), in GET /system's schemaLanguages, a refusal's supportedSchemaVersions and the startup and upgrade messages; a text sort would have put 0.10 first (0.10 N1).

Let us run it for you.

Backups, upgrades, TLS and monitoring are ours. Your data stays exportable any time.