Grilling the search feature
How a "simple" search feature got 6 questions deep before I knew what to build.
I came in thinking “site search, an afternoon job.” Six questions later I had the actual scope and a much shorter list of things to build. The agent caught two assumptions I hadn’t realised I was making.
The session
Agent: When you say “everything,” do you mean every prompt, every grilling transcript, every PRD — or just the published ones? Drafts too?
Me: Only what’s already on the site. If it’s not linked from somewhere, it’s not in scope.
Agent: What part of each item should be searchable — title only, title plus description, or the full body?
Me: Full body. Half the point is that someone can search for a phrase they remember from a transcript and land on it.
Agent: Synchronous as-you-type, or submit-then-results?
Me: As-you-type. No submit button. Mobile users especially.
Agent: Where does the index live? Client-bundled JSON, a server endpoint, or both? Bundle size matters on conference wifi.
Me: Client-bundled. The corpus is small. Avoid the server round-trip. If the bundle ever gets above 200 KB we move it server-side.
Agent: What happens when there are zero matches? Empty state copy, suggestions, recent items?
Me: Just “No matches.”. No cute fallbacks. If they typed something that doesn’t exist, they typed something that doesn’t exist.
Agent: Is this discoverable from the global nav, or only via the demo page? It changes how much polish it needs.
Me: Demo page only for now. If it gets used, promote to nav later. Don’t pay for nav-level polish on something nobody might use.
What we decided
- Client-bundled JSON, built at compile time from all three collections.
- Type-as-you-go, all whitespace-separated terms must match (AND, not OR).
- Title + description + full body all searchable, case-insensitive.
- “No matches.” is the entire empty state.
- No fuzzy matching, no stemming. v2 if needed.
- Linked from
/demos/searchonly. No global nav entry. - Bundle budget: < 200 KB for the search payload. Above that, server-side it.
The grilling took about four minutes. The implementation was a React
island plus a single Astro page reading the three content collections.
PRD lives at /prd/search. Shipped feature at /search.