Decision: Supabase pgvector over Pinecone
Logged 2026-03-08 after a 2-day evaluation. Status: locked.
What we picked
pgvector + HNSW inside the existing Supabase Postgres instance. Not Pinecone, Weaviate, Chroma, or Turbopuffer.
What we measured
I built two prototypes against the same 4,200-document corpus (my actual hub plus a synthetic test set):
| Backend | Build time | Read p99 | Cold-start p99 | $/month at our scale |
|---|---|---|---|---|
| pgvector + HNSW | 41s | 18ms | 22ms | $0 (incl. with Postgres) |
| Pinecone serverless | n/a | 11ms | 380ms | ~$32 |
The cold-start gap was the surprise. Pinecone serverless can spike past 300ms when an index hasn't been touched in a few minutes, which is exactly our access pattern (bursty, per-user). pgvector inside the warm Postgres pool is steady.
The argument for choosing the cheaper, slower-at-the-best-case option
- One vendor, one auth surface, one migration story. Adding Pinecone means a second SDK, a second control plane, a second set of API keys to rotate, a second "what region does it run in" answer.
- 18ms p99 read is well inside our 100ms recall budget. The reranker is the bottleneck, not the vector store.
- Postgres lets us join. Filter by
user_id,folder_id,is_draft = false, andcreated_at > $cutoffin the same query that returns the cosine match. Pinecone metadata filtering exists but is its own DSL.
Where this stops being the right call
At ~50K vectors per user, HNSW recall starts to degrade unless we tune ef_search. We're nowhere near that. When we cross 30K we revisit, but we project that as the H2 2027 problem — not this quarter's.
What I won't reconsider
The "but Pinecone is the obvious vector DB" pressure. It's the obvious choice in slide decks. The numbers say otherwise for our specific shape.