Skip to main content

Search Palette

A keyboard-driven command palette that searches everything in your library — photos, people, places, tags — and jumps to any admin or settings page, all from one input. Press Cmd+K (macOS) or Ctrl+K (Windows / Linux) to open it from anywhere in Gallery.

The top navigation search field opens this same palette. On searchable pages, the sort control next to the search field applies immediately to the current view, so searching and sorting live in one consistent place instead of separate page-specific search bars.

Each query runs in parallel against the configured providers and groups the results into named sections:

SectionWhat it returns
PhotosTop smart-search matches with thumbnails. Activate to open the asset viewer.
PeopleNamed faces from your library and any shared spaces you can access.
PlacesCities, regions, and countries from your reverse-geocoded photos.
TagsTags assigned to your assets, plus inherited tags from parent tags.
AlbumsYour albums, matched on album name.
Shared spacesSpaces you own or belong to, matched on space name.
CommandsVerbs — upload files, create things, sign out, toggle theme, manage pages.
NavigationAdmin and settings pages — fuzzy-matched against the live page catalog.

Empty sections collapse silently so the result list stays tight. If smart search is unhealthy (the ML server is unreachable), a banner appears at the top of the palette and offers a one-tap switch to filename mode.

Search modes

The footer shows the current matching mode for the Photos section. Press Ctrl+/ to cycle through them:

  • Smart — CLIP semantic search ("photos of a kitten on a couch")
  • Filename — Substring match against the original file name
  • Description — Substring match against your photo descriptions
  • OCR — Substring match against text extracted from your photos

The other sections (People, Places, Tags, Commands, Navigation) are unaffected by the mode — they always run their own provider.

Commands

Commands are verbs you can fire from the palette without leaving your current page. They live in their own section above Go to…, and the list is permission-aware: admin-only commands, album commands, space commands, and selection commands only appear when the current user and page context can run them.

Commands never appear in the Recent list. They're verbs, not destinations, and re-firing them belongs in the muscle-memory of the palette itself.

Global commands

These commands are available everywhere after login:

CommandWhat it does
ThemeSwitches between light and dark themes
UploadOpens the file picker so you can add photos or videos
New AlbumCreates a new album and jumps you straight into it
Create shared spaceOpens the Create shared space modal
Sign OutLogs you out and returns to the login screen
Keyboard shortcutsOpens the keyboard-shortcuts cheatsheet
Clear recent palette entriesEmpties your Recent list in the palette

Admin queue commands

Administrators see an extra group of commands for driving the job queues without leaving whatever page they're on. They are hidden from non-admin users.

CommandWhat it does
Run thumbnail generationStarts the thumbnail-generation job (equivalent to the Start button on the Jobs page)
Run metadata extractionStarts the metadata-extraction job
Run smart searchStarts the smart-search indexing job
Run face detectionStarts the face-detection job
Run face recognitionStarts the facial-recognition job
Pause all queuesPauses every processing queue in one shot
Resume all queuesResumes every paused queue
Clear failed jobsRemoves failed jobs from every queue (safe to fire even when none have failed)

Each Run… command confirms with a toast like Started: Thumbnail generation. The bulk commands (Pause all queues, Resume all queues, Clear failed jobs) fire a parallel request per admin-visible queue. If every request succeeds you get a single green confirmation; if any fail, a yellow warning toast reports "N of M queue operations failed" and the others still take effect. These commands target the same set of queues shown on Administration → Jobs, so the Jobs page is still the right place to watch per-queue progress in detail.

Album commands

When you open the palette from an album page, album-specific commands appear according to your permissions on that album:

CommandWhen it appearsWhat it does
Rename this albumAlbum ownerOpens the album edit modal
Share this albumAlbum ownerOpens album sharing and access management
Download this albumAnyone who can access the albumDownloads all album assets as a zip
Leave this shared albumShared-album member who is not ownerRemoves you from the album and returns to Albums
Delete this albumAlbum ownerPermanently removes the album and returns to Albums

Selection commands

When one or more assets are selected on a supported timeline page, the palette also shows bulk actions for that live selection:

CommandWhen it appearsWhat it does
Add selected to album...Selection exists on a page that can add assets to albumsOpens the album picker for the selected assets
Add selected to space...Selection exists on a page that can add assets to spacesOpens a space picker so you can choose a writable shared space
Add selected to this spaceCurrent shared-space page is writable, the page is in the add-assets flow, and the selected count is safeAdds the selected assets to the current writable shared space
Add selected to favoritesSelected assets are owned by you and are not all already favoritesMarks the selected assets as favorites
Archive selectedSelected assets are owned by you and are not all already archivedMoves the selected assets to archive
Delete selectedSelected assets are owned by youMoves selected assets to trash, or permanently deletes assets already there

