Self-hosted Twitter/X bookmark manager with AI-powered organization
Import ยท Analyze ยท Categorize ยท Search ยท Explore
Siftly turns your Twitter/X bookmarks into a searchable, categorized, visual knowledge base โ running entirely on your machine. No cloud, no subscriptions, no browser extensions required. Everything stays local except the AI API calls you configure.
It runs a 4-stage AI pipeline on your bookmarks:
๐ฅ Import (built-in bookmarklet or console script โ no extensions needed)
โ
๐ท๏ธ Entity Extraction โ mines hashtags, URLs, mentions, and 100+ known tools from raw tweet data (free, zero API calls)
โ
๐๏ธ Vision Analysis โ reads text, objects, and context from every image/GIF/video thumbnail (30โ40 visual tags per image)
โ
๐ง Semantic Tagging โ generates 25โ35 searchable tags per bookmark for AI-powered search
โ
๐ Categorization โ assigns each bookmark to 1โ3 categories with confidence scores
After the pipeline runs, you get:
- AI search โ find bookmarks by meaning, not just keywords ("funny meme about crypto crashing")
- Interactive mindmap โ explore your entire bookmark graph visually
- Filtered browsing โ grid or list view, filter by category, media type, and date
- Export tools โ download media, export as CSV / JSON / ZIP
- Node.js 18+
- npm (comes with Node.js)
That's it. If you have Claude Code CLI installed and signed in, AI features work automatically โ no API key needed.
git clone https://github.com/viperrcrypto/Siftly.git
cd Siftly
./start.shstart.sh installs dependencies, sets up the database, checks for Claude CLI auth, and opens http://localhost:3000 automatically.
If you're using Claude Code to set up the project, it will read CLAUDE.md and know exactly how to get started. Just open the project folder:
git clone https://github.com/viperrcrypto/Siftly.git
claude Siftly/Claude Code will handle setup and start the app using your existing Claude subscription โ no extra configuration needed.
git clone https://github.com/viperrcrypto/Siftly.git
cd Siftly
npm install
npx prisma generate
npx prisma db push
npx next devSiftly automatically detects the best available auth method โ no configuration needed in the most common case.
| # | Method | How |
|---|---|---|
| 1 | Claude Code CLI (zero config) | Already signed in? Siftly reads your session from the macOS keychain automatically |
| 2 | API key in Settings | Open Settings in the app and paste your key |
| 3 | ANTHROPIC_API_KEY env var |
Set in .env.local or your shell environment |
| 4 | Local proxy | Set ANTHROPIC_BASE_URL to any Anthropic-compatible endpoint |
If you use Claude Code, you're already signed in. Siftly detects your session from the macOS keychain and uses your Claude subscription (Free/Pro/Max) automatically.
The Settings page shows a green "Claude CLI detected โ no API key needed" badge with your subscription tier when this is active.
Note: This works on macOS. On Linux/Windows, add an API key in Settings instead.
- Go to console.anthropic.com
- Create a new API key
- Open Siftly โ Settings โ paste it in
New accounts include $5 free credit โ enough for thousands of bookmarks at Haiku pricing (~$0.00025/bookmark).
Siftly has built-in import tools โ no browser extensions required. Go to the Import page and choose either method:
- Go to Import in the Siftly sidebar
- Drag the "Export X Bookmarks" link to your browser's bookmark bar (or right-click the bookmark bar โ Add Bookmark โ paste the URL)
- Go to x.com/i/bookmarks while logged in to X
- Click "Export X Bookmarks" in your bookmark bar โ a purple button appears on the page
- Click "โถ Auto-scroll" โ the tool scrolls through and captures all your bookmarks automatically
- When complete, click the purple "Export N bookmarks" button โ
bookmarks.jsondownloads - Back in Siftly โ Import โ drop or upload the file
- Go to x.com/i/bookmarks while logged in to X
- Open DevTools: press
F12(Windows/Linux) orโโฅJ(Mac), then go to the Console tab - Copy the console script from the Siftly Import page, paste it into the console, and press Enter
- Click "โถ Auto-scroll" and wait for all bookmarks to be captured
- Click the export button โ
bookmarks.jsondownloads automatically - Back in Siftly โ Import โ upload the file
Re-import anytime โ Siftly automatically skips duplicates and only adds new bookmarks.
Categorization starts automatically as soon as you import. You can also trigger it manually from:
- The Import page (after upload)
- The Mindmap page (when bookmarks are uncategorized)
- The Categorize page in the sidebar
| Stage | What it does |
|---|---|
| Entity Extraction | Mines hashtags, URLs, @mentions, and 100+ known tool/product names from stored tweet JSON โ free, zero API calls |
| Vision Analysis | Analyzes every image, GIF, and video thumbnail โ OCR text, objects, scene, mood, meme templates, 30โ40 visual tags per image |
| Semantic Tagging | Generates 25โ35 precise search tags per bookmark by combining tweet text + image context. Also extracts sentiment, people, and company names. |
| Categorization | Assigns 1โ3 categories per bookmark with confidence scores using all enriched data |
The pipeline is incremental โ if interrupted, it picks up where it left off. Use "Re-run everything (force all)" to re-analyze bookmarks that were already processed.
Natural language queries across all bookmark data:
- "funny meme about crypto crashing"
- "react hooks tutorial"
- "bitcoin price chart"
- "best AI coding tools"
Searches tweet text, image OCR, visual tags, semantic tags, and categories simultaneously using a full-text search index (FTS5) + Claude semantic reranking. Results are ranked by relevance with AI-generated explanations for each match.
Interactive force-directed graph showing all bookmarks organized by category:
- Expand/collapse any category to reveal its bookmarks
- Click a bookmark node to open the original tweet on X
- Color-coded legend by category
- If bookmarks aren't categorized yet, an inline AI Categorize button starts the pipeline without leaving the page
- Grid view (masonry layout) or List view
- Filter by category, media type (photo / video), or search text
- Sort by newest or oldest
- Pagination with 24 items per page
- Active filter chips โ removable individually or all at once
- Hover any card to download media or jump to the original tweet
8 default categories pre-seeded with AI-readable descriptions:
| Category | Color |
|---|---|
| Funny Memes | Amber |
| AI Resources | Violet |
| Dev Tools | Cyan |
| Design | Pink |
| Finance & Crypto | Green |
| Productivity | Orange |
| News | Indigo |
| General | Slate |
Create custom categories with a name, color, and optional description. The description is passed directly to the AI during categorization โ the more specific, the more accurate the results.
- CSV โ spreadsheet-compatible with all fields
- JSON โ full structured data export
- ZIP โ exports a category's bookmarks + all media files with a
manifest.csv
Press Cmd+K (Mac) or Ctrl+K (Windows/Linux) to search across all bookmarks from anywhere in the app.
All settings are manageable in the Settings page at /settings or via environment variables:
| Setting | Env Var | Description |
|---|---|---|
| Anthropic API Key | ANTHROPIC_API_KEY |
Optional if Claude CLI is signed in โ otherwise required for AI features |
| API Base URL | ANTHROPIC_BASE_URL |
Custom endpoint for proxies or local Anthropic-compatible models |
| AI Model | Settings page only | Haiku 4.5 (default, fastest/cheapest), Sonnet 4.6, Opus 4.6 |
| OpenAI Key | Settings page only | Alternative provider if no Anthropic key is set |
| Database | DATABASE_URL |
SQLite file path (default: file:./prisma/dev.db) |
Point Siftly at any Anthropic-compatible server:
ANTHROPIC_BASE_URL=http://localhost:8080siftly/
โโโ app/
โ โโโ api/
โ โ โโโ analyze/images/ # Batch image vision analysis (GET progress, POST run)
โ โ โโโ bookmarks/ # List, filter, paginate, delete
โ โ โ โโโ [id]/categories/ # Per-bookmark category management
โ โ โโโ categories/ # Category CRUD
โ โ โ โโโ [slug]/ # Individual category operations
โ โ โโโ categorize/ # 4-stage AI pipeline (start, status, stop)
โ โ โโโ export/ # CSV, JSON, ZIP export
โ โ โโโ import/ # JSON file import with dedup + auto-pipeline trigger
โ โ โ โโโ bookmarklet/ # Bookmarklet-specific import endpoint
โ โ โ โโโ twitter/ # Twitter-specific import endpoint
โ โ โโโ link-preview/ # Server-side OG metadata scraper
โ โ โโโ media/ # Media proxy/download endpoint
โ โ โโโ mindmap/ # Graph nodes + edges for visualization
โ โ โโโ search/ai/ # Natural language semantic search (FTS5 + Claude)
โ โ โโโ settings/ # API key + model config
โ โ โ โโโ cli-status/ # Claude CLI auth detection endpoint
โ โ โ โโโ test/ # API key validation endpoint
โ โ โโโ stats/ # Dashboard stats
โ โโโ ai-search/ # AI search page
โ โโโ bookmarks/ # Browse, filter, paginate
โ โโโ categories/ # Category management
โ โ โโโ [slug]/ # Category detail page
โ โโโ categorize/ # Pipeline monitor with live progress
โ โโโ import/ # 3-step import flow (instructions โ upload โ categorize)
โ โโโ mindmap/ # Interactive graph
โ โโโ settings/ # Configuration
โ โโโ twitter-import/ # Alternative Twitter import page
โ โโโ page.tsx # Dashboard
โ
โโโ components/
โ โโโ mindmap/ # Mindmap canvas, nodes, edges
โ โ โโโ mindmap-canvas.tsx
โ โ โโโ category-node.tsx
โ โ โโโ tweet-node.tsx
โ โ โโโ root-node.tsx
โ โ โโโ chain-edge.tsx
โ โ โโโ mindmap-context.ts
โ โโโ command-palette.tsx # Cmd+K global search
โ โโโ nav.tsx # Sidebar navigation
โ โโโ theme-toggle.tsx # Light/dark mode
โ
โโโ lib/
โ โโโ categorizer.ts # AI categorization logic + default categories
โ โโโ claude-cli-auth.ts # Claude CLI OAuth session detection (macOS keychain)
โ โโโ vision-analyzer.ts # Image analysis + batch semantic tagging
โ โโโ image-context.ts # Shared image context builder
โ โโโ fts.ts # SQLite FTS5 full-text search index
โ โโโ rawjson-extractor.ts # Entity extraction from raw tweet JSON
โ โโโ parser.ts # Multi-format JSON parser
โ โโโ exporter.ts # CSV, JSON, ZIP export
โ โโโ types.ts # Shared TypeScript types
โ โโโ db.ts # Prisma client singleton
โ
โโโ prisma/
โ โโโ schema.prisma # SQLite schema
โ
โโโ start.sh # One-command launcher (install + DB setup + open browser)
โโโ CLAUDE.md # Instructions for Claude Code AI assistant
Bookmark โ tweet text, author, date, raw JSON, semantic tags, enrichment metadata
โโโ MediaItem โ images / videos / GIFs with AI-generated image tags
โโโ BookmarkCategory โ category assignments with confidence scores (0โ1)
Category โ name, slug, hex color, AI-readable description
Setting โ key-value store (API keys, model preferences)
ImportJob โ tracks import file status and progress
| Technology | Version | Role |
|---|---|---|
| Next.js | 16 | Full-stack framework (App Router) |
| TypeScript | 5 | Type safety throughout |
| Prisma | 7 | ORM + migrations |
| SQLite | โ | Local database โ zero setup, includes FTS5 |
| Tailwind CSS | v4 | Styling |
| Anthropic SDK | โ | Vision, semantic tagging, categorization, search |
| @xyflow/react | 12 | Interactive mindmap graph |
| Framer Motion | 12 | Animations |
| Radix UI | โ | Accessible UI primitives |
| JSZip | โ | Category ZIP export |
| Lucide React | โ | Icons |
# One-command start (installs, sets up DB, opens browser)
./start.sh
# Or manually:
npm install
npx prisma generate
npx prisma db push
npx next dev
# Type check
npx tsc --noEmit
# Open database GUI
npx prisma studio
# Build for production
npm run build && npm startEdit DEFAULT_CATEGORIES in lib/categorizer.ts. Each entry needs:
{
name: 'My Category', // Display name
slug: 'my-category', // URL-safe identifier (must be unique)
color: '#6366f1', // Hex color shown in UI
description: '...', // Natural language description โ used verbatim in AI prompts
}The description field directly shapes how the AI classifies bookmarks. Be specific.
Add domain strings to KNOWN_TOOL_DOMAINS in lib/rawjson-extractor.ts to have the entity extractor automatically recognize links to those tools in tweet data.
- All data is stored locally in a SQLite file on your machine
- The only external calls are to the AI provider you configure (tweet text + image data)
- No telemetry, no tracking, no accounts required
- Your bookmarks never touch any third-party server except your configured AI endpoint
If Siftly saves you time, consider leaving a tip โ
MIT โ see LICENSE
Built by @viperr ยท Self-hosted ยท No extensions ยท No cloud