This release adds cursor pagination to the device list API, shows devices waiting under a provisioning key on the Devices page, and moves namespace switching into a picker under the tab strip.
Read a whole namespace's devices by cursor
GET /api/devices has a cursor mode for integrations that walk every device in a namespace. Send page[size] (and page[after] on later pages) instead of page and per_page. The response carries the next cursor in X-Next-Cursor and in a Link: rel="next" header, and leaves both out on the last page. A device created or renamed during the walk no longer shifts a later page, so a walk returns each device once.
On a namespace with 100,000 devices, page 999 in page mode took 82 ms. The same position in cursor mode takes under 5 ms, because cursor mode skips the total count and the offset. page[size] defaults to 100 and is capped by the new SHELLHUB_DEVICE_LIST_MAX_PAGE_SIZE. Page mode is unchanged (#7788).
Upgrading? Migration
055adds an index on devices by namespace, creation time and id. It is builtCONCURRENTLY, so the devices table stays writable while it builds.
Devices waiting for approval, wherever they registered
In a namespace that registers devices through provisioning keys, the Devices page linked only the tenant ID queue and never counted the devices a key left pending. The toolbar is now one row: search, Filters, Waiting for approval and Add Device. Waiting for approval lists each key with devices pending and opens that key's activity. In a legacy namespace it still links the tenant ID queue. The Dashboard's Review pending goes to the same place (#7791).
Operators may accept devices, but they could not see the ones pending under a key, because listing provisioning keys was administrator-only. Operators can now list keys and review their pending devices. Revealing, creating, editing, disabling and revoking a key stay with administrators, and neither the key secret nor the webhook secret is ever returned (#7784).
Open a namespace from the tab strip
The + on the tab strip opens a namespace picker: the current namespace, then those open in tabs, then the rest from A to Z, plus Connect to a device, Create namespace and Admin Console. Ctrl K now lists devices only, from A to Z and without repeating the recent ones (#7790).
Also in this release
Fixes
- Accepting, cancelling, resending and creating a namespace invitation no longer race. The request that loses gets 404 or 409 instead of going through, and a user holds at most one pending invitation per namespace (#7792)
Upgrading? Migration
056keeps only the newest pending invitation per user and namespace before adding the unique index.
Under the hood
- CI workflows run with read-only tokens and stop persisting checkout credentials (#7785). Welcome, @Totara-thib, on your first contribution
- Dependency updates: Node 24.22.2, Docker 29.9.3, @redocly/cli 2.72.0 (#7786, #7789, #7793)
Full Changelog: v0.29.2...v0.29.3