Neptune DXP - Open Edition 24.15.2 release notes
November 4, 2026
Upgrade notes
Starting with Neptune DXP - Open Edition version 24.14.1, a new environment
variable SESSION_SECRET may be set. When upgrading from versions before 24.14.1,
you must explicitly set this environment variable during setup and ensure it is
identical across all instances in multi-instance or scaled deployments.
If it is not configured consistently, each instance generates its own secret, which
can lead to authentication failures. For example, users may be unable to log in
because of mismatched session cookies.
|
|
Node.js upgrade from version 18 to version 22.23.4 in Neptune DXP - Open Edition
The following information applies only when upgrading from Neptune DXP - Open Edition versions 24.11.0 or earlier. If you are already on Neptune DXP - Open Edition version 24.12.0, or above (that is to say, a Neptune DXP - Open Edition instance with a Node.js version higher than Node.js 18), these notes do not apply.
|
-
In multi-instance or scaled deployments, you can set the new
MCP_TOKEN_SECRETenvironment variable to pin the secret used to sign MCP tokens. If you set it, use the same value on every instance. -
When upgrading from version 24.14.5 on PostgreSQL, upgrade to version 24.15.2 or later. In earlier 24.15 versions, the
planet9_events_logmigration fails when the event log holdsClearQueryCacheevents.
Enhancements
Job Manage
-
Job scripts now run with a user context. A manual run uses the user who started it, a scheduled or event-triggered run uses the job’s creator, and a global admin can override this with the new Run as user field. The job log shows which user a run executed as.
Remote MCP
-
Changes made over MCP to web apps, server scripts, tables, APIs, adaptive entities, packages, and npm modules are now written to the Audit Log tool.
Server
-
IN_PROCESS_CACHE_ENABLED=falseturns the in-process caches off. The in-process cache limits and ages are configurable throughIN_PROCESS_CACHE_*environment variables. -
POST /api/functions/Overview/Poolreturns the database pool counters and the query cache usage of every process of the instance: the main process, each web worker, the engine and its running job and script executors. The system monitor data carries the same counters per process. It requires the Cockpit overview permission. -
With
P9_PROMETHEUS_ENABLED, every web worker exposesp9_db_pool_connections(labelled bypidandstate),p9_query_cache_bytesandp9_query_cache_entriesthrough the cluster metrics endpoint, so the pool usage of all web workers can be scraped across instances. -
Jobs and scripts in a script executor wait the equivalent of
DB_PSQL_EXECUTOR_POOL_ACQUIRE_TIMEOUTorDB_MSSQL_EXECUTOR_POOL_ACQUIRE_TIMEOUTseconds (default 60) for a database connection.
Sessions
-
With
SESSION_STORE_REDIS=trueand Redis configured (DB_ENABLED_REDISwithDB_URI_REDIS), sessions are stored in Redis instead of thesessionstable. This removes the session read on every request and the expiry writes from the database. Redis is then required for login: if it is unreachable, requests fail and/healthzreports the session store as down. The cockpit session list and the session cleanup on user deletion work with both stores.
Bug fixes
Access control
Several operations now require specific roles or edit access to a package or project. Review the role assignments of users who rely on them.
-
Starting, canceling or watching a job over the socket now requires the Job Manage or System Processes role.
-
Running a job now requires edit access to the job’s development package.
-
Running or debugging a server script over the socket now requires Script Editor edit permission and edit access to the script’s development package.
-
Listing API debugger conditions now requires Script Editor access and is limited to projects you can edit.
-
Saving or deleting an API debugger condition now requires edit access to its project.
-
Listing lock entries now requires the Lock Entries role, and deleting them requires edit access.
-
Cockpit worker methods started over the socket now require the matching role and development package access.
API
-
A script API with Run in own process enabled no longer fails on every call.
-
An API debugger condition can no longer be saved for a project that does not exist.
App Designer
-
The unused App Designer collaboration socket channel was been removed. Its messages are ignored.
-
Deleting an app, from the App Designer or over MCP, and restoring one from the Application Trashbin are now written to the Audit Log tool with the app’s name.
-
An app whose activation failed, for example during creation, can now be saved, activated and deleted. Before, these actions reported Not Found.
-
Bootstrap components now have their correct CSS applied.
Authentication
-
A Socket.io connection can now authenticate with a JWT Bearer token, like HTTP routes.
Job Manage
-
A script that calls an AI agent without a user context now fails with an error explaining that Run as user must be set on the job.
-
The Run button is disabled for a job you cannot edit, and a refused run now shows the reason.
-
Importing a development package no longer fails for jobs whose Run as user does not exist in the target system.
Launchpad
-
Saving a launchpad layout no longer removes it from the launchpads that use it. Saving sent back the Where-Used list, and an outdated list cleared the layout from any launchpad not on it.
-
Launchpad/GetDocreturns an empty list when the action type or its filter value is missing instead of listing all documentation.
Naia Agent Studio
-
Table AI tools no longer fail when the query returns a date or timestamp column.
-
Table AI tools no longer fail when the table name contains a dash or other special character.
-
Table AI tools no longer fail on PostgreSQL when a table or column name contains uppercase letters.
-
Excluded domains are now displayed correctly after an artifact is saved.
-
Azure models now support embedding.
Remote MCP
-
The MCP token secret is now generated once at startup instead of separately by each server process, so tokens issued by one instance are no longer rejected by another in multi-instance setups. It can also be pinned with the
MCP_TOKEN_SECRETenvironment variable. -
Audit Log entries for an update or delete made by ID alone now show the artifact’s name.
-
An MCP change that fails no longer leaves an Audit Log entry, and an artifact created over MCP is logged as Create.
Server
-
Upgrading from 24.14.5 on PostgreSQL no longer fails in the
planet9_events_logmigration when the event log holdsClearQueryCacheevents.
Stability and performance improvements
Authentication
-
A request without an Authorization header or a configured token header no longer runs the Basic and JWT strategies before falling through to the session.
-
A client that sends a Basic or JWT credential on every request gets its logon recorded in the user activity log and
lastLoginonce per five minutes per user and web worker instead of on every request. Session logins are recorded every time as before.
Launchpad
-
Launchpad/GetTilesreads each relation separately instead of in one joined query, which cost about 500 ms of database CPU and 98,000 page reads per call on a copy of a production database. The launchpad structure is cached per web worker for one minute, and the images inlined for mobile clients for five minutes. Saving a launchpad or any of its parts clears the cache in every process at once. -
Launchpad/GetUserInfosends about 50 KB less on every login.
Server
-
A database error no longer restarts the web worker, and an error after a response has started no longer crashes it.
-
A request that cannot get a database connection within
DB_PSQL_POOL_ACQUIRE_TIMEOUTorDB_MSSQL_POOL_ACQUIRE_TIMEOUTseconds (default 10) fails with 503 instead of waiting indefinitely. -
Data read on nearly every request, such as users, roles, apps, launchpads, customizing and script APIs, is cached per web worker or no longer read on every call. Saving clears the cache in every process at once. The global admin roles, ACL lists and other query-cached data reach the other web workers within one minute.
-
Compiled apps and web app assets are served from memory. App view ETags are derived from the app version, so a browser revalidating against a different server gets a 304.
-
The app access log no longer delays the app response, and the log file size limit holds when several processes write to the same file.
Sessions
-
A session’s expiry is extended at most once per minute instead of on every request, and concurrent requests that find it due share one write.
-
While Redis is unreachable, requests answer 503 with a session store message instead of a generic error page, and the outage is logged once instead of per request.
More information
Are you looking for more information? To access full details of the technical changelog for Neptune DXP - Open Edition 24.15.2, please contact Neptune directly.
If you experience any problems with this patch, please contact Neptune Support.