[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74850":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":15,"starSnapshotCount":15,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},74850,"Siftly","viperrcrypto\u002FSiftly","viperrcrypto","Local Twitter\u002FX bookmark organizer with AI categorization and mindmap visualization",null,"TypeScript",2504,233,6,10,0,13,19,49,39,29.11,"MIT License",false,"main",[25,26,27,28,29,30,31,32,33,34],"ai","bookmarks","categorization","local-first","mindmap","nextjs","open-source","productivity","twitter","typescript","2026-06-12 02:03:29","\u003Cdiv align=\"center\">\n  \u003Cimg src=\"public\u002Flogo.svg\" alt=\"Siftly\" width=\"80\" height=\"80\" \u002F>\n\n  \u003Ch1>Siftly\u003C\u002Fh1>\n\n  \u003Cp>\u003Cstrong>Self-hosted Twitter\u002FX bookmark manager with AI-powered organization\u003C\u002Fstrong>\u003C\u002Fp>\n\n  \u003Cp>Import · Analyze · Categorize · Search · Explore\u003C\u002Fp>\n\n  \u003Cp>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNext.js-16-black?style=flat-square&logo=next.js\" alt=\"Next.js 16\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5-blue?style=flat-square&logo=typescript\" alt=\"TypeScript\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSQLite-local-green?style=flat-square&logo=sqlite\" alt=\"SQLite\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTailwind-v4-38bdf8?style=flat-square&logo=tailwindcss\" alt=\"Tailwind CSS\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-yellow?style=flat-square\" alt=\"MIT License\" \u002F>\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\n---\n\n## What is Siftly?\n\nSiftly turns your Twitter\u002FX 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.\n\nIt runs a **4-stage AI pipeline** on your bookmarks:\n\n```\n📥 Import (built-in bookmarklet or console script — no extensions needed)\n    ↓\n🏷️  Entity Extraction   — mines hashtags, URLs, mentions, and 100+ known tools from raw tweet data (free, zero API calls)\n    ↓\n👁️  Vision Analysis      — reads text, objects, and context from every image\u002FGIF\u002Fvideo thumbnail (30–40 visual tags per image)\n    ↓\n🧠 Semantic Tagging     — generates 25–35 searchable tags per bookmark for AI-powered search\n    ↓\n📂 Categorization       — assigns each bookmark to 1–3 categories with confidence scores\n```\n\nAfter the pipeline runs, you get:\n- **AI search** — find bookmarks by meaning, not just keywords (*\"funny meme about crypto crashing\"*)\n- **Interactive mindmap** — explore your entire bookmark graph visually\n- **Filtered browsing** — grid or list view, filter by category, media type, and date\n- **Export tools** — download media, export as CSV \u002F JSON \u002F ZIP\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- [Node.js 18+](https:\u002F\u002Fnodejs.org)\n- npm (comes with Node.js)\n\n**That's it.** If you have [Claude Code CLI](https:\u002F\u002Fclaude.ai\u002Fcode) installed and signed in, AI features work automatically — no API key needed.\n\n### Option A — One command (recommended)\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fviperrcrypto\u002FSiftly.git\ncd Siftly\n.\u002Fstart.sh\n```\n\n`start.sh` installs dependencies, sets up the database, checks for Claude CLI auth, and opens [http:\u002F\u002Flocalhost:3000](http:\u002F\u002Flocalhost:3000) automatically.\n\n### Option B — Using Claude Code\n\nIf you're using [Claude Code](https:\u002F\u002Fclaude.ai\u002Fcode) to set up the project, it will read `CLAUDE.md` and know exactly how to get started. Just open the project folder:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fviperrcrypto\u002FSiftly.git\nclaude Siftly\u002F\n```\n\nClaude Code will handle setup and start the app using your existing Claude subscription — no extra configuration needed.\n\n### Option C — Manual setup\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fviperrcrypto\u002FSiftly.git\ncd Siftly\nnpm install\nnpx prisma generate\nnpx prisma migrate dev --name init\nnpx next dev\n```\n\nOpen [http:\u002F\u002Flocalhost:3000](http:\u002F\u002Flocalhost:3000)\n\n---\n\n## AI Authentication\n\nSiftly automatically detects the best available auth method — no configuration needed in the most common case.\n\n### Priority order\n\n| # | Method | How |\n|---|--------|-----|\n| 1 | **Claude Code CLI** *(zero config)* | Already signed in? Siftly reads your session from the macOS keychain automatically |\n| 2 | **API key in Settings** | Open Settings in the app and paste your key |\n| 3 | **`ANTHROPIC_API_KEY` env var** | Set in `.env.local` or your shell environment |\n| 4 | **Local proxy** | Set `ANTHROPIC_BASE_URL` to any Anthropic-compatible endpoint |\n\n### Claude Code CLI (no API key needed)\n\nIf you use [Claude Code](https:\u002F\u002Fclaude.ai\u002Fcode), you're already signed in. Siftly detects your session from the macOS keychain and uses your Claude subscription (Free\u002FPro\u002FMax) automatically.\n\nThe Settings page shows a green **\"Claude CLI detected — no API key needed\"** badge with your subscription tier when this is active.\n\n> **Note:** This works on macOS. On Linux\u002FWindows, add an API key in Settings instead.\n\n### Getting an API key (if needed)\n\n1. Go to [console.anthropic.com](https:\u002F\u002Fconsole.anthropic.com)\n2. Create a new API key\n3. Open Siftly → Settings → paste it in\n\nNew accounts include $5 free credit — enough for thousands of bookmarks at Haiku pricing (~$0.00025\u002Fbookmark).\n\n---\n\n## Importing Your Bookmarks\n\nSiftly has **built-in import tools** — no browser extensions required. Go to the **Import** page and choose either method:\n\n### Method A — Bookmarklet *(Recommended)*\n\n1. Go to **Import** in the Siftly sidebar\n2. Drag the **\"Export X Bookmarks\"** link to your browser's bookmark bar\n   *(or right-click the bookmark bar → Add Bookmark → paste the URL)*\n3. Go to [x.com\u002Fi\u002Fbookmarks](https:\u002F\u002Fx.com\u002Fi\u002Fbookmarks) while logged in to X\n4. Click **\"Export X Bookmarks\"** in your bookmark bar — a purple button appears on the page\n5. Click **\"▶ Auto-scroll\"** — the tool scrolls through and captures all your bookmarks automatically\n6. When complete, click the purple **\"Export N bookmarks\"** button — `bookmarks.json` downloads\n7. Back in Siftly → **Import** → drop or upload the file\n\n### Method B — Browser Console Script\n\n1. Go to [x.com\u002Fi\u002Fbookmarks](https:\u002F\u002Fx.com\u002Fi\u002Fbookmarks) while logged in to X\n2. Open DevTools: press `F12` (Windows\u002FLinux) or `⌘⌥J` (Mac), then go to the **Console** tab\n3. Copy the console script from the Siftly Import page, paste it into the console, and press Enter\n4. Click **\"▶ Auto-scroll\"** and wait for all bookmarks to be captured\n5. Click the export button — `bookmarks.json` downloads automatically\n6. Back in Siftly → **Import** → upload the file\n\n### Re-importing\n\nRe-import anytime — Siftly automatically skips duplicates and only adds new bookmarks.\n\n---\n\n## AI Categorization\n\n**Categorization starts automatically as soon as you import.** You can also trigger it manually from:\n\n- The **Import** page (after upload)\n- The **Mindmap** page (when bookmarks are uncategorized)\n- The **Categorize** page in the sidebar\n\n### The 4-Stage Pipeline\n\n| Stage | What it does |\n|-------|-------------|\n| **Entity Extraction** | Mines hashtags, URLs, @mentions, and 100+ known tool\u002Fproduct names from stored tweet JSON — free, zero API calls |\n| **Vision Analysis** | Analyzes every image, GIF, and video thumbnail — OCR text, objects, scene, mood, meme templates, 30–40 visual tags per image |\n| **Semantic Tagging** | Generates 25–35 precise search tags per bookmark by combining tweet text + image context. Also extracts sentiment, people, and company names. |\n| **Categorization** | Assigns 1–3 categories per bookmark with confidence scores using all enriched data |\n\nThe 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.\n\n---\n\n## Features\n\n### 🔍 AI Search\n\nNatural language queries across all bookmark data:\n\n- *\"funny meme about crypto crashing\"*\n- *\"react hooks tutorial\"*\n- *\"bitcoin price chart\"*\n- *\"best AI coding tools\"*\n\nSearches 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.\n\n### 🗺️ Mindmap\n\nInteractive force-directed graph showing all bookmarks organized by category:\n\n- Expand\u002Fcollapse any category to reveal its bookmarks\n- Click a bookmark node to open the original tweet on X\n- Color-coded legend by category\n- If bookmarks aren't categorized yet, an inline **AI Categorize** button starts the pipeline without leaving the page\n\n### 📚 Browse & Filter\n\n- **Grid view** (masonry layout) or **List view**\n- Filter by category, media type (photo \u002F video), or search text\n- Sort by newest or oldest\n- Pagination with 24 items per page\n- Active filter chips — removable individually or all at once\n- Hover any card to download media or jump to the original tweet\n\n### ⚙️ Categories\n\n8 default categories pre-seeded with AI-readable descriptions:\n\n| Category | Color |\n|----------|-------|\n| Funny Memes | Amber |\n| AI Resources | Violet |\n| Dev Tools | Cyan |\n| Design | Pink |\n| Finance & Crypto | Green |\n| Productivity | Orange |\n| News | Indigo |\n| General | Slate |\n\nCreate 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.\n\n### 📤 Export\n\n- **CSV** — spreadsheet-compatible with all fields\n- **JSON** — full structured data export\n- **ZIP** — exports a category's bookmarks + all media files with a `manifest.csv`\n\n### ⌨️ Command Palette\n\nPress `Cmd+K` (Mac) or `Ctrl+K` (Windows\u002FLinux) to search across all bookmarks from anywhere in the app.\n\n---\n\n## Configuration\n\nAll settings are manageable in the **Settings** page at `\u002Fsettings` or via environment variables:\n\n| Setting | Env Var | Description |\n|---------|---------|-------------|\n| Anthropic API Key | `ANTHROPIC_API_KEY` | Optional if Claude CLI is signed in — otherwise required for AI features |\n| API Base URL | `ANTHROPIC_BASE_URL` | Custom endpoint for proxies or local Anthropic-compatible models |\n| AI Model | Settings page only | Haiku 4.5 (default, fastest\u002Fcheapest), Sonnet 4.6, Opus 4.6 |\n| OpenAI Key | `OPENAI_API_KEY` | Alternative provider — GPT-4.1 Mini\u002FNano\u002FFull, o4-mini, o3 |\n| MiniMax Key | `MINIMAX_API_KEY` | Alternative provider — M2.7 (1M context), M2.5, M2.5-highspeed |\n| MiniMax Base URL | `MINIMAX_BASE_URL` | Custom MiniMax API endpoint (default: `https:\u002F\u002Fapi.minimax.io\u002Fv1`) |\n| Database | `DATABASE_URL` | SQLite file path (default: `file:.\u002Fprisma\u002Fdev.db`) |\n\n### Custom API Endpoint\n\nPoint Siftly at any Anthropic-compatible server:\n\n```env\nANTHROPIC_BASE_URL=http:\u002F\u002Flocalhost:8080\n```\n\n---\n\n## Architecture\n\n```\nsiftly\u002F\n├── app\u002F\n│   ├── api\u002F\n│   │   ├── analyze\u002Fimages\u002F   # Batch image vision analysis (GET progress, POST run)\n│   │   ├── bookmarks\u002F        # List, filter, paginate, delete\n│   │   │   └── [id]\u002Fcategories\u002F # Per-bookmark category management\n│   │   ├── categories\u002F       # Category CRUD\n│   │   │   └── [slug]\u002F       # Individual category operations\n│   │   ├── categorize\u002F       # 4-stage AI pipeline (start, status, stop)\n│   │   ├── export\u002F           # CSV, JSON, ZIP export\n│   │   ├── import\u002F           # JSON file import with dedup + auto-pipeline trigger\n│   │   │   ├── bookmarklet\u002F  # Bookmarklet-specific import endpoint\n│   │   │   └── twitter\u002F      # Twitter-specific import endpoint\n│   │   ├── link-preview\u002F     # Server-side OG metadata scraper\n│   │   ├── media\u002F            # Media proxy\u002Fdownload endpoint\n│   │   ├── mindmap\u002F          # Graph nodes + edges for visualization\n│   │   ├── search\u002Fai\u002F        # Natural language semantic search (FTS5 + Claude)\n│   │   ├── settings\u002F         # API key + model config\n│   │   │   ├── cli-status\u002F   # Claude CLI auth detection endpoint\n│   │   │   └── test\u002F         # API key validation endpoint\n│   │   └── stats\u002F            # Dashboard stats\n│   ├── ai-search\u002F            # AI search page\n│   ├── bookmarks\u002F            # Browse, filter, paginate\n│   ├── categories\u002F           # Category management\n│   │   └── [slug]\u002F           # Category detail page\n│   ├── categorize\u002F           # Pipeline monitor with live progress\n│   ├── import\u002F               # 3-step import flow (instructions → upload → categorize)\n│   ├── mindmap\u002F              # Interactive graph\n│   ├── settings\u002F             # Configuration\n│   └── page.tsx              # Dashboard\n│\n├── components\u002F\n│   ├── mindmap\u002F              # Mindmap canvas, nodes, edges\n│   │   ├── mindmap-canvas.tsx\n│   │   ├── category-node.tsx\n│   │   ├── tweet-node.tsx\n│   │   ├── root-node.tsx\n│   │   ├── chain-edge.tsx\n│   │   └── mindmap-context.ts\n│   ├── command-palette.tsx   # Cmd+K global search\n│   ├── nav.tsx               # Sidebar navigation\n│   └── theme-toggle.tsx      # Light\u002Fdark mode\n│\n├── lib\u002F\n│   ├── categorizer.ts        # AI categorization logic + default categories\n│   ├── claude-cli-auth.ts    # Claude CLI OAuth session detection (macOS keychain)\n│   ├── vision-analyzer.ts    # Image analysis + batch semantic tagging\n│   ├── image-context.ts      # Shared image context builder\n│   ├── fts.ts                # SQLite FTS5 full-text search index\n│   ├── rawjson-extractor.ts  # Entity extraction from raw tweet JSON\n│   ├── parser.ts             # Multi-format JSON parser\n│   ├── exporter.ts           # CSV, JSON, ZIP export\n│   ├── types.ts              # Shared TypeScript types\n│   └── db.ts                 # Prisma client singleton\n│\n├── prisma\u002F\n│   └── schema.prisma         # SQLite schema\n│\n├── start.sh                  # One-command launcher (install + DB setup + open browser)\n└── CLAUDE.md                 # Instructions for Claude Code AI assistant\n```\n\n### Database Schema\n\n```\nBookmark          — tweet text, author, date, raw JSON, semantic tags, enrichment metadata\n  ├── MediaItem   — images \u002F videos \u002F GIFs with AI-generated image tags\n  └── BookmarkCategory — category assignments with confidence scores (0–1)\n\nCategory          — name, slug, hex color, AI-readable description\nSetting           — key-value store (API keys, model preferences)\nImportJob         — tracks import file status and progress\n```\n\n### Prisma + SQLite + FTS5\n\nSiftly uses Prisma migrations for relational schema changes.\nIn development, run `npx prisma migrate dev --name \u003Cchange-name>` when schema changes.\nFor runtime\u002Fprod-style startup, apply committed migrations with `npx prisma migrate deploy`.\nFTS5 (`bookmark_fts`) is managed at runtime in [`lib\u002Ffts.ts`](.\u002Flib\u002Ffts.ts), not in `schema.prisma`.\nThis is intentional for now because Prisma does not model SQLite virtual table definitions directly.\n\nFor Prisma command and workflow details, see:\n- https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Form\u002Fprisma-migrate\u002Fworkflows\u002Fdevelopment-and-production\n- https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Form\u002Fprisma-client\u002Fsetup-and-configuration\u002Fgenerating-prisma-client\n\n---\n\n## Tech Stack\n\n| Technology | Version | Role |\n|------------|---------|------|\n| [Next.js](https:\u002F\u002Fnextjs.org) | 16 | Full-stack framework (App Router) |\n| [TypeScript](https:\u002F\u002Fwww.typescriptlang.org) | 5 | Type safety throughout |\n| [Prisma](https:\u002F\u002Fwww.prisma.io) | 7 | ORM + migrations |\n| [SQLite](https:\u002F\u002Fsqlite.org) | — | Local database — zero setup, includes FTS5 |\n| [Tailwind CSS](https:\u002F\u002Ftailwindcss.com) | v4 | Styling |\n| [Anthropic SDK](https:\u002F\u002Fdocs.anthropic.com) | — | Vision, semantic tagging, categorization, search |\n| [MiniMax](https:\u002F\u002Fplatform.minimaxi.com) | — | Alternative AI provider (M2.7 1M context, M2.5) |\n| [@xyflow\u002Freact](https:\u002F\u002Fxyflow.com) | 12 | Interactive mindmap graph |\n| [Framer Motion](https:\u002F\u002Fwww.framer.com\u002Fmotion\u002F) | 12 | Animations |\n| [Radix UI](https:\u002F\u002Fwww.radix-ui.com) | — | Accessible UI primitives |\n| [JSZip](https:\u002F\u002Fstuk.github.io\u002Fjszip\u002F) | — | Category ZIP export |\n| [Lucide React](https:\u002F\u002Flucide.dev) | — | Icons |\n\n---\n\n## Development\n\n```bash\n# One-command start (installs, sets up DB, opens browser)\n.\u002Fstart.sh\n\n# Or manually:\nnpm install\nnpx prisma generate\nnpx prisma migrate dev --name init\nnpx next dev\n\n# Type check\nnpx tsc --noEmit\n\n# Open database GUI\nnpx prisma studio\n\n# Build for production\nnpm run build && npm start\n```\n\n### Customizing Categories\n\nEdit `DEFAULT_CATEGORIES` in `lib\u002Fcategorizer.ts`. Each entry needs:\n\n```ts\n{\n  name: 'My Category',       \u002F\u002F Display name\n  slug: 'my-category',       \u002F\u002F URL-safe identifier (must be unique)\n  color: '#6366f1',          \u002F\u002F Hex color shown in UI\n  description: '...',        \u002F\u002F Natural language description — used verbatim in AI prompts\n}\n```\n\nThe `description` field directly shapes how the AI classifies bookmarks. Be specific.\n\n### Adding Known Tools\n\nAdd domain strings to `KNOWN_TOOL_DOMAINS` in `lib\u002Frawjson-extractor.ts` to have the entity extractor automatically recognize links to those tools in tweet data.\n\n---\n\n## Privacy\n\n- All data is stored **locally** in a SQLite file on your machine\n- The only external calls are to the AI provider you configure (tweet text + image data)\n- No telemetry, no tracking, no accounts required\n- Your bookmarks never touch any third-party server except your configured AI endpoint\n\n---\n\n## Support Development\n\nIf Siftly saves you time, consider leaving a tip ☕\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n---\n\n\u003Cdiv align=\"center\">\n  \u003Cp>Built by \u003Ca href=\"https:\u002F\u002Fx.com\u002Fviperr\">@viperr\u003C\u002Fa> · Self-hosted · No extensions · No cloud\u003C\u002Fp>\n\u003C\u002Fdiv>\n","Siftly是一款本地化的Twitter\u002FX书签管理器，利用AI技术进行书签的分类和可视化。其核心功能包括通过四阶段AI管道处理书签：导入、实体提取、视觉分析、语义标记与分类，并支持智能搜索、交互式思维导图展示及多种浏览过滤方式。项目基于TypeScript开发，使用Next.js框架构建，确保数据存储于本地SQLite数据库中，保障用户隐私安全。Siftly适用于需要高效管理和检索个人社交媒体收藏内容的用户，特别适合重视数据隐私且希望在没有云服务的情况下也能充分利用AI能力的场景。",2,"2026-06-11 03:51:06","high_star"]