Quick Start
Two Entrypoints
The package ships with two separate entry points so the core stays edge-safe and dependency-free:goldenmatch— edge-safe core. Works in browsers, Cloudflare Workers, Vercel Edge Runtime, Deno, Bun, and Node.goldenmatch/node— adds Node-only features: file I/O (CSV, JSON), HTTP servers, DB connectors.
Core API
dedupe(rows, options)
Deduplicate an array of rows.match(target, reference, options)
Match target records against a reference dataset. Returns matched pairs with confidence scores.scoreStrings(a, b, scorer?)
Score similarity between two strings. Available scorers:exact, jaro_winkler, levenshtein, token_sort, soundex_match, dice, jaccard, ensemble, given_name_aliased_jw, name_freq_weighted_jw.
applyTransforms(value, transforms)
Apply a chain of normalization transforms to a value.Scorers
All scorers implement the same interface as Pythongoldenmatch.core.scorer:
The two
*_jw scorers are refdata-aware and edge-safe: their bundled lookup tables (a given-name alias corpus and the US Census 2010 top-10k surname table) ship inside the npm package, generated from the Python source of truth and drift-guarded in CI. Auto-config swaps them in automatically for first-name and last-name columns. See Reference Data for the algorithms.
Optional WASM acceleration
The pure-TS scorers run everywhere (browser, Workers, edge, Node) with zero dependencies — that’s the default. For workloads that score large blocks you can optionally swap in a WebAssembly backend that wraps the same Rustscore-core kernel the Python package and the SQL UDFs use:
- Opt-in; pure-TS stays the default and the fallback. Default users download and parse zero wasm bytes (the loader/glue/bytes load only on
enableWasm()). It returnsfalse(pure-TS stays active) on any load failure; pass{ require: true }to throw instead. - Covered scorers:
jaro_winkler/levenshtein/token_sort/exact— the opsscore-coreimplements. Every other scorer always stays pure-TS, even when WASM is enabled. The swap is at the NxN block boundary (one JS↔WASM crossing per block, never per pair). - Edge-safe + portable: Node, browsers, and Workers. The
.wasmships inside the npm package; the loader resolves it at runtime. - Parity-guaranteed: the WASM kernel is rapidfuzz, and the pure-TS scorers are aligned with rapidfuzz to 4 decimals — so enabling WASM does not change results, it just runs them faster.
goldenanalysis exposes the same opt-in pattern for its aggregation primitives via enableAnalysisWasm() — see GoldenAnalysis › Native accelerator.
Blocking Strategies
static— single blocking key with transformsmulti_pass— multiple blocking keys, union of blockssorted_neighborhood— sliding window over sorted dataadaptive— static + auto-split oversized blocksann— approximate nearest neighbor (requireshnswlib-nodepeer dep)canopy— TF-IDF canopy clusteringlearned— data-driven predicate selection
Golden Record Strategies
most_complete— pick longest stringmajority_vote— pick most frequentsource_priority— pick first non-null from priority listmost_recent— pick value with most recent datefirst_non_null— pick first non-null
Transforms
Applied at matchkey time. Same names as the Python toolkit:lowercase, uppercase, strip, strip_all, soundex, metaphone,
digits_only, alpha_only, normalize_whitespace, token_sort,
first_token, last_token, substring:start:end, qgram:n.
CLI
The npm package ships agoldenmatch-js binary:
Servers
MCP server (Claude Desktop / Claude Code)
REST API server
/health, /dedupe, /match, /score, /explain, /profile, /clusters, /reviews.
A2A agent server
/.well-known/agent.json advertises 36 skills (the union of the base A2A skills plus the agent, memory, and identity registries, de-duped by id).
Interactive TUI
Optional Peer Dependencies
All peer deps are optional. Install only what you need:
The database connectors below are not declared peers — they are loaded via
runtime dynamic
import() only when you use the matching Node connector, so
install whichever you need directly: pg (Postgres), @duckdb/node-api
(DuckDB), snowflake-sdk (Snowflake), @google-cloud/bigquery (BigQuery),
@databricks/sql (Databricks).
Advanced Features
- Probabilistic matching — Fellegi-Sunter with Splink-style EM
- Splink config converter —
import-splinkCLI /convert_splink_configMCP tool /fromSplink()API converts a Splink settings (or trained-model) JSON into a GoldenMatch config, importing trained m/u probabilities directly - Negative evidence on Fellegi-Sunter matchkeys — goldenmatch-js 1.3.0 is a full FS-NE mirror of Python (trainEM / scoring / validation / loader matrix; new exports
neFired,fsWeightRange,NegativeEvidenceUnsupportedError; the loader now parsesnegative_evidencefor all matchkey types instead of silently dropping it). The TS pipeline (dedupe/matchRecords) throws on probabilistic+NE (its probabilistic scoring is a simplified weighted-style average), the continuous path rejects NE, andderive_fromNE is rejected in TS — materialize the column first, or use Python - PPRL — Privacy-preserving record linkage with SHA-256 bloom filters (3 security levels: standard, high, paranoid)
- Graph ER — Multi-table entity resolution with evidence propagation
- Streaming — Incremental single-record matching
- Memory — Persistent corrections + threshold learning
- Sensitivity analysis — Parameter sweep with CCMS / TWI cluster comparison
- Lineage tracking — Full provenance per field per golden record
Examples
Seepackages/goldenmatch-js/examples/ for 11 full end-to-end TypeScript examples covering dedupe, match, PPRL, streaming, graph ER, Fellegi-Sunter, and more.
Source
- npm: https://www.npmjs.com/package/goldenmatch
- GitHub: https://github.com/benseverndev-oss/goldenmatch/tree/main/packages/goldenmatch-js