Skip to main content
GoldenMatch is also published as an npm package with full feature parity with the Python toolkit.

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 Python goldenmatch.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 Rust score-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 returns false (pure-TS stays active) on any load failure; pass { require: true } to throw instead.
  • Covered scorers: jaro_winkler / levenshtein / token_sort / exact — the ops score-core implements. 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 .wasm ships 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 transforms
  • multi_pass — multiple blocking keys, union of blocks
  • sorted_neighborhood — sliding window over sorted data
  • adaptive — static + auto-split oversized blocks
  • ann — approximate nearest neighbor (requires hnswlib-node peer dep)
  • canopy — TF-IDF canopy clustering
  • learned — data-driven predicate selection

Golden Record Strategies

  • most_complete — pick longest string
  • majority_vote — pick most frequent
  • source_priority — pick first non-null from priority list
  • most_recent — pick value with most recent date
  • first_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 a goldenmatch-js binary:

Servers

MCP server (Claude Desktop / Claude Code)

Exposes 45 MCP tools over JSON-RPC on stdio.

REST API server

Endpoints: /health, /dedupe, /match, /score, /explain, /profile, /clusters, /reviews.

A2A agent server

Agent card at /.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

Requires the Ink peer deps (see below).

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 converterimport-splink CLI / convert_splink_config MCP 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 parses negative_evidence for 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, and derive_from NE 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

See packages/goldenmatch-js/examples/ for 11 full end-to-end TypeScript examples covering dedupe, match, PPRL, streaming, graph ER, Fellegi-Sunter, and more.

Source

Comparison With Python