Changelog

What changed, release by release

Every published version, newest first. The latest is 0.5.2. Every line links to the commit 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.5.2 Latest

    Release on GitHub

    Fixes

    • create-apograph-app configure the plugins the template only registered ([#250](https://github.com/apograph-source/apograph-cms/pull/250))

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

  2. 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.

  3. 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 `apograph --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](https://github.com/apograph-source/apograph-cms/pull/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 `apograph --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-apograph-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](https://github.com/apograph-source/apograph-cms/pull/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.

  4. 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-apograph-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.

  5. 0.4.2

    Release on GitHub

    Fixes

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

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

  6. 0.4.1

    Release on GitHub

    Fixes

    • create-apograph-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.

  7. 0.4.0

    Release on GitHub

    Features

    • cli add `apograph` and `npx create-apograph-app` 5c056f8
    • content-admin a ⋯ menu for the collection, and move Import into it ([#201](https://github.com/apograph-source/apograph-cms/issues/201))
    • content-admin move the ⋯ menu right, and fold bulk actions into one c5aaaec
    • create-apograph-app pick features at scaffold time, in a proper wizard 860b424
    • create-apograph-app ship the copilot by default, ask about protocols 4af1506
    • create-apograph-app declare every reachable package in a new app 17a97fb
    • create-apograph-app ship a working test setup in the generated app ea90aa4
    • create-apograph-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-apograph-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.

  8. 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](https://github.com/apograph-source/apograph-cms/issues/11))
    • media let an asset carry captions and subtitles (ORT-92) 53c6ba6
    • users-server machine codes on conflicts, and a resend cooldown ([#140](https://github.com/apograph-source/apograph-cms/issues/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](https://github.com/apograph-source/apograph-cms/issues/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](https://github.com/apograph-source/apograph-cms/issues/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](https://github.com/apograph-source/apograph-cms/issues/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](https://github.com/apograph-source/apograph-cms/issues/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](https://github.com/apograph-source/apograph-cms/issues/136))
    • wysiwyg-admin let the editor say what language it is in, and how to leave a1c5e88

    With thanks to Pavel Makhanko @pmknk.