Conversation
The rename autosuggest on /people/[personId] searched only people the viewer owns. A Space editor naming a person detected in someone else's library owns none of the existing people, so the dropdown stayed empty and every typo created a new identity. It looked like an admin/editor difference only because the admin owned the library. Search with withSharedSpaces for both the suggestion dropdown and the exact-name merge check, and resolve suggestion thumbnails per profile so a Space person's avatar loads from the Space endpoint. The merge modal already routes Space-scoped people through the scoped merge. Fixes #1098
… modal When a Space editor renames a Space person to an existing Space person's name (#1100), neither side belongs to them, so the merge has to go through the scoped merge instead of the owner-only legacy merge.
… tile (#1099, #1100) The inline "Add a name" field on the People grids was a plain input, so an existing identity could only be reached by typing its exact name. That path didn't catch duplicates either: the global grid skipped its same-name check for Space people and searched only owned people, and the Space grid and Space person page renamed straight through. An editor naming a Space pet had no way to land on the existing one. - The grid can now show a suggestion dropdown (combobox, arrow keys and Enter). Picking a suggestion offers a merge instead of renaming. - The global grid suggests from shared spaces too. Its same-name check now covers Space people, and the post-merge rename goes through updatePersonName, so a Space person's name is written to the Space. - The Space grid and Space person page look for a same-named Space person before renaming, and offer the Space merge (with the cross-owner confirmation). Declining keeps the rename. Fixes #1099 Fixes #1100
🧪 Release candidate buildLatest RC Images published
How to run this RCIn the directory containing your services:
immich-server:
image: ghcr.io/open-noodle/gallery-server:pr-1136-rc.0Then pull and restart: docker compose pull immich-server
docker compose up -dEach push publishes a new numbered tag, so update the image line to move to a newer RC. To roll back, point it at an earlier Last updated Thu, 24 Sep 2026 17:55:54 GMT. Every push while the |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1098, fixes #1099, fixes #1100.
Cause
All three come from the same gap: naming a person never checked the name against people who already exist in a Space. The reports make it look like Admin vs Editor. It's really about who owns the people: the admin owns the library where the pets were detected, and the editor sees them only through a Space.
/people/[personId](EditNameInput→PeopleSearch) calledsearchPersonwithoutwithSharedSpaces, so it only returned people the viewer owns. For the editor that's nobody.<input>with no suggestions, for everyone. The only way to reach an existing identity was to type its exact name.isPersonalPrimarygate), and the check searched only owned people.updateSpacePersonstraight away.Together these left an editor naming a Space pet with no route to the existing one, which is how the reporter ended up with three "Norgy" entries.
Changes
Person page (
/people/[personId])withSharedSpaces.withSharedSpaces.getGlobalPersonThumbnailUrl, so a Space person's avatar loads from the Space endpoint instead of 404ing on the owner-only one.People grids (
people-management-grid.svelte)searchNameSuggestions/onSuggestionSelectprops add a suggestion dropdown under the tile's name field. It's a combobox (aria-activedescendant, arrow keys and Enter, Escape closes it).mousedownis cancelled so the click doesn't blur the input and commit the typed text first.Global People grid
searchPerson({ withSharedSpaces: true }).isPersonalPrimarygate is gone) and searches shared spaces. It dates from the global-identities change (feat: add global face identities across spaces #495), beforePersonMergeSuggestionModallearned to send Space people through the scoped merge.handleMergegoes throughupdatePersonNameinstead of the owner-onlyupdatePerson, so it writes to the Space for a Space person.Space People grid and Space person page
getSpacePeople({ name, named: true }).space-person-name-merge.ts, finds a Space person with the same name (ignoring case and accents). It then asks before running the Space merge, with the cross-owner confirmation. Both Space surfaces use it, and the Space person page's existing suggestion pick now uses it too, instead of its own copy.There are no server or i18n changes.
GET /search/person?withSharedSpaces=trueis already RBAC-scoped throughsearchAccessiblePeople, and the dropdown's label reuses the existingsuggestionskey.Not changed
The asset-viewer face editor and the assign-face panel still list only the viewer's own people. They reassign faces rather than name a person, so they're a separate question.
Tests
person-detail-page.spec.ts: an editor renaming a Space person gets shared-space suggestions with the Space thumbnail. Saving an exact shared name opens the merge modal.person-merge-suggestion-modal.spec.ts: a Space-to-Space merge goes throughmergeScopedPeople, nevermergePersonLegacy. This pins existing behaviour.people-page.spec.ts: a global grid tile suggests shared-space people and picking one opens the merge modal without renaming. A Space-primary tile given an existing shared name opens the merge modal.space-people-page.spec.ts: a Space grid tile suggests and merges on click and with the keyboard. Declining a picked suggestion changes nothing. A typed exact name (different case) offers the merge.space-person-detail-page.spec.ts: a typed exact name on the Space person page merges and navigates to the surviving person. Declining still renames.With the source changes set aside, the two #1098 page tests and the seven new grid and Space-page behaviour tests all fail. The decline-fallback test and the modal test pass either way; they pin existing behaviour.
Two existing tests changed. The Space grid's "no refresh after rename" check now allows name-filtered lookups. The Space person page's rename test waits for the save, which now looks up the name first.
The full web unit suite passes locally (6407 tests). Prettier, eslint and tsc are clean on the changed files. svelte-check reports no new warnings.