Skip to main content
opini

Search

One box across every umbrella, comment, release, and raw feedback row in the project. Open with cmd-K (or ctrl-K), or click the pill in the top bar.

Opening the palette

Two entry points, same results surface:

  • Keyboard. cmd-K on macOS, ctrl-K on Windows/Linux. Works anywhere in the dashboard.
  • Top bar. The always-visible search pill in the dashboard chrome. On narrow screens it collapses to an icon that opens the palette directly.

Results are grouped by kind — umbrellas first, then comments, releases, feedback. Groups with zero hits hide their header. Arrow keys cycle, Enter opens, Escape closes.

What's searched

EntityRows includedFields
UmbrellasAll, including archivedtitle, body, author, tag names
CommentsApproved onlybody, author
ReleasesDrafts + publishedtitle, body, author
FeedbackTriage, attached, archivedbody, author

Pending and rejected comments are excluded deliberately — unreviewed text never shows up in the palette, not even to admins. Submitter email addresses are never in the result payload.

Ranking & snippets

Matches are ranked by where they land: titles weigh heaviest, then body text, then author names, then tag names. Multi-word matches that stay close together rank higher — a three-word query that all hit the title beats a query that scatters matches across a 2000-word release body.

Snippets show ~30 words around the match with <mark> highlights. Ties on rank break by recency — the most recently touched row wins.

Query syntax

Type what you'd type into any other search box. A few extras work:

  • "exact phrase" — double quotes force matching in order.
  • -word — leading minus excludes a term.
  • word1 or word2 — literal or between terms broadens the match.

Empty query returns no results — the palette waits for at least one character.

Scope & privacy

  • Admin-only. Search lives inside the authed dashboard shell — visitors to your public roadmap don't have access.
  • Per-project. One project at a time. Switching projects rescopes the results without rebooting the palette.
  • Size-capped. Up to 100 hits per query. Past that, refine the query — this is intentional; a "show more" pager would imply pagination is the right answer, and it isn't.
  • Rate-limited. Live typing hits a separate rate-limit bucket with a generous budget. Automated callers should debounce.

Search API

The palette is thin glue over a single authed endpoint:

  • GET /api/v1/projects/{project_id}/search?q=&limit=

Returns a list of typed hits (kind, entity_id, title, snippet, rank, updated_at). Full schema + parameters live in the OpenAPI reference at /docs/api.