selvage

local-first hybrid-search layer over scattered team knowledge

liveflagshippubliclast active 2026-07

how it works

your datanormalisestorerank (no LLM)fuseclientsfolder / gitSlackany Postgrescustomconnectorconnectorsshared schemaPostgres+ pgvectorfull-textGINvectorHNSWrare-termIDFRRF k=60recency decaycross-encoderCLIMCP serverweb UI
Selvage retrieval: connectors normalise every source into one Postgres + pgvector table; three ranked lists (full-text, vector, rare-term) fuse with RRF, decay by recency, and are reranked by a local cross-encoder before reaching the CLI, MCP server, or web UI.

built out of the same parts

JavaScript/TSMCPPostgresJavaScript/TSJavaScript/TSselvagegamecamlocalleadfindermedical-intake-aisequenceweb-vid
5 of the other 11 projects use something this one uses

Selvage is a thin, hybrid-searchable layer over the places team knowledge actually lives — Slack, wikis, code, and databases. Connectors normalize every source into one Postgres + pgvector table, so the same query serves a person at a CLI, an agent over MCP, or the web UI. Local-first and MIT-licensed, with embeddings running on your own CPU.

measured

why three signals instead of one

signalexact tokenparaphraserare term
full-text (GIN)
vector (HNSW)
rare-term (IDF)
all three, fused by RRF

Vector search alone misses an exact error code; full-text alone misses a paraphrase. RRF needs only ranks, so the three lists fuse without their scores having to be comparable.

source: selvage README

GitHub