Neos 3.3 highlights
Key insights
Welcome to the 3.3 release of Neos. There are many updates in this version that we hope you'll like, some of the key highlights include:
- Test projects upgraded to xUnit 4
- Data protection
- User interface
- Deployment
- Neos Studio
- Tenant Management
Test projects upgraded to xUnit 4
The Neos test dependencies move from xUnit 3 to xUnit 4. Custom test ordering now works at the method level ([TestMethodOrderer], with PriorityOrderer implementing ITestMethodOrderer), and the Parallelization attribute replaces the parallelization options of CollectionBehavior.
Run neos migrate-metadata after installing this version: it upgrades the xUnit 3 test projects of the cluster modules, and the shared test helper projects they reference, by updating their package references and lock files and rewriting the xUnit constructs that changed. Its output lists, file by file, what must be upgraded by hand. Test projects that still reference the Neos test packages of an older version stay on xUnit 3 and keep compiling. AI agent evaluation projects are upgraded with neos upgrade-ai-test.
See Upgrading cluster test projects to xUnit 4.
Data protection
Masking sensitive property values
A String entity property can now hide its value, such as a bank account, a card number, or a social security number, in what the application sends out, while the business code keeps working on the real value. The mask is chosen in Neos Studio, in the new Masking group of the entity property, among eight masking types: Full, Password, Partial, Regex, CreditCard, Iban, Email, and Phone. Full and Password hide the whole value, the other types leave a part of it visible, for example the country code and the last four characters of an IBAN. A sample value previews the result. The value is masked for every user.
- Entity view properties inherit the mask of their entity property, and can override each of its options.
- The API responses, the exports of displayed data, the MCP tools, and the AI skills only receive the masked value. A cluster that reads the entity views of another cluster receives it masked too.
- The screens edit a masked property blindly: the first key typed replaces the whole value, and a masked column of a datagrid is read-only. A mask sent back keeps the stored value, and a value that has the form of a mask is refused.
Important
Masking hides a value from the users, it does not protect the stored data: combine it with IsEncrypted. neos generate warns about a masked property stored in a database without encryption (M0102), and reports the personal or encrypted properties left without a mask as information (M0101).
The People module of the Technical Demos cluster shows one example of each masking type.
See Property masking.
User interface
Enriched style and transition directives
Xml templates and native UI views gain several new style: directives: border-style, border-width, opacity, scale, font-scale, rotate, translate, and the shadow-offset-x/-y/-blur/-spread group, each with a hover-* variant where it makes sense. border-color now also accepts one or four space-separated values (top, right, bottom, left).
A theme token used on any color directive (background, color, border-color, shadow-color, ...) can carry its own transparency with the token/alpha notation, for example "primary-500/0.6". Directives that take a plain numeric factor (opacity, scale, font-scale) use a decimal value, for example "0.6" or "1.2".
A new transition: directive family (properties, duration, easing) animates a change to any of the style directives above, or to layout:height/layout:width.
See Style directives and Transition directives.
Overlaying elements with the canvas layout
The new canvas-layout component places its children in depth instead of one after the other, so elements can overlap: a badge in the corner of a picture, a caption over a card, a floating button, a banner that unfolds on hover.
Each child is positioned by its distances to the edges of the canvas, with the canvas:top, canvas:right, canvas:bottom, and canvas:left directives. A distance is a number of pixels (decimal or negative), a percentage of the canvas size, or a bound value. Two opposite distances stretch the child, and the align-horizontal and align-vertical attributes set the default alignment of the children. Children can extend beyond the canvas without a scrollbar, and style:overflow="hidden" clips them.
The canvas relies on the enriched style and transition directives above, completed by layout:align-self-* (including centering), style:rotate-x, style:rotate-y, and the event:mouseenter and event:mouseleave events. Transformations are always applied in the same order, inside a canvas or not: translation, then rotations, then scale.
Warning
Use a canvas-layout only when elements must overlap. A layout made of fixed positions does not adapt to the size of its content, of the window, or of translated texts: everything else stays with vertical-layout, horizontal-layout, and grid-layout.
See Canvas layout and Canvas directives.
Navigation links and declarative view opening
Navigation gains several building blocks that make opening a view declarative, and let the browser treat it as a real link.
- A new
type="openView"button opens a UI view without a full action or method. Itsui-view-namecan be bound to a value of the screen, and an optional synchronouscustomize-method-nameadjusts the navigation options just before the view opens. TheOpenViewaction type gets the same capability through a newOpenViewCustomizationCodeproperty, edited in Neos Studio. - A cluster can opt in to real links with
UIDefaultBehavior.EnableNavigationLinks(disabled by default). Eligible navigations, such as "open a view" menu entries, theMenuButtonitems, and the declarative buttons above, are then rendered as links: a simple click still runs inside the application, while Ctrl or Cmd click, or a middle click, opens the view in a new browser tab. - A UI view that is already open can update the browser URL with
SetUrlContextValue,SetUrlContextValues,RemoveUrlContextValue, andRemoveUrlContextValues, choosing whether the history entry is replaced or added. Writing directly to theUrlContextis now a compilation error instead of being silently ignored. - A cluster custom home page can display its content in a single
ViewContainerinstead of tabs, through the newMainViewContainerIdconfiguration key. The browser history, the back button, and a full page reload restore the exact view of the URL, and theprotect-unsaved-changesattribute ofview-containerasks for confirmation before unsaved changes are discarded. The newUseMainUIViewTitleAsBrowserTitlecluster option makes the browser tab title follow the title of the home page UI view.
See Button, UI view actions, URL context, and Create a custom home page.
Percentage sizes and container-based responsive layouts
The layout:width, layout:height, and their min- and max- variants now accept a percentage of the parent size, such as 50% or 33.33%. A layout:width or layout:height in percent is handled like a fixed size: the parent neither shrinks nor stretches it, so a strip at 200% can hold two pages at 50%. The min- and max- variants set lower and upper bounds, as they do in pixels. Whole numbers remain pixels.
grid-layout can adapt to its own width instead of the browser window width, with breakpoint-scope="container" (window remains the default). Each grid-layout-definition can set the pixel threshold at which its tier activates, in both scopes, and a fifth tier, extraextralarge, is available.
view-container gains content-max-width and content-padding to center the displayed view at a maximum width and keep a margin around it, while the scrollbar stays at the edge of the container, unless the root element of the view declares layout:height="fill".
See Layout directives, Grid layout, and View container.
Interactive charts
A chart can now call a UI method when the user clicks a data element (pie slice, bar, point), through the new element-click attribute. The method receives the series and element indexes, the label, the series name, and the value. The pointer becomes a hand over a clickable element, and the legend keeps its usual behavior.
The new item-labels attribute adds extra lines to the tooltip of each data point.
See Chart.
Datagrid row actions
The row actions of a datagrid are redesigned. The overlay block now covers the whole height of the row up to its right edge, with the color of the row (hover, selection, or style rule). The new row-actions-location attribute (overlay or column) can instead display the actions in a column frozen at the right of the grid, which does not hide data and shows its buttons on hover, on focus, and on the current row of touch screens. This mode cannot be combined with data columns frozen on the left: the overlay mode then applies.
Row actions are displayed without border: a Default action as a ghost button, and three new GhostPrimarySubtle, GhostPositiveSubtle, and GhostDangerSubtle styles, also available as button variants in templates, take their color only on hover, click, or focus. In card mode, the actions are displayed in a last line at the bottom of each card.
The actions are also reachable with the keyboard: Tab moves from the cells of a row to its actions, Shift+Tab goes back, and Enter or Space runs the focused action.
See Datagrid.
Partial template slots
A UI view template can declare a named slot, and any module can plug partial templates into it, for example new tabs. Extending a screen of another module no longer requires overriding its UI view in YAML. An empty slot renders nothing, so the base module still generates on its own, and contributions are assembled in a predictable order whatever the module load order.
The base module declares where its screen can be extended:
<tabs>
<tab-item caption="Overview">...</tab-item>
<partial-template-slot name="Sections" />
</tabs>
Another module adds a tab from its own metadata, with a partial template of the new SlotContribution type:
- Name: SalesSection
Type: SlotContribution
Slot: Sections
Order: 10
Template: |-
<tab-item caption="Sales">...</tab-item>
In Neos Studio, slot contributions have their own icon in the tree view, and an opened partial template shows its type, slot, and order under its title.
Visual refinements of standard components
splitter: the newbar-style="handle"keeps the space between panels transparent and draws a rounded handle at its center, sized withhandle-lengthandhandle-thickness.bar-corner-radiusnow acceptsfull.imageandinput-image: the newfitattribute (contain,cover, orfill) controls how the image fills its box.horizontal-layout:vertical-alignacceptsbaseline, to align elements of different font sizes on their text baseline.button: the new "unstyled" variant, together with the genericstyle:cursordirective, turns any content, such as a card, into a clickable area without changing its look.popover: the newside,align,side-offset,show-arrow, andarrow-sizeattributes choose its preferred side, alignment, distance, and arrow relative to its anchor. The arrow takes the background given to the popover.chatbot: the newprompt-disabled,show-agent, andshow-new-conversationattributes, aStartNewConversationmethod on the instance given byref, and thePromptBackground,PromptBorder,PromptFocusBorder, andPromptBorderRadiustheme attributes customize its prompt. The newshow-avatarsattribute and thechatbot-messages-startsub-component embed it in a custom conversation panel: messages without avatar, and a content at the start of the messages, in the same scroll. The header band is no longer shown when it has nothing to show: no agent, no button, and nochatbot-headercontent. The newcontent-max-widthattribute centers its content at a maximum width. While the agent prepares its answer, an agent message now holds three animated dots until the first text arrives, in place of the former thinking indicator, and the newshow-elapsed-timeattribute hides the elapsed time shown above it. The newprompt-placeholderattribute replaces the hint of the empty prompt input, typically with a string resource of the application.progress-bar: the newvalue-background,corner-radius,label-color, andlabel-outside-colorattributes customize each instance, and can be bound to data, including per row of a repeated list. The percentage text now moves next to the fill when the fill is too narrow to contain it.
See Splitter, Popover, Chatbot, Image, Horizontal layout, Button, and Progress bar.
Deployment
Content-Security-Policy header at the Gateway
The Gateway now sends a Content-Security-Policy header on every response, including the responses it proxies from the clusters. By default the policy is style-src 'self' 'unsafe-inline': the browser only loads the stylesheets served by the application.
Warning
A stylesheet loaded from another origin (a CDN, an @import of an external URL in a tenant CSS) is now blocked. Set the full policy with the Helm value gateway.contentSecurityPolicy to allow its origin, for example style-src 'self' 'unsafe-inline' https://cdn.example.com, or set gateway.contentSecurityPolicyEnabled to false to remove the policy of the Gateway.
See Content-Security-Policy at the Gateway.
Files opened safely in the browser
A file stored by a user can no longer run a script in the application. The client only opens PDF, raster images, plain text and SVG files in the browser, and an SVG is cleaned of its scripts first. Any other type, such as HTML or XML, is downloaded instead of opened. The server adds X-Content-Type-Options: nosniff and, except for a PDF, Content-Security-Policy: sandbox to every file it returns.
See How are files opened in the browser?.
Neos Studio
Creating a menu item directly from a UI view
A UI view's tree view now has a Menu entries node, next to Actions, Methods, and Computeds, listing every existing menu item that opens this view. Clicking one navigates straight to its editor.
Its + button opens a quick-creation modal, so you no longer need to leave the UI view to create a menu item pointing to it: fill in a name, a caption, and optionally an icon and a menu. When a menu is selected, saving takes you directly to that menu's editor with the new entry already placed and selected, ready to be positioned exactly as if you had used the menu's own Add a menu item action.
See Creating a new menu item for the general menu item concepts.
Tenant Management
Per-tenant CSS override
A platform administrator can now override the look of a cluster for one tenant at runtime, without redeploying anything. The new Visual identity screen of Tenant Management, with its Visual identity, Theme and CSS tabs, stores reusable styles: a light slot and an optional dark slot. The images that a CSS references with url(assets/<name>) are added to the CSS. Each slot holds a theme, a free CSS, or both. A style is chosen as the default style of a tenant, or assigned to a tenant for a cluster version. The CSS can be typed in a code editor, which now supports CSS, or loaded from a .css file.
A theme editor lets the administrator build the look without writing CSS. Its Theme tab creates named, reusable themes. A theme starts from a standard Neos theme of its color scheme, Light or Dark, and only holds the colors and the component attributes that the administrator overrides, with a preview of the result. The light slot of a style needs a light theme or a free CSS, the dark slot is optional, and the published CSS of a slot is the CSS generated from its theme followed by its free CSS. When the dark slot is empty, the light slot is also used in the dark mode, so give a dark theme or a dark CSS to every style used by a tenant that supports it. Editing a theme republishes the styles of every tenant that uses a style with it, and a theme used by a style cannot be deleted.
A cluster uses the style that is assigned to the highest version lower than or equal to its own version, or else the default style of the tenant, and its users see it applied after the theme at their next page load. The screens are reserved to the tenants administrators, through the new Tenant visual identity function.
See Tenant visual identity and its Themes section.
Resource routes in the Tenant Management API
The entity views and server methods of the Tenants, Tenant Styling, Customer Licensing, Neos Deployment, Neos Diagnostics, and User Permissions modules now answer on routes named after the resources they handle, instead of the technical name of the entity view or of the server method. Each route carries a description, which labels its operation in the API documentation. The routes of the User Permissions module, such as users, roles, roles/assignments, and permissions, come with the module in every cluster that references it.
| Operation | Previous route | New route |
|---|---|---|
| List the tenants | GET api/v1/tenantlistview |
GET api/v1/tenants |
| Read a cluster | GET api/v1/clusterview/{clusterId} |
GET api/v1/clusters/{clusterId} |
| Change the identifier of a tenant | POST api/v1/methods/changetenantidentifier |
PUT api/v1/tenants/{tenantId}/identifier |
| Search the data | POST api/v1/methods/globalsearch |
GET api/v1/search |
| Start a database migration | POST api/v1/methods/migratedatabase |
POST api/v1/database-servers/{databaseServerId}/migrate |
| List the user accounts | GET api/v1/useraccountview |
GET api/v1/users |
| Read a role | GET api/v1/userroleview/{id} |
GET api/v1/roles/{id} |
| Assign a role to a user account | POST api/v1/useraccountuserroleview |
POST api/v1/roles/assignments |
| Update a permission | PUT api/v1/permissionview/{id} |
PUT api/v1/permissions/{id} |
| Read the report print settings of the user | POST api/v1/methods/getuserreportprintsettings |
GET api/v1/users/settings/reports/by-name/{name} |
| List the tenant themes | GET api/v1/tenantthemelistview |
GET api/v1/tenant-themes |
| Rebuild the published tenant styles | POST api/v1/methods/rebuildtenantstyles |
POST api/v1/tenant-styles/rebuild |
| List the licenses | GET api/v1/licensinglicenseview |
GET api/v1/licensing/licenses |
| Read the deployment configuration | GET api/v1/methods/getdeploymentconfiguration |
GET api/v1/deployment-configuration |
On its new route, a server method takes the HTTP verb that matches what it does: GET when it only reads data, PUT when it replaces a value. When it acts on a resource, the identifier of that resource moves into the route.
The new route of a server method is its primary route, which the screens call. Its previous route becomes a complementary route. The previous routes keep working: the deployment scripts and the calls from one cluster to another use them unchanged. They are hidden from the API documentation, with one exception: when a list view and a detail view of Tenant Management serve the same resource, the operations they share stay on their previous route, still documented, and their description names the route to prefer when there is one. GetAuthorizedTenants, SetMigrationResult, and SetTenantState, which only the framework calls, are hidden without a new route. So are UpsertUserAccounts, the subscription to the UserAccountSaved event, and the user account lookup view and the multi-cluster views of user accounts, roles, and role assignments, which serve the screens.
Note
A client generated from the API documentation, such as an NSwag client, switches to the new routes at its next generation. The operations it generates for them get new names, and the operations hidden without a new route disappear from it.
See API documentation, Root route, Complementary routes, and User Permissions.
What's new in documentation
This release includes significant documentation improvements.
New articles
- New checks by version - Lists, for each framework version since 3.2, the generation, metadata-validation and analyzer checks a cluster can newly fail on when it moves to that version, with the message to look for and the fix to apply in the cluster.
- Partial template slot - Explains how a UI view declares a named slot and how modules plug partial templates into it.
- Property masking - Describes the masking types and their options, what the server masks, how the screens edit and save a masked value, and what masking does not protect.
Reorganized content
- The key insights of a minor version are now published once, in a dedicated "Neos X.Y highlights" section at the very top of the changelog, ahead of every patch section, instead of below the patches of that version where they were easy to miss.
v3.3.0-alpha.6434
🛡️ Security patch 🛡️
Published on Nov 04, 2026.
Breaking changes
- [Gateway] Tenant-status-specific
503pages are now served by default instead of generic503.htmlpage. You can override them or disable them usingNEOS_TENANT_PAGES_ENABLED=falsein the gateway secret. Please see this article for details. (18830) - [Helm] Application metrics are no longer exported to Application Insights by default. See managing Application Insights ingestion volume for details. (19071)
- [Helm] The OpenTelemetry Collector generated by the chart now exports only the logs at Warning level and above by default, instead of every level emitted by the pods. Lower
observability.collector.config.minLogLevelto export more, see Default log level filter. (19325) - [C# Dependencies] Upgraded xUnit test dependencies to 4.0.0. The
neos migrate-metadatacommand now upgrades the xUnit 3 test projects of the cluster modules (package references, lock files, test method orderer and parallelization attributes) and the shared test projects they reference, and lists the constructs left to migrate manually. Test projects that still use the test packages of an older Neos version stay on xUnit 3 with a warning. AI agent evaluation projects must be upgraded withneos upgrade-ai-test. (18615) - [Helm] Made the internal OpenTelemetry Collector image configurable with
observability.collector.imageandobservability.collector.imagePullSecret. Custom collector configurations supplied throughconfig.inlineorconfig.existingConfigMapmust be adapted to the 0.161.0 collector, see this article. (19058) - [Native UI views] Removed the exported runtime directives exports. Use
directiveStylesformatters,dragdropHandlerslisteners andcontentStyle/contentClassprops. See documentation. (19644) - [Neos AI] Model usage and token pricing now use the Neos Studio model name instead of the provider-specific model identifier. Review your token configurations to reference the model name defined in Neos Studio. (18982)
- [Neos Studio] Replaced AI model capability collection by a
Typeproperty (ChatorEmbeddings) on the AI model. A metadata migration automatically performs the replacement. (18968) - [User Permissions] Removed the obsolete
UserAccount.Synchronizedcolumn and related user account view fields. (18635) - Changed the default path of the MCP endpoint from
/api/mcpto/api/v1/mcp, so it is routed and protected by the Gateway without configuration. MCP clients using/api/mcpmust switch to the new path or setAI:McpUrlPattern. (20243) - Each Pub/Sub subscription can now define its own dead letter event. Failed messages are no longer published as
DefaultDeadLetterevents, and those of a subscription without dead letter event are lost after all retries. (19678) ICustomizingTenantDataIsolation.NewQueryFilterwas replaced byTenantQueryFilter, which receives the tenant of the query as its first parameter: a custom tenant filter no longer keeps the authorized tenants of the first tenant that built the Entity Framework model. See Customizing data isolation. (20110)- In a calculable number input, Enter evaluates a formula and commits its result at once. (19990)
- Opening a user file in the browser now only opens PDF, raster images, plain text and sanitized SVG files: any other type, such as HTML or XML, is downloaded. See How are files opened in the browser?. (20070)
- Removed
Azure AI InferenceAI model API type. (18542) - Removed the
AzureOpenAIAPI for AI models, as there is no longer any Azure-specific code following the migration to the Microsoft Agent Framework. Use theOpenAIAPI instead. A metadata migration automatically updates existing AI models. (18898) - Replaced Swagger UI with Scalar as the default API documentation UI. Swagger UI can still be enabled through cluster configuration. (19018)
- Restricted the template directive values: a style directive value containing a semicolon is now rejected when the template is generated, and the value
space-betweenoflayout:align-self-horizontal, which had no effect, is now ignored with a warning. (19644) - The
InputNumberCalculableandNumberCalculableFormFieldcomponents are removed: use anInputNumberor aNumberFormFieldwith thecalculableprop. (19990) - The
QueryExpressionEvaluatorfunction of the AI entities querier skill takes an entity name and OData query options instead of C# code.MaxConcurrency,WaitTimeoutSecondsandForceMemoryCleanupsettings ofAI:EntityQuerierSkillare no longer used. (19895) - The design system only loads the styles of the Wijmo grid. An application that uses other Wijmo controls directly (inputs, menus, charts, gauges, grid filter...) must import
@mescius/wijmo.styles/wijmo-core.cssitself. (20181) - The Gateway now enforces the Content-Security-Policy
style-src 'self' 'unsafe-inline'by default, so a stylesheet loaded from another origin is blocked until its origin is added togateway.contentSecurityPolicy. See Content-Security-Policy at the Gateway. (20070) - The view displayed in a frame is wrapped in a
frame-contentelement: the class is no longer on the root element of the view, and thevisibleprop of the UI views is removed, the frame hiding the wrapper itself. If you use other tools than Neos features to write E2E tests, update the CSS selectors and the tests that target.frame-contentas the root of the view. (20217) - With Kestrel, a cluster is now only served from the root of its port (
https://localhost:5001/): its name is no longer part of the URL. A page opened with the cluster name (https://localhost:5001/{ClusterName}/...) is redirected to the root, and an API call with the cluster name is still served, but scripts and tools should now callhttps://localhost:{port}/webapi/.... With an identity provider that checks the redirect URIs (Azure AD, Azure AD B2C, Microsoft Entra External ID...), registerhttps://localhost:{port}/signin-oidcfor the clusters run with Kestrel.
More details : 20311
Security
- [Gateway] Fixed the cluster name of the notifications routes being taken from the
neos-clusternameheader sent by the client: the header is now ignored and the cluster is always resolved from the host and the path, so the tenant validation always applies. (20713), closes 38953 - [Helm] Upgraded the internal OpenTelemetry Collector image from 0.96.0 to 0.161.0, which removes its 67 high and 4 critical known vulnerabilities. (19058)
- [Security] Updated dependencies to fix CVE-2026-93749 (HIGH CVSS 7.5) (19324), closes 36926, 37123
- [Security] Updated dependencies to fix GHSA-2fmv-rv2c-59x7 (MEDIUM CVSS 5.9) (19841), closes 37841
- [Security] Updated dependencies to fix GHSA-846f-f764-76mx (HIGH CVSS 7.5) (19841), closes 37841
- [Security] Updated dependencies to fix GHSA-p98j-92pf-mc4p (LOW CVSS 2.3) (19324), closes 36926, 37123
- A file stored by a user can no longer run a script in the application: SVG files are sanitized before being opened, other active types are downloaded, and the server sends every file with
X-Content-Type-Options: nosniffand, except for a PDF,Content-Security-Policy: sandbox. (20070) - Fixed a claim value being able to add or replace a user property, such as the identifier, in the
Neos-Userheader sent to the clusters. (20248) - Fixed the gateway and the server proxy forwarding the requests of service accounts (client credentials tokens) without checking their tenant membership. (20492), closes 38716
- Fixed the gateway forwarding a request to a tenant other than the one it had validated when the tenant in the URL differed from the
Neos-Tenantheader. Such requests are now rejected with a 400 error, letter case included. Requests carrying severalNeos-Tenantheaders are now rejected by the gateway with a 400 error.
More details : 20232, closes 37830 - Fixed the gateway forwarding to the backend a
Neos-Userheader sent by an unauthenticated caller. The header received from outside is now always removed. (19788) - The database migration and the development proxy no longer write the database password to the logs: the secret values of the connection string are masked. (20488)
- Updated the .NET runtime and SDK to 10.0.14 and 10.0.403 to fix two CVEs.
- CVE-2026-111497: Brotli decoder out-of-bounds write. You should rebuild and redeploy your cluster images on the updated base image. See this article.
- CVE-2026-114148: Linux .NET tarball file ownership (local elevation of privilege).
More details : 20563
Features
"Open a view" items of a
MenuButtonare now rendered as real links whenEnableNavigationLinksis enabled, so they can be opened in a new tab. (19456)[Documentation] Added a tips and tricks article on managing Application Insights ingestion volume on capped Log Analytics workspaces. (19071)
[Helm] Added an optional memory limiter to the generated collector pipelines with
observability.collector.config.memoryLimiter, see Collector memory limiter. (19325)[Helm] Added optional
cpuLimitconfiguration alongsidecpuRequestfor Neos containers (see CPU resources configuration). (19879)[Helm] Added the optional
gateway.contentSecurityPolicyandgateway.contentSecurityPolicyReportOnlyHelm values, which make the Gateway send a Content-Security-Policy header on every response, either enforced or in report-only mode. See this article. (19263)[Helm] Added the possibility to set priority class for business clusters pods. See this article. (18682)
[License Management] Added Spanish translations. (19777)
[Neos AI] Added Spanish translations. (19777)
[Neos AI] Added the execution durations to the conversation log: the total time taken to answer each question and the duration of each function call. (19100)
[Neos Audit] Added an AI assistant that answers questions about the audits, the clusters and the tracked errors from the screen being viewed. (19966)
[Neos Manager] Added two buttons to switch a SQL query between its parameterized form and a version with real parameter values substituted, ready to run directly against the database. (18763)
[Neos Studio] Added
Groupableoption for UI view properties. (18566)[Neos Studio] Added a
Visibleboolean option to menu items, which can be set to a C# expression, evaluated on the client side. (18567)[Neos Studio] Added a button next to the "Name in the template" field of a UI component to copy its tag to the clipboard. (19847)
[Neos Studio] Added an
Enabledproperty to themes: a disabled theme is neither generated nor checked, which also silences M0107 and M0109 for a theme the application does not use. See Themes. (20548)[Neos Studio] Added cluster-level default report styles for report editing, viewing, and PDF generation. (18603)
[Neos Studio] Added more examples / states in the theme component preview. (19037)
[Neos Studio] Added the
NEOS0007analyzer, which warns when a string is implicitly converted to a LocalizableString, since such a text is only available in the default language. (19067)[Neos Studio] Added the
PubSubComponentSpeccluster configuration property, which replaces the pub/sub component used byneos runwith any broker supported by Dapr, for example RabbitMQ. See the documentation for details. (19683)[Neos Studio] Added the ability to create and browse menu entries directly from the UI view editor. (18719)
[Neos Studio] Added the real diagnostic code of client C# warnings and errors to the code editor tooltip and to the generation output. (18570)
[Neos Studio] Added typed inputs for the default value and the bounds of entity properties, entity view properties and data columns: numeric input, list of the allowed expressions, enumeration members, None /
true/falsebuttons, color picker. (20008)[Neos Studio] Indexes and alternate keys containing a column stored as JSON (LocalizableString, Json or StringArray) were rejected in Neos Studio, and reported by the warning M0097 at generation and by check-metadata. (19043)
[Neos Studio] Simplified the Entity View AI tools tab. (18771)
[Neos Webhooks] Added the NeosWebhooks module, which receives the webhooks sent by external services with Bearer or HMAC (Standard Webhooks, or a scheme added by a business module) authentication, duplicate detection, a receipt log, replay and administration screens. See Receiving webhooks. (20510)
[NeosAICore] Added
NeosGpt61SolandNeosGpt6LunaAI models. (19026)[NeosAICore] Added
NeosGpt6SolAI model. (20313)[Notification Center] Added a
button-sizeparameter to theneos-notification-centercomponent to set the size of its button. (19278)[Support Center] Added Spanish translations. (19777)
[Task Scheduler Client] Added an UpdateTask method to the TaskSchedulerClient module to update an existing scheduled task without recreating it. (18593)
[Task Scheduler Client] Added Enable/Disable and Modify schedule row actions to the RemoteScheduledTaskListUI administration screen. (18593)
[Task Scheduler] Added a scheduled task that deletes every night the task executions older than 30 days by default, keeping the last run of each task (see How it works?). (19805)
[Task Scheduler] Added Spanish translations. (19777)
[Tenant Management] Added resource routes, each described in the API documentation, to the entity views and server methods of the Tenants module, and hid the previous routes, which still work, from that documentation. (20489)
[Tenant Management] Added Spanish translations. (19777)
[Tenant Management] Added the user login criterion to the advanced filter of the tenant list. (19376)
[Tenant Management] Added the Visual identity screen, where an administrator builds reusable visual identities from colors, component attributes and CSS with images, and gives one to a tenant as its default or for a cluster version, with a live preview of the theme. The users of that tenant then see it applied on top of the cluster theme, without any redeployment. (19263)
[Tenant Management] Added three filter criteria to the tenants list based on the users attached to each tenant: user login, first name and last name. Entering a login now narrows the list to the tenants that user belongs to. (18730)
[Tenant Management] Added user groups and deployment solutions, to give several tenants the same publisher administrators and the same versioned clusters in a few actions. See user groups and deployment solutions.
- User groups
- Added the User groups screen (Users menu, publisher accounts only) and a "User group" filter on the user list.
- Added the "Publisher administrators" tab: picking a group adds its publishers to the tenant, in bold until saved.
- Changed the users tab into "Client administrators", and moved Roles and permissions into the Users menu.
- Deployment solutions
- Added the Solutions screen (Clusters menu): versioned clusters, each with an optional shared database.
- Added the "Deployment solution" box filling or adding the Clusters list.
- Added the "Deployment solution" column and filter on the tenant list.
More details : 20315
- User groups
[Tenant Styling] The CSS of the tenant themes is generated again with the new version of Neos when Tenant Management starts after an upgrade, and by the
RebuildTenantStylesmethod. See When a new version of Neos is deployed. (20266)[User Permissions] A role can no longer be saved with a name already used by another role in the same language, and a clear message now explains why. (19086)
[User Permissions] Added Okta user synchronization through an optional module. See User Synchronization and Okta authentication. (19722)
[UserPermissions] User accounts are created automatically at the first login on multi-tenant clusters, with the role each tenant checks as assigned to automatically created accounts. (20133)
A calculable
input-numbersupports theupdate-modeattribute, and itstypeattribute can be bound. (19990)A cluster's custom home page can now use a ViewContainer instead of a FramesContainer as its main container, via the new MainViewContainerId configuration key, with matching URL/browser history behavior and an opt-in confirmation before discarding unsaved changes. (18797)
A masked value is edited in a field that replaces it as a whole, and the server keeps the stored value when it receives the mask back. (20497)
A new UseMainUIViewTitleAsBrowserTitle cluster option makes the browser tab title follow the title of the custom home page UI view, which can be built from the view displayed in its container. (19692)
A tenant claim mapped to the TenantIdentifier user property of the authentication configuration admits a user into this tenant of a multi-tenant cluster, even when the user is not yet a member of it. The TenantClaimAdmission option can restrict this admission to users who are not yet a member of any tenant of the cluster. See Authentication configuration. (20133)
Added
AnthropicAPI type for AI models. (18847)Added
InputCapabilities.SupportsTouch()static method indicating whether touch input is supported. (UI code only) (18660)Added
layout:rendered-sizeandevent:resizedirectives reporting the size actually rendered for an element. (18668)Added
neos dependencies renamecommand to rename a metadata element and update its references, with a --dry-run option. See CLI commands. (20434)Added
PromptAsync<T>method toIChatCompletioninterface to be able to get a typed response: the JSON schema of the expected type is sent to the model, which is constrained to respond with a matching payload, and the response is deserialized automatically. (18838)Added
row-draggableattribute to the datagrid to drag one or several rows out of it, and theexternal-row-dragoverandexternal-row-dropattributes to drop data coming from elsewhere in a datagrid at a given position. See row drag and drop. (19826)Added
SelectFilesAsyncandSelectDeferredFilesAsyncto view models to let the user select several files at once in the file selection dialog. See Select several files. (20803)Added
VisualIdentityandWithVisualIdentitytoOnTenantResolvedResult, so that a tenant resolved interceptor can replace the visual identity chosen by Tenant Management with any other visual identity, chosen by its name, or with the standard look. See Choose the style from the cluster code. (20669)Added
Window.Current.IsPageVisibleto client code, to skip the ticks of a periodic processing while the browser tab is hidden. (19888)Added a "handle" bar style to the splitter, which keeps the space between panels transparent and displays a rounded handle at its center. (19493)
Added a
fitattribute (contain,coverorfill) to theimageandinput-imagecomponents to control how the image fills its box. (19214)Added a
neos update-modulesCLI command that updates referenced modules to their latest published version, or to the latest patch of their currently used major and minor version with the--patch-onlyoption, reusing the same NuGet resolution asneos restore. (18662)Added a configuration per database engine for programmable objects in Neos Studio, to choose whether the parameters of a function are bound by name or by position and to set the order of the parameters. (19307)
Added a container-based responsive mode to GridLayout, allowing the component to adapt its columns and spacing to its own width instead of the browser window's width. (18955)
Added a detailed breakdown of AI token usage (message, conversation history, system prompt) and tracking of cached input/output tokens in the NeosAI pricing. (18692)
Added a generation warning that detects when a business assembly's metadata name does not match its project's real assembly name, to catch silent test-coverage gaps early. (18910)
Added a generation warning when a UI view's datagrid has no visible column, closing a gap where only lookup-target views were checked. (18828)
Added a guard against accidental interactions with elements that are closing: a combobox list, a date or color picker, a popover, a modal, a dropdown or context menu, a toast and the content of a collapsing group box now ignore clicks during their closing animation, instead of selecting another option or running an action a second time. (20515)
Added a new declarative
openViewbutton type to open a UI view from a template, without writing a full action or method. (19031)Added a read-only MCP server to Neos Audit and a Claude plugin to fix the errors and warnings reported for a cluster. (20047)
Added a template validation that reports a two-way or write-only attribute bound to a computed without setter or to a UI view property that cannot be set, as a warning (M0098), or as an error for write-only attributes such as
layout:rendered-size. (19051)Added a threshold attribute on grid-layout-definition to customize the pixel value at which each breakpoint tier activates, for both window and container responsive scopes. (18955)
Added a tokenizer setting on the AI model configuration to force the token estimation encoding, with automatic detection from the model name. (18692)
Added a warning in
neos restoreon Windows when a module referenced by local path has noDirectory.Build.propsredirecting itsbinandobjfolders, which every cluster sharing the module would otherwise overwrite. (19934)Added an
OpenViewCustomizationCodeproperty toOpenViewactions to customize the navigation options before the view is opened. (19275)Added an opt-in --include-module option to neos generate and neos check-metadata that tags each diagnostic with its owning Neos module. The module is exposed as a structured property visible in JSON console output only - it never appears in the default, human-readable output. (18934)
Added an opt-in setting to generate database CHECK constraints for line breaks in single-line text and maximum lengths in multiline text. (18583)
Added an optional item-labels attribute to the chart component, showing extra tooltip lines for each data point. (19029)
Added an optional loading screen, configurable per cluster with the
LoadingScreensetting, that replaces the blank page displayed while the application loads. Its colors and its texts, in any language, can be customized, or it can be replaced by a custom HTML file. (19466)Added breakpoints in theme. (18660)
Added ExecuteAsync to IViewModelAction, allowing client code to trigger a view model action programmatically, without going through a statically declared button. (18720)
Added HasModifiedNavigationProperty() to the entity view API surface available to business assemblies. (18591)
Added keyboard-accessible resize bars for
splittercomponent. (19964)Added programmatic chatbot message sending. (19011)
Added Prometheus metrics for SignalR negotiation failures, transport fallback, and the connectionToken/Tenant cache, along with an example Grafana dashboard. (19028)
Added properties and methods in
Viewportto granularly know the current breakpoint. They are accessible in UI code and template. (18660)Added property masking: a
Stringentity property can hide its value in the responses of the application, with a masking type chosen in Neos Studio (Property masking). (20497)Added relative dates, an advanced mode and user favorites to the date filter of editable filters. (19396)
Added RetrieveCountAsync and RetrievePagedItemsAsync methods to IRetrievingRuleArguments to retrieve a count or a paginated page with its total without loading every matching item. (18824)
Added Settable property on IViewModelProperty for generic code that iterates over a UIView's properties, to know upfront which ones can be set (independently of any expression or read-only rule) without hard-coding a list. (18597)
Added SetUrlContextValue/SetUrlContextValues/RemoveUrlContextValue/RemoveUrlContextValues on the UI view model to update the browser URL dynamically from an already open UI view, replacing or adding a browser history entry. (18953)
Added Spanish translations of the framework's server messages and client application labels, including the rich text editor and the client components. (19762)
Added style classes: named styles defined in Neos Studio and applied to the elements of the UI templates with the
style:classesdirective. They allow, as a last resort, the creation of layouts that are not possible natively with Neos, for example by using CSS directly. The Components cluster shows examples in the "Style classes" screen of its Directives menu. (19987)Added style directives for border style, border width, opacity, scale, font scale, rotation, translation and shadow offset/blur/spread, each with a hover variant where relevant. Border color now accepts one or four values, and any color-consuming directive can carry its own alpha with the "token/alpha" notation. Added a transition directive family to animate style and layout changes. (19169)
Added support for 2 or 3 values to the multi-value template directives. (19644)
Added support for PeriodicTimer, CancellationTokenSource and cancellable Task.Delay in client C# code, with a LifetimeToken that automatically stops periodic processing when a screen or a UI component is closed. (19375)
Added support for referencing Constants from UI templates: code generation, live diagnostics, editor autocompletion, and dependency/unused-usage detection. (18723)
Added support for the using statement in client C# code: the resource is disposed at the end of its scope. (19375)
Added syntax highlighting of the code blocks of the markdown viewer on a light background, and the standard light themes now display light code blocks. (20379)
Added the
event:keydowntemplate directive, which calls a UI method with the key pressed, such as Enter in a text box. (20301)Added the
baselinevalue to thevertical-alignattribute ofhorizontal-layout, to align elements with different font sizes on their common text baseline. (19491)Added the
content-max-widthandcontent-paddingattributes to theview-containercomponent to limit and center the width of the displayed view, and to keep a margin around it, while keeping the scrollbar at the edge of the container. (19213)Added the
GhostPrimarySubtle,GhostPositiveSubtleandGhostDangerSubtleaction styles and button variants, which only take their color when hovered. (19645)Added the
NavigationTargetproperty to global search result items, and a UI view that opens in the same or a nested frame now opens in a new frame by default when selected from the global search. (19764)Added the
neos dependencies movecommand to move a metadata element to another module, with a--dry-runoption. See CLI commands. (20558)Added the
NEOS0008andNEOS0009analyzers, which report as errors an event rule whose constructor does not match how it is registered (missing or unexpected base rule), instead of letting it fail at runtime. (19685)Added the
NewMock<T>()method to the unit test base classes, to create a mock that is configured and verified like the AutoMocker mocks, instead ofnew Mock<T>(). (19757)Added the
partial-template-slotnode, which lets several modules contribute partial templates to a named slot of a UI view template. See Partial template slot. (20046)Added the
row-actions-locationdatagrid attribute, with a theme fallback, to display the row actions in a column frozen at the right end of the datagrid. (19645)Added the
row-click-selection-modeattribute to the datagrid: with thetogglevalue, a click on a row toggles its selection without unselecting the other rows. (19724)Added the
show-markers,track-thickness,track-border-width,track-border-color,selected-track-border-color,thumb-size,thumb-border-widthandthumb-backgroundattributes to input-slider-discrete to hide the markers and customize the track, its border and the thumb. Every color of the slider is defined by the theme and can be overridden on a slider. A slider without markers accepts more than 20 values. (20703)Added the
showPositiveSignoption to theInputNumbercomponent, see InputNumber. (19396)Added the
side,align,side-offset,show-arrowandarrow-sizeattributes to thepopovertemplate component to choose its preferred side, alignment, distance and arrow relative to its anchor, see Popover. (20048)Added the
StrictTestsByDefaultassembly attribute: a test library that declares it runs itsTestBasetest classes in strict mode by default, whatever their base class. Changed thestrictparameter of theTestBase,BackgroundServiceTestBase<T>andRemoteServiceInvokerTestBaseconstructors tobool?. Changed theStrict*test base classes to obsolete: use theStrictTestsByDefaultattribute instead. (19575)Added the
style:letter-spacingandstyle:text-transformtemplate directives to set the spacing between letters and the displayed case of a text. See Style directives. (20169)Added the
WithMaximumToolIterationsprompt option to change the maximum number of tool-calling rounds an AI agent can chain for a single prompt. (19075)Added the canvas-layout component, which places each child at an exact position with canvas:top, canvas:right, canvas:bottom and canvas:left, together with the style and transition directives it relies on. (19312)
Added the deprecation of standard theme colors, so that they can evolve without breaking existing themes: a deprecated color stays an alias of the color that replaces it until a major version removes it — see Standard colors. The generation and the template editor of Neos Studio warn about a color that a theme does not have (M0109) and about a deprecated standard color (M0108).
More details : 20314Added the display of the validation message of a
datagridcell selected with the keyboard, and its announcement by screen readers. (20162)Added the M0099 generation warning, raised when UIView client code resets the key of a non-editable reference to an empty value, which makes the save fail. (19373)
Added the optional
strictandsuperStrictconstructor parameters to the domain and application test base classes and to the generatedApplicationTestand rule test classes, so a cluster unit test can enable the strict mock verification ofTestBase. (19574)Added the prompt-disabled, show-agent and show-new-conversation attributes to the chatbot component, and a StartNewConversation method on the chatbot instance given by ref. (19966)
Added the PromptBackground, PromptBorder, PromptFocusBorder and PromptBorderRadius theme attributes to customize the chatbot prompt, which no longer uses the input theme attributes. (19966)
Added the SelectLocalFileAsync method to UI views, which opens the file picker and reads the text content of the selected file in the browser without uploading it to the server. (19449)
Adding the agent's response time to the chatbot. (18894)
Additional data: each tenant can add its own fields to the entities enabling additional data. The fields are defined in the screen of the
NeosAdditionalDatamodule, read and written through thecustomFieldsproperty of the Web API, queried with OData (customFields/Name), displayed as grid columns, and entered in forms with theneos-additional-data-slotUI component. Enable them with the Allow additional data option of the entity in Neos Studio, and choose the storage mode with theAdditionalData:StorageModekey of the cluster configuration (JsonorEav). (19873)AI agent evaluation tests could be configured by environment variables, repeat a case with a success threshold, check the tools called by the agent with the new ToolCallAccuracy, TaskAdherence and IntentResolution evaluators, and be filtered by agent. (19053)
Charts can now call a UI method when the user clicks a data element (pie slice, bar, point), through the new element-click attribute. (19511)
Datagrid row actions are now displayed without border, and a danger row action only turns red when hovered. (19645)
Datagrid rows now extend to the right edge of the datagrid when the columns do not fill its width. (19645)
Deprecated
Deviceclass (UI code only). UseWindow.Current.Viewportin UI code or@Viewportin UI template instead. (18660)Deprecated some
Windowproperties and methods (UI code only). Use the following classes instead:Display,Viewport,InputCapabilities,SystemPreferences. (UI code only) (18660)Entity view parameters are now exposed, with their description, as arguments of the MCP tools generated for an entity view. (18785)
Entity view properties inherit the masking options of their entity property and can override them. (20497)
Improved
PromptOptions.ResponseFormatto be able to specify the expected schema of the expected response. (18838)Improved chatbot UI : message times and agent durations, transparent standard-theme agent bubbles.transparent (20118)
Improved input accessibility by exposing labels, validation messages, required states to screen readers. (20080)
Improved the alignment of the summary tiles of the clusters in error on narrow screens. (20670)
Improved the datagrid rendering performance when checking rows, changing the current row or editing values. (20049)
Improved the server build time of
neos generate: NuGet packages are now restored only when needed, and the AspNetCore and TaskRunner projects are built together. (19643)Improved the tracked errors filter on narrow screens: it is summarized in a single link that opens the filters in a popup. (20670)
Improved the UI rendering and update speed: template directives are now resolved when the application is generated. (19644)
Improved toast stacking and dismissal. (19909)
Improved unit test base classes: the mocks of an additional AutoMocker passed to
GetMockerServiceProviderare now verified at the end of the test, like the mocks of the main mocker. (19500)In development, the access rights error page now shows the actual cause when the backend server failed to start or crashed, such as a dependency injection or database migration error. (19545)
LocalizableString.GetTranslationOrDefault()andLocalizableString.GetTranslationOrDefault(string language)can now be used in UI code. (19067)Masking types: full, password, partial (visible prefix and suffix), regular expression (visible parts), credit card, IBAN, e-mail and phone, with a live preview in Neos Studio. (20497)
MCP tools now expose the application context keys declared by
IUserContextPermissionsasneos-{key}input parameters, and check the provided values like the REST API does. (19283)Menu items can now begin a group, which draws a separator above them in the side menu and its sub-menus. The separator moves down to the next visible item when the item that opens the group is hidden, and is never duplicated nor displayed at the top of a menu. (18834)
Migrated AI related code from
Microsoft.SemanticKerneltoMicrosoft.Agents.AI(Microsoft Agents Framework). (18542)Migrated the button component out of PrimeVue. (19686)
Migrated the carousel component out of PrimeVue. (19305)
Migrated the chip, badge and divider components out of PrimeVue. (19292)
Migrated the color input component out of Wijmo. (19566)
Migrated the dropdown menu and context menu components out of PrimeVue. (19243)
Migrated the group-box component out of PrimeVue. (19567)
Migrated the modal component out of PrimeVue. (19677)
Migrated the password input component out of PrimeVue. (19286)
Migrated the popover component out of PrimeVue. (19240)
Migrated the select button component out of PrimeVue. (19303)
Migrated the time input component out of Wijmo. (19304)
Migrated the timeline component out of PrimeVue. (19294)
Migrated the toast component out of PrimeVue. (19623)
Moving an entity, an entity view or a server method with
neos dependencies movenow moves its rule files or its implementation file, with their unit tests, to the business assembly of the same layer in the target module, and gives them its namespace. (20743)neos generatenow builds the server projects when the code of a business assembly changed since the last build, without--rebuild. (19993)neos generatereports the new warningM0110for aProjectReferenceof a business assembly that reaches a dependency module through thedependenciesfolder instead of$(<Module>ModuleDirectory)— see Module dependencies. (20665)neos generatereports UI template references to a module that is not a declared dependency as warningM0105, and references to anInternalelement without access as warningM0106instead of an error (see Generation message level configuration). Neos Audit counts them in the Boundaries category. (20426)neos runstops with a clear message when a port of its URLs is already in use, and lists the configuration folders read when thePersistenceTypeorConnectionStringvariable is missing. (20328)Rebuilt the progress bar component without its previous third-party UI library dependency, with no visual or functional change. Added
value-background,corner-radius,label-color, andlabel-outside-colorattributes onprogress-barcomponent to set the fill color, corner radius, and percentage label color (inside and outside the fill). (18710)Removed the
IsCustomproperty of theme colors: in a theme based on a standard theme, a color is standard when it has the name of a standard color or of a color of the base theme, so Neos Studio no longer lets it be renamed or deleted.neos migrate-metadataremoves the property from the theme color files — see Standard colors. (20736)Renamed
deviceattribute of thegrid-layout-definitionelement toviewport. Existing templates are migrated automatically. (19175)Renaming a server method or a validation rule with
neos dependencies renamenow renames its files and those of its unit tests, with its class, its test class and its generated interface. (20743)Renaming an entity or an entity view with
neos dependencies renamenow moves the files of its event and validation rules, and their unit tests, to the folders of its new name, and updates their namespaces. (20743)Replaced colors that were hardcoded in some UI components by colors configurable in themes using new attributes:
- Application: Background, Foreground
- Calendar: Border, DayFocusBorder, FocusBorder, Foreground
- Carousel: PaginationIndicatorFocusBorder
- Chatbot: PromptDragActiveBackground
- Checkbox, FrameNestedTab, FrameTab, SelectButton, TabItem, UserButton: FocusBorder
- Datagrid: FormulaIcon, LinkCellForeground, NotLoadedBannerAccent, NotLoadedBannerBackground, TooltipBorder
- Divider: ContentForeground
- Dropdown: ItemIcon, ItemHoverIcon, ItemSelectedIcon, SubmenuLabelForeground
- FilterBuilder: NamedFilterGroupBorder
- GlobalSearch: ModalItemSeparator, ModalOverlay
- Input: CalculableIcon, CalculableModeBorder, CalculableModeForeground, CalculablePreviewForeground, DropdownBackground, DropdownBorder, DropdownBorderRadius, DropdownForeground, DropdownPadding, DropdownItemBorderRadius, DropdownItemGap, DropdownItemPadding, LookupFreeValueForeground, PasswordIcon, UploadProgressBackground, UploadProgressBar
- LoadingOverlay: Background, PanelBackground, PanelBorder
- MarkdownViewer: CodeBlockBackground, CopyCodeButtonFocusBorder, CopyCodeButtonForeground
- MessageModal: LogDebugForeground, LogErrorForeground, LogWarningForeground
- Modal: Foreground, Overlay
- PaginationBar: PageNumberBorder
- PanelMenu: ItemFocusBorder, Overlay
- SliderDiscrete: ThumbBackground
- Timeline: ConnectorColor, MarkerContentBackground
- Toast: ProgressBar
- Tooltip: Background, Foreground
- TreeView: NodeFocusBorder
More details : 19037
Saving a non-editable reference whose key was reset now fails with an explicit, logged technical error naming the reference and the possible fixes, instead of a generic "entity view not found" message. (19348)
The Chatbot got the
show-avatars,show-elapsed-time,prompt-placeholderandcontent-max-widthattributes and thechatbot-messages-startchild, to embed it in a custom panel without avatars, with its own prompt hint and a content at the start of the conversation. Its header band is no longer shown when it has nothing to show. While an answer is in progress, the agent message now shows three animated dots until the first text. (20707)The
InputNumbercomponent has acalculableprop to type a formula, which replaces theInputNumberCalculablecomponent. (19990)The
layout:width,layout:height,layout:min-width,layout:min-height,layout:max-widthandlayout:max-heightdirectives now accept percentages of the parent size, such as50%or33.33%. (19582)The AI agent evaluation projects now build the OpenAPI document of the application, so that the agents creating or proposing data can be evaluated. (19099)
The AI entities querier skill now queries the entities with OData queries translated into SQL, instead of C# scripts compiled by Roslyn. The read permission is checked on every entity used by a query, the returned rows are limited and the timeout cancels the query. (19895)
The AI personalization agent can now save the changes it applies (columns, filters, sorting, styles) into a custom view, updating the one already applied or creating a new one. (18788)
The anonymous routes of the gateway and of the development proxy accept
*segments, each standing for one path segment such as the tenant (/*/api/v1/webhooks/public/*). (20510)The color picker gives its value when the pointer is released instead of on each move while dragging. (20049)
The CSS of external libraries and of the Neos framework is now placed in the
neos-vendorandneos-frameworkcascade layers, so the CSS of an application always takes precedence over them whatever the specificity of their selectors. (19399)The font size, font weight and border width of the datagrid header and summary cells, the text color of the totals row, the font, padding and border of the summary cell tag, and the color of the time below the chatbot messages, can be set in the theme. (20667)
The Helm value
gateway.contentSecurityPolicyEnabledset tofalsedisables the Content-Security-Policy of the Gateway. (20070)The row actions of a datagrid in card mode are now displayed at the bottom of each card. (20043)
The row actions of the datagrid can be reached and run with the keyboard: Tab moves from the cells of a row to its actions, and Enter or Space runs the focused action. (20044)
The up and down arrows of the Chatbot prompt recall the messages already sent. (20663)
Transpilation of types in the UI code:
- added
Record<TKey, TValue>support, transpiled to a TypeScriptRecordand used to serialize a dictionary to JSON (see documentation) - improved
IReadOnlyDictionary<TKey, TValue>withCountand fixed conditional accessx?.Method()on a generic type (for use with theTryGetValuemethod of a dictionary for instance).
More details : 19988
- added
UI automation tests can read the state of a
web-viewcomponent throughIWebViewComponent, which tells whether its page is loading and which URL it shows. (20112)Updated Stimulsoft library from version 2026.1.3 to version 2026.4.1. (19489)
When a UI automation test fails with Chrome or Edge, the verbose log of the web driver is saved next to the screenshot in
NEOS_AUTOMATION_SCREENSHOTS_FOLDER, without the values that the test types or reads. See this article. (20141)
Fixes
- [Docker] Upgraded frontend base image to
nginx:1.30.5-alpine-slim. (18957), closes 36680 - [Neos Studio] Fixed default status pages missing in development mode. (18830)
- [Automation tests] Fixed data-grid empty-row waits to poll until row removal is reflected. (18822), closes 36470
- [Docker] Upgraded .NET runtime base image to
mcr.microsoft.com/dotnet/aspnet:10.0.12-alpine3.24. (19319) - [Docker] Upgraded .NET runtime base image to
mcr.microsoft.com/dotnet/aspnet:10.0.13-alpine3.24. (19842) - [Docker] Upgraded frontend base image to
nginx:1.31.6-alpine-slim. (19319) - [License Management] Fixed the API allowing the customer or the commercial solution of an existing license to be changed. Such a change is now rejected. (19968), closes 38108
- [Neos AI] Fixed keyboard navigation with the Tab key skipping a
neos-ai-rich-text-editorwithout atab-stopattribute. (20096), closes 37425 - [Neos AI] Fixed the automatic detection and the display of a markdown value returned by a function in the function call details. (19209), closes 36979
- [Neos AI] Fixed the casing of the native UI views directory. (18665), closes 36200
- [Neos AI] Fixed the display of a JSON or XML question and answer in the conversation tracking. (19793), closes 37826
- [Neos AI] Fixed the documentation of token prices, which did not state that prices are per million tokens. (19803), closes 37842
- [Neos AI] The email analysis no longer created an entry from an email which did not contain the expected information, such as a newsletter. (19053)
- [Neos AI] The navigation assistant could refuse to open a view on an identifier given in the request, or open the messages of a conversation thread without restricting them to that thread. (19103), closes 36974
- [Neos AI] The text corrector could fix the spelling of a word while leaving the sentence grammatically incorrect. (19103), closes 36974
- [Neos Copilot] Fixed skills that referenced a removed command, broken file links, outdated module dependency checks and resources unavailable from a user's cluster. (19647)
- [Neos Data Exchange] Fixed a French spelling mistake in the title of the import settings screen. (19310), closes 37199
- [Neos Data Exchange] Fixed accented characters in data import: the sample file now opens correctly in Excel, and a CSV file saved by Excel in Windows-1252 is no longer rejected. (20732)
- [Neos Data Exchange] Fixed the raw English error messages shown when an import file is rejected: a duplicate column in the header and required columns missing from the file are now explained in the user's language, and unexpected errors start with a translated message. (20802)
- [Neos Data Exchange] Restored sample-file downloads after switching import templates. (18624), closes 36125
- [Neos Manager] Fixed the errors card of the dashboard, too small to read its errors when the request detail had many lines: a resize bar now separates the two areas. (20828), closes 39129
- [Neos Notification Center] Toasts and action buttons of the notification center now display texts in the cluster's default language when no translation exists in the user's language, instead of an empty text. (19067), closes 36764
- [Neos Shared UI] Fixed the tab navigator's Previous/Next buttons being shown disabled instead of hidden when navigation through them is not intended. (18716), closes 29158
- [Neos Studio VSCode extension] Fixed an error when opening the entity view UI. (18607), closes 35637, 36060, 36099, 36103
- [Neos Studio VSCode extension] Fixed serialization error (Seroval error) raised when saving the view state while a validation message was displayed. (19092), closes 36838
- [Neos Studio VSCode extension] Fixed Seroval error when opening a lookup modal. (18854), closes 36416
- [Neos Studio VSCode extension] Fixed the list opened by the "View all N items" entry of the quick search, which was displayed empty. See Search. (19847)
- [Neos Studio] Added a generation warning to report the
placeholderignored attribute, as for the other attributes supported only on unbound inputs. (18927), closes 36602 - [Neos Studio] Changing the module of a menu item, an interface or a style class no longer moves the menu entries, interface implementations or theme style class targets that belong to another element. (20558)
- [Neos Studio] Fixed an error wrongly reported on an entity view property whose value was actually valid, which remained visible until another property row was selected. (18916), closes 36554
- [Neos Studio] Fixed API path classification so client files sharing an API-prefix name were no longer treated as API requests. (18765), closes 36370
- [Neos Studio] Fixed rejection of long expression-based UI property formats when saving. (19976), closes 37832
- [Neos Studio] Fixed the "Data type" field being required when saving a UI view property bound to a reference property of its entity view. (19756), closes 37518
- [Neos Studio] Fixed the "Display differences (external tool)" and "Merge help (external tool)" actions of the overridden metadata screen, which failed with a technical error on an empty value or on a git tool command not starting with the quoted tool path. An incomplete git configuration now displays a message explaining the expected setting, see Metadata overriding. (20084), closes 38196
- [Neos Studio] Fixed the C# full name being left as
...when opening an entity. (18647), closes 36156 - [Neos Studio] Fixed the entity view tree view highlighting the header for an error on a property, parameter or rule. (20115), closes 38301
- [Neos Studio] Images created by the AI assistant from a description in another language could be named in that language instead of English. (19103), closes 36974
- [Neos Studio] Preserved overridden inherited UIView action function permissions across saves. (18526), closes 34285
- [Neos Studio] Prevented metadata generation from creating a table for an abstract entity without a table or persistence inheritance pattern while continuing to generate its children. (19097), closes 36740
- [Neos Studio] The image creator no longer generated SVG images containing scripts or event handlers. (19053)
- [Reporting] Fixed report generation failing with "The generation failed while applying styles." when a 3.2 reporting service served a business cluster older than 3.2. (18858), closes 36476
- [Reporting] Fixed system fonts not being embedded in a PDF report generated right after the report server restarted, on Linux. (19557), closes 37336
- [Task Scheduler] Fixed StyleCop warnings raised when the TaskSchedulerClient or TaskSchedulerShared module was referenced from another cluster. (18572)
- [Task Scheduler] Fixed the "Recent" tab of the dashboard, which loaded slowly and could overload the database by reloading in a loop on every task execution notification. (19805), closes 37846
- [Technical Demos] Fixed the Oracle migration and enabled retries after partial programmable-object creation failures. (19059), closes 36569
- [Tenant Management] Fixed the "This email address is not valid" error when creating a tenant with a user whose login is not an email address: the users of a new tenant have an optional email address. (20287), closes 38512
- [Tenant Management] Fixed the additional properties of a tenant being kept when the tenant was deleted from its edition screen. (20458), closes 38341
- [Tenant Management] Selecting a connection settings tab right after changing a database server's type no longer switches back to the Main tab or builds the connection string from the previous type's settings. (19074), closes 36906
- [UI Customization] Enabled custom-view editing for nested subviews. (19003)
- [UI Customization] Fixed custom view editing when inherited subviews were disabled and preserved their saved settings. (19050)
- [UI Customization] Fixed erroneous frozen-column warnings when saving an unchanged custom view. (18896), closes 36515
- [User Permissions] Fixed StyleCop warnings raised on the Permission partial class file when referenced from another cluster. (18572)
- [User Permissions] Fixed the automatic creation of a user account (
CreateUserAccountIfNotExists), which never happened when the user's permissions were already cached. (20367), closes 38604 - [User Permissions] Fixed the generation of a module that references UserRoleView, which produced code that failed to compile. (19768), closes 37754
- [User permissions] Removed the alternate key and the unique index on the localizable user role name, which was stored as JSON and could not be indexed directly. Role names are no longer required to be unique. (19043)
- A child of a canvas layout is now always drawn over the content of the children written before it, even when that content has its own stacking order. (20718), closes 38964
- A datagrid lookup cell could briefly display the value of another row after scrolling. (20049)
- A variable passed as an
outorrefargument inside a nested block (if, else or loop body) of client-side C# code is now correctly transpiled as a reference. (19846), closes 37873 - A view opened in a
view-containerno longer replaces the view displayed in the container with the same identifier of another tab: each open view has its own containers. (20042), closes 38226 - Added an option to
neos runso it can stop itself automatically when its owning process exits, preventing orphaned proxy server processes. (18946), closes 36618 - After logging out of an application served under a path prefix and logging in again, the user now returns to the page they left instead of the root of the domain. (20771), closes 39068
- Applied row style backgrounds to datagrid system columns. (18951)
- Changed read-only and disabled comboboxes and multi-selects to show the default cursor on hover. (20519), closes 38713
- Clearer error message when running
neos runwithout a completedneos setupfor the current Neos version (Dapr mode or not). (18598) - Clicking an action button placed inside a clickable element no longer triggers the click of that element. (19580), closes 37484
- Compilation errors reported during
neos generateare now parsed and coded individually instead of being duplicated as raw uncoded text for each failing build. (18754) - Datagrid color, file and localizable string cells displayed their value as HTML instead of plain text. (20049)
- Disabled SQL parameter values logging outside of development, where they could expose sensitive or personal data. (19691), closes 37636
- Double-clicking an editable datagrid cell no longer opens the editing view of the row. (19791)
- Enabled drag-and-drop file attachments in the chatbot prompt. (18926)
- Excluded the primary key from update request models for entities bound to a relational database table, and reapplied its real value from the URL before any nested collection is processed, so a mismatched or missing id in the payload can no longer corrupt the entity's identity or its children's reconciliation. (18677)
- Fixed
event:clickdirective oncomboboxcomponent. (18607) - Fixed
neos build clientfailing when the UI packages of the cluster's modules had no installed npm dependencies. The command installs them before the build, asneos rundoes. (20386) - Fixed
neos check-metadata --fixcommand to preserve language files in referenced modules when the cluster did not use their language. (19985), closes 38140 - Fixed
neos dependencies set-accessibilitycommand to no longer rewrites the C# code when the metadata changes cannot be saved. (20434) - Fixed
neos dependencies set-accessibilitycommand to no longer rewrites unchanged metadata files, such as the module files of referenced read-only modules. (20434) - Fixed
neos setupfailing when a preview or release candidate .NET SDK is installed: such SDKs are now ignored and a supported stable SDK installed alongside is detected. (20165), closes 38346 - Fixed
ThemeManager.GetCurrentTheme()returning a copy of the applied theme instead of the applied theme itself. (UI code only) (20616), closes 38620 - Fixed a browser tab that froze when a popup showing a Neos application in an iframe, such as the preview of a tenant theme, was closed while this application was starting. (20167), closes 38348
- Fixed a bug where a string value equal to "Null", "NULL" or "~" was saved without quoting in YAML metadata files and silently turned into an empty value when read back, which could later break code generation. (18694), closes 35543
- Fixed a button's label being unexpectedly centered instead of left-aligned once it wrapped onto several lines. (18655), closes 30855
- Fixed a crash that could occur when resizing a chart while it was being redrawn after a data change. (18944), closes 36648
- Fixed a font embedded as a report resource and applied through a report style being replaced by another font in the first PDF generated after the report server started. (19728), closes 37396
- Fixed a heading or a paragraph stuck to the code block above it in the Markdown viewer. (20788), closes 39082
- Fixed a remaining crash in the shared Chart component's annotation plugin, triggered by a resize during the chart's very first layout pass. (19012), closes 36748
- Fixed a report or report style file modified outside Neos Studio not being taken into account by the running application until the next action in Neos Studio. (19368)
- Fixed a scrollbar flashing on an element whose animated size changes while its classes change. (19644)
- Fixed a technical error raised when filtering a string property with a value that looked like a GUID or a date. (19234), closes 36982
- Fixed a text size in pixels bound to a text field being ignored by the text and progress bar components. (19314), closes 37209
- Fixed a typed catch clause without variable in client C# code, which caught every error instead of only the specified exception type. (19375)
- Fixed a view field of a non-nullable date type causing the view to crash on opening because of a missing import in the generated view model. (19279), closes 37156
- Fixed a view opened with
WithContainerIdtoward a container that is not displayed, which was not shown. It now opens in a tab of the main container. (20820), closes 38683 - Fixed actions of the main UI view being hidden for users without an explicit permission on that view. Actions restricted by their own function remain hidden. (19444), closes 37309
- Fixed an
InvalidCastExceptionthrown by the E2E UI automation framework when searching components of a type whose tag is also used by another type, such as headings and texts. (20203) - Fixed an action clicked from the notification center panel opening its screen in a popup instead of a new tab. (19776), closes 37534
- Fixed an API error when POSTing an entity view where a required boolean property with no value was omitted. Before 3.2, this specific case was handled. To avoid introducing this breaking change, we are restoring the specific handling for this case. For all other types, a default value must be set on the required property if you want to be able to omit it. (18661)
- Fixed an error when saving large JSON content on SQL Server or Oracle databases: JSON columns now use an unlimited-length column on SQL Server and the native JSON type on Oracle. (18902), closes 35612
- Fixed an intermittent server error when two clients requested the list of AI agents at the same moment right after a server start. (18990), closes 36712
- Fixed an internal error returned when sorting a list whose entity view declared a collection that is not loaded on read (
LoadedOnGetset to false). (18761), closes 36308 - Fixed an invalid datagrid width such as
*2being silently accepted by the generator and crashing the grid at runtime. The generation now reports an error. (20229), closes 38251 - Fixed an issue where the first column of a grouped data grid could be truncated. (18607)
- Fixed an issue with modifying the filter when entering a value in the quick search input: a new filter instance is assign instead of mutating the current filter instance. (18607)
- Fixed an issue with opening the dropdown of a lookup in combobox mode within an editable data grid. (18607)
- Fixed background server methods staying pending with
neos runwhen Neos Studio is not started: the development proxy now starts the task runner on the first background server method call. (20327) - Fixed chatbot stream failures to show an inline error and end the waiting state while preserving partial responses. (20556), closes 38808
- Fixed chatbot streaming requests timing out or being buffered during long-running responses. (18753)
- Fixed combobox focus border to be consistent with other inputs. (19037)
- Fixed DateTime formatting so that standard .NET format specifiers (such as "d" or "t") now render the same result as in .NET, instead of silently showing incorrect data or causing a technical error. (18782), closes 36253
- Fixed drag and drop: moving a drag between two adjacent drop targets now calls the handlers of both, and a drag from outside the page no longer exposes the object of a previous drag. (19644)
- Fixed dropping files dragged in Safari. (20577), closes 38846
- Fixed E2E automation of the advanced filter failing to click its Apply and back to simple filter buttons when it shows many conditions. (19376)
- Fixed empty area when the datagrid in card mode has no data. (18717)
- Fixed group headers showing the enumeration code instead of its label when the grouping was added by UI code with a property name in another casing. (20177), closes 38352
- Fixed JSON inference of ISO date-only values so they deserialize as
DateOnly. (18676), closes 36190 - Fixed loading and waiting overlays appearing behind frozen Datagrid headers. (20433), closes 38136
- Fixed lookup display labels and string-array parameters in server-side CSV exports. (19481), closes 37359
- Fixed markdown viewer code blocks which now display non-highlighted code in a readable color. (19711)
- Fixed markdown-viewer rendering of text starting with horizontal rules when the intervening content was not valid YAML. (20414), closes 38654
- Fixed migration command insertion before the first or after the last command of a specified type, including migrations with preliminary commands. (19463), closes 37320
- Fixed missing generation error for a directive bound to an unknown value. (19644)
- Fixed next-position navigation to load remaining pages in partially loaded server-side datagrid groups. (18648)
- Fixed Oracle migrations that dropped and recreated unchanged tables and altered unchanged columns at each run: computed columns and decimal columns without decimals are now compared correctly. (19180), closes 37024
- Fixed redundant SQL joins for fully materialized Entity View collections. (18284)
- Fixed report URLs being truncated when the filter, culture or styles bundle name contained a reserved URI character such as '#'. (18823), closes 36404
- Fixed routing via Neos gateway version 3.2 for SignalR clients on version 3.1/3.0. (18630), closes 36126
- Fixed save errors on an item of an embedded collection being reported on the saved item instead of the item and field they concern. (20115)
- Fixed server-side CSV exports to use localized booleans, grid captions and lookup labels, limit selectable columns, and localize failure notifications. (19483), closes 37359
- Fixed server-side lookup display values for columns sourced through entity references. (19495), closes 37359
- Fixed several StyleCop/Roslyn warnings raised by code generated by neos generate (empty string literals, obsolete member suppression, generated EF Core query expressions, and undocumented generated fields). (18933)
- Fixed size directives (layout:width, layout:height and their min/max variants) on action and menu buttons, which were applied to each inner part of the button instead of the whole button. (19635), closes 37495
- Fixed tab dividers disappearing when the browser was zoomed out. (19046), closes 36797
- Fixed tabs sometimes keeping the wrong content associated with the wrong tab header after tabs were dynamically added or removed from a list. (19142)
- Fixed the
input-numbercomponent withupdate-mode="immediate"not refreshing its displayed value when a UIViewAction reassigned it to a value already known internally. (18973), closes 36679 - Fixed the
neos dependencies unusedcommand failing with a NullReferenceException on clusters containing elements whose name includes a dot. (19276), closes 37168 - Fixed the authentication failure of MCP clients that strictly validate the authorization server metadata (such as the MCP Inspector) when using Azure AD B2C. (19176)
- Fixed the automatic NotEmpty check constraint rejecting some non-empty strings on SQL Server and PostgreSQL depending on the database collation, and aligned SQL Server with the other databases by accepting whitespace-only strings. (19485), closes 37295
- Fixed the badge of a button being cut off while the button is loading. (19278), closes 37173
- Fixed the call of an Oracle scalar function programmable object that modifies data, which failed with the error ORA-14551. (20442), closes 38666
- Fixed the card mode of a datagrid ignoring disabled infinite scrolling, which loaded the next pages on scroll and showed no card when the grid had no fixed height. (19581), closes 37428
- Fixed the chatbot component showing an agent selector with no agent when its agent-ids were bound to a value still empty when the agents loaded. (20149), closes 38338
- Fixed the check constraints on the minimum and maximum values of properties being dropped and created again at every database migration on PostgreSQL and SQL Server. (19532), closes 37399
- Fixed the code editor suggestions appearing far from the cursor when the code editor was displayed in a modal. (19369), closes 19616
- Fixed the combobox displaying
[object Object]when its value is an object that is not one of its options. (20616) - Fixed the creation form opened empty by the data creation AI agents when the model wrapped the data in an object named after the creation schema. (20538), closes 38795
- Fixed the CS0108 warning raised on generated code when an entity view implements an interface that declares a reference or a collection with the same name as one of its navigation properties. (19804), closes 37799, 37800
- Fixed the CS1570 warning raised on generated code when the description of an enumeration or the caption of one of its members contains a
<or&character. (19804), closes 37799, 37800 - Fixed the datagrid selection and row context menu commands acting on an outdated selection when an item selection rule takes time. (19791)
- Fixed the display of a filter that was supposed to be invisible on the chip of a property displayed in the filter bar. (18661), closes 36185, 36193, 36194
- Fixed the empty UI of a tab opened at startup when closing the active tab that was immediately after it. (18661)
- Fixed the Enter key moving to the next row instead of the next cell from a lookup cell of an editable datagrid when the "Enter key acts as Tab" option was enabled. (19206), closes 36790, 37042
- Fixed the excessive memory usage of the AI entities querier skill, which could make the application restart, and limited the number of rows returned by its queries. (19655), closes 37570
- Fixed the first opening of a nested cluster UI view, whose view models were created before the languages, resources, context and permissions of the nested cluster were loaded (for example, a localizable string field opened in the default language). (19917)
- Fixed the generation deleting the files it had just generated when a metadata element was renamed with only a change of casing on Windows. (20002), closes 38151
- Fixed the generation of an entity global filter that queries the database, which failed to compile when the entity had a read-only view. (20103)
- Fixed the hot reload of business assemblies during
neos run: modules whosebindirectory is moved to thebusinessAssemblydirectory are reloaded, and the DLLs of referenced modules are no longer copied as if they had just been built. (19930), closes 38026 - Fixed the input schemas of the generated MCP tools so that nullable properties and row versions are described in a form accepted by more MCP clients. (19361)
- Fixed the label of a radio option wrapping under its radio button on narrow screens for comboboxes and checkboxes displayed as radio buttons. (19365), closes 36798
- Fixed the loss of authentication when navigating between several applications hosted on the same machine with HTTP.sys. (19233), closes 36988
- Fixed the main authentication cookie being scoped to the cluster's URL prefix instead of the site root on prefixed (host/prefix) deployments, which caused every API request to fail with a 401 error after a successful login. (18779), closes 36392
- Fixed the MCP endpoint so a client authenticated through the NeosDevAuth development server is identified, and so an unauthenticated call is answered with a 401 that starts the client's OAuth flow. (19308), closes 37115
- Fixed the MCP endpoint so external OAuth clients can discover the real Azure AD B2C authorization server and complete the authorization code exchange as a public client, instead of failing with an invalid client_secret error or being redirected to the application's sign-in flow. (18711)
- Fixed the modal retrieval of the UI automation framework, which could return a modal during its opening animation and lose the focus of the element clicked right after. (19204), closes 37065
- Fixed the notification center keeping the former icon and caption of a notification category after they were changed in its registration. (19896), closes 37750
- Fixed the progress bar's percentage label becoming unreadable or invisible at very low values: it now automatically renders next to the fill, on the track, instead of being clipped. (18710)
- Fixed the Querya agent calling the query tool directly on a non-existent 'Entity' entity instead of exploring the available entities first. (19203)
- Fixed the quick search not filtering the cards of a datagrid displayed in card mode. (20183), closes 38356
- Fixed the report designer not opening when running with Dapr and no cluster-level default report style is configured. (19104), closes 36850
- Fixed the rich text editor staying light when the current theme is dark. It now also looks like the other fields. (20170)
- Fixed the scrollbar that appeared under the discrete slider when its markers overflowed the component. (20703)
- Fixed the SignalR connection being closed on deployed applications when the browser returned a value containing an enumeration to the server. (19045), closes 36799
- Fixed the splitter panels not filling the full height of the splitter on Firefox. (19197), closes 36741
- Fixed toasts overflowing the screen on mobile. (20077), closes 38235
- Fixed transpiled integer division so it truncates toward zero like C# instead of producing a floating-point value, and added support for transpiling
Math.Truncate. (18714), closes 36254 - Fixed values longer than the maximum length of a String, StringArray or LocalizableString property not being reported on the client: a value set by code, such as the text pre-filled in the creation view of a lookup, is now shown as an error on the field and blocks the save. (20282), closes 38300
- Fixed values of the application context containing a literal %xx sequence being decoded twice when propagated to another cluster (remote service calls, event publications and background tasks). (19302), closes 37177
- Fixed XML code blocks being unreadable in the chatbot, their text having the same color as the background. (19206), closes 36790, 37042
- Generation now reports a warning when a declared ServerMethod has no matching implementation file, instead of silently omitting the method from the generated interface. (18829), closes 36252
- Global filters that check a function with FunctionAuthorizer now see the permissions of the user in background methods and in the scopes created by business code. (20152)
- Improved the readability of Markdown content: tables now have borders, a header, alternating rows and horizontal scrolling, very long words wrap instead of overflowing, and code blocks are readable in dark themes. (19952), closes 38070
- In card mode with infinite scrolling, the next page is now loaded only when the list is scrolled to the bottom, not whenever scrolling stops. (20619)
- In card mode, an input in progress in a card is no longer lost or moved to another item when an item is inserted before it. (20619), closes 38841
- In the filter bar, clicking a value of an enumeration property with the "in" or "not in" operator no longer unselects the other values. (19723)
- Increased the default AI provider network timeout to five minutes and added configurable timeouts per model and provider. (19479), closes 37366
- MCP tools now apply the function permissions (
AuthorizeResource) like the REST API: a tool the user is not allowed to call is hidden from the tool list and its call is rejected. Regenerate the clusters after upgrading: MCP-only resources and public server methods depend on the generated code. (19283) - Message box and error box buttons are now stacked at full width on narrow screens instead of wrapping over several misaligned lines. (19810), closes 37850
- On mobile, adding a card to a datagrid in card mode with infinite scrolling now scrolls to the new card instead of stopping on the previous one. (20619)
- Prevented images from shrinking beside long text. (20118)
- Reduced the size of the badge of small and extra small buttons, with a minimum size to keep it legible. (19278), closes 37173
- Restored the ability to call
LocalizableString.GetTranslationOrDefaultwith only localization settings in server-side code, by adding aGetTranslationOrDefault(ILocalizationSettings)overload. (20247) - Row actions displayed over a datagrid row now have an opaque background covering the whole row, so the content of the covered cells no longer shows through them. (19645)
- Smart search could return no filter for a question about a computed value of a field, such as the number of characters of a text. (19103), closes 36974
- The
fullvalue ofcorner-radiusnow rounds both ends of a non-square element into a pill shape instead of drawing an ellipse. (19326), closes 37212 - The browser context menu no longer opens in the datagrid, except in a text field. (19791)
- The chart component's canvas could get stuck at an outdated size after a fast, continuous window resize, causing a neighboring card to remain wrapped onto its own line even when enough space became available again. (18783), closes 36255
- The dependencies of a constants static class no longer list code that does not use the class. (20743)
- The generated controller of a server method that has a CancellationToken and optional parameters now compiles, without having to give the token an explicit default value. (19854), closes 37872
- The message asking to refresh the page is displayed again when opening a view fails after the application has been redeployed, instead of the tab silently disappearing. (19405), closes 37277
- The notification center can now be closed on mobile with a close button, and its headers no longer break over several lines on narrow screens. (19911)
- The rich text editor no longer logs a TinyMCE deprecation warning about the
content_css_corsoption in the browser console. (20613), closes 38840 - The validation tooltips of a datagrid could disappear when another datagrid was closed. (20049)
- Two clusters run with Kestrel at the same time on different ports no longer sign each other out. (20311), closes 38818
- UI templates with several root elements no longer lose the root elements that follow a self-closing second root element, and an else or else-if following a self-closing if at the root level no longer fails the generation. (19770), closes 37681
- Upgraded the recommended .NET SDK to 10.0.401. (19319)
- Upgraded the recommended .NET SDK to 10.0.402. (19842)