Release 7.24.0 adds a dark theme across the whole UI, background jobs to export and migrate schema contents, console logging for scripts with a log viewer, and new limits for GraphQL and asset processing. Here is what changed and how to use it.
Squidex 7.24.0 was released on 2026-09-28 and is the only release of the quarter. It is a large one, so this post covers the changes that are most likely to affect your daily work, and then groups the rest.
The management UI now has a dark theme. You select it in the profile menu, where the options are Light, Dark and System. System follows the preference reported by your operating system.
The theme is not limited to the main shell. It is also applied to the code editor, the rich text editor, GraphiQL, the API documentation and the login pages.
If you build custom editors or plugins, the editor SDK exposes two new functions so your UI can follow the same theme:
const field = new SquidexFormField();
applyTheme(field.getTheme());
field.onThemeChanged(theme => {
applyTheme(theme);
});
Alongside this, all colors in the frontend are now defined as CSS variables. If you have custom styles that rely on the previous variables, they might need to be adjusted.
Two new jobs operate on all contents of a schema.
The first is an export to CSV or JSON. You can start it from the new export dialog in the content list, or through the API:
POST /api/apps/{app}/schemas/{schema}/contents/export
The second is a migration of all contents to the current schema definition. It removes deleted fields and components, drops values with incompatible types and moves values after partitioning changes. This is useful when a schema has evolved over time and older content items still carry data that no longer matches the definition. Start it in the schema settings or with:
POST /api/apps/{app}/schemas/{schema}/contents/migrate
All endpoints that start jobs now accept an optional ?reference= query parameter. The value is returned as reference in the job, so you can correlate a job you started from your own automation with the job list.
Content and asset scripts now support console.log, console.info, console.warn, console.error and console.debug. The output is collected and shown in a new "Script Logs" settings page, and is also available through the API:
GET /api/apps/{app}/script-logs
Logging can be configured with the scripting:logs option.
Scripting also got faster and easier to debug. Jint was upgraded to 4.16.1, scripts are now compiled once per query instead of once per item, the error message when a function is not available in the current script is clearer, and autocompletion shows function parameters.
Several options were added to put a ceiling on expensive operations.
For GraphQL there are now graphql:maxDepth, which defaults to 30, and graphql:maxComplexity, which is off by default. Apollo tracing is now disabled by default and can be turned back on with graphql:enableTracing. The GraphQL schema is also no longer rebuilt for every app change.
For assets, assets:maxConcurrentResizes limits how many image resizes run in parallel, and concurrent requests for the same thumbnail are only resized once. assets:maxCacheDuration caps the cache duration that a request can ask for and defaults to 365 days.
For content queries, contents:maxFullTextResults limits the number of results returned from the full text index and defaults to 1000. For the request log, logging:maxPendingItems limits the queue when the log store is unavailable.
Client secrets can be regenerated while keeping the client ID, via PUT apps/{app}/clients/{id}/secret or in the UI. Rules got a flow step for Azure Service Bus queues and topics, and the "Create content" flow step now supports an optional ID for upserts plus a patch option. The rich text editor gained a plainHtml node type, the content editor marks fields that are only required on publish, and uploading a duplicate file now asks whether you want to store it as a new asset anyway.
On the security side, deleting users requires the new squidex.admin.users.delete permission, SSRF protection now covers the HTTP client of the identity services, protected assets are no longer cached by public caches, and escaping of JSON paths in SQL queries was hardened.
The backend received performance work across workflows, role resolution, validation, rules and EF Core queries, size limits for several in-memory caches, source-generated log methods and dependency updates including MongoDB.Driver 3.10.0 and Magick.NET 14.16.0. MongoDB now caches total counts for unfiltered queries, skips counting when it is not needed, supports AWS IAM authentication for Atlas, retries index creation after transient errors and reads legacy GUIDs correctly. For SQL, the JSON helper functions are created by an EF Core migration instead of at startup, the OpenIddict token type column was widened for OpenIddict 7, and deleted items are now ignored in queries for references, asset folders and scheduled contents.
A number of frontend fixes are included as well, among them overflow menus, the date-time editor with seconds, saved queries, asset tags, the item count for reference and asset fields in lists, and collapse and expand of content fields. The inline filter now has search and reset buttons.
If you maintain plugins, note the breaking changes: IContentWorkflow is resolved per schema through IContentWorkflows, IJintExtension receives the Jint Engine, and Context is immutable.
The full changelog for 7.24.0 lists every entry, and the configuration options mentioned here are documented with the rest of the Squidex settings.