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.
-
0.5.2 Latest
Release on GitHubFixes
-
create-apograph-appconfigure 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.
-
-
0.5.1
Release on GitHubFixes
-
releasepack what the build compiles, and state media-domain's licence 771bdbe
With thanks to Claude Opus 5 (1M context), Pavel Makhanko.
-
-
0.5.0
Release on GitHubFeatures
-
activityclose the silent gaps in the audit trail (server) 41a038c -
activityaudit the contexts that raised no events at all 599485a -
activitymake the trail's gaps and one entry's history reachable 57e3cd0 -
activity-adminrender every kind the server writes, and pin it e9d1640 -
cliadd `apograph --version` 6856416 -
design-systemlet MultiSelect add what was typed, and use it 364fa2b -
users-adminfilter Members through the inline panel, not a drawer 8a44019 -
webhooksdeliver content changes to configured endpoints 9246ffb -
webhooks-adminconfigure endpoints and read the delivery log 2c9583a -
webhooks-adminpick content types, without closing the list 465c1cb -
webhooks-adminscope the type picker to the chosen workspaces ecb3707 -
webhooks-admina status switch that asks, and custom headers e746ef5
Fixes
-
adminclose the ten UI tickets ORT-197…ORT-206 ([#247](https://github.com/apograph-source/apograph-cms/pull/247)) -
adminpick the Action filter by label, and lift the empty-group mute to AA 09f647f -
alarmssay the severity on the two surfaces that had stopped 4940789 -
api-tokensanswer honestly about an expiry, a scope, and an empty bucket 3793433 -
api-tokens-adminkeep a credential from being minted twice, and give focus somewhere to land 275b5df -
clianswer `apograph --help` instead of "Unknown command" 25ca401 -
configread the environment only through readEnv, so a blank key means absent f9c1a50 -
contentdescribe the public content API in the OpenAPI document f36b0ad -
copilotkeep a partial answer when a run ends mid-stream 21ea422 -
create-apograph-appexpect the plugins the template actually registers 66649d4 -
design-systemdrop the dropdown exit animation, which kept closed overlays live 1362201 -
design-systemthe spinner stops rotating under reduced motion, without stopping ab4f6ae -
e2estop the memory advisory crying wolf on macOS bb11484 -
i18njoin the ambient unit of work when checking a translation group 6590443 -
identity-adminsay why the session ended, and ask for the confirm once 1f36533 -
identity-adminanswer an unknown /identity path instead of a blank page f5e8991 -
mediamove the timed-text track types out of infrastructure 80219e9 -
mediagive the storage port its own package, so an adapter costs an adapter 82d1287 -
query-builderrestore `like` to the reverse map, which silently dropped it 4574cfd -
query-builderopen the filter panel without scrolling its own clip 0fc3907 -
segmentscheck an entry's workspace before writing its audiences 5e974b4 -
server-e2eretry a deadlocked truncate, and unpin two stale expectations aedcd99 -
server-e2ebind the harness to loopback, so the suite stops losing requests 99a648f -
transferlet the link pass see what the first write actually wrote 585418d -
users-serverreject an explicit null name instead of clearing it d73d8ff -
webhookspurge a deleted workspace's subscription rows ([#245](https://github.com/apograph-source/apograph-cms/pull/245)) -
webhooks-adminkeep node:crypto out of the browser bundle a58eeb4 -
webhooks-adminthe three things only a browser could find 7e73abd -
webhooks-adminname the two filter pickers 7c3bf77 -
workspacespurge the rows a deleted workspace used to strand ba4632b -
workspaces-adminstop the roster surfaces failing quietly 3b12ffe -
wysiwygactually clear the alt when an image is marked decorative dd0b967 -
wysiwygkeep a passage's language when formatting is cleared fcd1f3b -
wysiwygstop Tab re-appending the row TableTab just bounded 5b0a906
With thanks to Claude, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.
-
-
0.4.3
Release on GitHubFeatures
-
alarmscontent rules that flag problems without blocking a write b86f449 -
alarmsexpose findings to the copilot and render them dfbfe29 -
alarmsgroup flagged records by the alarm that flagged them 3d5740b -
alarmsmark required fields, remove muting, wire the relation picker 7c6de57 -
alarmsre-check from a group header, and collapse the builder on apply b4e19c5 -
contentsaved list views for collection records dcf8040 -
content,segmentsversion an entry's access with the entry 1828438 -
identitylet a contributor delete content and media 9ae9248 -
query-buildera named category for flat fields, and put segments in one 2210792 -
segmentsreader access as two lists on the entry e5f500e -
segmentsapply entry access on the entry's own Save/Publish 7716a0a -
segmentsaudience pages, workspace scope, pagination, bulk set f1f2afc -
segmentsfilter records by audience; move the Access tab's directory link ec850b2 -
segmentsdefault the audience filter to multi-select, and cover both halves by e2e 7e4106a -
segmentsrevise every locale a save's audiences reached, and load into skeletons 7ceebbb -
segmentsreach reader entitlements from MCP, the copilot and a token 0a6b6ab
Fixes
-
admin-e2esort from the header's button, not the cell around it 33eddbf -
alarmsrebuild the alarms UI around what people actually reported e8311ae -
alarmsdrop the dead space under a group that does not page a1f76dc -
contentapply the read scope inside relation windows, not only on hydration bb379d5 -
create-apograph-apprefuse a feature id no group defines b6c4a98 -
releasestop pack leaving a broken package staged b2e085e -
segmentsspace badge icons in the design system, validate the segment form da7a319 -
segmentsbind reader/audience ids as one uuid[] parameter f4bf6dd -
segmentswrite an entry's audiences to its whole locale group c364a01 -
server-e2egive the run the heap the run actually needs be0df26 -
server-e2ebound resetDb's wait for its own locks 29aabc9
With thanks to Claude, Claude Opus 5, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.
-
-
0.4.2
Release on GitHubFixes
-
create-apograph-appmake Tailwind actually scan the installed packages 8951c7e
With thanks to Claude Opus 5 (1M context), Pavel Makhanko @pmknk.
-
-
0.4.1
Release on GitHubFixes
With thanks to Claude, Claude Opus 5 (1M context), Pavel Makhanko @pmknk.
-
0.4.0
Release on GitHubFeatures
-
cliadd `apograph` and `npx create-apograph-app` 5c056f8 -
content-admina ⋯ menu for the collection, and move Import into it ([#201](https://github.com/apograph-source/apograph-cms/issues/201)) -
content-adminmove the ⋯ menu right, and fold bulk actions into one c5aaaec -
create-apograph-apppick features at scaffold time, in a proper wizard 860b424 -
create-apograph-appship the copilot by default, ask about protocols 4af1506 -
create-apograph-appdeclare every reachable package in a new app 17a97fb -
create-apograph-appship a working test setup in the generated app ea90aa4 -
create-apograph-appsplit e2e into server and admin suites 70411c9 -
identitySSO phase 0 — the provider seam, with no real IdP in it 3afa965 -
identitySSO phase 1 — a real identity provider c48b13e -
identitySSO phase 2 — what a sign-in is allowed to do 67a8811 -
identitySSO phase 3 — the long tail c7aa471 -
insightsput the selected range in the URL, so a dashboard can be shared bf0c3e9 -
mediaone storage provider per deployment, passed as one object 96c7b02 -
mediaship the in-memory storage provider as a package 218be99 -
mediaimplement the S3-compatible storage provider 8589f09 -
mediaserve downloads as a signed redirect when the backend can 57f0f80 -
mediaadd the Azure Blob Storage provider ffa1558 -
mediaadd the Google Cloud Storage provider fc67428 -
mediaadd the Vercel Blob provider a5a662a -
transferthe transfer kernel — document contract, formats, identity 37235c7 -
transferthe server plugin — one-hop export, two-phase import fd6eb11 -
transferthe admin plugin, and a bulk-action slot to hang it on 7c8b293 -
transferregister the plugin, and write down why it exists d1abf7c -
transferlink related records on import instead of copying them 744ab91
Fixes
-
admin-a11ystop the route announcer reading loading skeletons; give every skeleton an <h1> 36f955d -
admin-e2eclose the permission drift and two stale locators 810bc1f -
bootstrap-adminwire slot contributions from empty, so a hot update stops doubling them 99f1cf8 -
content-graphqlclose the maxComplexity budget's prototype-name fail-open 1298af4 -
content-graphqlbound SchemaCache, which kept one schema per grant set ever seen a3bde04 -
copilot-adminmake the transcript and the composer one column 33a8c2a -
copilot-provider-openairetry a transient upstream failure, as anthropic does d54d415 -
create-apograph-appclassify the two provider-authoring packages 94a294d -
databasedrain the pool and the in-flight outbox batch on shutdown ac173ef -
identity-serverdrop sessionSecret and tokenSecret, which nothing read 2d5b9b6 -
media-servermap the media tools' domain errors, so a bad argument is a 400 not an opaque 500 474a7ea -
media-serveranswer 404, not 500, when an asset's blob is missing from storage 98d6624 -
server-e2estop the local-storage suite leaking rows into the next file 1532d74 -
transferkey localized fields, and fold the locale into the match 5b5fb27 -
transferstop the import's link pass blanking the fields it just wrote 7510195 -
transfer-adminrefresh 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.
-
-
0.3.0
Release on GitHubFeatures
-
admingive the last six lazy routes a skeleton instead of a blank page b7b3937 -
contentmark entry-editor tabs that still hold required fields a2588e6 -
contentmodel richtext as a structured document, not an opaque string 3c1fe33 -
contentmodel alt text on a media value (ORT-83, ORT-91) c573e30 -
content-admindraw the boundary between translated and shared fields 4fb331d -
content-serverbatch the writes for the API, MCP and the copilot c06de35 -
copilotkeep a thread's model and its attached page with the session 3812cc3 -
copilotcache the prompt, and lift all three run ceilings together cf6d8fd -
copilotsay what a save must contain, which depends on publishable 12b950a -
copilotdrop defaultProvider — the provider list is the setting 6930757 -
copilotstand the dock down on the Agents view, and let a panel move there e6c4178 -
copilot-servertell the model that shared fields are not translatable a98ea87 -
devper-worktree dev stack slots for parallel tickets c2b29a1 -
i18n-serverbatch the translations, and stop content saves joining a group c037a12 -
identity,usersadmin-generated password reset links ([#11](https://github.com/apograph-source/apograph-cms/issues/11)) -
medialet an asset carry captions and subtitles (ORT-92) 53c6ba6 -
users-servermachine codes on conflicts, and a resend cooldown ([#140](https://github.com/apograph-source/apograph-cms/issues/140))
Fixes
-
a11ylandmarks, headings, dialog names, titles and localized chrome 586135e -
a11yname the scrollport, contain the mobile panel, fix the copilot transcript 9024592 -
a11yreachable tooltips, a shared shortcut guard, bounded table Tab 35a9fe4 -
a11ymake the query builder usable by screen reader (ORT-157) 1d7eba9 -
a11ygive the copilot consent prompt a deadline the user can see and extend (ORT-118) 90def35 -
a11yprompt for alt in the copilot write path, declare direction, mark a prefill's language 6eb1c45 -
a11yre-enable the structural axe rules, and fix what they caught 985c73a -
activity-adminrender every audit kind the server writes, and stop a bad timestamp blanking the app 4c709a0 -
activity-serveraudit the media library, invite acceptance, and refuse an unnameable subject 490c5dc -
admin-e2emake typecheck — the suite's only static gate — pass again daaba15 -
api-tokenslet the workspace picker scroll by wheel inside its dialog 03404fc -
api-tokens-adminstop the one-time secret being silently lost, and label what mints it 72d8976 -
appsvalidate the two composition roots instead of trusting them 47f6fe1 -
bootstrap-adminstop one plugin from taking the whole app down c52bf23 -
bootstrap-adminstop the route announcer naming the page you just left 647be7d -
bootstrap-serverlet the host trust its proxy so login throttling buckets per client b22e8b6 -
bootstrap-servermake the host's four deployment-shaped failures survivable d190f0d -
contentcount only real transitions in a bulk unpublish ac38291 -
contentstop the globe meaning two opposite things across the editor 1f57541 -
contentdisclose when a proposed edit rewrites every locale b681454 -
contentreject inherited Object.prototype names in the ?fields= whitelist ([#164](https://github.com/apograph-source/apograph-cms/issues/164)) -
contentraise domain events for entry create, update, delete and restore 900fc27 -
content-admintell refusal, absence and failure apart 78b29de -
content-domainclose seven validation holes in the shared kernel e99aad9 -
content-graphqla 620-byte query no longer wedges the process 25ad080 -
content-graphqla single-record read costs one record, not a page 65e64e2 -
content-graphqldrop the needless escapes in the MediaAsset.alt description 1a4707a -
content-graphqlescape the cache key's separator instead of embedding it b09b571 -
content-serverenforce workspace content grants on the admin API cfb43bf -
copilotput a replayed tool result back on a user turn 36d2691 -
copilottell the model when an earlier turn was cut off 8733404 -
copilot-adminone thread one window, and controls that mean what they say b523ddc -
copilot-adminsay what the run is doing, and give a failed change room 84127e9 -
copilot-domainbound the untrusted fence and tighten the port's contracts 5843c22 -
copilot-serverown the parked run, bound the tool loop, keep every receipt 4ce655b -
databasestop the outbox from wedging the pool it drains 81f3eb0 -
design-systemsettle the toast corner in one place e62427a -
design-systemper-toast dismissal, localizable names, forced colors 5ae28bd -
design-systemgive the button focus ring enough contrast to see 8533c75 -
design-systemwatch the table, not just the wrapper, for overflow 75ca80b -
hooksthe catalog drift hooks never matched a file 42475e3 -
i18n-admintell "nothing" from "we couldn't ask", and state language ([#144](https://github.com/apograph-source/apograph-cms/issues/144)) -
i18n-servera group lock, a guarded POST, an orphan check, honest filters 69d7c10 -
identityannounce a forced sign-out and explain it on the sign-in page f325e9e -
identity-admindrop the previous session's cache when the tab changes hands 10047aa -
identity-adminstop advertising controls the sign-in page cannot honour ([#8](https://github.com/apograph-source/apograph-cms/issues/8)) -
identity-adminstop reporting an invite-lookup outage as a dead link 9a27ff0 -
identity-admintell the user when signing out fails b1b502a -
identity-admintell an API outage apart from being signed out 4aa274a -
identity-admingive an empty field one validation message, not two 12eb2d4 -
identity-adminclose the four open ORT-57 accessibility findings ([#129](https://github.com/apograph-source/apograph-cms/issues/129)) -
identity-adminstop the focus ring boxing the auth page title 2748e91 -
identity-servercount the password ceiling in bytes, the unit bcrypt truncates on 22d94f8 -
identity-servergate a member's session list on users:update, not users:read 1c535c6 -
identity-serverrevoke sessions on a password change, and audit it 143564f -
identity-serveraudit API-token mint and revoke 84b463c -
identity-serverreject an API token minted for a workspace that does not exist 17099dd -
identity-serverreconcile the RBAC seeder so a retired permission stops being granted 297d75c -
mcp-serveranswer every verb, bound every exchange, map every resource failure 2e59ee2 -
mediabrowse the library on the server, and page it f0859a1 -
media-adminsay what the server said, and let alt text be written 8e55bf8 -
media-admin, copilot-admintwo landmark bugs the new axe rules found efaaae2 -
media-provider-localmake a write all-or-nothing, and keep every key inside the root 74a393e -
media-servertreat a download as hostile bytes, and mean the limits f0cafb3 -
nxstop db:generate caching a schema it cannot see, and refuse a migration nobody aimed 05dd392 -
packagingdeclare the deps four packages import but never listed fac626f -
query-builder-admin,insights-adminclose the crafted-filter crash and the silent dashboard states 259b536 -
server-e2ea broken run says so instead of blaming the product 90ef675 -
server-e2eclose the state a test could leak into the next one 1d15022 -
server-e2esay "memory" before the run says "regression" 7c68d69 -
shell-adminstop the chrome dropping focus, and stop a phone rewriting a desktop preference 6f07f31 -
tools-servervalidate what a tool is handed, and fail the deploy on a bad catalogue 89b61fb -
users-adminclose the eleven confirmed ORT-66 QA findings dee5c07 -
users-adminanchor roster focus outside the table 1ae4d71 -
users-admintake the member timeline's action labels from the one shared catalogue a92eff3 -
users-serverguard state-changing routes and stop blanket locking d6abb02 -
utils-adminrepair five seams every admin plugin inherits 6de165d -
utils-servermake the filter whitelist a whitelist again 3833733 -
utils-serverreject a filter operator the column type cannot answer 2ddcf4d -
workspaces-adminclose the five confirmed ORT-60 QA findings 0f52010 -
workspaces-adminclose the eleven ORT-60 accessibility findings 6967469 -
workspaces-admingive the switcher a width again, and fold the quick-list 25ee2d8 -
workspaces-serverclose the eight confirmed ORT-53 QA findings 450210e -
workspaces-serverpurge cross-plugin rows when a workspace is deleted ([#136](https://github.com/apograph-source/apograph-cms/issues/136)) -
wysiwyg-adminlet the editor say what language it is in, and how to leave a1c5e88
With thanks to Pavel Makhanko @pmknk.
-