Repository navigation
v26.9.0
What's Changed (v26.8.1 -> v26.9.0)
✨ Features
Ant Design to Astryx migration
The WebUI is now built on the Astryx component system instead of Ant Design. Table scrolling and the session launcher stepper were carried over as part of the move.
- FR-3482: migrate the WebUI from Ant Design to Astryx by @yomybaby in #8626
- FR-3500: revive the antd scroll={{x,y}} contract on BAITableAstryx by @nowgnuesLee in #8726
- FR-4068: upgrade @astryxdesign/lab to 0.6.2-canary and take Stepper from Astryx core by @yomybaby in #9930
Explicit project scoping
Pages and dialogs now take the project they act on explicitly instead of relying on the header project selector. Admin routes hide the header selector and offer in-page project selection where it is needed.
- FR-3408: establish the explicit project prop contract and convert the folder-creation flow by @yomybaby in #8463
- FR-3410: explicit project for deployment creation, model-folder deploy, and model-card creation by @yomybaby in #8465
- FR-3411: scope Add revision and resource allocation to the deployment's own project by @yomybaby in #8467
- FR-3412: FileBrowser/SFTP take an explicit project with a disabled-state tooltip by @yomybaby in #8468
- FR-3413: prop-gated mismatch alerts and ownership-derived folder gating by @yomybaby in #8469
- FR-3414: flip admin routes — hide header project selector, guardrails, E2E by @yomybaby in #8470
- FR-3415: explicit in-page project selection for Environments and Reservoir by @yomybaby in #8473
- FR-3423: disable the deploy row action on the administrator folder page by @yomybaby in #8494
Sessions & session list
Session lists show more information and can be filtered further, including session priority, access key, and preemption-related statuses. Non-superadmin users can export their own session history as CSV.
- FR-3250: show and edit session priority in pending session list by @ironAiken2 in #8612
- FR-2771: show session access key in list and detail with mismatch warning by @ironAiken2 in #9009
- FR-3668: redesign scheduling-history sub-steps as a compact inline table and open the modals full screen by @yomybaby in #9048
- FR-1136: let non-superadmins export their own session history as CSV by @yomybaby in #9512
- FR-1581: add session ID filter to the admin session list by @yomybaby in #9477
- FR-3409: scope the pending-sessions tab by any resource group by @yomybaby in #8464
- FR-2898: improve SFTP session creation error feedback by @yomybaby in #7422
- FR-3889: render preemption session statuses and reason copy by @agatha197 in #9555
- FR-3923, FR-3924: session status badge kernel progress ring and per-kernel breakdown by @yomybaby in #10090
Agents & resource grid views
A grid visualization shows resource and kernel usage per unit, available on the user and superadmin session pages and in the agent detail panel, which now also lists the sessions assigned to the agent.
- FR-3252: show sessions assigned to the agent in agent detail panel by @ironAiken2 in #8613
- FR-3569: add BAIResourceUnitGrid, a generic unit-grid visualization component by @yomybaby in #8848
- FR-3570: add the resource/kernel grid view to the user session list page by @yomybaby in #8849
- FR-3571: add the resource grid view to the superadmin session page by @yomybaby in #8850
- FR-3652: show the resource grid view in the agent detail panel by @yomybaby in #9006
Folder mounting & upload
Mount sub-paths are chosen with a directory picker in the session launcher and deployments, the folder creation form is simpler, and uploads can decide overwrite per duplicate item.
- FR-3675: pick the model mount subpath with a directory picker by @ironAiken2 in #9070
- FR-3441: simplify the folder creation form by @nowgnuesLee in #9398
- FR-1564: decide overwrite per duplicate item on folder upload by @ironAiken2 in #9605
- FR-3863: pick the mount subpath with BAIVFolderPathPicker by @nowgnuesLee in #9452
- FR-3864: mount folders in the session launcher with BAIVFolderMountConfigInput by @nowgnuesLee in #9455
Deployments & model store
Custom deployments gain a redesigned Start Command with shell and exec modes, environment variable suggestions, a model-folder/model-card source toggle for revision presets, and more flexible runtime variant presets. Admin model cards and the Reservoir artifact table gain new search and sort options.
- FR-3205: redesign custom deployment Start Command with shell/exec modes by @agatha197 in #8170
- FR-3481: support nullable name/model_path/port in preset model definitions (BA-7210) by @agatha197 in #8622
- FR-3475: suggest common environment variable names via autocomplete in deployment env var forms by @agatha197 in #8607
- FR-3314: add model-folder / model-card source toggle to revision preset mode by @agatha197 in #8246
- FR-3476: expose runtime variant preset UI metadata in admin create/update form by @agatha197 in #8609
- FR-3939: support pre-filled create mode and return the created registry in ContainerRegistryEditorModal by @yomybaby in #9675
- FR-3676: explain how to pass a JSON string in the start command hint by @nowgnuesLee in #9664
- FR-3919: make the Reservoir artifact table sortable by @yomybaby in #9653
- FR-4013: open the 26.9.0 model card search axes in AdminModelCard by @agatha197 in #9799
RBAC & roles
Role list, role form, permissions and assignments are aligned with the 26.9 single-scope role model, and the RBAC page gains a Presets tab. Project-admin detection keeps working on both 26.8 and 26.9 managers.
- FR-3960: keep project-admin detection working on 26.8 and 26.9 managers by @ironAiken2 in #9721
- FR-3905: walk the role list and the role form onto the 26.9 single-scope role by @ironAiken2 in #9714
- FR-3957: gate the role permission tab onto the 26.9 single-scope role by @ironAiken2 in #9849
- FR-3958: gate role assignments between users and usersV2 and the assign payload by @ironAiken2 in #9850
- FR-4065: add a Presets tab to the RBAC page backed by adminRolePresets by @ironAiken2 in #9924
Admin list filters, orderings & columns
Admin lists (Users, Projects, Resource Policies, Fair Share, Environments, Agents, Sessions, Data) gain missing filters, orderings and columns, and several lists migrate to the newer admin queries.
- FR-3730: restore PowerSearch on Resource Policy admin tabs by @yomybaby in #9189
- FR-3875: pick id-valued filter properties with the existing selects by @nowgnuesLee in #9504
- FR-3910: migrate the Resource Group list to adminResourceGroups by @yomybaby in #9644
- FR-3920: add the missing Fair Share scheduler filters and orderings by @yomybaby in #9654
- FR-3917: add created/modified filters and modified_at ordering to the Projects page by @yomybaby in #9643
- FR-3915: add missing filters, orderings and columns to the super-admin Sessions page by @yomybaby in #9641
- FR-3916: add project/creator filters, orderings and columns to the admin Data page by @yomybaby in #9636
- FR-3908: add missing filters, orderings and columns to the super-admin Users page by @yomybaby in #9631
- FR-3911: add missing filters, orderings and columns to the Environments page lists by @yomybaby in #9637
- FR-3661: add Client IP column to login history and audit logs by @nowgnuesLee in #9662
- FR-4015: hide personal projects behind a default, removable type filter on the Projects page by @ironAiken2 in #9835
- FR-3912: add the Resource Policy V2 keypair user filter by @yomybaby in #9635
- FR-3909: expose the remaining agent filters, orderings and columns by @yomybaby in #9630
Dashboard
Dashboard board layouts persist consistently, and custom panels can be added with an edit sider, including count panels and session resource grid panels with the full set of session filters.
- FR-3062: unify dashboard board layout persistence by @yomybaby in #7763
- FR-3063: dashboard custom panels with an edit sider by @yomybaby in #7764
- FR-3565: dashboard count panel type for custom panels by @yomybaby in #8827
- FR-3635: dashboard session resource grid panel kind by @yomybaby in #8981
- FR-3654: offer every backend-supported session filter in dashboard panels by @yomybaby in #9017
Chat
A custom OpenAI-compatible endpoint can be connected from the Chat page.
Search & navigation
A global search palette indexes pages, tabs and settings and is available behind an experimental setting. Power search shows a search icon at its start.
- FR-3690: show a search icon at the start of every Power search by @yomybaby in #9082
- FR-3558: generate a build-time search index of pages, tabs, and setting items by @nowgnuesLee in #8811
- FR-3558: add the global search palette — index-backed search core, UI, and actions by @nowgnuesLee in #8812
- FR-3558: gate the global search palette behind an experimental setting by @nowgnuesLee in #8875
Login & authentication
Reusable interactive login hook and button are added to backend.ai-ui.
- FR-3872: add useBAIInteractiveLogin hook and BAIInteractiveLoginButton to backend.ai-ui by @yomybaby in #9464
Desktop app & proxy
A Debian package is built for the Linux desktop app, and the local wsproxy port pool is configurable.
- FR-145: make the local wsproxy proxying port pool configurable by @yomybaby in #9469
- FR-3971: build a Debian package for the Linux desktop app by @yomybaby in #9726
bai-agent CLI
A new bai-agent CLI lets agents search the manual, schema and terminology, run validated GraphQL queries and log in through the browser, and it is published as its own package.
- FR-3761: add bai-agent CLI package skeleton with output contract by @yomybaby in #9246
- FR-3762: add docs and terminology search with deployed-docs links by @yomybaby in #9247
- FR-3765: add schema show and unified docs/schema/terminology search ranking by @yomybaby in #9248
- FR-3763: add browser-delegated CLI login with the /cli-login route by @yomybaby in #9249
- FR-3768: add query command with SDL validation and mutation allow-list by @yomybaby in #9250
- FR-3769: add explain with curated field mappings and staleness checks by @yomybaby in #9251
- FR-3770: add schema sync with meta recording and version-alignment warnings by @yomybaby in #9252
- FR-3772: add bai-agent skill and generated CLAUDE.md agent block by @yomybaby in #9258
- FR-3804: add
syncto fetch the checkout data outside a checkout by @yomybaby in #9321 - FR-3805: turn
initinto the setup wizard and ship the skill in the package by @yomybaby in #9322 - fix alignment false positives, WebUI links and agent-facing ergonomics by @yomybaby in #9444
- FR-3861: mark list links with the access their WebUI page requires by @yomybaby in #9446
- FR-3773: validate WEBUIHelpButton manual anchors in verify.sh by @yomybaby in #9269
- FR-3795: run the version-alignment gate in query and explain by @yomybaby in #9509
Review overlay & walkthroughs
The dev review overlay supports multi-pin draft sets, deep links, keyboard docking and shareable walkthroughs with a guided mode. The docs preview lists change pins on every page.
- FR-3811: review overlay write side — react-grab pick to
#bai=v3block by @yomybaby in #9337 - FR-3813: open a #bai=v3 link on the dev server — deep link to the pinned element by @yomybaby in #9368
- FR-3849: copy the pin id from the deep-link card, and let overlay text be selected by @yomybaby in #9422
- FR-3851: copy the whole comment from the deep-link card by @yomybaby in #9426
- FR-3855: read #bai=v3 pins with the overlay's own codec from a CLI by @yomybaby in #9437
- FR-3856: carry a pin set as
&-repeated#bai=v3parts by @yomybaby in #9438 - FR-3857: draw N pins from one layer instead of one pin per overlay by @yomybaby in #9439
- FR-3858: keep every pin the reviewer makes in a draft set by @yomybaby in #9440
- FR-3859: open a multi-pin link into the draft set by @yomybaby in #9441
- FR-3862: move the review overlay dock with the keyboard by @yomybaby in #9450
- FR-3880: ship the review pin overlay in the nightly Amplify build by @yomybaby in #9536
- FR-3898: collect per-change review comments on the docs PR preview and copy them at once by @ironAiken2 in #9584
- FR-3929: reorder pins in the review overlay's set dock by @agatha197 in #9657
- FR-3930: edit a pin's note after it joined the draft set by @agatha197 in #9658
- FR-3949: add walkthrough stop fields to the v3 anchor with strict resolution by @agatha197 in #9694
- FR-3950: walk a walkthrough's stops in a docs-style guided mode by @agatha197 in #9697
- FR-3951: mint and post a walkthrough for the PR a session just implemented by @agatha197 in #9698
- FR-4004: make the dev review overlay client host-agnostic so the Jira Helper extension can run it on any site by @yomybaby in #9786
- FR-3991: mint a walkthrough on demand for any PR by number by @agatha197 in #9760
- FR-4041: list every change pin in the docs preview navigator, on every page by @agatha197 in #9879
- FR-4057: let a walkthrough reader switch between ko and en by @agatha197 in #9907
- FR-4101: point at the button a waiting walkthrough stop needs clicked by @agatha197 in #9981
- FR-4103: fill and select steps in a walkthrough stop's via, beside click by @agatha197 in #9987
Dev tooling & release process
Dev servers are named after their issue and PR and advertise their gateway URL, per-PR docs previews are generated, and release preparation gains a QA checklist.
- FR-3708: register backend.ai-ui as an Astryx CLI integration by @yomybaby in #9132
- FR-3665: name the dev server after its issue, PR and what it does by @yomybaby in #9049
- FR-3810: dev-server advertises the gateway URL and boot record on every served PR by @yomybaby in #9336
- FR-3843: release train prep — QA risk checklist, Teams digest, train kickoff by @agatha197 in #9397
- FR-3879: per-PR docs site preview with change highlighting by @yomybaby in #9537
- FR-3921: serve the Portless dev-server list as JSON at /servers by @nowgnuesLee in #9629
Other improvements
Smaller user-facing additions.
- FR-3387: pilot useKeyedSnapshot render-as-you-fetch tab state on the users page by @nowgnuesLee in #8588
- notification drawer empty state + header docs recapture (2026-08-31) by @lablup-octodog in #9312
- Accept a per-language
titlein book.config.yaml by @rapsealk in #8630 - FR-70: display private tag in Environment page for private images by @yomybaby in #6227
🐛 Bug Fixes
Tooltips & disabled-state explanations
Tooltips keep their text inside the bubble, stay hoverable, and render line breaks, and disabled actions now say why they are disabled.
- FR-3537: keep launcher tooltip text readable and left-aligned by @yomybaby in #8758
- FR-3573: keep tooltip text inside the tooltip bubble by @agatha197 in #8845
- FR-3609: make the deployment card-title help tooltips hoverable by @agatha197 in #8929
- FR-3589: stop all:unset from poisoning tooltip anchor-name on Chromium 151 by @agatha197 in #8952
- FR-3611: converge every bare-svg tooltip trigger onto the BAI trigger components by @agatha197 in #9010
- FR-3672: stop the SFTP button opening an empty tooltip pill by @yomybaby in #9150
- FR-3707: open the +N overflow on hover, like the tooltip it is by @yomybaby in #9147
- FR-3837: keep help tooltips hover-reachable inside disabled controls by @nowgnuesLee in #9370
- FR-3679: name the reason on the disabled access-token buttons by @agatha197 in #9166
- FR-3737: name why Add Rules / Add Revision / Add Access Token are disabled by @yomybaby in #9476
- FR-3895: render tooltip line breaks and center the help icon on Information rows by @agatha197 in #9570
Notifications, banners & announcements
Announcements render as Markdown, toast and banner surfaces are opaque and correctly colored, and oversized notifications stay dismissable.
- FR-3494: render announcements with Astryx Markdown in banner and editor preview by @yomybaby in #8695
- FR-3554: restore top-center message placement and an opaque dark banner surface by @agatha197 in #8806
- FR-3616: upgrade markdown-to-jsx to 9.x to fix the GFM-alert crash by @agatha197 in #8948
- FR-3610: keep the notification badge on the app theme, not the band's by @agatha197 in #8928
- FR-3700: paint failure toasts as errors and contain their detail body by @yomybaby in #9148
- FR-3700: opaque notification fills, no stray content border, one body type scale by @yomybaby in #9174
- FR-3829: keep oversized notifications dismissable and clear of the header by @yomybaby in #9499
- FR-3723: keep the edit-announcement body a skeleton until Monaco is ready by @yomybaby in #9498
Tables & lists
Tables regain horizontal scrolling, correct sorting, empty states and pagination behavior after the migration, and row selection no longer flashes loading states.
- FR-3503: own the table empty state so it is iconed and localized by @yomybaby in #8694
- FR-3563: slice client-side rows in BAITableAstryx by @nowgnuesLee in #8821
- FR-3510: stop row selection from flashing the fetch-key button's loading state by @ironAiken2 in #8752
- FR-3702: render the storage-host Allowed column via BAITable's render contract by @agatha197 in #9165
- FR-3685: make the Credentials User ID column actually pin to the left by @yomybaby in #9149
- FR-3681: restore scroll on the minWidth-workaround tables (batch 2/2) by @yomybaby in #9154
- FR-3681: restore the scroll prop the Astryx migration stripped (batch 1/2) by @yomybaby in #9153
- FR-3711: let the auto-scaling Created At sort reach ascending and unsorted by @agatha197 in #9164
- FR-3670: move folder-explorer row actions onto BAINameActionCell by @agatha197 in #9062
- FR-3703: restore BAITable's invalid-page empty state by @nowgnuesLee in #9178
- FR-3710: feed the sort order back into the Deployment Presets table by @agatha197 in #9163
- FR-3684: right-align the auto-scaling refresh and Add Rules buttons by @agatha197 in #9078
- FR-3722: derive row-action
disabledfromdisabledReasonby @agatha197 in #9170 - FR-3846: apply "Off" on the first auto-refresh interval pick by @yomybaby in #9417
- FR-3721: keep row action colours in the more menu by @yomybaby in #9496
- FR-4063: feed the sort order back into the Agent Summary table by @agatha197 in #9922
- FR-3994: keep a page-size pick on controlled BAITable pagination by @rapsealk in #9824
- FR-4007: contain a wide table's horizontal scroll in flex and grid parents by @agatha197 in #9825
Forms & inputs
Form and select behavior is corrected, including validation display, bulk user creation feedback, power search focus and input controls that stay joined.
- FR-3531: hug the cluster-mode segmented control and trail its help glyph by @yomybaby in #8737
- FR-3530: fire Form.Provider onFormChange for unnamed forms by @ironAiken2 in #8753
- FR-3520: surface review-step validation errors on the failing cards and stepper by @agatha197 in #8711
- FR-3419: list failed users when bulk user creation partially fails by @agatha197 in #8479
- FR-3688: weld the unit number input's stepper and unit select into one control by @yomybaby in #9086
- FR-3692: let an ellipsized link keep its own colour by @yomybaby in #9105
- FR-3689: constrain the runtime variant preset uiType/valueType pairing by @agatha197 in #9083
- FR-3739: drop power search input focus when the popup is dismissed by an outside click by @yomybaby in #9208
- FR-3705: keep form values when the registry modal's project select suspends by @nowgnuesLee in #9295
- FR-2329: improve bulk user creation max count message wording by @yomybaby in #6224
- FR-3840: name the runtime parameter the same on both surfaces by @agatha197 in #9391
- FR-3724: show a loading row in the select popup while the list is in flight by @yomybaby in #9507
- FR-3683: make
scrollToFirstErrorwork, and have Create User submit by @agatha197 in #9204 - FR-3874: feed the staged value back into renderInput controls by @nowgnuesLee in #9502
- FR-3931: wrap the property filter editor row instead of clipping it by @agatha197 in #9661
- FR-3938: reject whitespace in deployment preset names by @nowgnuesLee in #9678
Folder explorer & data page
The folder explorer lays out and resizes correctly, enters directories on click, gates write and delete on permissions, and keeps folders reachable when a field is missing.
- FR-3517: return the whole-path copy to the "Path" label and size the path row down by @yomybaby in #8728
- FR-3575: make the folder-explorer upload dropzone fill the overlay by @agatha197 in #8855
- FR-3602: enter a directory when its name is clicked in the file explorer by @agatha197 in #8912
- FR-3590: contain the folder explorer's split panes so they cannot overlap by @agatha197 in #8887
- FR-3591: restore the full drag height of the folder explorer's resize handle by @agatha197 in #8889
- FR-3606: adapt the folder explorer to live viewport resizes by @agatha197 in #8921
- FR-3800: gate Folder Explorer write/delete on the legacy per-user permission set by @ironAiken2 in #9315
- FR-3674: show pending state through the whole create-file flow by @nowgnuesLee in #9409
- FR-2911: gate trash-bin permanent delete on delete_vfolder permission by @yomybaby in #9466
- FR-3893: align invited-folder items and drop the stray last divider by @nowgnuesLee in #9562
- FR-3897: render the vfolder permission code as an inline code tag by @nowgnuesLee in #9574
- FR-3926: give the folder explorer's Name column room for the file name by @ironAiken2 in #9666
- FR-3820: answer per id in bulk vfolder and user mutations by @agatha197 in #9341
- FR-3927: verify a vfolder download reached the browser before reporting success by @ironAiken2 in #9665
- FR-3997: keep a folder reachable when one non-nullable field nulls the node by @agatha197 in #9772
- FR-3983: hide the cross-project banner for folders in a personal project by @ironAiken2 in #9832
- FR-4042: keep the folder explorer header on the legacy node when the V2 node nulls out by @ironAiken2 in #9884
- FR-4009: keep the folder page header visible while the table refetches by @agatha197 in #9819
- FR-4005: reset the folder explorer's side panel per session by @nowgnuesLee in #9793
Session launcher & sessions
The session launcher, resource step and session detail behave correctly, including accelerator fields, image selection, SFTP resource groups, and session REST calls that use the session UUID.
- FR-3523: stop the accelerator form-watch loop that freezes Relay selects by @agatha197 in #8717
- FR-3506: drop the fill from disabled session action buttons by @yomybaby in #8697
- FR-3499: stop the image selector clearing itself on re-select by @agatha197 in #8677
- FR-3544: restore tag info on the image version select's closed trigger by @nowgnuesLee in #8783
- FR-3568: session detail drawer transition delay by @yomybaby in #8847
- FR-3478: surface the manager's actual error when start-service fails by @ironAiken2 in #8640
- FR-3479: give start-service its own 60s request timeout by @agatha197 in #8778
- FR-3598: widen the Start from URL modal so the tab strip fits by @agatha197 in #8908
- FR-3601: give the Container Logs modal a height budget that fits by @agatha197 in #8909
- FR-3580: keep the session action buttons on the brand accent inside a notice by @agatha197 in #8877
- FR-3615: use session UUID instead of session name in session REST API calls by @nowgnuesLee in #8946
- FR-3712: stop accelerator slot fields failing as "not a valid undefined" by @agatha197 in #9162
- FR-3673: gate PREEMPTED / RESCHEDULING session statuses on manager 26.8.0 by @agatha197 in #9141
- FR-3831: weld the accelerator type select and restore the number stepper by @nowgnuesLee in #9350
- FR-3581: explain the empty kernel-mode metric selector by @yomybaby in #9491
- FR-3865: validate the app launcher's allowed client IPs by @yomybaby in #9506
- FR-3587: render the fallback image meta icon as a themed glyph by @yomybaby in #9494
- FR-3054: surface manager errors when a manual SSH keypair is rejected by @yomybaby in #9485
- FR-3593: open the session detail drawer in place from the agent detail panel by @agatha197 in #9568
- FR-3969: show the picked mount permission at once and load until the refetch lands by @yomybaby in #9724
- FR-3996: list SFTP resource groups in the launcher for system sessions by @agatha197 in #9771
- FR-4023: keep the outlined surface on disabled session action buttons by @ironAiken2 in #9837
- FR-4018: center the kernel Hostname cell's icon with its text by @agatha197 in #9822
- FR-4021: show the container-log request failure instead of an empty viewer by @agatha197 in #9829
- FR-4012: keep the session scheduling subscription inside the request line by @agatha197 in #9833
- FR-3985: settle the resource step's automatic writes under minimum-required by @nowgnuesLee in #9747
- FR-4067: key resource presets by id in the session launcher by @agatha197 in #9927
Deployments & model store
Deployment forms, presets and cards behave correctly, including multi-node defaults, preset name validation, and the model-store project lookup.
- FR-3469: warn that Open to Public cannot be changed at deployment creation by @agatha197 in #8592
- FR-3599: apply the deployment card's secondary accent to its icon and title by @agatha197 in #8907
- FR-3633: keep the runtime variant preset UI option fields inside the modal by @yomybaby in #8977
- FR-3677: default deployment presets to single-node and warn on multi-node by @agatha197 in #9066
- FR-2371: resolve deployment project name from projectV2 by @yomybaby in #9523
- FR-4003: point the no-preset revision hint at Advanced Mode by @yomybaby in #9780
- FR-4062: list only public model cards to non-admin users on the Model Store page by @agatha197 in #9919
- FR-4058: read the model store project through the caller's memberships by @ironAiken2 in #9904
- FR-4138: resolve the admin model card's model-store project from the current domain (26.9) by @yomybaby in #10091
Admin pages
Admin resource policies, resource presets, credentials, audit logs and user purge flows are corrected.
- FR-3718: target resource presets by id in delete and modify mutations by @nowgnuesLee in #9143
- FR-3801: lift the keypair max session lifetime cap off 100 by @agatha197 in #9301
- FR-3887: widen the minimum image resource limit modal to remove horizontal scroll by @agatha197 in #9543
- FR-3892: skip auto-diagnostics queries for non-superadmin users by @nowgnuesLee in #9561
- FR-3902: explain what the resource group Public toggle controls by @nowgnuesLee in #9602
- FR-3982: pick the audit-log entity name by manager version by @agatha197 in #9766
- FR-3989: keep personal projects out of the user edit project selector by @nowgnuesLee in #9757
- FR-3990: reset the purge options on open and draw the confirm text as a Token by @agatha197 in #9768
- FR-4010: restore CSV export on the V2 resource policy tables by @agatha197 in #9818
- FR-4008: close the purge users modal when nothing failed by @agatha197 in #9820
RBAC & roles
Role name cells, sorting, scope ids and project-admin detection work with the current role model.
- FR-3618: send domain uuid instead of domain name as RBAC role scopeId by @ironAiken2 in #8954
- FR-3686: ellipsize the RBAC role name cell instead of hard-clipping it by @yomybaby in #9084
- FR-3725: keep the assignment tab rendered while the assign modal loads by @nowgnuesLee in #9413
- FR-3918: fix Created At / Updated At sorting on the RBAC roles list and widen the scope type filter by @yomybaby in #9650
- FR-3986: find project admin roles by scope_admin permission instead of role name by @nowgnuesLee in #9782
- FR-4128: detect project admins from project-scoped roles instead of held permissions (26.9) by @yomybaby in #10089
Localization & typography
Built-in strings are translated, untranslated placeholders and English leftovers are fixed, Korean fonts are self-hosted, and CJK line breaks are preserved.
- FR-3511: translate Astryx's built-in strings via antd-style per-locale BAILocale catalogs by @yomybaby in #8699
- FR-3540: use the declared --font-family-code token for BAIText monospace by @yomybaby in #8770
- FR-3695: stop
keep-allremoving every line break in Japanese and Chinese by @agatha197 in #9181 - FR-3726: restore the antd-era Typography.Text structure for BAIText by @nowgnuesLee in #9177
- FR-3729: translate away the NOT_TRANSLATED placeholder by @agatha197 in #9184
- FR-3839: translate the catalog values left in English and add the missing non-en keys by @ironAiken2 in #9389
- FR-3841: show LLM sampling parameter labels in English in every locale by @ironAiken2 in #9393
- FR-3427: use "자원 정책" for resource policy in the ko locales and pin it in the termbase by @yomybaby in #9481
- FR-3967: self-host Pretendard so Korean UI text stops falling back to host fonts by @ironAiken2 in #9804
App shell, theming & layout
Header, sider, modals, drawers and boot splash render consistently in light and dark modes, and the stylesheet layer order is declared before other styles load.
- FR-3493: pin DropdownMenu panel overlays to the page surface by @yomybaby in #8678
- FR-3496: adopt BAIMetadataList bordered in the agent detail drawer by @yomybaby in #8696
- FR-3502: invert header band content with the app mode by @yomybaby in #8698
- FR-3518: converge every copy control on BAIText copyable by @yomybaby in #8730
- FR-3534: namespace app-compiled StyleX atomics away from Astryx's precompiled classes by @yomybaby in #8747
- FR-3574: draw the fetch-key countdown border in the current menu's accent by @agatha197 in #8846
- FR-3556: make the expand-chevron hover pill correctly shaped and visible in dark mode by @agatha197 in #8803
- FR-3585: render scrimmed drawers through a portal so a modal opened from a drawer is reachable by @nowgnuesLee in #8881
- FR-3608: stop copyable text painting over the copy button by @agatha197 in #8927
- FR-3697: tag the build number on Amplify and stop precaching the app shell by @yomybaby in #9109
- FR-3706: paint the tab count badge in the active menu group's primary by @yomybaby in #9127
- FR-3736: clip the Rebellions icon's white plate to its rounded border by @rapsealk in #9201
- FR-3738: give lucide icons a baseline and SimpleProgressWithLabel one box by @yomybaby in #9206
- FR-3732: stop boot splash background/text flash during load by @yomybaby in #9193
- FR-3828: keep macOS window controls clear of the top band in Electron by @nowgnuesLee in #9367
- FR-3819: make the Storybook theme toolbar switch both theme layers by @agatha197 in #9339
- FR-3842: stop double-padding the resource usage panel card by @agatha197 in #9395
- FR-3532: declare the @layer order before any stylesheet loads by @yomybaby in #9497
- FR-3894: align the deployment More menu to the trigger's end edge by @nowgnuesLee in #9564
- FR-3900: stop blurring the page behind the mobile nav drawer by @nowgnuesLee in #9590
- FR-3901: use relative brandImage paths in the Storybook theme by @nowgnuesLee in #9593
- FR-3904: follow the settings modal through its consumers by @yomybaby in #9598
- FR-4035: keep tab count badges and PowerSearch chips out of the FR-4002 chip restyle by @yomybaby in #9856
- FR-4024: clip the overlay scrollbar track so a sub-pixel thumb overshoot cannot become the app shell's overflow by @ironAiken2 in #9848
Tours & walkthroughs
Tour and walkthrough spotlights scroll into view, retry until anchors exist, and stay inside the window or off open modals.
- FR-3525: keep the lab Tour callout above its spotlight backdrop by @yomybaby in #8732
- FR-3526: scroll off-viewport tour spotlight targets into view on step change by @ironAiken2 in #8754
- FR-3546: retry tour target resolution until the anchors exist by @agatha197 in #8785
- FR-3853: dock the pin card instead of hiding it off-screen by @yomybaby in #9429
- FR-4022: keep the walkthrough popover inside the window by @agatha197 in #9831
- FR-4100: keep walkthrough marks of stops behind an open modal off the modal by @agatha197 in #9979
- FR-4104: stop the walkthrough via hint pulsing on a control already clicked by @agatha197 in #9990
Dashboard
Dashboard metric cards keep their titles visible while charts load.
Chat
The Chat page shows the app-wide skeleton while loading, and the history panel and header menu are laid out correctly.
- FR-3662: show the app-wide skeleton while the Chat page loads by @nowgnuesLee in #9041
- FR-4038: render the chat history panel inside the chat card with a close button by @yomybaby in #9875
- FR-4037: widen the chat header menu and match the composer radius to the card by @yomybaby in #9874
Security
CSV exports neutralize formula injection, access token values are no longer exposed in a tooltip, and CodeQL alerts from the migration are closed.
- FR-3698: stop exposing the access token value in a hover tooltip by @agatha197 in #9126
- FR-3106: neutralize CSV formula injection in the export helpers by @ironAiken2 in #9365
- FR-3487: close the actionable CodeQL alerts from the migration PR by @yomybaby in #9470
Data fetching & Relay
Update payloads are mergeable, missing fields are handled through Relay, and fair share steps send schema-valid order fields.
- FR-3378: make update payloads mergeable and skip update-path list refetches by @nowgnuesLee in #8401
- FR-3833: send schema-valid order fields from the fair share steps by @ironAiken2 in #9352
- FR-3838: give the Data page route its own Suspense boundary by @agatha197 in #9386
- FR-4061: forward the close lifecycle so BAIUnmountAfterClose unmounts Astryx-era modals and drawers by @ironAiken2 in #9910
- FR-4105: fill version-stripped GraphQL fields with null so Relay serves cached data by @yomybaby in #9992
- FR-4107: replace the FR-4105 response null-fill with Relay's treatMissingFieldsAsNull by @yomybaby in #9998
Developer tooling & CI
Fixes to the dev server, statusline, test suites, PR previews and verification scripts.
- FR-3521: remove the portless atomic-write patch that breaks the daemon's routes.json watch by @nowgnuesLee in #8714
- FR-3485: open docs search palette on Cmd+K regardless of input language by @yomybaby in #8634
- FR-3614: run the react vitest suite without per-file isolation by @yomybaby in #8938
- FR-3617: give waitFor enough headroom for the CI runner by @yomybaby in #8951
- FR-3629: restore per-file isolation for the vitest suites by @nowgnuesLee in #8968
- FR-3658: render the statusline Portless and Jira segments reliably by @yomybaby in #9019
- FR-3720: read the gateway's target_port by @yomybaby in #9156
- FR-3666: drop the Portless placeholder when no dev server belongs here by @yomybaby in #9050
- FR-3807: use the stored session before the checkout config.toml, and keep doctor offline without one by @yomybaby in #9327
- FR-3835: drop the removed selectProps prop from BAIVFolderPathPicker's doc by @ironAiken2 in #9358
- FR-3896: count only page/component feats as R5 manual gaps by @agatha197 in #9572
- FR-3899: publish the PR preview from the approved build by @ironAiken2 in #9585
- FR-3925: drop the dev-boot search index rebuild and answer the PR lookup from cache by @agatha197 in #9645
- FR-4020: drop the shared gh-pages concurrency group so a burst of PRs keeps every preview by @ironAiken2 in #9827
Desktop app & networking
Electron window controls and the API-mode proxy gateway behave correctly.
🔨 Refactoring
Astryx component layer
Component names and structure are cleaned up after the migration: shared components live in backend.ai-ui, modals and drawers render through portals, and the main layout adopts the Astryx app shell.
- FR-3509: draw the notification tooltip's shortcut badge with Astryx Kbd by @yomybaby in #8701
- FR-3564: rename BAITableAstryx to BAITable and inherit Astryx's TableProps by @nowgnuesLee in #8823
- FR-3533: fold the astryx-bui twin components onto their BUI originals by @nowgnuesLee in #8742
- FR-3533: promote the no-twin astryx-bui components into backend.ai-ui by @nowgnuesLee in #8743
- FR-3533: retire the astryx-bui directory and write down the single-home rule by @nowgnuesLee in #8744
- FR-3612: adopt Astryx AppShell in MainLayout with global announcement banner and mobile nav drawer by @yomybaby in #8935
- FR-3578: render modals through a portal instead of a native by @nowgnuesLee in #8863
- FR-3655: remove the migration-era Astryx suffix from component names by @agatha197 in #9015
Deployment & preset forms
Shared form components and a single select simplify revision and preset editing.
- FR-3474: extract shared Service Configuration/Health Check/Pre-Start Actions form components by @agatha197 in #8603
- FR-3160: read the preset image node in the add-revision modal by @yomybaby in #9513
- FR-3346: collapse revision preset selects onto one select by @yomybaby in #9511
Data loading & page state
Pages read data through preloaded queries and keyed snapshots, and admin selects and lists move to the newer admin queries.
- FR-3597: read the agent sessions tab through a preloaded query by @ironAiken2 in #8900
- FR-3735: own the resource-policy tab state on the page with useKeyedSnapshot by @nowgnuesLee in #9198
- FR-3430: split FairShareList into per-step self-contained components by @ironAiken2 in #8516
- FR-2655: use the typed v2 vfolder select in the admin model card form by @yomybaby in #9522
- FR-3418: migrate BAIAdminResourceGroupSelect to adminResourceGroups by @yomybaby in #9484
- FR-3848: give the assign modal's user select its own Suspense boundary by @nowgnuesLee in #9419
Settings, images & folders
User settings open in a modal, images render through one meta row, and folder mount inputs fetch their own list.
- FR-3903: open user settings in a modal over the current page by @yomybaby in #9596
- FR-3182: render every image through one meta row by @ironAiken2 in #9606
- FR-3866: make BAIVFolderMountConfigInput fetch the gated REST folder list and render its own select by @nowgnuesLee in #9453
Electron client
The Electron local proxy moves onto the backend.ai-client package.
- FR-3796: move the Electron local proxy onto the backend.ai-client package by @nowgnuesLee in #9290
🛠 Chores
Dependency & schema updates
Astryx and other dependency versions are bumped, including the move to pnpm 12, and the GraphQL schema is synced with the 26.8 manager.
- FR-3541: update Astryx to 0.4.0 by @yomybaby in #8772
- FR-3542: bump to 26.9.0-alpha.0 and update dependencies by @yomybaby in #8774
- FR-3577: update Astryx to 0.4.3 and move the pins into the pnpm catalog by @yomybaby in #8857
- FR-3595: update Astryx to 0.4.4 by @yomybaby in #8899
- FR-3646: bump actions/upload-artifact to v7 so release builds stop forcing Node 20 by @yomybaby in #8998
- FR-3651: update Astryx to 0.4.7 by @yomybaby in #9004
- bump actions/setup-node from 6.4.0 to 7.0.0 by @dependabot[bot] in #8979
- FR-3660: update Astryx to 0.5.0 by @yomybaby in #9038
- FR-3802: update Astryx to 0.5.2 by @yomybaby in #9305
- bump actions/cache from 5 to 6 by @dependabot[bot] in #8512
- bump actions/labeler from 6 to 7 by @dependabot[bot] in #9244
- bump actions/github-script from 8 to 9 by @dependabot[bot] in #9243
- FR-3886: update Astryx to 0.5.4 and drop the upstreamed useFocusTrap patch by @yomybaby in #9540
- bump sharp from 0.35.3 to 0.35.4 by @dependabot[bot] in #9560
- migrate to pnpm 12 by @yomybaby in #9447
- FR-3888: sync data/schema.graphql with the live manager (26.8.x preemption surface) by @agatha197 in #9554
- bump react-router-dom from 6.30.4 to 6.30.6 by @dependabot[bot] in #9541
- FR-4034: update Astryx to 0.6.2 by @yomybaby in #9854
CI & build
CI runs faster and gains agent-CLI checks, parallel verification lanes and a smoke-test convention.
- FR-3604: speed up CI — dedupe pnpm caches, split vitest, consolidate typecheck, prune dead workflows by @yomybaby in #8916
- FR-3613: remove the Copilot Storybook coverage checker workflows by @yomybaby in #8934
- FR-3659: deploy a per-PR Storybook preview and post a PR analysis report by @yomybaby in #9036
- FR-3774: run the agent-cli lint/build/test in CI by @yomybaby in #9270
- FR-3803: publish backend.ai-agent-cli to npm at 0.1.0 with its own release tag by @yomybaby in #9320
- FR-3657: use cached eslint and incremental tsc in verify.sh by @ironAiken2 in #9016
- FR-3964: run verify.sh checks as parallel lanes by @yomybaby in #9711
- FR-2875: role-aware
@smoketag convention and a smoke config for installed clusters by @yomybaby in #9712
Dev tooling & AI guidance
Agent skills and AI guidance files are trimmed to project-specific content, and dev scripts are tidied.
- FR-3488: remove .scratch and .docs, relocate durable migration records by @yomybaby in #8646
- FR-3488: prune agent skills the model no longer needs by @yomybaby in #8647
- FR-3488: slim AI guidance to project-specific deltas by @yomybaby in #8648
- FR-3488: retire the antd migration gates by @yomybaby in #8649
- FR-3490: add root-level astryx CLI proxy script by @yomybaby in #8654
- FR-3489: prune component-authoring skills current models no longer need by @yomybaby in #8655
- FR-3489: trim derivable content from CLAUDE.md by @yomybaby in #8657
- FR-3492: add an astryx-bug-report skill for capture-only UI defect intake by @yomybaby in #8660
- FR-3492: add a discussion category to astryx-bug-report and an assignee gate to astryx-fix by @yomybaby in #8671
- remove dead code comments and cleanup trivial remarks by @yomybaby in #8598
- FR-3631: clear the FR-3205/FR-3474 leftovers in comments and locale files by @yomybaby in #8973
- FR-3720: print the team share URL (dev-gw) from dev.mjs by @yomybaby in #9146
- FR-3806: drop the retired dev-server registry from the skills by @yomybaby in #9325
- FR-3796: remove dead client-era leftovers under src/lib by @nowgnuesLee in #9289
- improve create-release skill to merge main into existing release branch by @yomybaby in #6413
- remove the Astryx-specific skills by @yomybaby in #9416
- FR-2985: drop the wholesale bui-language Vitest mock by @yomybaby in #9482
- FR-4079: clean up stale and dated Claude instruction files by @yomybaby in #9944
- Bring late fixes and documentation updates into 26.9 by @yomybaby in #10088
🌐 i18n
Japanese pagination strings
Half-English Japanese pagination strings in backend.ai-ui are translated.
🧪 E2E Tests
Coverage added
New end-to-end and regression tests for deployments, folder explorer permissions, the app launcher, the global search palette and runtime variant presets.
- FR-3344: add E2E coverage for custom deployment add-revision (FR-3205 + FR-3342) by @agatha197 in #8333
- FR-3476: add e2e coverage for runtime variant preset UI metadata by @agatha197 in #8614
- FR-3807: probe the recorded endpoint from a fake checkout, not the real one by @yomybaby in #9335
- FR-3824: add regression test for Folder Explorer share-permission gating by @ironAiken2 in #9343
- FR-3830: cover each share permission type in the Folder Explorer gating test by @agatha197 in #9348
- finish the Astryx locator heal #9043 scoped out by @agatha197 in #9167
- FR-3873: cover the missing-sToken branch of the /applauncher route by @yomybaby in #9465
- FR-3558: cover the global search palette by @nowgnuesLee in #8864
Automated updates
Automated Playwright locator and spec repairs after UI changes.
- Automated E2E auto-heal updates (16 PRs) by @lablup-octodog: #8638, #8949, #9099, #9043, #9202, #9316, #9344, #9168, #9384, #9405, #9423, #9589, #9592, #9736, #9754, #9916
🎨 Style
Forms, selectors & modals
Spacing, field sizes and layout of forms, selectors and modals are tuned.
- FR-3529: give the Runtime Parameters category tabs room and a rail by @agatha197 in #8724
- FR-3513: render BAIModal's loading body with the shared BAISkeleton by @ironAiken2 in #8740
- FR-3536: pin ComplexSelector field height to the Selector size ramp by @agatha197 in #8756
- FR-3543: mute placeholders to the antd quaternary strength by @agatha197 in #8777
- FR-3644: production labels, required fields, and sider captions by @yomybaby in #8991
- FR-3603: align BAIComplexSelect's dropdown panel with Astryx Selector's by @agatha197 in #8914
- FR-3728: render the preset Required field as a checkbox by @agatha197 in #9183
- FR-3854: align the Bulk Create Users from CSV modal with the other modals by @agatha197 in #9431
- FR-3713: shrink the "Unlimited" checkbox to the compact size by @yomybaby in #9493
- FR-3716: fix code block background and tab strip spacing in the Downloads modal by @yomybaby in #9495
- FR-3876: align inputs and spacing in the keypair resource policy modal by @agatha197 in #9525
- FR-4016: lighten the slider track to the neutral skeleton tone by @agatha197 in #9802
Theme, chrome & layout
Sider, table headers, metadata lists, tokens and badges follow the Astryx theme.
- FR-3512: restore the sider footer's supporting size and muted rest tone by @yomybaby in #8700
- FR-3566: give table headers a background band and header-only column splits by @yomybaby in #8829
- FR-3588: drop the result count from Power search on the folder lists by @yomybaby in #8885
- FR-3596: draw the pinned step rails with the on-track indicator by @yomybaby in #8901
- FR-3555: re-anchor the primary button fill so an info banner cannot repaint it by @agatha197 in #8804
- FR-3687: weld BAIDoubleTag back into one joined pair by @yomybaby in #9085
- FR-3694: converge metadata lists on BAIMetadataList with a card container by @yomybaby in #9104
- FR-3731: sider chrome spacing, ghost select border, card header/tab inset by @yomybaby in #9186
- FR-4002: outline Token and tint Badge through the Astryx theme by @yomybaby in #9777
Page-level polish
Visual alignment on deployments, My Environments, revision details and the session launcher.
- FR-3572: give the deployment Scheduling History controls the accent icon-button treatment by @agatha197 in #8842
- FR-3678: tint the My Environments delete action danger-red by @yomybaby in #9151
- FR-3667: top-align revision detail labels with their values by @nowgnuesLee in #9314
- FR-3984: polish the design of BAIVFolderMountConfigInput by @yomybaby in #9745
- FR-4069: align card, dialog and Stepper spacing on the session launcher by @yomybaby in #9931
📝 Documentation
AI guidance & workflow docs
Contributor and agent documentation: PR workflow, stacked PR restructuring, ADR process and walkthrough decisions.
- FR-3508: route draft→ready through the pr-ready-gate skill by @yomybaby in #8682
- FR-3539: point THEME_NAME_REV at its source instead of a stale literal by @yomybaby in #8769
- FR-3535: document gh stack modify and the agent-safe restructure path by @nowgnuesLee in #8750
- FR-3709: complete the Astryx CLI catalog for backend.ai-ui by @yomybaby in #9138
- FR-3869: Set up the ADR process by @nowgnuesLee in #9458
- FR-3531: record that an Astryx
stringslot prop is a type, not a wall by @yomybaby in #8736 - FR-3952: record the walkthrough decisions in an ADR and the overlay glossary by @agatha197 in #9693
- FR-3992: make dev-server + walkthrough an ordered post-PR step by @agatha197 in #9761
User manual
Manual authoring rules and boilerplate cleanup.
- FR-3480: remove auto-refresh and self-evident table-state boilerplate by @ironAiken2 in #8619
- add "What NOT to Document" rules distilled from docs-autoupdate review feedback by @ironAiken2 in #9294
Automated updates
Automated updates to the user manual pages, plus the 26.8 PDF tag bump.
- Automated user manual page updates (116 PRs) by @lablup-octodog: #8623, #8940, #8942, #8943, #8941, #8939, #8994, #8992, #8995, #9022, #9023, #9021, #9020, #9024, #9027, #9028, #9026, #9025, #9031, #9033, #9029, #9030, #9034, #9091, #9119, #9120, #9118, #9098, #9157, #9097, #9191, #9190, #9090, #9092, #9093, #9094, #9096, #9116, #9117, #9121, #9095, #9159, #9158, #9160, #9293, #9292, #9310, #9313, #9311, #9307, #9383, #9374, #9371, #9308, #9379, #9372, #9373, #9380, #9375, #9376, #9377, #9382, #9400, #9401, #9402, #9399, #9451, #9550, #9549, #9552, #9548, #9553, #9551, #9565, #9566, #9567, #9581, #9578, #9577, #9580, #9576, #9579, #9575, #9625, #9626, #9622, #9623, #9624, #9717, #9718, #9679, #9715, #9808, #9807, #9809, #9810, #9811, #9817, #9815, #9805, #9814, #9858, #9859, #9861, #9867, #9863, #9864, #9862, #9816, #9914, #9913, #9868, #9812, #9813, #9865, #9857
- bump 26.8 pdfTag to v26.8.1 by @github-actions[bot] in #8624
Full Changelog: v26.8.1...v26.9.0