Search Match Highlighting
Show users why each result matched instead of making them hunt.
What it adds
Highlighted spans in search results marking the text that matched the query, rendered safely.
What your agent is told to do
5
What your agent is told to do
5-
1
Escape the record text first, then insert highlight markup. Escaping afterwards destroys your own markup, and skipping it gives you stored XSS.
-
2
Escape the query too before using it to match. A raw user query containing regex metacharacters will either throw or match the wrong thing.
-
3
Match case-insensitively but render the original casing from the source text — never the casing the user typed.
-
4
For long fields, truncate around the first match rather than from the start, so the snippet actually contains the highlighted term.
-
5
Do NOT highlight every occurrence in a long body. Cap the number of highlighted spans per snippet; a page of yellow is unreadable.
Edge cases it handles
6
Edge cases it handles
6- Overlapping and adjacent matches must merge into one span, not nest into broken markup.
- The query may match in a field that is not displayed. Either show that field's snippet or do not claim a match.
- Highlight markup must be decorative to assistive tech — do not make a screen reader announce a mark on every word.
- Accented and multi-byte characters must not be split mid-character by truncation.
- When the match came from a synonym or stem, the literal query string is absent; highlight the term that actually matched.
- Truncation must show that text was cut, and must not cut in the middle of a highlighted span.
Definition of done
8
Definition of done
8- Result text is escaped before highlight markup is inserted.
- Queries containing regex or HTML characters neither throw nor render as markup.
- Matching is case-insensitive and the original casing is preserved.
- Long fields truncate around the match, with an ellipsis indicating the cut.
- Overlapping matches merge into a single span.
- Screen readers do not announce the highlighting as separate content.
- The feature matches the existing design system.
- No existing functionality is broken.
Related features
Global Search
Global Search
One search box that finds anything in your app.
What it does
Search across every meaningful entity in the application from a single input.
How it works
- 1 Identify every entity worth searching, and report them before building.
- 2 Use the database's own search capability first (for example Postgres full-text search). Do not add Elasticsearch or a search SaaS unless the project already has one.
- 3 Return results grouped by entity type, strongest match first.
Copy the prompt
No account needed
Add this feature to my app:
https://addthisfeature.com/x/global-search
Voice Search
Voice Search
Let people speak a search query instead of typing it, and still edit what was heard.
What it does
A microphone control on the app's existing search field that turns speech into a query the user can correct before it runs.
How it works
- 1 Add the microphone to the search input the app already has. Do not build a separate voice search screen or a second results page; the spoken query must go through the same search, the same filters, and the same ranking as a typed one.
- 2 Show words as they are recognised, in the search field itself, so the user can see the microphone is working before the final result arrives.
- 3 Leave the recognised text in the field as ordinary editable text once recognition finishes. The single most common repair is the user fixing one wrong word and pressing enter.
Copy the prompt
No account needed
Add this feature to my app:
https://addthisfeature.com/x/voice-search
Saved Filters
Saved Filters
Let people keep the views they build.
What it does
Save a filter combination as a named view the user can return to.
How it works
- 1 Let a user name and save the current filter state, and list their saved views.
- 2 Store the filter definition, not the matching row IDs — a saved view must stay live as data changes.
- 3 Allow editing, renaming, and deleting saved views.
Copy the prompt
No account needed
Add this feature to my app:
https://addthisfeature.com/x/saved-filters
How it works
-
1
Copy the link
Grab the Markdown instruction URL for this feature.
-
2
Give it to your AI
Paste it into Claude Code, Cursor, v0, Lovable — whatever you build with.
-
3
It inspects, then implements
Your agent reads your existing app first, then adds the feature to fit it.
Works with your stack
These instructions are written to adapt. They tell the agent to detect your framework, match your existing design system, and reuse what you already have — rather than assuming a particular stack.
Need it tighter than that? Customize the feature and tell it exactly what you're running.