DEV Community

Jagadeesh Jayachandran
Jagadeesh Jayachandran

Posted on

I Built a Chrome Extension That Finally Makes Bookmarks Searchable — Here's How

The Problem Nobody Talks About

You know that feeling. You saved a link weeks ago — a brilliant tutorial, a useful tool, a must-read article. Now you need it. You type something vague into your bookmarks search bar... and get nothing.

So you open your bookmarks manager and start clicking through folders named "Useful", "Dev Stuff", "Read Later", and "Misc". Twenty minutes later, you give up and just Google it again.

I had this problem every single day. And after years of dealing with it, I decided to build a proper solution.

That's how Recall: Smart Bookmark Search was born.


What Is Recall?

Recall is a Chrome extension that transforms your bookmark library from a cluttered folder system into an intelligent, searchable knowledge base. Instead of remembering exact titles or folder paths, you can search like a human:

  • "that webpack config article"
  • "React tutorial from last week"
  • "design tools from the CSS conference"

And it actually finds them.

Chrome Web Store: Install Recall


The Technical Foundation

1. Content Indexing — Going Beyond the Title

The biggest insight was this: the page title is almost never what you remember. You remember what the page was about.

So when you save a bookmark, Recall injects a content extractor script that scrapes:

  • Page title and URL
  • Meta description and keywords
  • H1, H2, H3 headings
  • Main body paragraphs
  • Image alt text
  • Link titles

It then extracts the top 50 keywords by frequency, weighted by their position in the document. This becomes your searchable index.

// Simplified keyword extraction
function extractKeywords(content) {
  const words = tokenize(content);
  const frequency = {};
  for (const word of words) {
    if (!isStopWord(word)) {
      frequency[word] = (frequency[word] || 0) + 1;
    }
  }
  return Object.entries(frequency)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 50)
    .map(([word]) => word);
}
Enter fullscreen mode Exit fullscreen mode

2. Fuzzy Search with Levenshtein Distance

Exact string matching is useless when you can't remember the exact title. Real search needs to tolerate typos and partial matches.

I implemented fuzzy matching using the Levenshtein distance algorithm — so "devinci" still matches "DaVinci", and "recat" still finds "React".

3. Smart Relevance Scoring

Not all matches are equal. Recall scores results across multiple signals:

Signal Points
Tag match +25
Phrase in title +20
Title keyword match +20
Description match +12
URL keyword +15
Content keyword +10
Saved recently (<7 days) +5

This means if you tagged something "css-tricks", it bubbles to the top immediately.

4. Auto-Categorization

Nobody wants to manually categorize every bookmark. Recall uses URL pattern matching and content keyword analysis to auto-assign one of 12 categories:

Development, Education, Entertainment, Productivity, Finance, Health, Design, Food, Travel, News, Books, Other

// Example category detection
if (url.includes('github.com') || url.includes('stackoverflow.com')) {
  return 'Development';
}
if (url.includes('coursera.org') || url.includes('udemy.com')) {
  return 'Education';
}
Enter fullscreen mode Exit fullscreen mode

Features That Make It Practical

Visual Snapshots

When you save a bookmark, Recall automatically captures a screenshot of the page. This is surprisingly useful — you often recognize a page visually before you remember its title.

Reading List

Shift+Click the save button to add anything to your reading queue. Your dashboard shows the top 3 items at all times, so nothing gets buried.

Duplicate Detection

Uses URL normalization (strips UTM params, tracking tokens) plus Jaccard similarity on titles with an 80% threshold. It catches duplicates even when URLs are slightly different.

Dead Link Validation

Batch HTTP status checking with Archive.org fallback for 404s. Dead links get marked with a warning badge so you can clean up your library.


Challenges I Solved

Storage limits: Chrome extensions have a 10MB default storage quota. For large bookmark collections with screenshots, this fills up fast. I switched to chrome.storage.local with unlimitedStorage permission and added base64 compression for snapshots.

Manifest V3 restrictions: Background service workers in MV3 are ephemeral — they spin down when idle. I had to carefully architect the indexing pipeline to handle interrupted jobs gracefully.

Search speed: With 1,000+ bookmarks, naive search was too slow. Pre-building keyword indexes at save time (rather than search time) brought results down to under 300ms.


What's Next

  • Semantic search using local embeddings (no server required)
  • Firefox support
  • Sync across devices (opt-in, encrypted)
  • Browser history integration

Try It

If you're drowning in bookmarks, give Recall a try. It's free, requires no account, and keeps everything 100% on your device.

👉 Install on Chrome Web Store

I'd love to hear what features you'd want next — drop them in the comments below!

Top comments (0)