searchCards
Performs full-text search across card content, metadata, and AI-generated fields with advanced filtering capabilities.Arguments
Full-text search query. Searches across multiple fields:
- Card content
- Notes
- AI summary
- AI transcript (audio/video cards)
- Metadata title (link cards)
- Metadata description (link cards)
- User tags
- AI tags
"fav","favs","favorites"- Returns all favorited cards"trash","deleted","bin"- Returns all deleted cards
Filter by one or more card types.Available types:
text, link, image, video, audio, document, palette, quoteIf
true, returns only cards marked as favorites.If
true, returns only soft-deleted cards. Mutually exclusive with normal card queries.Filter by AI-detected visual styles. Only applicable to image and palette cards.Common values:
"minimal", "modern", "vintage", "abstract", "geometric", etc.Filter by color hue categories.Available hues:
"red", "orange", "yellow", "green", "blue", "purple", "pink", "brown", "gray", "black", "white"Filter by exact hex color codes.Useful for finding cards with specific brand colors.
Filter by creation date range.
Maximum number of cards to return. Results are sorted by creation date (newest first).
Returns
Array of cards matching the search criteria. Each card includes:
- All standard card fields
- Auto-generated file URLs (
fileUrl,thumbnailUrl, etc.) - Quote formatting applied for display
- User is not authenticated
- No cards match the filters
- Search query has no results
Search Behavior
Multi-Field Search
Multi-Field Search
When a
searchQuery is provided, the function searches across:- Content - Main card content (search_content index)
- Notes - User notes (search_notes index)
- AI Summary - AI-generated summaries (search_ai_summary index)
- AI Transcript - Transcripts for audio/video (search_ai_transcript index)
- Metadata Title - Link preview titles (search_metadata_title index)
- Metadata Description - Link descriptions (search_metadata_description index)
- Tags - User-defined tags (JavaScript filter)
- AI Tags - AI-generated tags (JavaScript filter)
Index Optimization
Index Optimization
Uses Convex search indexes for efficient full-text search:Each search index filters by:
userId- Only current user’s cardsisDeleted- Normal vs. deleted cardstype(if single type filter)isFavorited(if favorites only)
Visual Filter Queries
Visual Filter Queries
When visual filters are present (styles, hues, or hex colors):
- Uses dedicated facet indexes:
search_visual_styles,search_color_hexes,search_color_hues - Runs parallel queries for each filter type
- Intersects results to find cards matching all filters
- Over-fetches (
limit * 3) to account for filtering
Date Range Optimization
Date Range Optimization
When
createdAtRange is specified:- Uses
by_createdindex for efficient range queries - Applies deletion filter via
.filter()(not index) - Type filters applied as OR conditions in post-query filter
Special Keyword Handling
Special Keyword Handling
Certain search terms trigger optimized queries:
- Favorites:
"fav","favs","favorites","favourite","favourites"- Uses
by_user_favorites_deletedindex - Returns all favorited cards regardless of content
- Uses
- Trash:
"trash","deleted","bin","recycle","trashed"- Uses
by_user_deletedindex withisDeleted: true - Returns all deleted cards
- Uses
Deduplication
Deduplication
When searching across multiple indexes:
- Results from all searches are combined into a flat array
- Duplicates are removed using a Map keyed by card ID
- Additional filters (type, favorites, date range) are applied
- Results are sorted by
createdAtdescending - Limited to requested
limit
searchCardsPaginated
Paginated version ofsearchCards for loading large result sets incrementally.
Arguments
Pagination configuration object.
searchCards:
searchQuery,types,favoritesOnly,showTrashOnlystyleFilters,hueFilters,hexFilterscreatedAtRange
Returns
Pagination result object.
Pagination Behavior
Cursor-Based Pagination
Cursor-Based Pagination
For visual filters and search queries:
- Cursor is a stringified offset number (e.g.,
"0","20","40") - First page:
cursor: null→ starts at offset 0 - Next page:
cursor: "20"→ starts at offset 20 - Cursor increments by
numItemseach page
Index-Based Pagination
Index-Based Pagination
When using Convex indexes (no search query, no visual filters):Uses native Convex pagination:Cursor is opaque and managed by Convex internally.
Search Result Pagination
Search Result Pagination
For search queries with text search:
- Runs all search index queries in batches
- Deduplicates results incrementally
- Applies filters and sorting
- Slices to offset and page size
- Returns cursor as stringified offset
Performance Optimization
Performance Optimization
The function adjusts fetch limits based on page size:
- Search queries:
searchLimit = max(offset + pageSize + 20, pageSize) - Visual filters:
limit = max(desiredLimit * 2, desiredLimit + 40) - Tag searches:
tagSearchLimit = max(searchLimit + 20, searchLimit + 1)
Example: Infinite Scroll
Source References
searchCards:packages/convex/card/getCards.ts:96searchCardsPaginated:packages/convex/card/getCards.ts:400