OPEN SOURCE · MIT · v1.0.0

Fuzzy search,
shipped as 3 KB
of WebAssembly.

A complete fuzzy search runtime for the browser. Bloom pre-filter, Bitap matching, accent-insensitive, typo-tolerant — zero backend, zero network after load.

Quick start →
$ npm i flashfuzzy
GitHub
InputTokenizerBloom BuilderIndexStorePipelineResults
Expand ↗7 nodes · 6 edges / < 1 ms query

Runtime topology — full diagram

INGEST
01
INPUT
JSON · arrays
02
TOKENIZER
unicode fold
03
BLOOM BUILDER
64-bit filter
04
INDEX
BSS pool
05
STORE
3 KB · 50k tokens
SEARCH
06
PIPELINE
bloom ▸ bitap / score ▸ rank
07
RESULTS
< 1 ms
3 KB
Main WASM binary
<1 ms
Query on 100k records
10–100×
Faster than JS fuzzy libs
0 deps
Core + search crates

Three steps, no server.

STEP 01 · DROP

DROP

Feed any array, JSON, or text.

array / JSON ──▶ flashfuzzy
no network · no server
STEP 02 · INDEX

INDEX

Tokenizer + Bloom filter.

tokens ──▶ bloom builder ──▶ BSS
unicode fold · 64-bit filter
STEP 03 · SEARCH

SEARCH

Bloom skips, Bitap finishes.

bloom filter ──▶ bitap
O(1) skip · O(n·k) match

Four stages, one pass.

01
Bloom Filter
O(1) — probabilistic skip
02
Bitap Shift-Or
O(n·k) — up to 2 edits
1
·
·
1
·
·
·
·
·
1
·
·
·
·
1
·
·
·
1
·
·
·
·
1
·
1
·
1
·
·
·
·
·
·
·
·
1
·
·
·
·
·
1
·
·
1
·
1
·
·
·
·
·
·
1
·
·
·
1
·
·
·
·
1
03
Score
O(1) — edit-dist, position, freq
edit
1.0
pos
0.7
freq
0.5
04
Rank
O(log k) — min-heap top-K
0.98
0.84
0.79
0.68
0.62
0.55
0.50
BSS POOL 3 KB
TOKENS 50k
bloom bits
doc index

Built for the browser edge.

Zero backend

Runs entirely in the browser. No server, no API calls.

3 KB · MIT
Typo-tolerant

Bitap allows up to 2 edit operations. Finds "javascript" from "javsacript".

bitap · adaptive
á
Accent-insensitive

café matches cafe. Full Latin Extended fold.

U+00C0 – U+00FF
Multi-field

Search across name, description, tags simultaneously.

multi-field
Any data

Arrays of strings, objects, JSON — no schema required.

json · arrays · objects
Zero allocator

BSS static memory. No heap, no GC pressure.

no_std · no_alloc

Query language.

PatternMeaningExample match
wordFuzzy single tokenflashfuzzy → matches flashfuzzy, flashfuzy
a bAll tokens ANDreact hooks → both must appear
"a b"Exact phrasehello world
a | bEither tokentypescript | javascript
"a b" | cPhrase OR tokenfuzzy search | search

Up in under a minute.

index.ts
import { FlashFuzzy } from "flashfuzzy";

const ff = await FlashFuzzy.create();

ff.index([
  { id: 1, name: "React Hooks", tags: ["react", "js"] },
  { id: 2, name: "Vue Composition API", tags: ["vue", "js"] },
]);

const hits = ff.search("raect hoks");  // typo-tolerant

for (const h of hits) {
  console.log(h.id, h.score, h.snippet);
}

What goes in.

arrays
JavaScript arrays
Native JS array input
objects
Plain JS objects
Any object shape
JSON
Serialised JSON
Parsed automatically
CSV
CSV rows
Parsed as row objects
text
Raw strings
String array input

Default limits.

3 KB
WASM binary
Total runtime size
50k
Token capacity
Tokens stored in BSS pool
100
Max documents
Concurrent indexed records
32 chars
Query limit
Max query string length

Ship fuzzy search today.

No backend required. Runs entirely in the browser.

npmnpm install flashfuzzy
pnpmpnpm add flashfuzzy
yarnyarn add flashfuzzy
cargocargo add flashfuzzy
pippip install flashfuzzy