Features / Search Palette

Search Palette

A keyboard-first command palette that searches photos, people, places, tags, and jumps to any settings page — opens with Cmd/Ctrl+K from anywhere in Gallery.

searchkeyboardnavigationdiscovery Documentation
Gallery's photo timeline with the Cmd+K search palette open over it, showing 'mountains' typed into the input, photo and place result sections, and a preview pane on the right with a mountain lake thumbnail

One input for everything in your library

Press Cmd+K on macOS or Ctrl+K anywhere else, and a single search box opens over whatever page you're on. Type a query and Gallery hits five providers in parallel — photos, people, places, tags, and the page catalog — then groups everything into named sections so you can see at a glance what kind of match you're looking at. Pick a result with the arrow keys and hit Enter; the palette knows whether to open the asset viewer, jump to a person's page, drop you on a map, or navigate to a settings screen.

The classic search bar in the navbar still works exactly as it did. The palette is a second, faster entry point — built for the moment when you already know roughly what you want and just need to get there in three keystrokes.

Navigation that responds from the first keystroke

Photos and people travel over the network — they take a few hundred milliseconds, even on a fast server. Navigation doesn't wait. The palette keeps the full Gallery page catalog in memory and fuzzy-scores it synchronously inside the same setQuery call that fires the network requests, so jumps to People, Map, Sharing, or any admin screen show up the instant you start typing.

When the query is a near-perfect match for one navigation entry, that entry is promoted into a dedicated Top result band at the top of the list. Hitting Enter activates it without a single arrow press — the most common "open this page" case becomes a one-shot keyboard gesture.

Search palette with 'peo' typed into the input, showing People as the Top result, then Places (Paizhou, Péone, Yaxché de Peón) and Navigation entries (Sharing, Map, Spaces) below

Stale-while-revalidate, so the list never blanks

Every keystroke fires a fresh batch of provider calls, but the palette doesn't wipe the old results to show a skeleton while it waits — that produces a frustrating flicker on slower servers. Instead, the previous successful results stay visible until the new ones land, and only the sections that change actually update. Typing into the box feels like filtering an in-memory list, not poking a remote API.

Each provider runs on its own 150 ms debounce with a 5 s timeout via AbortSignal.timeout, and an in-flight counter discards stale batches whose responses arrive after a newer query has already been fired. A thin progress stripe appears across the top after a 200 ms grace window when something is still loading, so you always know whether the empty section means "nothing matched" or "still working".

Search palette with 'paris' typed into the input, listing five matching photos with thumbnails on the left and three location matches (Paris in Île-de-France, Paris Léona, Paris in Herrera Province), with a Parisian building thumbnail in the preview pane on the right

Smart, filename, description, OCR — all from one footer

The Photos section can search four different ways. Smart is the default — CLIP semantic search, ranking by visual meaning, so "kitten on a couch" works even if no one ever typed those words. Filename matches the original file name, useful when you remember an export pattern or a camera's naming scheme. Description hits any captions you've added, and OCR searches text Gallery extracted from the photos themselves — receipts, signs, screenshots.

Cycle modes with Ctrl+/ without ever leaving the input. The footer shows the active mode and the keyboard hint, so the affordance is always discoverable but never in the way.

If the ML server happens to be unreachable, the palette notices and offers a one-click flip to filename mode, so a flaky machine-learning container doesn't take search down with it.

Recents that come back where you were

Every result you activate gets remembered, scoped per user and per browser. The next time you open the palette with an empty query, your last few activations are already there — the photo you opened a minute ago, the person whose page you visited yesterday, the admin screen you tweaked this morning. Repeating a workflow is two keystrokes: Cmd+K, then Enter.

Recents stay honest as your library changes. Entries that you no longer have access to — admin pages after a demotion, deleted people, removed tags — are filtered out automatically the next time you open the palette. You can remove individual entries with the small × button on the row, or hit Delete while the entry is highlighted.

And on a brand-new browser with no history yet, an empty open isn't dead air: a curated set of Quick links shows up instead, admin-aware so non-admins don't see destinations they can't reach. The palette is useful from the very first time you open it.

Search palette opened with an empty query, showing a Recent section with a recently opened photo, the Paris location, the Photos page, and two more photos — with the most recent photo's thumbnail in the preview pane on the right

A preview pane on screens that have room

On larger viewports, the palette splits in two: the result list on the left, and a content-sized preview pane on the right. Arrow up and down through the list and the pane updates with the right kind of preview for each result — letterboxed photo, face thumbnail, place breakdown, tag with parent path. On smaller screens the preview hides and the result list takes the full width, so the palette stays useful from a phone-sized viewport up to a wide desktop.

Built to live alongside, not replace

The classic search bar still does what it's always done. The palette is a different shape of search — keyboard-first, multi-entity, navigation-aware — and it earns its place by being faster, not by being mandatory. Whichever your hands reach for first is the right one.

Read the full documentation on GitHub

See Search Palette in action or set up your own instance.