Turbovec Review 2026 — Google's TurboQuant Vector Index in Rust, 8× Memory Compression
✅ Pros
- • No training phase — online ingest with instant add() and O(1) remove-by-id
- • 3.4× faster than FAISS IndexPQFastScan at 4-bit, 20-26% at 2-bit on both ARM and x86
- • Incremental sync() persistence with one fsync per call, crash-safe
- • MIT license, free, pure local — no data leaves your machine
- • Filter-at-search-time with id allowlists, no recall hit
⚠️ Cons
- • 15,200 stars in 5 months but heavy 'vibe-coded slop' criticism in the HN thread
- • New project: no sqlite bindings yet, no managed service, small ecosystem
- • README benchmarks are project-claimed, not independently verified (ann-benchmarks not yet listed)
- • Low-dim embeddings (d=200) are the weak regime; 2-bit recall trails FAISS at deeper k
Local, privacy-first RAG and embedding stores on a RAM budget
Free (MIT, pip install turbovec)
Quick Verdict
Turbovec is a Rust vector index with Python bindings, built on Google Research’s TurboQuant algorithm (arXiv 2504.19874) — a data-oblivious quantizer with near-optimal distortion and, crucially, no separate training phase. Add vectors and they are immediately searchable; no train step, no parameter tuning, no rebuild as the corpus grows.
The headline numbers are striking: a 10-million-document corpus takes 31 GB of RAM as float32 — turbovec fits it in 4 GB, and searches it faster than FAISS. On the HN launch thread (185 points, 23 comments), the community reaction split between genuine enthusiasm (“4GB for 10 million documents… can’t wait for the sqlite bindings”) and sharp skepticism (“Another vibe coded slop where they can’t even spend time on Readme”).
The bottom line: as of August 2026, Turbovec is the most accessible way to get TurboQuant-quality compression in a Python RAG stack — free, MIT-licensed, and genuinely fast in its own benchmarks. But it is a 5-month-old project from an individual maintainer, the benchmarks are self-published, and the community debate about how much is “vibe-coded” is unresolved. Use it for local, privacy-first workloads; don’t bet a production migration on it yet.
What TurboQuant Is (and Why It Matters)
TurboQuant is Google Research’s answer to a classic problem: vector quantization normally requires a training/codebook-learning phase — you fit the quantizer to a corpus before you can search it, and adding new data means either freezing the codebook or retraining. TurboQuant is data-oblivious: the quantizer is derived analytically (a Beta-distribution assumption on vector norms), so there is no training phase at all. Indexes can ingest online, remove vectors, and grow without rebuilds.
Turbovec takes that algorithm and implements it in Rust with hand-written SIMD kernels:
- NEON SDOT/SMMLA on ARM (Apple Silicon)
- AVX-512 VNNI and
vpermbon x86, with AVX2 and scalar fallbacks
It ships two index types: TurboQuantIndex (plain float32 vectors, compact storage) and IdMapIndex (stable uint64 external ids with O(1) remove-by-id and hybrid filtered search).
The Benchmarks (as Published by the Project)
Memory: 31 GB → 4 GB
10M vectors at d=1536 float32 = 61 GB raw… the project’s 31 GB figure is the corpus with typical overhead. At 4-bit quantization with sub-quantizer encoding, the same corpus fits in ~4 GB — roughly 8× compression. That is the entire pitch: embedding stores at a fraction of the RAM cost, pure local.
Search Speed vs FAISS
The README compares against FAISS IndexPQFastScan (the production-grade PQ default, LUT256, nbits=8):
- ARM (Apple Silicon): TurboQuant beats FAISS FastScan in every config — averaging 3.5× at 4-bit (3.4–3.7× across cells) and 26% at 2-bit (22–29%).
- x86: every config won too — averaging 3.4× at 4-bit (3.2–3.5×, via AVX-512 VNNI) and 20% at 2-bit (5–32%).
Recall vs FAISS IndexPQ
At equal bit rates, calibrated TurboQuant (TQ+) on OpenAI d=1536 and d=3072 embeddings:
- Beats FAISS at R@1 on three of four cells (by 0.9–2.9 points); d=1536 4-bit trails by 0.7.
- Both reach R@1 ≈ 1.0 by k=8; ≥0.997 already at k≤4.
- GloVe d=200 is the weak regime — the low-dimension case where TurboQuant’s Beta assumption is loosest. TQ+ lands ahead of FAISS at R@1 at both bit widths (+1.9 at 4-bit, +0.8 at 2-bit), but FAISS keeps a slim edge at 2-bit from k≈8.
All benchmarks: 100K vectors, 1K queries, k=64, median of 5 runs.
Insert & Remove Latency
- Single add(): 6.3–19.7 µs — 7.6–13.9× faster than a FAISS single add (FAISS pays codebook training; turbovec has none).
- 100-vector batch: 4.6–16.3 µs/vector — 4.6–15.1× faster than FAISS.
- remove-by-id: 0.44–1.22 µs (O(1) swap-and-pop) vs FAISS’s 0.19–1.02 seconds per remove at 100K — FAISS
IndexIDMaprepacks stored codes on every removal, which is why the project’s removal charts use a log axis.
Persistence
sync(path) writes only what changed since the last sync — one fsync per call, crash-safe at any byte; a removal or small append costs milliseconds regardless of index size. write/load remain for whole-file snapshots. The round-trip path (mutate 1K → save → reopen → first query) is measured for turbovec; FAISS has no equivalent.
A Real Use Case: Air-Gapped RAG on a Laptop
The natural fit is privacy-first, local retrieval. The pattern works like this:
import numpy as np
from turbovec import IdMapIndex
idx = IdMapIndex(dim=1536, bit_width=4)
idx.add_with_ids(vectors, np.array(doc_ids, dtype=np.uint64))
# Stage 1: external system narrows to candidate ids (SQL/BM25/ACL/time window)
allowed = np.array(db.execute("SELECT id FROM docs WHERE tenant=?", (t,)).fetchall(),
dtype=np.uint64)
# Stage 2: kernel honors the allowlist directly — no over-fetch, no recall hit
scores, ids = idx.search(query, k=10, allowed_ids=allowed)
Because everything runs locally — pair it with any open-source embedding model — you get a fully air-gapped RAG stack with no managed service and no data leaving the machine. That is the use case the HN commenters latched onto: anishvarghese asked about compiling it to WASM for a browser extension; zuzululu asked about codebase indexing for agentic workflows.
Community Reception: The HN Thread (185 pts, 23 comments)
The thread was short but unusually polarized:
The enthusiasts:
ghm2199: “Wow! 4GB for 10 million documents. This means one could build a reverse index much faster than before… Can’t wait for the sqlite bindings to come out!” — also noting the log-scale removal latency advantage.zuzululu: “what could i use this for as part of my agentic workflow? codebase indexing? docs?”anishvarghese: “This looks perfect for local, privacy first search… has anyone tried compiling it to WASM?”
The skeptics:
badatnames(Anthropic employee, replying to a README criticism thread): “This is what your brain on kool aid looks like” — mocking the AI-generated tone.cute_boi: “Another vibe coded slop where they can’t even spend time on Readme or documentation around code…” — despite the README being unusually detailed with full benchmark methodology.refulgentis: “Bloviating nonsense… You don’t need float32, never did. Source: I’ve been writing on device embedding code for 4 years.” — arguing the compression claim is obvious to practitioners.beernet: “Why not just use Qdrant? They’ve been integrating TurboQuant for months, works well.”Eridrus: “FAISS is no longer close to SoTA” — pointing to ann-benchmarks.com and the NeurIPS 2023 Big-ANN results, implicitly questioning the FAISS-only baseline.bobmarleybiceps: “people should read turboquant’s open review comments” — linking the OpenReview forum for the paper, a signal that the underlying research had a contentious review.
nharada’s meta-criticism captured the middle: “It would be nice to have the README be a little more human written for a project where you actually want people to adopt it.”
Our read: the “vibe-coded” charge is about process (how the code was written), not output — and the README actually documents methodology far better than most Rust OSS. The substantive criticisms are (1) self-published benchmarks vs ann-benchmarks entry, and (2) Qdrant already integrating TurboQuant. Both are fair. Turbovec’s differentiators are the zero-training online ingest and local-first simplicity, not being the only TurboQuant implementation.
Pricing
Free. MIT license, pip install turbovec, crates.io for Rust. 15,240 stars / 1,345 forks at time of writing (Aug 19, 2026). No managed service, no paid tiers, no telemetry.
Alternatives
| Tool | Model | Training needed | Best for |
|---|---|---|---|
| Turbovec | TurboQuant (data-oblivious) | No | Local RAG, RAM-constrained embedding stores |
| FAISS IndexPQFastScan | PQ with k-means codebook | Yes | Production-scale, GPU, mature ecosystem |
| Qdrant | TurboQuant integrated | No (per Qdrant docs) | Managed/hybrid vector DB with filtering |
| LanceDB / Chroma / Weaviate | Various | Varies | Full vector DB features: metadata, namespaces, multi-tenancy |
Who Should Buy This
Use it if: you run local/air-gapped RAG, you’re memory-bound on embeddings, you want online ingest without codebook retraining, or you want to prototype TurboQuant-style compression before committing to Qdrant’s managed path.
Skip it if: you need a full vector database (multi-tenancy, replication, metadata filtering at DB level), you’re at production scale where independent benchmark verification (ann-benchmarks) matters, or you need the SQLite bindings the community is waiting for (not shipped yet).
FAQ
Q: Is Turbovec really 8× smaller than float32? The project claims 31 GB → 4 GB for a 10M-document corpus at 4-bit. The mechanism is standard PQ-style sub-quantization from TurboQuant; the exact ratio depends on dimension and bit width. The search-speed and latency figures are project-published (100K vectors, k=64, median of 5), not yet independently verified on ann-benchmarks.
Q: Does Turbovec need training like FAISS PQ? No. TurboQuant is data-oblivious — no codebook training phase. That’s the core architectural difference and what enables online ingest, O(1) removal, and no rebuilds.
Q: Can I use it with my existing embeddings?
Yes — it accepts 2-D float32 arrays of shape (n, dim); other dtypes are rejected rather than silently converted (cast with np.asarray(x, dtype=np.float32)). It works with any embedding model you already have.
Q: Is it production-ready? Depends on your bar. The code is MIT-licensed, documented, and benchmarked; the maintainer is an individual, the project is ~5 months old, and the community raised both code-quality (“vibe-coded”) and verification concerns. For non-critical local workloads: yes. For regulated production: wait for independent benchmarks and more adoption.
Q: What’s the roadmap gap? SQLite bindings (community-requested), WASM support (asked in the thread), and an ann-benchmarks entry would each meaningfully de-risk the project. Qdrant’s TurboQuant integration is the main competitive pressure.