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.

  • Remove node_sqlite3.node from the root directory before running the Neptune DXP - Open Edition executable. If not removed, Neptune DXP - Open Edition will not start.

  • Test your server script code in a QA system before upgrading your production system, as this patch might introduce breaking changes.

  • Follow the migration checklist here.

While you can run any Node.js 22 version, Neptune recommends running the same version as your Neptune DXP - Open Edition instance.
  • In multi-instance or scaled deployments, you can set the new MCP_TOKEN_SECRET environment 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_log migration fails when the event log holds ClearQueryCache events.

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.

Naia Agent Studio

  • Agents with JSON output now support tool calling.

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.

Script Editor

  • P9_SCRIPT_DEBUGGER_DISABLED=1 turns the server script debugger off.

Server

  • IN_PROCESS_CACHE_ENABLED=false turns the in-process caches off. The in-process cache limits and ages are configurable through IN_PROCESS_CACHE_* environment variables.

  • POST /api/functions/Overview/Pool returns 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 exposes p9_db_pool_connections (labelled by pid and state), p9_query_cache_bytes and p9_query_cache_entries through 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_TIMEOUT or DB_MSSQL_EXECUTOR_POOL_ACQUIRE_TIMEOUT seconds (default 60) for a database connection.

Sessions

  • With SESSION_STORE_REDIS=true and Redis configured (DB_ENABLED_REDIS with DB_URI_REDIS), sessions are stored in Redis instead of the sessions table. 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 /healthz reports 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/GetDoc returns an empty list when the action type or its filter value is missing instead of listing all documentation.

Chatbox Component

  • Speech-to-text no longer cuts off while dictating.

  • Agent info and the text on the launchpad chat button now truncate when space is limited.

  • Declining the microphone permission no longer causes an error loop.

  • Speech to text no longer fails in Microsoft Edge.

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_SECRET environment 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_log migration when the event log holds ClearQueryCache events.

Table Definition

  • A table created in the Cockpit is now logged as Create in the Audit Log tool instead of Save.

  • Legacy tables with empty or text default values no longer fail with validation errors.

Vault

  • Secret expiration notifications are now sent by email.

Web App

  • Audit Log shows each Web App’s name instead of Web App.

Workflow and Workflow Inbox

  • Users can again start, approve, reject, forward and list workflow tasks from the Workflow Overview and the Workflow Inbox.

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 lastLogin once per five minutes per user and web worker instead of on every request. Session logins are recorded every time as before.

Launchpad

  • Launchpad/GetTiles reads 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/GetUserInfo sends 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_TIMEOUT or DB_MSSQL_POOL_ACQUIRE_TIMEOUT seconds (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.

Was this page helpful?

What made the biggest difference for you?
What went wrong? (Your feedback helps us fix it.)

Please don't include personal or sensitive data.