2026.10.4 — 2026-10-01
Breaking
Replace VirtualTable with DataTable and export the page parts (c7c0c815)
Plugins get the console's data table and page parts: DataTable, Column, ColumnKind, ColumnPriority, RowMenu, Page, PageHeader, Section, Toolbar, EmptyState, ErrorState, LoadingState, StatusBadge, Stat, DescriptionList, ConfirmDialog and notify.
Added
Switch clusters from one row that never moves (c31fa219)
The list of clusters in the navigation is replaced by a cluster switcher: one row shows the current cluster, its environment and its health in words, and opens a searchable list grouped by environment with "Register cluster" at the end. The navigation below it no longer jumps when clusters load, and it scales to many clusters. Switching keeps the view you are on. The loading placeholder no longer moves the page when the console starts, and a console warning about updating the freshness indicator while rendering is gone.
Replace VirtualTable with DataTable and export the page parts (c7c0c815)
Plugins get the console's data table and page parts: DataTable, Column, ColumnKind, ColumnPriority, RowMenu, Page, PageHeader, Section, Toolbar, EmptyState, ErrorState, LoadingState, StatusBadge, Stat, DescriptionList, ConfirmDialog and notify.
Restyle charts, editors, diagrams and shared parts on the tokens (a01f3bf3)
Charts, the code editor, diagrams, per-node outcomes, the pager, capability explanations, redacted values, menus and links use the token scale. Code lint marks differ by shape as well as colour, inline links are underlined, the pager announces its position, a redacted value never reaches an attribute, and diagrams follow the colour scheme. Route errors, disabled features and unavailable plugins state what happened in place.
One heading per page and a navigation that follows zoom (0e97c6fc)
Each view now carries the page's only top-level heading; the cluster's name, environment and freshness sit in a context strip beside it. The navigation collapses to its icon rail when the window is narrow at high zoom, and widths, gutters and motion come from the token scale.
DataTable with content-fitted columns (5f4b7796)
One table for the console: an interactive, virtualised grid and a static table for short read-only lists, sharing one column model. Columns are sized from their measured content and the window; long identifiers are shortened in the middle so names that share a prefix stay apart; columns that do not fit are hidden least important first and can be shown again; the identifying and action columns stay in view when a table must scroll. Sorting is announced, and density, widths and column choices are remembered per table.
Shared page, state and dialog components (d9998d39)
Page, PageHeader (the page's one heading), Section, Toolbar, EmptyState (empty, filtered and unreachable), ErrorState (a cause and a next step for every kind of failure), LoadingState, StatusBadge, Stat (unavailable is said, never shown as 0), DescriptionList, ConfirmDialog and notify (the four outcomes of an action, each announced).
Solve table column widths from their content (349fe32f)
A pure solver fits columns to the width a table has: it shares spare width among the text columns, shortens the longest values, then hides the least important columns, and only then lets the table scroll.
New visual identity on one token scale (c54e6e11)
- The console has a new look: graphite surfaces, a cobalt accent, amber and red for state, and the Atkinson Hyperlegible typefaces, which tell 0 from O and 1 from l in queue names and message IDs. The typefaces ship with Studio and are never fetched from another host.
- Type, spacing, radius, elevation, motion and table density come from one token scale; every text colour meets WCAG AA contrast on every surface in both schemes, and a test keeps it that way.
- The colour scheme follows the operating system until you choose light or dark from the header or the command palette; the page opens in the right scheme without a flash of the other.
- Tables can be compact or comfortable, chosen from the user menu or the command palette.
Changed
Load each view's code when it is first opened (a123989e)
Views, and the panels that need charts, graphs or the code editor, are split out of the entry bundle and loaded on first use. The entry is 63% smaller (868 kB to 317 kB, 263 kB to 95 kB compressed).
Fixed
Announce loading sessions and permissions as status (978dc6fc)
Loading indicators that were labelled spinners now use the shared loading state, which screen readers announce as a status.
Stop retrying requests that cannot succeed (254ef04b)
A request refused with a client error (a run that does not exist, a missing permission, a bad request) was tried three more times before the view said so. Only network failures, timeouts, rate limits and server errors are retried now.
Keep application properties named like headers as they are (4c0d8b91)
Without a Core connection, a message property named type, correlationId, replyTo, groupId or groupSeq was sent as the JMS header of that name, so a property called groupId turned on message grouping. Only the headers of a send become JMS headers now; properties keep their names, as they do over Core.
Announce every sort and every repeated table message (e2b7c6d3)
A sort whose rows were already cached landed in the same render as the sort and was never announced; it now is. A message repeated word for word (copying the same cell twice) is announced again.
Keep every queue column at 1280 px and long names distinguishable (e7affd8b)
The queues table shows every column in a 1280-pixel window, with compact headers whose full names are in their descriptions. Names shortened to fit keep their last characters wherever they appear (links, routes, nodes), so queues that share a prefix stay apart. Number headers line up with their figures.
Explain gated controls beside them and name every failure (07d00bd8)
- A control disabled by a missing capability or permission now has its explanation in a separate "Why?" button beside it, instead of a button nested inside a button.
- A failure that is not an API error (a fault in the console itself) is no longer reported as "Studio could not be reached"; a server error keeps the server's own detail next to its request id.
- A full-height table fills exactly the space left under the page header, so the page no longer scrolls by the height of the breadcrumb.
- Columns of status badges are measured with the badge around the word, so the longest state is never clipped.
- Clearing the queue filter no longer brings the old filter back.
Open the keyboard shortcuts with focus inside (ba69f9a2)
The shortcuts popover traps focus but had no first control to move it to, so opening it could leave focus on the header button. Focus now lands on its single-key shortcuts switch. It also no longer hides itself when its position is measured late, which could leave it open but invisible.
One fill shade so filled controls keep a readable label (f91d63d5)
Mantine settles a filled control's label colour once, so a fill that changed shade with the colour scheme kept the other scheme's label: in the dark scheme the primary button was pale blue with white text. Fills now use one shade in both schemes, and the contrast test checks the label the control really gets. The sweep also waits for the app to replace its boot placeholder before it captures a page.
Validate sent property names and send headers as JMS headers (02d010ec)
- A property name that is not a valid JMS identifier (for example x-trace-id, a selector keyword, or a name starting with JMS other than JMSXGroupID and JMSXGroupSeq) is refused with 400 naming the property, instead of failing with 500 inside the broker client. Plugins sending messages get the same refusal.
- The headers of a sent message (correlationId, type, replyTo, groupId, groupSeq) now set the real JMS headers instead of properties with those names; any other header name is refused with 400.
- Without a Core connection, a message is sent as the account Studio holds for the cluster, so a broker that refuses anonymous senders accepts it. Over that path property values arrive as text; a typed property needs a Core connection.
Security
Update jackson-databind and the image's OpenSSL (0301e4be)
jackson-databind 2.21.7 and 3.1.7 fix two high-severity advisories (GHSA-cxp5-3px4-pw24, GHSA-wv8q-qhhj-9h54). The image now applies the distribution's security updates when it is built, which brings OpenSSL to the release that fixes CVE-2026-84782 before a new base image carries it.
Keep Jolokia arguments out of a request's string form (a25b0c97)
A Jolokia exec can carry the broker user and password a message is sent as, so a request that reached a log line or an exception message would print them. Its string form now names the operation and says how many arguments it has without showing them.