These commands only appear when the current page can safely run them. Favorite, archive, and delete require assets you own. Add selected to this space is shown only inside a writable shared space, only while choosing assets to add, and only when the selected count is within the per-request shared-space limit. Readers and other non-writers do not see commands that would modify the space.

Shared-space commands

When you open the palette from a shared-space page, space-specific commands appear according to your role in that space:

CommandWhen it appearsWhat it does
Add photos to this spaceCurrent space is writableStarts the asset-selection flow for adding photos to this space
Manage space membersSpace ownerOpens the member management modal
Add a member to this spaceSpace ownerOpens the add-member modal
Add all my photos to this spaceCurrent space is writableQueues a background job to add all of your assets to the space
Leave this spaceSpace member who is not ownerRemoves you from the space and returns to Spaces
Delete this spaceSpace ownerPermanently removes the space and returns to Spaces

Readers and other non-writers do not see write actions like Add photos to this space, Add selected to this space, or Add all my photos to this space. Space-owner actions are separate from write access: a user can be able to add photos without being able to manage members or delete the space.

Destructive confirmations

Destructive commands keep the palette confirmation step: press Enter once to arm the command, then press Enter again to confirm or Esc to cancel. This applies to destructive album commands, destructive space commands, and Delete selected. Permanent asset deletes can still show the normal delete confirmation modal after the palette confirmation.

Navigation entries are destinations rather than commands. They appear in the Navigation, Admin, and System Settings groups, and can be found with normal search or the > prefix.

Admin pages and system settings are hidden from non-admin users. Feature-gated destinations, such as Map and Trash, only appear when that server feature is enabled.

User pages:

EntryWhere it goes
PhotosMain library timeline
AlbumsAlbum list
PeoplePeople and face list
TagsTag browser
MapMap view, when enabled
SharingShared links and sharing
SpacesShared spaces list
TrashTrash, when enabled
FavoritesFavorite assets
ArchiveArchived assets
MemoriesMemories page

Admin pages:

EntryWhere it goes
UsersUser management
External LibrariesExternal library management
Job QueuesProcessing queues
Server StatsSystem statistics
MaintenanceBackup, restore, and maintenance

System settings:

EntryOpens this settings panel
Authentication SettingsAuthentication
Database Dump SettingsBackup
Image SettingsImage
Job SettingsJobs
External LibraryExternal libraries
LoggingLogging
Machine Learning SettingsMachine learning
Auto-ClassificationClassification
Map & GPS SettingsLocation and map
Metadata SettingsMetadata
Nightly Tasks SettingsNightly tasks
Notification SettingsNotifications
Server SettingsServer
Storage TemplateStorage template
Theme SettingsTheme
Trash SettingsTrash
User SettingsUser settings
Version CheckVersion checks
Video Transcoding SettingsVideo transcoding

Unscoped: command-first tie-break

When a command and a navigation entry score similarly against an unscoped query, the command wins the Top result slot. So plain album activates New Album on Enter, and plain upload activates Upload — even though the Albums and Library pages also match.

Prefix shortcuts

Start a query with a prefix character to restrict results to a single scope. The prefix is consumed by the palette and is not part of the query text, so @alice, #xmas, /trip, and >theme search the relevant scope for alice, xmas, trip, and theme respectively.

PrefixScopeWhat it searches
@PeopleNamed faces only
#TagsYour tags only
/Albums + shared spacesBoth collection types at once
>Commands + navigationPalette commands and admin / settings pages

