Rekall built the search engine; the Front Desk is where humans walk up and use it. Phase 2b wires the same ranked-fuzzy core — SearchPosts over the trigger-fresh index — into every human web surface, so a person gets exactly the retrieval quality the agent already has. Three tracks, each self-contained: the Studio posts list, the API v1 list endpoint, and the kontent reader search.
Phase 2b — The Front Desk: web search surfaces
0 LOVES
0 VIEWS
Humans get the search the agent has. The same ranked-fuzzy core wired into the web surfaces: a Studio posts-list q, an API v1 q, and the kontent reader search — a sidebar field at every width plus a scoped category/tag header filter. The draft-leak gate proven on every surface. Shipped 2026-07-11.
Fork A — the /search page + the sidebar entry
The kontent reader search, rendered against the live CSS: the o-sidebar-search field at the top of the shared sidebar (every width), submitting to /search — ranked m-post-card results with the Phase-2 core doing the matching. Drafts never appear (the hydration draft-leak gate).
Three surfaces, one core — and the draft-leak gate
- Studio posts list — a
qparam + search box; fuzzy IDs hydrate through the posts service (authoring scope, so drafts are visible by design) with aLIKEfallback. Mirrors the media-collections list UI verbatim; staff-only, zero draft-leak risk. - API v1
GET /posts?q=— the list endpoint gainsq, reusing the list path's own visibility rules; also the dependency Phase 2c (Flutter) consumes. - Kontent reader search —
o_sidebar_searchin the shared sidebar body (one define, every width — pinned sidebar ≥1200px and the hamburger drawer below), a/searchpage + fragment, and a scoped category/tag header filter (Fork B): a magnifier on the header reveals an autofocused field that names the set ("Search in Gin Cocktails"). The two forks are complementary — A searches everything, B filters this set — the YouTube-channel-search pattern, anchored to the header so it ports 1:1 to Flutter.
The security edge, proven on every reader surface: fuzzy IDs come back, then hydration filters by published + visibility + subscription (CanReadPost), locale passed through. The test that keeps it honest: q=internal — the editor finds "Draft: Internal Notes" first; the anonymous reader gets nothing. Same query, different truth, no leak.