Experimental WASM + relaxed SIMD build of botirk38/turboquant for browsers and Node.js.
Based on the paper "TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate" (Google Research, ICLR 2026).
Live Demo — vector search, image similarity, and 3D Gaussian Splatting compression running in the browser.
npm install turboquant-wasm@mulAdd FMA maps to f32x4.relaxed_maddTurboQuant.init() / encode() / decode() / dot()The WASM binary uses relaxed SIMD instructions:
| Runtime | Minimum Version |
|---|---|
| Chrome | 114+ |
| Firefox | 128+ |
| Safari | 18+ |
| Node.js | 20+ |
import { TurboQuant } from "turboquant-wasm";
const tq = await TurboQuant.init({ dim: 1024, seed: 42 });
// Compress a vector (~4.5 bits/dim, ~6x compression) const compressed = tq.encode(myFloat32Array);
// Decode back const decoded = tq.decode(compressed);
// Fast dot product without decoding const score = tq.dot(queryVector, compressed);
// Batch search: one WASM call for all vectors (83x faster than looping dot()) const allCompressed = new Uint8Array(/* concatenated compressed vectors */); const scores = tq.dotBatch(queryVector, allCompressed, bytesPerVector);
tq.destroy();
class TurboQuant { static async init(config: { dim: number; seed: number }): Promise<TurboQuant>; encode(vector: Float32Array): Uint8Array; decode(compressed: Uint8Array): Float32Array; dot(query: Float32Array, compressed: Uint8Array): number; dotBatch(query: Float32Array, compressedConcat: Uint8Array, bytesPerVector: number): Float32Array; destroy(): void; }
zig test -target aarch64-macos src/turboquant.zig
bun run build
bun run build:zig
Requires Zig 0.15.2 and Bun.
Encoding preserves inner products — verified by golden-value tests and distortion bounds:
MIT