When a prefix is active, all other sections (Photos, Places, and the two you didn't pick) are hidden for the duration of that query. Prefixes are handy when a bare query is dominated by photos and you want a single section to come through cleanly, or when you know exactly which kind of thing you're after.

Bare-prefix browsing

Typing just the prefix character with nothing after it opens the full index for that scope, so the palette doubles as a lightweight browser for recent people, tags, collections, and admin pages:

  • @ — your people, most-recently-updated first
  • # — your tags, most-recently-updated first
  • / — your most-recently-active albums and shared spaces
  • > — every command and navigation entry you have access to, alphabetical

This is faster than reaching for a sidebar when you just want to glance at recent activity.

Top result band

Typing plain free text in the palette creates a synthetic Top result row: Search for "…". Hitting Enter on that row routes the query to the current page's search surface when one exists. Pages without a filter panel fall back to /photos?q=....

When your query closely matches a single command or navigation entry, that entry takes over the Top result slot instead of the generic search row. Hitting Enter activates it immediately, no arrow keys needed.

Promotion is based on a fuzzy score against the title, description, and search keywords. Commands win tie-breaks against navigation entries, so unscoped verbs like upload or album surface their command first. A short query like peo will surface People as the top result; users will surface Administration → User Management.

Typed filter suggestions

On searchable pages, typed filters can be mixed with free-text search:

beach person:anna tag:travel country:Germany city:Berlin

While the cursor is inside person:, tag:, country:, or non-empty city:, the palette shows a compact filter-match section before the normal results. Selecting a row rewrites only that token to the canonical value, such as person:"Anna Maria", and keeps the final search under the normal Enter validation path.

Live filter rows apply filters; they do not navigate to person or tag pages. camera: still resolves only when the search is submitted.

When you open the palette from a page that supports inline search, Gallery preloads the page's current query and sort mode. Submitting a new free-text query updates the page URL instead of navigating away:

Current pageWhere Search for "…" applies
Photos/photos?q=... with the selected relevance / newest / oldest sort
Shared space detailThat space's timeline, scoped to the space's assets
Shared space photos routeThat space's photos route, preserving route context
MapThe map markers, combined with active map filters
Any other page without a search scopeFalls back to the Photos timeline

The URL carries the query in q and, when needed, the sort in sort=asc or sort=desc. Clearing the search chip removes q and returns the page to its normal date ordering.

Typed filter syntax

You can add advanced filters directly to a palette search by typing key:value tokens alongside normal search text:

beach person:anna from:2025 to:2026 camera:nikon

Pressing Enter applies the plain words as the search query and applies the typed filters to the current searchable page's filter state. On Photos, the query stays on /photos; inside a shared space, it stays scoped to that space. Pages without a searchable context fall back to the Photos timeline.

Typed filters are a keyboard shortcut for the existing filter panel. After submission, the active filter chips and filter panel reflect the same filters, and the URL can be refreshed or shared.

Supported filters:

FilterExampleNotes
person:<name> or people:<name>person:annaResolves to a matching named face. Repeat to filter by multiple people.
tag:<name> or tags:<name>tag:natureResolves to a matching tag. Repeat to filter by multiple tags.
from:<date>from:2025Start date. Accepts YYYY, YYYY-MM, or YYYY-MM-DD.
to:<date>to:2026-03End date. Accepts YYYY, YYYY-MM, or YYYY-MM-DD.
city:<value>city:"New York"Filters by reverse-geocoded city.
country:<value>country:GermanyFilters by reverse-geocoded country.
camera:<value>camera:nikonResolves to a known camera make or model.
type:<photo|image|video>type:videophoto is treated as image.
favorite:<true|false>favorite:trueAlso accepts yes, no, 1, and 0.
rating:<1-5>rating:4Filters by minimum star rating.

Use quotes when a filter value contains spaces:

person:"Anna Maria" city:"New York"

Filters are resolved only when you press Enter, not while you type. If a person, tag, or camera value has no match, or if multiple matches are possible, the palette stays open and asks you to fix or choose a result. Invalid filters such as persn:anna, rating:9, from:soon, or a repeated scalar filter block submission instead of being ignored.

Recents

Every destination or free-text search you activate is added to a Recent list (per user, per browser). When you reopen the palette with an empty query, your last few activations are shown immediately so you can repeat a workflow with two keystrokes.

  • Recent entries that are no longer accessible (admin pages after a demotion, deleted people, removed tags) are filtered out automatically the next time you open the palette.
  • Remove a single entry with the × button on the row, or with Delete while it's highlighted.
  • Re-activating a query recent runs that query immediately on the current searchable page, instead of just filling the input.

When you open the palette for the first time on a fresh browser — no recents yet — a curated set of Quick links is shown instead, so the empty state is still useful. The quick-link set is admin-aware: non-admins don't see admin destinations.

Preview pane

On large screens (≥ lg breakpoint) a preview pane appears to the right of the result list:

  • Photos → larger thumbnail with file name and an Open affordance
  • People → face thumbnail with the person's name
  • Places → region/country breakdown
  • Tags → tag value with parent path

The preview updates as you arrow up and down through the list. On smaller screens it's hidden — the result list takes the full width and previews don't get in the way.

Keyboard reference

KeyWhat it does
Cmd+K / Ctrl+KOpen the palette from anywhere
EscClose the palette
/ Move through results — wraps at top/bottom
EnterActivate the highlighted result
DeleteRemove the highlighted Recent entry
Ctrl+/Cycle the Photos search mode (smart → filename → description → OCR)
Shift+TToggle the theme (light / dark)

How it stays responsive

  • Each provider runs on its own 150 ms debounce with a 15 s timeout via AbortSignal.timeout. A slow people query never blocks photos from rendering.
  • The palette uses a stale-while-revalidate rule: when a query is being re-run, the previous successful results stay visible until new ones arrive. No skeleton flash between keystrokes.
  • A thin progress stripe appears across the top after a 200 ms grace window if any provider is still in flight, so you know work is happening when results are slow.
  • The navigation provider runs synchronously against an in-memory catalog of admin/settings pages, so you see jumps from the very first keystroke even before the network comes back.