← All projects

Snippet Search

A local library that scrapes and imports saved Twitter/X and LinkedIn posts, indexes them for full-text search and mirrors them to a Markdown vault.

Snippet Search library view with search, source filters, saved posts, and an AI chat panel
The real UI, running on seeded placeholder posts instead of my actual saved library.

The short version

What it is

I save a lot of tweets and LinkedIn posts and never go back to them. Snippet Search turns those saves into a local library with full-text search, a Markdown mirror that Obsidian and Claude Code can read, and an optional chat that shows what each question costs.

What I had to steer

I kept it local and the AI optional. No API key is needed by default, the chat is opt-in and the model switcher shows the price of every query. I was also blunt about the limits: the scrapers use methods LinkedIn doesn't want used, so this stays a personal tool.

What I wired together

Express 5 and SQLite with FTS5. Playwright scrapers for X and LinkedIn, with an X API path and CSV import as fallbacks. node-cron for scheduling, a Vite and React PWA on localhost and the Claude API for chat.

Where I pushed it

It does more than anything else here: scraping, sync, search, a vault mirror and an AI layer, all on one laptop.

The build log

Turning saves into a library

I save tweets and LinkedIn posts and never find them again. There’s no search and no way back to them six months later when I actually need one. I wanted a local library that kept my saved posts useful.

Snippet Search is a local app. An Express backend indexes everything into SQLite with full-text search. Playwright scrapers pull posts from X and LinkedIn directly, with an X API sync and CSV import as fallbacks for when the scraping breaks.

Everything is mirrored into a Markdown vault, so Obsidian and Claude Code can read the library without going through a database. There’s an optional chat on top, wired to Claude, with a model switcher that shows what each query costs. It runs as an installable PWA on localhost, starts on login and needs no API key by default.

It’s still running and still getting features: sync improvements, a links view and autostart fixes. It won’t get a public URL. It scrapes my own saved posts using methods LinkedIn doesn’t want used, which is fine for a personal tool and not something to ship.

The screenshot is the real UI, seeded with eight made-up posts instead of my actual library.