viperrcrypto
Siftly
TypeScript

Local Twitter/X bookmark organizer with AI categorization and mindmap visualization

Last updated Jul 8, 2026
2.6k
Stars
236
Forks
21
Issues
+3
Stars/day
Attention Score
95
Language breakdown
TypeScript 97.1%
Shell 1.8%
CSS 0.7%
Dockerfile 0.3%
JavaScript 0.1%
β–Έ Files click to expand
README

Siftly

Siftly

Self-hosted Twitter/X bookmark manager with AI-powered organization

Import Β· Analyze Β· Categorize Β· Search Β· Explore

Next.js 16 TypeScript SQLite Tailwind CSS MIT License


What is Siftly?

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

Quick Start

Prerequisites

That's it. If you have Claude Code CLI installed and signed in, AI features work automatically β€” no API key needed.

Option A β€” One command (recommended)

git clone https://github.com/viperrcrypto/Siftly.git
cd Siftly
./start.sh

start.sh installs dependencies, sets up the database, checks for Claude CLI auth, and opens http://localhost:3000 automatically.

Option B β€” Using Claude Code

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.

Option C β€” Manual setup

git clone https://github.com/viperrcrypto/Siftly.git
cd Siftly
npm install
npx prisma generate
npx prisma migrate dev --name init
npx next dev

Open http://localhost:3000


AI Authentication

Siftly automatically detects the best available auth method β€” no configuration needed in the most common case.

Priority order

| # | 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 | ANTHROPICAPIKEY env var | Set in .env.local or your shell environment | | 4 | Local proxy | Set ANTHROPICBASEURL to any Anthropic-compatible endpoint |

Claude Code CLI (no API key needed)

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.

Getting an API key (if needed)

New accounts include $5 free credit β€” enough for thousands of bookmarks at Haiku pricing (~$0.00025/bookmark).

Importing Your Bookmarks

Siftly has built-in import tools β€” no browser extensions required. Go to the Import page and choose either method:

Method A β€” Bookmarklet (Recommended)

  • 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.json downloads
  • Back in Siftly β†’ Import β†’ drop or upload the file

Method B β€” Browser Console Script

  • 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.json downloads automatically
  • Back in Siftly β†’ Import β†’ upload the file

Re-importing

Re-import anytime β€” Siftly automatically skips duplicates and only adds new bookmarks.


AI Categorization

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

The 4-Stage Pipeline

| 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.


Features

πŸ” AI Search

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.

πŸ—ΊοΈ Mindmap

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

πŸ“š Browse & Filter

  • 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

βš™οΈ Categories

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.

πŸ“€ Export

  • CSV β€” spreadsheet-compatible with all fields
  • JSON β€” full structured data export
  • ZIP β€” exports a category's bookmarks + all media files with a manifest.csv

⌨️ Command Palette

Press Cmd+K (Mac) or Ctrl+K (Windows/Linux) to search across all bookmarks from anywhere in the app.


Configuration

All settings are manageable in the Settings page at /settings or via environment variables:

| Setting | Env Var | Description | |---------|---------|-------------| | Anthropic API Key | ANTHROPICAPIKEY | Optional if Claude CLI is signed in β€” otherwise required for AI features | | API Base URL | ANTHROPICBASEURL | 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 | OPENAIAPIKEY | Alternative provider β€” GPT-4.1 Mini/Nano/Full, o4-mini, o3 | | MiniMax Key | MINIMAXAPIKEY | Alternative provider β€” M2.7 (1M context), M2.5, M2.5-highspeed | | MiniMax Base URL | MINIMAXBASEURL | Custom MiniMax API endpoint (default: https://api.minimax.io/v1) | | Database | DATABASE_URL | SQLite file path (default: file:./prisma/dev.db) |

Custom API Endpoint

Point Siftly at any Anthropic-compatible server:

ANTHROPICBASEURL=http://localhost:8080

Architecture

siftly/
β”œβ”€β”€ 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
β”‚   └── 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

Database Schema

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

Prisma + SQLite + FTS5

Siftly uses Prisma migrations for relational schema changes. In development, run npx prisma migrate dev --name <change-name> when schema changes. For runtime/prod-style startup, apply committed migrations with npx prisma migrate deploy. FTS5 (bookmarkfts) is managed at runtime in lib/fts.ts, not in schema.prisma. This is intentional for now because Prisma does not model SQLite virtual table definitions directly.

For Prisma command and workflow details, see:

  • https://www.prisma.io/docs/orm/prisma-migrate/workflows/development-and-production
  • https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client

Tech Stack

| 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 | | MiniMax | β€” | Alternative AI provider (M2.7 1M context, M2.5) | | @xyflow/react | 12 | Interactive mindmap graph | | Framer Motion | 12 | Animations | | Radix UI | β€” | Accessible UI primitives | | JSZip | β€” | Category ZIP export | | Lucide React | β€” | Icons |


Development

# One-command start (installs, sets up DB, opens browser)
./start.sh

Or manually:

npm install npx prisma generate npx prisma migrate dev --name init npx next dev

Type check

npx tsc --noEmit

Open database GUI

npx prisma studio

Build for production

npm run build && npm start

Customizing Categories

Edit 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.

Adding Known Tools

Add domain strings to KNOWNTOOLDOMAINS in lib/rawjson-extractor.ts to have the entity extractor automatically recognize links to those tools in tweet data.


Privacy

  • 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

Support Development

If Siftly saves you time, consider leaving a tip β˜•


License

MIT β€” see LICENSE


Built by @viperr Β· Self-hosted Β· No extensions Β· No cloud

πŸ”— More in this category

Β© 2026 GitRepoTrend Β· viperrcrypto/Siftly Β· Updated daily from GitHub