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:
- Extract content from posts/threads when you bookmark
- Convert raw content into Markdown + metadata
- Sync everything to a backend inbox (
/api/v2/sync/inbox) - 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)
}
2) Structured sync API for ingestion
The extension sends normalized content to the backend sync endpoint:
PUT /api/v2/sync/inbox
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)
}
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)