Repository navigation
RD-API-Server v1.5.0
Every picker whose list grows with the deployment now searches instead of listing it.
The problem
A fleet is thousands of devices. A directory-synced deployment has as many user groups as the directory does. Rendering either into a <select> builds every row into the DOM on page load — so the page is slowest for exactly the deployments with the most to manage, and the operator can only scroll it, never search for the name they already know.
Device and user pickers already worked this way. This release brings the rest into line:
| Picker | Was | Now |
|---|---|---|
| Remote control peer | 200 most-recent devices in a <select> |
Searched, online first |
| User group (create, edit, bulk bar) | Every group in scope | Searched |
| Admin role scoped groups | Every group in the deployment | Searched, as chips |
| Group "can access" | Every group in scope | Searched, as chips |
| Device group "accessible by" | Every group in scope | Searched, as chips |
Fixed lists — statuses, enum choices, quality presets — stay plain <select>s. A combobox for four options is worse, and the rule recorded in CLAUDE.md says so explicitly.
Multi-value selection
The existing combobox was single-value, which is why three pickers had remained multi-selects. It now supports multiple selections as removable chips, with Backspace on an empty box removing the last, and duplicates refused.
The component emits whichever shape the form already posted — a comma-joined hidden field, or one hidden input per value under an array name — so no controller, request validation or write path changed. That was the point: a conversion that alters the request shape is one that can silently save the wrong thing.
Chips use the existing design tokens; no new colours were introduced.
Fixed
The admin role scope picker showed every group in the deployment. It ran an unscoped query, so a delegate confined to a single group could read the names of every group in the deployment from the role form. Group names are not the most sensitive thing in the system, but a scope boundary that leaks the shape of what lies outside it is still a leak. It now goes through AdminScopeService like every other group query.
A dead query on every device-index page load. Every visit fetched every in-scope user, ordered them by name, and rendered none of them — the owner picker had been converted to a combobox and the query was left behind. On a large deployment it was the single biggest unbounded fetch on the page.
Upgrading
docker compose pull && docker compose up -dNo migration, no configuration change, and no request or API shape changed.
Image
ghcr.io/gigaionllc/rustdesk-api-server:1.5.0
Multi-architecture (AMD64/ARM64), digest sha256:5b853a9e93e82a7e6ef24af656384319335b1c7434f234dedc92dab64eb53d99. The latest, 1 and 1.5 tags point at the same manifest.
Verification
677 PHP tests, 253 web-client unit tests, 15 browser tests, Pint and PHPStan.
The multi-value combobox was also exercised in a real browser against the published image: searching, selecting, refusing a duplicate, removing a chip, and submitting — with the saved row read back out of the database to confirm the round trip. The PHP suite proves the request shapes; only a browser shows that the chips and their hidden inputs stay in step.
Full notes: docs/releases/v1.5.0.md
RD-API-Server is an independent, third-party, open-source project. It is not affiliated with, endorsed by, or sponsored by RustDesk or Purslane Ltd.