Siftly: The Local AI Layer That Turns X Bookmarks Into a Searchable Knowledge Base

A self-hosted, multimodal bookmark engine that extracts meaning from text, images, and metadata, then keeps the whole thing private in SQLite.

8 min read • View on GitHub • More from viperrcrypto

A chaotic stack of bookmark cards, screenshots, and tweet fragments being sorted into a locked cabinet labeled SQLite. A thin cable links a CLI terminal to a keychain icon in the background. The scene explains how Siftly turns saved links into a private local knowledge system without making the browser extension the center of the workflow.
Siftly treats bookmarks as raw material. It turns them into structured knowledge, then stores the result locally.
Key Takeaways

Siftly is not trying to be a universal notes app. It is trying to rescue the one place where useful links go to die: X bookmarks.

The pitch is simple. Save something on X, and Siftly turns it into a searchable object instead of a dead-end URL. That means text, images, OCR, semantic labels, and categories all become part of the same local database.

Why X bookmarks become a graveyard

Bookmarks are easy to collect and easy to forget. The problem is rarely storage. It is retrieval, which is why so many saved posts end up as a private museum of almost-useful things.

Siftly attacks that failure mode by making the bookmark itself do more work. A saved post is not just preserved. It is processed, labeled, and made queryable later without depending on a cloud account or a browser extension to stay alive.

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.

viperrcrypto, Project Creator and Maintainer · Siftly GitHub README

What Siftly changes

The product shift is bigger than search. Siftly treats each bookmark as a structured knowledge object with extracted entities, visual tags, semantic tags, and a category assignment. The result is a local memory layer, not a flat archive.

That matters because X content is often multimodal. A useful post might be mostly text, mostly image, or some messy combination of both. If you only index the caption, you miss the point.

A single bookmark transforms into layered index cards. The top layer shows raw post text, while lower layers fan out into hashtags, OCR text, visual concepts, semantic tags, and a category card with a confidence mark. An arrow points into a search box that matches a natural-language query.
One bookmark becomes many search surfaces. That is the core idea behind Siftly.

The pipeline that makes a bookmark searchable

This is the heart of the project. Siftly does not just send bookmarks to an LLM and hope for the best. It stages the work so deterministic extraction and multimodal inference each do their part, then writes the result to SQLite.

Siftly is a transformation engine. A bookmark passes through several stages before it becomes durable, searchable knowledge.

The first stage is raw entity extraction. That catches obvious structure like hashtags, URLs, mentions, and known products or tools without paying an AI tax on every record.

Then vision analysis reads the visual layer. Screenshots, memes, thumbnails, and image text can all contribute OCR text and visual concepts, which is how a post with weak caption text can still become searchable later.

Semantic tagging and categorization turn those signals into something the app can use consistently. The point is not to generate a single magical answer. It is to create several stable representations that survive indexing and retrieval.

// Simplified shape of the pipeline
const bookmark = await importBookmark(rawPost)
const entities = extractEntities(bookmark.raw)
const vision = await analyzeImages(bookmark.media)
const semanticTags = await buildSemanticTags({ entities, vision, text: bookmark.text })
const category = await categorize({ text: bookmark.text, tags: semanticTags })
await db.bookmark.upsert({ data: { ...bookmark, entities, vision, semanticTags, category } })

How search becomes semantic, not just keyword-based

Siftly’s search stack is a hybrid. Full-text search handles speed and recall. Intent detection and reranking handle meaning. That combination is what makes a query like “funny meme about coding” feel surprisingly specific.

In practice, this means the app does not require perfect literal overlap between the query and the saved post. If the text is thin but the image is rich, the visual tags still help. If the post is vague but the category is clear, the reranker can still surface it.

DimensionKeyword searchSiftly
Input signalExact text onlyText, OCR, visual tags, semantic tags
SpeedFastFast first pass, smarter second pass
Best atKnown phrasesIntent and meaning
Failure modeMisses contextDepends on pipeline quality
Storage modelUsually cloud or app-specificSQLite, local-first

That is the product thesis in miniature. Siftly is not trying to be broad. It is trying to be precise inside a narrow domain where precision matters.

The import trick that avoids a browser extension

One of the nicest details is that Siftly does not force a heavyweight extension-first workflow. It can use a bookmarklet or console-script approach to pull bookmarks from X, which keeps the setup lighter than a traditional browser extension path.

That choice comes with tradeoffs. Anything tied to internal platform endpoints can be brittle. But the payoff is real: less friction, fewer permissions, and a more developer-native way to get data out of the walled garden.

It runs a 4-stage AI pipeline on your bookmarks: 📥 Import... 🏷️ Entity Extraction... 👁️ Vision Analysis... 🧠 Semantic Tagging... 📂 Categorization

viperrcrypto, Project Creator and Maintainer · Siftly GitHub README

Why local-first changes the product

This is the philosophical center of Siftly. AI is treated as a processing utility, not the system of record. Once the bookmark is enriched, the durable asset is the local SQLite database, not an external SaaS index.

That changes the business logic of the tool. The model can change. The provider can change. The knowledge stays put. For people who already manage their own infrastructure, that is not a feature add-on. It is the reason to use the tool at all.

The Claude Code CLI auth path reinforces the same idea. Siftly tries to fit into the workflow you already have, instead of demanding a new account ritual for every layer of the stack.

How it compares

Siftly is narrow on purpose. That makes it easier to compare against broader knowledge tools and more generic bookmark managers.

Tool typePlatform focusLocal-firstMultimodalImport pathBest fit
Generic bookmark managerBroadSometimesUsually noExtension or syncSimple saving
Cloud knowledge baseBroadUsually noSometimesManaged ingestionTeams that want SaaS
General AI note toolBroadMixedSometimesManual or syncCross-domain notes
SiftlyX bookmarks onlyYesYesBookmarklet or console scriptPower users who want ownership

The table makes the tradeoff obvious. Other tools may be broader, but Siftly is deeper where it counts: one platform, one local database, and one pipeline that squeezes meaning out of messy social content.

Who this is for

Siftly is for power users, researchers, and developers who already understand the value of self-hosted tools. It is for people who want their saved X content to behave like a queryable archive instead of a garbage drawer.

It is not for someone who wants a polished SaaS with zero setup and no curiosity about internals. Siftly expects a little patience, and in return it gives you control.