Skip to content

Releases: ortha-source/ortha-cms

v0.10.0

Choose a tag to compare

@pmknk pmknk released this 09 Oct 14:47

0.10.0 (2026-10-09)

🚀 Features

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

🩹 Fixes

  • admin: stale selection, unclamped pages, invite submit, i18n (5ad84dd4)
  • content-admin: the whole form-section header folds and unfolds (9ea4598e)
  • content-server: malformed ids, in-write target checks, saved-view cap (7d0fa0ef)
  • copilot: show a tool step while the model is still writing it (0748638d)
  • 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 (477dafc9)
  • copilot-admin: forget the switcher's remembered pages with the session (62539694)
  • copilot-server: never show driver errors to the user or the model (ccdc8cfe)
  • design-system: round dialogs and space stacked footer buttons on mobile (19d0e046)
  • identity-admin, copilot-admin: end copilot chats when the session ends (b759d90b)
  • identity-server: share login rate-limit buckets across instances (d3c2d79d)
  • media-admin: show a loader while a media delete is in flight (9f4c62a1)
  • schema-builder-admin: keep focus while typing in a select option (76babd36)
  • schema-builder-admin: drag a field into a group on General, and back out (d2f941bd)
  • segments-server, alarms-server, activity-server: refuse malformed tool arguments (a76c3545)
  • utils-admin: slots hand out one stable, frozen array (55d9eea1)
  • webhooks-domain: judge IPv6 literals by the IPv4 they embed (2b07a4e8)
  • webhooks-server, mail-server: fence attempt writes on the claim (62724a7d)

❤️ Thank You

  • Claude
  • Claude Opus 5.5
  • Pavel Makhanko @pmknk

v0.9.1

Choose a tag to compare

@pmknk pmknk released this 06 Oct 19:07

0.9.1 (2026-10-06)

🚀 Features

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

🩹 Fixes

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

🎨 Design

  • admin: the locale switcher leads the editor's top bar; access moves to Details (1e3f4e7b)
  • protection-admin: the review chip heads the Review block (84397640)

❤️ Thank You

  • Claude Opus 5.5 (1M context)
  • pmknk

v0.9.0

Choose a tag to compare

@pmknk pmknk released this 05 Oct 17:50

0.9.0 (2026-10-05)

🎨 Design

  • admin: a floating work area, header-less pages and borderless tables (26a37085)
  • 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

❤️ Thank You

  • Claude
  • Claude Opus 5.5
  • pmknk

v0.8.0

Choose a tag to compare

@pmknk pmknk released this 04 Oct 20:20

0.8.0 (2026-10-04)

🚀 Features

  • cli: generate the content manifest with content sync (4820f29c)
  • create-orthacms-app: ship the schema builder in every new app (873c7906)
  • schema-builder: the schema document, its diff and fingerprint (719251e0)
  • schema-builder: classify changes and generate content type code (fae480ae)
  • schema-builder: server plugin with the read-only document route (9bfceb8a)
  • schema-builder: read-only content model page in the admin (1fa86f3b)
  • schema-builder: plan a content model change (c7ea2efa)
  • schema-builder: apply a content model change (9e59caec)
  • schema-builder: edit the content model in the admin (fec793bf)
  • schema-builder: review, apply and grant in the admin (11/12) (ca269767)
  • schema-builder: review as a page with steps; sheets slide in (f9722ffb)
  • schema-builder: add a field as a page with steps; roomier cardinality (a1cdcffe)
  • schema-builder: relations named the usual way, with what each means (eb6062e3)
  • schema-builder: fewer knobs, searchable grant, flags that undo (a8450568)
  • schema-builder: a new type starts empty; description is a text box (c376878e)

🩹 Fixes

  • schema-builder: declare express, which the error filter imports (36c4fefb)
  • schema-builder: the structure rule says what it checks, and starts on (dda60413)
  • schema-builder: long text is not checked as a document (51ab5365)
  • server-e2e: declare jest and node types explicitly (afcc3206)

❤️ Thank You

  • Claude
  • Claude Opus 5.5
  • pmknk

v0.7.0

Choose a tag to compare

@pmknk pmknk released this 30 Sep 11:26
9dabe56

