DEV Community

infz
infz

Posted on • Originally published at diggx.nian.me

I Built Digg X: A Chrome Extension That Turns X Bookmarks into a Searchable AI Research Inbox

I built Digg X because I had a personal problem:

I was bookmarking great posts and threads on X/Twitter every day, but I couldn't reliably turn them into reusable knowledge.

So I built a workflow-first Chrome extension:

  • Capture what matters while you browse X
  • Sync it into a structured cloud inbox
  • Run AI analysis on top of clean, versioned content

Chrome Web Store:
Digg X - The Social Scout


What Digg X does

At a high level, Digg X is a social intelligence layer on top of X:

  1. Extract content from posts/threads when you bookmark
  2. Convert raw content into Markdown + metadata
  3. Sync everything to a backend inbox (/api/v2/sync/inbox)
  4. Build profiles/insights around creators and content

I wanted this to feel native to browsing, not like "yet another dashboard."


Product architecture

Digg X is a monorepo with three main apps:

  • digg-x-ext: Chrome extension (Plasmo + React)
  • digg-x: Cloudflare Worker backend (Hono + D1 + KV + R2 + Queue)
  • digg-x-web: Web app (Vite + React Router + Pages Functions)

This split worked well:

  • Extension is optimized for capture and browser context
  • Worker backend is optimized for ingestion, sync, and APIs
  • Web app is optimized for browsing, organization, and reports

Key implementation details

1) Bookmark interception with fallback extraction

When a user clicks X's bookmark button, the extension intercepts that action, tries to extract structured data from bridge/JSON first, then falls back to DOM parsing if needed.

This reduced breakage when X's UI changed.

// Simplified from bookmark scanner logic
if (tweetId) {
  const tweetResult = await getTweetDataFromBridge(tweetId)
  if (tweetResult) data = MarkdownExtractor.extractFromTweetResult(tweetResult)
}

if (!data) {
  data = MarkdownExtractor.extractFromPage(bookmarkButton as HTMLElement)
}
Enter fullscreen mode Exit fullscreen mode

2) Structured sync API for ingestion

The extension sends normalized content to the backend sync endpoint:

PUT /api/v2/sync/inbox
Enter fullscreen mode Exit fullscreen mode

On the backend, this lands in D1 and object storage, with queue-based async processing for heavier tasks.

3) Side panel AI profile analysis

Digg X includes an analyzer flow in the side panel. It attempts API-based analysis first, and falls back to UI automation if the API route fails.

try {
  const result = await executeViaAPI(handle, prompt, lang, pluginI18n, selectors)
  return mergeWithDomData(result, domData, interceptedData)
} catch {
  const result = await executeViaUI(handle, prompt, lang, pluginI18n, selectors)
  return mergeWithDomData(result, domData, interceptedData)
}
Enter fullscreen mode Exit fullscreen mode

This "API-first, UI-fallback" strategy made the feature significantly more resilient.

4) Practical usage limits for free users

I added a lightweight local quota mechanism for free users (currently 3 analyses/day). It keeps costs controlled while still giving users a real experience.


Why Cloudflare for the backend

I chose Cloudflare because the stack maps well to this product shape:

  • Worker for fast API edge runtime
  • D1 for relational query patterns
  • KV for hot cache
  • R2 for content/media blobs
  • Queue for async enrichment

For a browser-first tool with many small sync operations, this setup has been cost-effective and operationally simple.


Lessons learned

1) "Capture quality" matters more than model quality

If extraction is noisy, downstream AI outputs are noisy. The biggest wins came from improving ingestion and normalization.

2) Build graceful degradation everywhere

Social platforms change often. Fallbacks (JSON -> DOM, API -> UI) are not optional in extension products.

3) Keep the first action incredibly fast

If saving content feels slow, users stop doing it. One-click capture with immediate feedback was critical.

4) Don't over-centralize too early

Keeping extension, API, and web responsibilities separate made iteration faster and safer.


What's next

I'm currently focused on:

  • Better semantic retrieval across saved items
  • Stronger creator-level insight scoring
  • More automation around weekly "research brief" generation

If you're building dev tools, research tools, or browser extensions, I'd love to compare notes.

Try Digg X:
Chrome extension

Web app

Top comments (0)