Module guide
Unified search
One query across tasks, wiki, projects, goals, and comments.
Overview
A single search surface powered by a deterministic ranker. Results come back grouped per entity type with facet filters, and the ranker upweights exact title matches, recency, and whole-word hits.
Highlights
The capabilities worth knowing before you dive in.
- Cross-entity: task, wiki, project, goal, and comment
- Kind filter as a query param or a facet pill
- Deterministic ranker: the same query returns the same order every time
- Wired into the ⌘K palette so scope prefixes (`w runbook`) hit /search under the hood
Important to know
Limits, permissions, and sharp edges to keep in mind.
- Search is case-insensitive and substring-based today; tsvector plus BM25 is coming for large workspaces.
- Tenant isolation is enforced through the Prisma middleware, so there is no cross-tenant leakage.
How to use it
The primary workflow, start to finish.
- Type at least 2 characters to trigger a search.
- Click a facet pill to scope the results.
- Press Enter on a hit to open it in the detail drawer on the right.
FAQ
- Why is search slow on very large corpora?
- The current implementation is `WHERE title contains ...`, which is fine up to roughly 100k rows per entity. A tsvector plus GIN index is next.
- Can somebody in another workspace find our content through search?
- No. Tenant isolation is enforced in the data layer rather than in the query that the search screen happens to send, so there is no cross-tenant result to leak.
- Why did a partial word match something I did not expect?
- Search is case-insensitive and matches substrings today, so a fragment can appear inside a longer word. Full text ranking is planned for large workspaces and will make matching more precise.
Automate this module
Everything on this screen is scriptable. Drive it from the REST API, or let an AI agent run it through the MCP server.
Was this page helpful?