What's Changed

  • Admin polish: gray sidebar, entry-form layout, richer locale menu, AI launcher in the top bar by @pmknk in #284
  • AI launcher as a top-bar icon, no bottom gutter by @pmknk in #285
  • feat: shared workspaces — published records linkable across workspaces by @pmknk in #286
  • fix(content): ungranted required relations; keep a new record's values when publish is refused by @pmknk in #287
  • fix(content): refused-publish leftovers and bulk publish required many-relations by @pmknk in #288
  • feat: explicit per-source shared content grants by @pmknk in #289
  • fix(content): serve the published version of a modified entry on the public API by @pmknk in #290
  • fix: shared records read-only; review lifecycle around publish; Reviews table by @pmknk in #291
  • fix(protection): keep reviewers queued after a publish; align the Reviews table by @pmknk in #292
  • fix(create-orthacms-app): install on npm 10, and smoke-test the first run in CI by @pmknk in #293
  • chore(release): publish 0.7.0 by @pmknk in #294

Full Changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@pmknk pmknk released this 25 Sep 15:06

0.6.0 (2026-09-25)

🚀 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, #256, #258, #259, #260, #263)
  • protection: review requests name reviewers; drop notes, request changes and bypass reasons (2d494cac)

🩹 Fixes

  • rename the scope in the one file grep classified as binary (cd254670)
  • rename the 49 files that carry the name only in upper or title case (fa0d577a)
  • content: the publish verdict answers for a staged audience too (084fc1ae)
  • content-admin: refuse a background refetch's re-seed over unsaved edits (93433214)
  • content-admin: address the four review findings on the refused re-seed (e2b0b9ed)
  • copilot-admin: bound the change card's failure reason (#278)
  • deps: restore sharp's platform binaries in the lock file (2bf50a0b)
  • protection: publish no longer stales its own approval; ordinary Publish for bypass (7fbd9811)
  • protection: send the overdue threshold with the queue instead of restating it (41b0a494)
  • protection: the queue's empty-page assertions carry the new field (12780a34)
  • protection: declare the shell-admin dependency the Reviews page imports (419d71d2)
  • protection-admin: key the entry review by the entry's version (1215f953)
  • protection-admin: hold Publish while the review key is re-read (6b14dbc5)
  • release: let reserve-names run again straight after a batch (c6a49cfc)
  • server-e2e: clear mail_deliveries between tests (f8db838b)
  • shell: reserve the gutter the copilot dock covers, and close four coverage gaps (6a837c11)

❤️ Thank You

  • Claude
  • Claude Opus 5
  • Claude Opus 5 (1M context)
  • Pavel Makhanko @pmknk
  • pmknk

v0.5.2

Choose a tag to compare

@pmknk pmknk released this 07 Sep 14:24

0.5.2 (2026-09-07)

🩹 Fixes

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

❤️ Thank You

  • Claude Opus 5 (1M context)
  • Pavel Makhanko @pmknk

v0.5.1

Choose a tag to compare

@pmknk pmknk released this 07 Sep 09:59

0.5.1 (2026-09-07)

🩹 Fixes

  • release: pack what the build compiles, and state media-domain's licence (771bdbef)

❤️ Thank You

  • Claude Opus 5 (1M context)
  • Pavel Makhanko

v0.5.0

Choose a tag to compare

@pmknk pmknk released this 07 Sep 09:41

0.5.0 (2026-09-07)

🚀 Features

  • activity: close the silent gaps in the audit trail (server) (41a038c6)
  • activity: audit the contexts that raised no events at all (599485a5)
  • activity: make the trail's gaps and one entry's history reachable (57e3cd02)
  • activity-admin: render every kind the server writes, and pin it (e9d1640b)
  • cli: add ortha --version (68564167)
  • design-system: let MultiSelect add what was typed, and use it (364fa2b7)
  • users-admin: filter Members through the inline panel, not a drawer (8a440191)
  • webhooks: deliver content changes to configured endpoints (9246ffb4)
  • webhooks-admin: configure endpoints and read the delivery log (2c9583a8)
  • webhooks-admin: pick content types, without closing the list (465c1cb4)
  • webhooks-admin: scope the type picker to the chosen workspaces (ecb37070)
  • webhooks-admin: a status switch that asks, and custom headers (e746ef56)

