Semantic Bookmark Search: Find Any Link Without Remembering the Title
Your bookmark library is only useful if you can find things in it. Keyword search breaks down when you can't remember the exact words. Semantic search understands what you mean — not just what you typed.
The problem with keyword search
You saved 2,000 bookmarks over five years. Now you need that article about database indexing you read last March. You type “database performance” — nothing useful comes up. You try “sql index” — still wrong. You give up and Google it again.
Keyword search only works when you remember the exact words the author used. It treats your query as a bag of characters to match, not a concept to understand.
✗ You think: “making my app faster”
✗ The article says: “React rendering optimisation”
✗ Keyword search finds nothing
How semantic search works
Semantic search converts text into vectors — lists of numbers that encode meaning. Similar concepts land close together in this vector space, regardless of the words used.
When you search, your query is converted into a vector too. The search engine finds bookmarks whose vectors are closest to yours — meaning bookmarks about similar ideas, not just matching words.
✓ You think: “making my app faster”
✓ Vector distance to “React rendering optimisation” = 0.12 (close)
✓ Semantic search surfaces it
The model powering this — in KeenMarks' case, BAAI's bge-base-en-v1.5 running on Cloudflare Vectorize — was trained on billions of text pairs to understand which phrases mean the same thing across different vocabulary.
Keyword vs semantic: real scenarios
You saved an article about React performance
Keyword
You search "react performance" → finds it ✓
Semantic
You search "making my web app faster" → finds it ✓
You saved a paper on neural network training
Keyword
You search "neural network" → finds it ✓
Semantic
You search "why my model is slow" → finds it ✓
You saved a link about managing cloud costs
Keyword
You search "aws bill" → misses it ✗
Semantic
You search "my infrastructure is expensive" → finds it ✓
You saved a link months ago, title forgotten
Keyword
You search partial title, get zero results ✗
Semantic
You search the idea you remember → finds it ✓
How KeenMarks implements semantic search
Every bookmark you save goes through a four-stage async pipeline on Cloudflare Workers:
- 1
Save
You add a URL. KeenMarks immediately extracts the title and meta description.
- 2
AI processing (30s)
Workers AI generates 3–7 tags and a 2-sentence summary using Llama 3.1.
- 3
Archive (5min, Pro)
The full page HTML is fetched and stored in Cloudflare R2 for link-rot protection.
- 4
Vectorize (10min)
The title + summary is embedded using bge-base-en-v1.5 (768 dimensions) and written to Cloudflare Vectorize.
When you search with ?mode=semantic, your query is vectorized on the fly and compared against all stored embeddings using approximate nearest-neighbour search. Results are re-ranked by cosine similarity.
When to use which mode
Use keyword (FTS) when…
- → You remember the exact title or URL
- → You're looking for a specific tag
- → You want precise matches only
- → Speed is critical (FTS is faster)
Use semantic when…
- → You only remember the idea
- → You're exploring a topic
- → The exact words escape you
- → You saved it months ago
Your bookmarks, queryable by AI agents via MCP
KeenMarks exposes a search_bookmarks tool over MCP. When Claude Code or Cursor calls it, the AI agent itself handles the semantic layer — you describe what you're looking for in natural language, the AI translates that into an effective search query, and FTS does the rest.
# You ask Claude Code:
"find that borrow checker article I saved"
# Claude calls:
search_bookmarks("rust borrow checker ownership")
# Returns: the article you saved 3 months ago
For in-app semantic search (vector mode), use the search bar with ?mode=semantic — available on the Pro plan.
Try semantic search on your bookmarks
Free tier includes 500 bookmarks and full-text search. Semantic search is available on Pro ($9/year).