Beta . Ortha CMS is in public beta. Every plan is free until it ends.
Get started
Menu

Changelog

What changed, release by release

Every published version, newest first. The latest is 0.13.1. Every line links to the commit or pull request behind it, and every version is an anchor the documentation can point at.

Read from the product's own CHANGELOG.md, written by the release tooling. Nothing here is typed by hand.

  1. 0.13.1 Latest

    Release on GitHub

    Fixes

    • content list the inverse of a single relation read-only #361

    With thanks to Claude, Pavel Makhanko @pmknk.

  2. 0.13.0

    Release on GitHub

    Features

    • identity self-service password recovery — a "Forgot it?" screen that answers the same for every address; redrawn sign-in, invitation and dead-link pages, one password field with a reveal toggle and a strength meter #350
    • schema-builder the type page is fields first; adding a field is a kind picker plus a field panel with a live preview; templates for new types; the review is one page with each destructive change confirmed on its own #349
    • users members get quick filters, last active, an invite sheet that invites several people at once, a four-tab member page and "sign out everywhere" #352
    • workspaces cards that say what is inside and when it last moved, a three-step create with a ready page, and archiving that says what it touches first #353
    • protection Reviews as tabs (Waiting on me, My requests, Recently approved), a review panel with the changes since live and Approve, and publishing rules as switches read back in one sentence #359
    • insights Needs attention first, sections as tabs, and a drill-down panel behind every signal #358
    • activity free-text search, an event panel with a before/after diff, CSV export of the current view, and Retry all for unrecorded events #357
    • segments audiences show which entries use them, a "Try a reader" tester, and a delete dialog that says who will see what #351
    • alarms flagged records by title, rules as cards with an on/off switch, and a live "Right now" preview in the editor; switching a rule back on rescans #354
    • copilot chats in the sidebar, openers per workspace, a write shown as "Was → Now" before you allow it, a skills sheet, and collapsed chats as pills in the dock #355
    • api-tokens the list names each token's creator and flags expiries, access as two cards, a ready curl request on reveal, and revoking says what stops #356

    Fixes

    • copilot-admin picking a thread from the history menu opens it instead of starting a window drag #355
    • design-system no Chrome autofill tint on form fields #350
    • admin the accept-invite page no longer scrolls sideways at 320px, closing an Insights drill-down returns focus to its line, and Done on the invite results asks before leaving an uncopied link 9c4e000

    Migrations

    • Run `orthacms migrate` after upgrading. All three are additive:
    • activity `0002_subject_label` — a `subject_label` column, backfilled
    • workspaces `0003_workspace_archived_at` — an `archived_at` column, backfilled from `updated_at`
    • protection `0004_review_approvals_by_user` — an index for Recently approved

    With thanks to Claude, Claude Opus 5.5, Claude Opus 5.5 (1M context), Pavel Makhanko @pmknk, pmknk.

  3. 0.12.0

    Release on GitHub

    Features

    • content-admin the entry editor is one form — relations and media inline, Properties on demand, a status cluster, History with activity (ADR-0022) #347
    • content-admin an overview for the Content Library; saved views as tabs, status chips and a floating selection bar on the records page #347
    • media-admin folders in the tree, type chips, a list view and a details panel beside the grid #347
    • shell a "Needs your attention" row and top-bar actions on Home; every page shows its title and subtitle #347
    • webhooks-admin a state filter and delivery strips, a sectioned editor, figures and a two-pane delivery log #347
    • workspaces-admin workspaces as cards, and settings with a side nav #347
    • alarms-admin a per-severity strip and framed alarm groups; protection-admin: the Reviews queue redrawn #347

    Fixes

    • content-admin an author's own save no longer flashes the conflict notice #347
    • admin no page cross-fade on entry tab switches, no square corners mid-fade 30e55f2

    With thanks to Claude, Claude Opus 5.5, Claude Opus 5.5 (1M context), Pavel Makhanko @pmknk, pmknk.

  4. 0.11.0

    Release on GitHub

    Features

    • admin a motion pass — page cross-fade, sliding indicators, overlay entrances, no skeleton flash #346
    • content fold each row of the sync preview, with a count in its heading #341
    • copilot daily token quotas, runs per minute and runs in flight #335
    • copilot-admin mark the way in only when a chat is waiting for you #344
    • i18n preview what a save does to other locales and records, and ask before every one #336
    • server a feature-named dev content model and a full dev seed f9bdbbf
    • shell resizable sidebars, with the layout saved to the user's preferences #332

    Fixes

    • content no blur before the sync question — cover an asked-first write late #339
    • content the sync preview names the record being saved, and real statuses #340
    • copilot the page under the chat catches up after a change #342
    • copilot-admin the Agents switch counts the chat the page is showing #337
    • design-system a resize drag always ends, and never leaves the cursor stuck #333
    • design-system button-backed fields show focus however they got it #345
    • design-system the page cross-fade no longer zooms between pages of different sizes 7e6ed35
    • i18n a target's late translation fills the mirrored links waiting for it #334
    • i18n one cover across the sync question, and a preview a person can read #338
    • schema-builder-admin a group taller than the first one can be dragged to the top #343

    With thanks to Claude, Claude Opus 5.5, Claude Opus 5.5 (1M context), Pavel Makhanko @pmknk, pmknk.

  5. 0.10.3

    Release on GitHub

    Features

    • i18n one confirmation when a save reaches other locales #331

    With thanks to Claude Opus 5.5, Pavel Makhanko @pmknk.

  6. 0.10.2

    Release on GitHub

    Fixes

    • content ask before a save that leaves a published translation incomplete e26d43e
    • content name a linked record that is in the trash instead of its id da2bf58
    • content say what links to an entry before deleting it 7889081
    • i18n keep a sibling's link to a trashed translation of the same record 1ca78a0

    With thanks to Claude, Claude Opus 5.5.

  7. 0.10.1

    Release on GitHub

    Features

    • copilot the Agents rail marks a thread that is working or waiting for you f51160c
    • i18n switch locales at once — no cover, siblings prefetched #328
    • schema-builder drag that makes room, groups sorted and edited in place, options before the default #326

    With thanks to Claude Opus 5.5, Pavel Makhanko @pmknk, pmknk.

  8. 0.10.0

    Release on GitHub

    Features

    • admin add a favicon to the admin and the scaffolded app #314
    • content a field's default value, as a create-form prefill d7ad2e4
    • copilot-admin show open chats' status on the sidebar's Agents switch #319
    • i18n-admin searchable locale menu, readable rows e0b1c73
    • i18n-admin pin the default locale first in the locale menu 6cf4862
    • media opt-in public (CDN) URLs from the storage provider f779aa3
    • schema-builder explain relation locale behaviour as a choice #311

    Fixes

    • admin stale selection, unclamped pages, invite submit, i18n 5ad84dd
    • content-admin the whole form-section header folds and unfolds 9ea4598
    • content-server malformed ids, in-write target checks, saved-view cap 7d0fa0e
    • copilot show a tool step while the model is still writing it 0748638
    • copilot raise the message limit to 32,000 and enforce it in the composer #318
    • copilot-admin keep the latest turn when an Agents thread is reopened 477dafc
    • copilot-admin forget the switcher's remembered pages with the session 6253969
    • copilot-server never show driver errors to the user or the model ccdc8cf
    • design-system round dialogs and space stacked footer buttons on mobile 19d0e04
    • identity-admin, copilot-admin end copilot chats when the session ends b759d90
    • identity-server share login rate-limit buckets across instances d3c2d79
    • media-admin show a loader while a media delete is in flight 9f4c62a
    • schema-builder-admin keep focus while typing in a select option 76babd3
    • schema-builder-admin drag a field into a group on General, and back out d2f941b
    • segments-server, alarms-server, activity-server refuse malformed tool arguments a76c354
    • utils-admin slots hand out one stable, frozen array 55d9eea
    • webhooks-domain judge IPv6 literals by the IPv4 they embed 2b07a4e
    • webhooks-server, mail-server fence attempt writes on the claim 62724a7

    With thanks to Claude, Claude Opus 5.5, Pavel Makhanko @pmknk.

  9. 0.9.1

    Release on GitHub

    Features

    • content-admin an outline of the General tab's fields at the editor's edge 893b69e
    • copilot-admin start new chats on the last model picked, across reloads 4edd8d5
    • protection-server let the copilot see who can review an entry 1645b49

    Fixes

    • alarms-admin offer only the workspace's own collections when creating an alarm 9a04bbd
    • content-server scope the type schema an agent reads to the workspace 58ec9c2
    • design-system no side scrollbar on a tabs row f74c299
    • segments "Can be seen by" filters by who can actually read the entry 5c5c570

    Design

    • admin the locale switcher leads the editor's top bar; access moves to Details 1e3f4e7
    • protection-admin the review chip heads the Review block 8439764

    With thanks to Claude Opus 5.5 (1M context), pmknk.

  10. 0.9.0

    Release on GitHub

    Design

    • admin a floating work area, header-less pages and borderless tables 26a3708
    • admin the work area is one white card on a light gray frame, and the right panel (Properties) sits inside it
    • admin page titles fold into the top bar; a page's actions and its tabs move up into it, and back links give way to the breadcrumb
    • admin list tables run full width with no frame and no row rules — a gray header pill and a rounded hover row
    • admin compact list toolbars: Columns and Filters are icon buttons, and Filters opens a large popover instead of an inline panel
    • copilot "Ask Ortha AI" sits under the work area instead of in the top bar

    Breaking changes for plugin authors

    • query-builder `QueryBuilderPanel` is removed — use `QueryBuilderPopover` (and `useFilterDraft` for the draft/apply logic)
    • design-system `InsetBarEnd` is now `InsetFooterEnd`, drawn into the `InsetFooter` under the work area
    • design-system new `TopBarTabs`, `PageHeaderHost`, `DensityProvider` / `useDensity`, and `Container width="full"`; `ContainerHeader` folds into a top bar when one is present

    With thanks to Claude, Claude Opus 5.5, pmknk.

  11. 0.8.0

    Release on GitHub

    Features

    • cli generate the content manifest with content sync 4820f29
    • create-orthacms-app ship the schema builder in every new app 873c790
    • schema-builder the schema document, its diff and fingerprint 719251e
    • schema-builder classify changes and generate content type code fae480a
    • schema-builder server plugin with the read-only document route 9bfceb8
    • schema-builder read-only content model page in the admin 1fa86f3
    • schema-builder plan a content model change c7ea2ef
    • schema-builder apply a content model change 9e59cae
    • schema-builder edit the content model in the admin fec793b
    • schema-builder review, apply and grant in the admin (11/12) ca26976
    • schema-builder review as a page with steps; sheets slide in f9722ff
    • schema-builder add a field as a page with steps; roomier cardinality a1cdcff
    • schema-builder relations named the usual way, with what each means eb6062e
    • schema-builder fewer knobs, searchable grant, flags that undo a845056
    • schema-builder a new type starts empty; description is a text box c376878

    Fixes

    • schema-builder declare express, which the error filter imports 36c4fef
    • schema-builder the structure rule says what it checks, and starts on dda6041
    • schema-builder long text is not checked as a document 51ab536
    • server-e2e declare jest and node types explicitly afcc320

    With thanks to Claude, Claude Opus 5.5, pmknk.

  12. 0.7.0

    Release on GitHub

    Features

    • explicit per-source shared content grants 3ec2ffb
    • admin shared workspaces — sharing toggle, shared relation targets, read-only view cf3b9cf
    • content collapsible form sections via groups + admin.group f7bed82
    • content admin.width decides a field's form width, full by default 704aa89
    • content shared workspaces in the MCP and copilot content tools e838eea
    • content-admin size entry fields to their value, rows via admin.row f19057c
    • copilot-admin move the AI launcher into the top bar, drop the bottom gutter 344d44c
    • copilot-admin make the top-bar launcher an icon 6cc58df
    • i18n richer locale menu in the entry editor, built for many locales 57400dc
    • server shared workspaces — published records linkable across workspaces 6202af3

    Fixes

    • content a required relation to an ungranted type is not required 1d35990
    • content bulk publish checks required many-relations like single publish 3eea0b2
    • content serve the published version of a modified entry on the public API 887bd0d
    • content-admin snap entry fields to a two-column grid 9a87434
    • content-admin keep a new record's values when its publish is refused aac1ca7
    • content-admin settle staged plugin and relation state after a refused publish df7a0de
    • content-admin hide Save on shared records and shared-only types ff0d2a3
    • create-orthacms-app install on npm 10, and smoke-test the first run in CI 52c2077
    • protection nothing to review on a published, unchanged entry dbb8753
    • protection keep reviewers queued after a publish; align the Reviews table d5b796e
    • segments resolve the reader from X-Reader-Tags by default 226cc2b

    With thanks to Claude, Claude Opus 5.5.

  13. 0.6.0

    Release on GitHub

    Features

    • agents add the tiered ticket pipeline, and restore open-pr as a skill #273
    • content-admin, i18n-admin slim the entry editor's Properties rail #276
    • create-apograph-app ask for a mail backend, and wire what it answers #275
    • database, activity prune delivered outbox rows, retry a parked one #280
    • mail send invitations and reset links instead of relaying them by hand #272
    • protection add the publication-protection domain kernel #255
    • protection publication protection — plugin, review, publish guard, admin (ORT-226) #265
    • protection review requests name reviewers; drop notes, request changes and bypass reasons 2d494ca

    Fixes

    • rename the scope in the one file grep classified as binary cd25467
    • rename the 49 files that carry the name only in upper or title case fa0d577
    • content the publish verdict answers for a staged audience too 084fc1a
    • content-admin refuse a background refetch's re-seed over unsaved edits 9343321
    • content-admin address the four review findings on the refused re-seed e2b0b9e
    • copilot-admin bound the change card's failure reason #278
    • deps restore sharp's platform binaries in the lock file 2bf50a0
    • protection publish no longer stales its own approval; ordinary Publish for bypass 7fbd981
    • protection send the overdue threshold with the queue instead of restating it 41b0a49
    • protection the queue's empty-page assertions carry the new field 12780a3
    • protection declare the shell-admin dependency the Reviews page imports 419d71d
    • protection-admin key the entry review by the entry's version 1215f95
    • protection-admin hold Publish while the review key is re-read 6b14dbc
    • release let reserve-names run again straight after a batch c6a49cf
    • server-e2e clear mail_deliveries between tests f8db838
    • shell reserve the gutter the copilot dock covers, and close four coverage gaps 6a837c1

    With thanks to Claude, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk, pmknk.

  14. 0.5.2

    Release on GitHub

    Fixes

    • create-ortha-app configure the plugins the template only registered #250

    With thanks to Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  15. 0.5.1

    Release on GitHub

    Fixes

    • release pack what the build compiles, and state media-domain's licence 771bdbe

    With thanks to Claude Opus 5 (1M context), Pavel Makhanko.

  16. 0.5.0

    Release on GitHub

    Features

    • activity close the silent gaps in the audit trail (server) 41a038c
    • activity audit the contexts that raised no events at all 599485a
    • activity make the trail's gaps and one entry's history reachable 57e3cd0
    • activity-admin render every kind the server writes, and pin it e9d1640
    • cli add `ortha --version` 6856416
    • design-system let MultiSelect add what was typed, and use it 364fa2b
    • users-admin filter Members through the inline panel, not a drawer 8a44019
    • webhooks deliver content changes to configured endpoints 9246ffb
    • webhooks-admin configure endpoints and read the delivery log 2c9583a
    • webhooks-admin pick content types, without closing the list 465c1cb
    • webhooks-admin scope the type picker to the chosen workspaces ecb3707
    • webhooks-admin a status switch that asks, and custom headers e746ef5

    Fixes

    • admin close the ten UI tickets ORT-197…ORT-206 #247
    • admin pick the Action filter by label, and lift the empty-group mute to AA 09f647f
    • alarms say the severity on the two surfaces that had stopped 4940789
    • api-tokens answer honestly about an expiry, a scope, and an empty bucket 3793433
    • api-tokens-admin keep a credential from being minted twice, and give focus somewhere to land 275b5df
    • cli answer `ortha --help` instead of "Unknown command" 25ca401
    • config read the environment only through readEnv, so a blank key means absent f9c1a50
    • content describe the public content API in the OpenAPI document f36b0ad
    • copilot keep a partial answer when a run ends mid-stream 21ea422
    • create-ortha-app expect the plugins the template actually registers 66649d4
    • design-system drop the dropdown exit animation, which kept closed overlays live 1362201
    • design-system the spinner stops rotating under reduced motion, without stopping ab4f6ae
    • e2e stop the memory advisory crying wolf on macOS bb11484
    • i18n join the ambient unit of work when checking a translation group 6590443
    • identity-admin say why the session ended, and ask for the confirm once 1f36533
    • identity-admin answer an unknown /identity path instead of a blank page f5e8991
    • media move the timed-text track types out of infrastructure 80219e9
    • media give the storage port its own package, so an adapter costs an adapter 82d1287
    • query-builder restore `like` to the reverse map, which silently dropped it 4574cfd
    • query-builder open the filter panel without scrolling its own clip 0fc3907
    • segments check an entry's workspace before writing its audiences 5e974b4
    • server-e2e retry a deadlocked truncate, and unpin two stale expectations aedcd99
    • server-e2e bind the harness to loopback, so the suite stops losing requests 99a648f
    • transfer let the link pass see what the first write actually wrote 585418d
    • users-server reject an explicit null name instead of clearing it d73d8ff
    • webhooks purge a deleted workspace's subscription rows #245
    • webhooks-admin keep node:crypto out of the browser bundle a58eeb4
    • webhooks-admin the three things only a browser could find 7e73abd
    • webhooks-admin name the two filter pickers 7c3bf77
    • workspaces purge the rows a deleted workspace used to strand ba4632b
    • workspaces-admin stop the roster surfaces failing quietly 3b12ffe
    • wysiwyg actually clear the alt when an image is marked decorative dd0b967
    • wysiwyg keep a passage's language when formatting is cleared fcd1f3b
    • wysiwyg stop Tab re-appending the row TableTab just bounded 5b0a906

    With thanks to Claude, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  17. 0.4.3

    Release on GitHub

    Features

    • alarms content rules that flag problems without blocking a write b86f449
    • alarms expose findings to the copilot and render them dfbfe29
    • alarms group flagged records by the alarm that flagged them 3d5740b
    • alarms mark required fields, remove muting, wire the relation picker 7c6de57
    • alarms re-check from a group header, and collapse the builder on apply b4e19c5
    • content saved list views for collection records dcf8040
    • content,segments version an entry's access with the entry 1828438
    • identity let a contributor delete content and media 9ae9248
    • query-builder a named category for flat fields, and put segments in one 2210792
    • segments reader access as two lists on the entry e5f500e
    • segments apply entry access on the entry's own Save/Publish 7716a0a
    • segments audience pages, workspace scope, pagination, bulk set f1f2afc
    • segments filter records by audience; move the Access tab's directory link ec850b2
    • segments default the audience filter to multi-select, and cover both halves by e2e 7e4106a
    • segments revise every locale a save's audiences reached, and load into skeletons 7ceebbb
    • segments reach reader entitlements from MCP, the copilot and a token 0a6b6ab

    Fixes

    • admin-e2e sort from the header's button, not the cell around it 33eddbf
    • alarms rebuild the alarms UI around what people actually reported e8311ae
    • alarms drop the dead space under a group that does not page a1f76dc
    • content apply the read scope inside relation windows, not only on hydration bb379d5
    • create-ortha-app refuse a feature id no group defines b6c4a98
    • release stop pack leaving a broken package staged b2e085e
    • segments space badge icons in the design system, validate the segment form da7a319
    • segments bind reader/audience ids as one uuid[] parameter f4bf6dd
    • segments write an entry's audiences to its whole locale group c364a01
    • server-e2e give the run the heap the run actually needs be0df26
    • server-e2e bound resetDb's wait for its own locks 29aabc9

    With thanks to Claude, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  18. 0.4.2

    Release on GitHub

    Fixes

    • create-ortha-app make Tailwind actually scan the installed packages 8951c7e

    With thanks to Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  19. 0.4.1

    Release on GitHub

    Fixes

    • create-ortha-app let a second picker read the keyboard b47c1e7
    • release declare the phantom deps that kept two packages off npm 7232e0c

    With thanks to Claude, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  20. 0.4.0

    Release on GitHub

    Features

    • cli add `ortha` and `npx create-ortha-app` 5c056f8
    • content-admin a ⋯ menu for the collection, and move Import into it #201
    • content-admin move the ⋯ menu right, and fold bulk actions into one c5aaaec
    • create-ortha-app pick features at scaffold time, in a proper wizard 860b424
    • create-ortha-app ship the copilot by default, ask about protocols 4af1506
    • create-ortha-app declare every reachable package in a new app 17a97fb
    • create-ortha-app ship a working test setup in the generated app ea90aa4
    • create-ortha-app split e2e into server and admin suites 70411c9
    • identity SSO phase 0 — the provider seam, with no real IdP in it 3afa965
    • identity SSO phase 1 — a real identity provider c48b13e
    • identity SSO phase 2 — what a sign-in is allowed to do 67a8811
    • identity SSO phase 3 — the long tail c7aa471
    • insights put the selected range in the URL, so a dashboard can be shared bf0c3e9
    • media one storage provider per deployment, passed as one object 96c7b02
    • media ship the in-memory storage provider as a package 218be99
    • media implement the S3-compatible storage provider 8589f09
    • media serve downloads as a signed redirect when the backend can 57f0f80
    • media add the Azure Blob Storage provider ffa1558
    • media add the Google Cloud Storage provider fc67428
    • media add the Vercel Blob provider a5a662a
    • transfer the transfer kernel — document contract, formats, identity 37235c7
    • transfer the server plugin — one-hop export, two-phase import fd6eb11
    • transfer the admin plugin, and a bulk-action slot to hang it on 7c8b293
    • transfer register the plugin, and write down why it exists d1abf7c
    • transfer link related records on import instead of copying them 744ab91

    Fixes

    • admin-a11y stop the route announcer reading loading skeletons; give every skeleton an <h1> 36f955d
    • admin-e2e close the permission drift and two stale locators 810bc1f
    • bootstrap-admin wire slot contributions from empty, so a hot update stops doubling them 99f1cf8
    • content-graphql close the maxComplexity budget's prototype-name fail-open 1298af4
    • content-graphql bound SchemaCache, which kept one schema per grant set ever seen a3bde04
    • copilot-admin make the transcript and the composer one column 33a8c2a
    • copilot-provider-openai retry a transient upstream failure, as anthropic does d54d415
    • create-ortha-app classify the two provider-authoring packages 94a294d
    • database drain the pool and the in-flight outbox batch on shutdown ac173ef
    • identity-server drop sessionSecret and tokenSecret, which nothing read 2d5b9b6
    • media-server map the media tools' domain errors, so a bad argument is a 400 not an opaque 500 474a7ea
    • media-server answer 404, not 500, when an asset's blob is missing from storage 98d6624
    • server-e2e stop the local-storage suite leaking rows into the next file 1532d74
    • transfer key localized fields, and fold the locale into the match 5b5fb27
    • transfer stop the import's link pass blanking the fields it just wrote 7510195
    • transfer-admin refresh the list after an import, and explain the options ffaf843

    With thanks to Claude, Claude Opus 4.8, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.

  21. 0.3.0

    Release on GitHub

    Features

    • admin give the last six lazy routes a skeleton instead of a blank page b7b3937
    • content mark entry-editor tabs that still hold required fields a2588e6
    • content model richtext as a structured document, not an opaque string 3c1fe33
    • content model alt text on a media value (ORT-83, ORT-91) c573e30
    • content-admin draw the boundary between translated and shared fields 4fb331d
    • content-server batch the writes for the API, MCP and the copilot c06de35
    • copilot keep a thread's model and its attached page with the session 3812cc3
    • copilot cache the prompt, and lift all three run ceilings together cf6d8fd
    • copilot say what a save must contain, which depends on publishable 12b950a
    • copilot drop defaultProvider — the provider list is the setting 6930757
    • copilot stand the dock down on the Agents view, and let a panel move there e6c4178
    • copilot-server tell the model that shared fields are not translatable a98ea87
    • dev per-worktree dev stack slots for parallel tickets c2b29a1
    • i18n-server batch the translations, and stop content saves joining a group c037a12
    • identity,users admin-generated password reset links #11
    • media let an asset carry captions and subtitles (ORT-92) 53c6ba6
    • users-server machine codes on conflicts, and a resend cooldown #140

    Fixes

    • a11y landmarks, headings, dialog names, titles and localized chrome 586135e
    • a11y name the scrollport, contain the mobile panel, fix the copilot transcript 9024592
    • a11y reachable tooltips, a shared shortcut guard, bounded table Tab 35a9fe4
    • a11y make the query builder usable by screen reader (ORT-157) 1d7eba9
    • a11y give the copilot consent prompt a deadline the user can see and extend (ORT-118) 90def35
    • a11y prompt for alt in the copilot write path, declare direction, mark a prefill's language 6eb1c45
    • a11y re-enable the structural axe rules, and fix what they caught 985c73a
    • activity-admin render every audit kind the server writes, and stop a bad timestamp blanking the app 4c709a0
    • activity-server audit the media library, invite acceptance, and refuse an unnameable subject 490c5dc
    • admin-e2e make typecheck — the suite's only static gate — pass again daaba15
    • api-tokens let the workspace picker scroll by wheel inside its dialog 03404fc
    • api-tokens-admin stop the one-time secret being silently lost, and label what mints it 72d8976
    • apps validate the two composition roots instead of trusting them 47f6fe1
    • bootstrap-admin stop one plugin from taking the whole app down c52bf23
    • bootstrap-admin stop the route announcer naming the page you just left 647be7d
    • bootstrap-server let the host trust its proxy so login throttling buckets per client b22e8b6
    • bootstrap-server make the host's four deployment-shaped failures survivable d190f0d
    • content count only real transitions in a bulk unpublish ac38291
    • content stop the globe meaning two opposite things across the editor 1f57541
    • content disclose when a proposed edit rewrites every locale b681454
    • content reject inherited Object.prototype names in the ?fields= whitelist #164
    • content raise domain events for entry create, update, delete and restore 900fc27
    • content-admin tell refusal, absence and failure apart 78b29de
    • content-domain close seven validation holes in the shared kernel e99aad9
    • content-graphql a 620-byte query no longer wedges the process 25ad080
    • content-graphql a single-record read costs one record, not a page 65e64e2
    • content-graphql drop the needless escapes in the MediaAsset.alt description 1a4707a
    • content-graphql escape the cache key's separator instead of embedding it b09b571
    • content-server enforce workspace content grants on the admin API cfb43bf
    • copilot put a replayed tool result back on a user turn 36d2691
    • copilot tell the model when an earlier turn was cut off 8733404
    • copilot-admin one thread one window, and controls that mean what they say b523ddc
    • copilot-admin say what the run is doing, and give a failed change room 84127e9
    • copilot-domain bound the untrusted fence and tighten the port's contracts 5843c22
    • copilot-server own the parked run, bound the tool loop, keep every receipt 4ce655b
    • database stop the outbox from wedging the pool it drains 81f3eb0
    • design-system settle the toast corner in one place e62427a
    • design-system per-toast dismissal, localizable names, forced colors 5ae28bd
    • design-system give the button focus ring enough contrast to see 8533c75
    • design-system watch the table, not just the wrapper, for overflow 75ca80b
    • hooks the catalog drift hooks never matched a file 42475e3
    • i18n-admin tell "nothing" from "we couldn't ask", and state language #144
    • i18n-server a group lock, a guarded POST, an orphan check, honest filters 69d7c10
    • identity announce a forced sign-out and explain it on the sign-in page f325e9e
    • identity-admin drop the previous session's cache when the tab changes hands 10047aa
    • identity-admin stop advertising controls the sign-in page cannot honour #8
    • identity-admin stop reporting an invite-lookup outage as a dead link 9a27ff0
    • identity-admin tell the user when signing out fails b1b502a
    • identity-admin tell an API outage apart from being signed out 4aa274a
    • identity-admin give an empty field one validation message, not two 12eb2d4
    • identity-admin close the four open ORT-57 accessibility findings #129
    • identity-admin stop the focus ring boxing the auth page title 2748e91
    • identity-server count the password ceiling in bytes, the unit bcrypt truncates on 22d94f8
    • identity-server gate a member's session list on users:update, not users:read 1c535c6
    • identity-server revoke sessions on a password change, and audit it 143564f
    • identity-server audit API-token mint and revoke 84b463c
    • identity-server reject an API token minted for a workspace that does not exist 17099dd
    • identity-server reconcile the RBAC seeder so a retired permission stops being granted 297d75c
    • mcp-server answer every verb, bound every exchange, map every resource failure 2e59ee2
    • media browse the library on the server, and page it f0859a1
    • media-admin say what the server said, and let alt text be written 8e55bf8
    • media-admin, copilot-admin two landmark bugs the new axe rules found efaaae2
    • media-provider-local make a write all-or-nothing, and keep every key inside the root 74a393e
    • media-server treat a download as hostile bytes, and mean the limits f0cafb3
    • nx stop db:generate caching a schema it cannot see, and refuse a migration nobody aimed 05dd392
    • packaging declare the deps four packages import but never listed fac626f
    • query-builder-admin,insights-admin close the crafted-filter crash and the silent dashboard states 259b536
    • server-e2e a broken run says so instead of blaming the product 90ef675
    • server-e2e close the state a test could leak into the next one 1d15022
    • server-e2e say "memory" before the run says "regression" 7c68d69
    • shell-admin stop the chrome dropping focus, and stop a phone rewriting a desktop preference 6f07f31
    • tools-server validate what a tool is handed, and fail the deploy on a bad catalogue 89b61fb
    • users-admin close the eleven confirmed ORT-66 QA findings dee5c07
    • users-admin anchor roster focus outside the table 1ae4d71
    • users-admin take the member timeline's action labels from the one shared catalogue a92eff3
    • users-server guard state-changing routes and stop blanket locking d6abb02
    • utils-admin repair five seams every admin plugin inherits 6de165d
    • utils-server make the filter whitelist a whitelist again 3833733
    • utils-server reject a filter operator the column type cannot answer 2ddcf4d
    • workspaces-admin close the five confirmed ORT-60 QA findings 0f52010
    • workspaces-admin close the eleven ORT-60 accessibility findings 6967469
    • workspaces-admin give the switcher a width again, and fold the quick-list 25ee2d8
    • workspaces-server close the eight confirmed ORT-53 QA findings 450210e
    • workspaces-server purge cross-plugin rows when a workspace is deleted #136
    • wysiwyg-admin let the editor say what language it is in, and how to leave a1c5e88

    With thanks to Pavel Makhanko @pmknk.