🩹 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 (09f647ff)
  • alarms: say the severity on the two surfaces that had stopped (4940789b)
  • api-tokens: answer honestly about an expiry, a scope, and an empty bucket (37934330)
  • api-tokens-admin: keep a credential from being minted twice, and give focus somewhere to land (275b5df9)
  • cli: answer ortha --help instead of "Unknown command" (25ca4018)
  • config: read the environment only through readEnv, so a blank key means absent (f9c1a50f)
  • content: describe the public content API in the OpenAPI document (f36b0ade)
  • copilot: keep a partial answer when a run ends mid-stream (21ea4223)
  • create-ortha-app: expect the plugins the template actually registers (66649d4a)
  • design-system: drop the dropdown exit animation, which kept closed overlays live (13622011)
  • design-system: the spinner stops rotating under reduced motion, without stopping (ab4f6aed)
  • e2e: stop the memory advisory crying wolf on macOS (bb11484f)
  • i18n: join the ambient unit of work when checking a translation group (65904430)
  • identity-admin: say why the session ended, and ask for the confirm once (1f36533c)
  • identity-admin: answer an unknown /identity path instead of a blank page (f5e89918)
  • media: move the timed-text track types out of infrastructure (80219e9a)
  • media: give the storage port its own package, so an adapter costs an adapter (82d12871)
  • query-builder: restore like to the reverse map, which silently dropped it (4574cfd9)
  • query-builder: open the filter panel without scrolling its own clip (0fc39073)
  • segments: check an entry's workspace before writing its audiences (5e974b41)
  • server-e2e: retry a deadlocked truncate, and unpin two stale expectations (aedcd992)
  • server-e2e: bind the harness to loopback, so the suite stops losing requests (99a648f7)
  • transfer: let the link pass see what the first write actually wrote (585418d2)
  • users-server: reject an explicit null name instead of clearing it (d73d8ffa)
  • webhooks: purge a deleted workspace's subscription rows (#245)
  • webhooks-admin: keep node:crypto out of the browser bundle (a58eeb4c)
  • webhooks-admin: the three things only a browser could find (7e73abdf)
  • webhooks-admin: name the two filter pickers (7c3bf771)
  • workspaces: purge the rows a deleted workspace used to strand (ba4632b1)
  • workspaces-admin: stop the roster surfaces failing quietly (3b12ffef)
  • wysiwyg: actually clear the alt when an image is marked decorative (dd0b9676)
  • wysiwyg: keep a passage's language when formatting is cleared (fcd1f3b9)
  • wysiwyg: stop Tab re-appending the row TableTab just bounded (5b0a906a)

❤️ Thank You

  • Claude
  • Claude Opus 5
  • Claude Opus 5 (1M context)
  • Pavel Makhanko @pmknk

v0.4.3

Choose a tag to compare

@pmknk pmknk released this 28 Aug 10:22

0.4.3 (2026-08-28)

🚀 Features

  • alarms: content rules that flag problems without blocking a write (b86f4499)
  • alarms: expose findings to the copilot and render them (dfbfe29b)
  • alarms: group flagged records by the alarm that flagged them (3d5740b1)
  • alarms: mark required fields, remove muting, wire the relation picker (7c6de578)
  • alarms: re-check from a group header, and collapse the builder on apply (b4e19c50)
  • content: saved list views for collection records (dcf80402)
  • content,segments: version an entry's access with the entry (1828438b)
  • identity: let a contributor delete content and media (9ae9248c)
  • query-builder: a named category for flat fields, and put segments in one (22107929)
  • segments: reader access as two lists on the entry (e5f500e9)
  • segments: apply entry access on the entry's own Save/Publish (7716a0ab)
  • segments: audience pages, workspace scope, pagination, bulk set (f1f2afc3)
  • segments: filter records by audience; move the Access tab's directory link (ec850b2e)
  • segments: default the audience filter to multi-select, and cover both halves by e2e (7e4106a7)
  • segments: revise every locale a save's audiences reached, and load into skeletons (7ceebbb5)
  • segments: reach reader entitlements from MCP, the copilot and a token (0a6b6ab2)

🩹 Fixes

  • admin-e2e: sort from the header's button, not the cell around it (33eddbfb)
  • alarms: rebuild the alarms UI around what people actually reported (e8311ae5)
  • alarms: drop the dead space under a group that does not page (a1f76dc9)
  • content: apply the read scope inside relation windows, not only on hydration (bb379d58)
  • create-ortha-app: refuse a feature id no group defines (b6c4a98c)
  • release: stop pack leaving a broken package staged (b2e085ec)
  • segments: space badge icons in the design system, validate the segment form (da7a3191)
  • segments: bind reader/audience ids as one uuid[] parameter (f4bf6dd5)
  • segments: write an entry's audiences to its whole locale group (c364a01c)
  • server-e2e: give the run the heap the run actually needs (be0df263)
  • server-e2e: bound resetDb's wait for its own locks (29aabc9b)

❤️ Thank You

  • Claude
  • Claude Opus 5
  • Claude Opus 5 (1M context)
  • Pavel Makhanko @pmknk