Data validation that discovers rules from your data so you don't have to write them
Project description
GoldenCheck
Data validation that discovers rules from your data so you don't have to write them.
Every competitor makes you write rules first. GoldenCheck flips it: validate first, keep the rules you care about.
Why GoldenCheck?
| GoldenCheck | Great Expectations | Pandera | Pointblank | |
|---|---|---|---|---|
| Rules | Discovered from data | Written by hand | Written by hand | Written by hand |
| Config | Zero to start | Heavy YAML/Python setup | Decorators/schemas | YAML/Python |
| Interface | CLI + interactive TUI | HTML reports | Exceptions | HTML/notebook |
| Learning curve | One command | Hours/days | Moderate | Moderate |
| LLM enhancement | Yes ($0.01/scan) | No | No | No |
| Fix suggestions | Yes, in TUI | No | No | No |
| Confidence scoring | Yes (H/M/L per finding) | No | No | No |
| DQBench Score | 88.40 | 21.68 (best-effort) | 32.51 (best-effort) | 6.94 (auto) |
Install
pip install goldencheck
With LLM boost support:
pip install goldencheck[llm]
Quick Start
# Scan a file — discovers issues, launches interactive TUI
goldencheck data.csv
# CLI-only output (no TUI)
goldencheck data.csv --no-tui
# With LLM enhancement (requires API key)
goldencheck data.csv --llm-boost --no-tui
# Validate against saved rules (for CI/pipelines)
goldencheck validate data.csv
# JSON output for CI integration
goldencheck data.csv --no-tui --json
How It Works
1. SCAN → goldencheck data.csv
GoldenCheck profiles your data and discovers what "healthy" looks like
2. REVIEW → Interactive TUI shows findings sorted by severity
Each finding has: description, affected rows, sample values
3. PIN → Press Space to promote findings into permanent rules
Dismiss false positives — they won't come back
4. EXPORT → Press F2 to save rules to goldencheck.yml
Human-readable YAML with your pinned rules
5. VALIDATE → goldencheck validate data.csv
Enforce rules in CI with exit codes (0 = pass, 1 = fail)
What It Detects
Column-Level Profilers
| Profiler | What It Catches | Example |
|---|---|---|
| Type inference | String columns that are actually numeric | "Column age is string but 98% are integer" |
| Nullability | Required vs. optional columns | "0 nulls across 50k rows — likely required" |
| Uniqueness | Primary key candidates, near-duplicates | "100% unique — likely primary key" |
| Format detection | Emails, phones, URLs, dates | "94% email format, 6% malformed" |
| Range & distribution | Outliers, min/max bounds | "3 rows have values >10,000" |
| Cardinality | Low-cardinality enum suggestions | "4 unique values — possible enum" |
| Pattern consistency | Mixed formats within a column | "3 phone formats detected" |
Cross-Column Profilers
| Profiler | What It Catches |
|---|---|
| Temporal ordering | start_date > end_date violations |
| Null correlation | Columns that are null together (e.g., address + city + zip) |
| Numeric cross-column | value > max violations (e.g., claim_amount > policy_max) |
| Age vs DOB | Age column doesn't match calculated age from date_of_birth |
Domain Packs
Improve detection accuracy with domain-specific type definitions:
goldencheck scan data.csv --domain healthcare # NPI, ICD, insurance, patient types
goldencheck scan data.csv --domain finance # accounts, routing, CUSIP, transactions
goldencheck scan data.csv --domain ecommerce # SKUs, orders, tracking, products
Domain packs add semantic types that reduce false positives and improve classification for industry-specific data.
Schema Diff
Compare two versions of a data file:
goldencheck diff data.csv # compare against git HEAD
goldencheck diff old.csv new.csv # compare two files
goldencheck diff data.csv --ref main # compare against a branch
Auto-Fix
Apply automated fixes to clean your data:
goldencheck fix data.csv # safe: trim, normalize, fix encoding
goldencheck fix data.csv --mode moderate # + standardize case
goldencheck fix data.csv --mode aggressive --force # + coerce types
goldencheck fix data.csv --dry-run # preview changes
Watch Mode
Continuously monitor a directory for data quality:
goldencheck watch data/ --interval 30 # re-scan every 30s
goldencheck watch data/ --exit-on error # CI mode: fail on first error
REST API
Run GoldenCheck as a microservice:
goldencheck serve --port 8000
# Scan via file upload
curl -X POST http://localhost:8000/scan --data-binary @data.csv
# Scan via URL
curl -X POST http://localhost:8000/scan/url -d '{"url": "https://example.com/data.csv"}'
Database Scanning
Scan tables directly — no CSV export needed:
pip install goldencheck[db]
goldencheck scan-db "postgresql://user:pass@host/db" --table orders
goldencheck scan-db "snowflake://..." --query "SELECT * FROM orders WHERE date > '2024-01-01'"
Scheduled Runs
Cron-like scheduling with webhook notifications:
goldencheck schedule data/*.csv --interval hourly --webhook https://hooks.slack.com/...
goldencheck schedule data/*.csv --interval daily --notify-on grade-drop
LLM Boost
Add --llm-boost to enhance profiler findings with LLM intelligence. The LLM receives a representative sample of your data and:
- Finds issues profilers miss — semantic understanding (e.g., "12345" in a name column)
- Upgrades severity — knows "emails should be required" even if the profiler only says "INFO"
- Discovers relationships — identifies temporal ordering between columns like
signup_dateandlast_login - Downgrades false positives — "mixed phone formats are common, not an error"
# Using OpenAI
export OPENAI_API_KEY=sk-...
goldencheck data.csv --llm-boost --llm-provider openai --no-tui
# Using Anthropic
export ANTHROPIC_API_KEY=sk-ant-...
goldencheck data.csv --llm-boost --no-tui
Cost: ~$0.01 per scan (one API call with representative samples, not per-row).
Budget control:
export GOLDENCHECK_LLM_BUDGET=0.50 # max spend per scan in USD
Configuration (goldencheck.yml)
version: 1
settings:
sample_size: 100000
fail_on: error
columns:
email:
type: string
required: true
format: email
unique: true
age:
type: integer
range: [0, 120]
status:
type: string
enum: [active, inactive, pending, closed]
relations:
- type: temporal_order
columns: [start_date, end_date]
ignore:
- column: notes
check: nullability
Only pinned rules appear in this file — not every finding. The ignore list prevents dismissed findings from reappearing.
CLI Reference
| Command | Description |
|---|---|
goldencheck <file> |
Scan and launch TUI |
goldencheck scan <file> |
Explicit scan (supports --smart, --guided) |
goldencheck validate <file> |
Validate against goldencheck.yml |
goldencheck review <file> |
Scan + validate, launch TUI |
goldencheck init <file> |
Interactive setup wizard (scan → config → CI) |
goldencheck diff <file> [file2] |
Compare two files or against git HEAD |
goldencheck watch <dir> |
Poll directory, re-scan on change |
goldencheck fix <file> |
Auto-fix data quality issues |
goldencheck learn <file> |
Generate LLM validation rules |
goldencheck history |
Show scan history and trends |
goldencheck serve |
Start REST API server |
goldencheck scan-db <conn> |
Scan a database table directly |
goldencheck schedule <files> |
Run scans on a cron schedule |
goldencheck mcp-serve |
Start MCP server (9 tools) |
Flags
| Flag | Description |
|---|---|
--no-tui |
Print results to console |
--json |
JSON output |
--fail-on <level> |
Exit 1 on severity: error or warning |
--domain <name> |
Domain pack: healthcare, finance, ecommerce |
--llm-boost |
Enable LLM enhancement |
--llm-provider <name> |
LLM provider: anthropic (default) or openai |
--mode <level> |
Fix mode: safe, moderate, aggressive |
--smart |
Auto-triage: pin high-confidence, dismiss low |
--guided |
Walk through findings one-by-one |
--webhook <url> |
POST findings to Slack/PagerDuty/any URL |
--notify-on <trigger> |
Webhook trigger: grade-drop, any-error, any-warning |
--version |
Show version |
Benchmarks
Speed
| Dataset | Time | Throughput |
|---|---|---|
| 1K rows | 0.05s | 19K rows/sec |
| 10K rows | 0.23s | 43K rows/sec |
| 100K rows | 2.29s | 44K rows/sec |
| 1M rows | 2.07s | 482K rows/sec |
DQBench v1.0 — Head-to-Head
| Tool | Mode | DQBench Score |
|---|---|---|
| GoldenCheck | zero-config | 88.40 |
| Pandera | best-effort rules | 32.51 |
| Soda Core | best-effort rules | 22.36 |
| Great Expectations | best-effort rules | 21.68 |
GoldenCheck's zero-config discovery outperforms every competitor — even when they have hand-written rules.
Run the benchmark yourself:
pip install dqbench goldencheck
dqbench run goldencheck
Detection Accuracy
| Mode | Column Recall | Cost |
|---|---|---|
| Profiler-only (v0.1.0) | 87% | $0 |
| Profiler-only (v0.2.0 with confidence) | 100% | $0 |
| With LLM Boost | 100% | ~$0.003-0.01 |
Tested on a custom benchmark with 341 planted data quality issues across 9 categories.
v0.2.0 improvements: minority wrong-type detection, range profiler chaining, broader temporal heuristics, and confidence scoring pushed profiler-only recall from 87% to 100%.
Raha Benchmark Datasets
| Dataset | Column Recall |
|---|---|
| Flights (2,376 rows) | 100% (4/4 columns) |
| Beers (2,410 rows) | 80% (4/5 columns) |
Tech Stack
| Dependency | Purpose |
|---|---|
| Polars | All data operations |
| Typer | CLI framework |
| Textual | Interactive TUI |
| Rich | CLI output formatting |
| Pydantic 2 | Config validation |
Optional: Anthropic SDK / OpenAI SDK for LLM Boost | MCP SDK for MCP server
MCP Server (Claude Desktop)
GoldenCheck includes an MCP server for Claude Desktop integration:
pip install goldencheck[mcp]
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"goldencheck": {
"command": "goldencheck",
"args": ["mcp-serve"]
}
}
}
Available tools:
| Tool | Description |
|---|---|
scan |
Scan a file for data quality issues (with optional LLM boost) |
validate |
Validate against pinned rules in goldencheck.yml |
profile |
Get column-level statistics and health score |
health_score |
Quick A-F grade for a data file |
get_column_detail |
Deep-dive into a specific column |
list_checks |
List all available profiler checks |
Remote MCP Server
GoldenCheck is available as a hosted MCP server on Smithery — connect from any MCP client without installing anything.
Claude Desktop / Claude Code:
{
"mcpServers": {
"goldencheck": {
"url": "https://goldencheck-mcp-production.up.railway.app/mcp/"
}
}
}
Local server:
pip install goldencheck[mcp]
goldencheck mcp-serve
19 tools available: scan files, validate rules, profile columns, health-score datasets, auto-configure validation, explain findings, compare domains, suggest fixes.
Jupyter / Colab
GoldenCheck renders rich HTML in Jupyter notebooks:
from goldencheck.engine.scanner import scan_file
from goldencheck.engine.confidence import apply_confidence_downgrade
from goldencheck.notebook import ScanResult
findings, profile = scan_file("data.csv")
findings = apply_confidence_downgrade(findings, llm_boost=False)
# Rich HTML display in notebooks
ScanResult(findings=findings, profile=profile)
Contributing
See CONTRIBUTING.md for development setup and guidelines.
License
MIT — see LICENSE
Part of the Golden Suite:
- GoldenMatch — entity resolution toolkit.
pip install goldenmatch[quality]auto-integrates GoldenCheck as a pre-matching quality step. - dbt-goldencheck — data validation as a dbt test.
- goldencheck-types — community-contributed domain type packs.
- goldencheck-action — GitHub Action for CI with PR comments.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file goldencheck-1.0.2.tar.gz.
File metadata
- Download URL: goldencheck-1.0.2.tar.gz
- Upload date:
- Size: 403.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b77c3f30475f9e9e2549505c483e0c37b9207dd66d1b9643d169e3f27a7f671
|
|
| MD5 |
a81432825bdc01ab3fcb784d379f9a54
|
|
| BLAKE2b-256 |
4653ad84eb9bb4bc4bd3f5c5a955bf6890f4e5b18a17c87a98b5309c6b19a831
|
Provenance
The following attestation bundles were made for goldencheck-1.0.2.tar.gz:
Publisher:
publish.yml on benzsevern/goldencheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
goldencheck-1.0.2.tar.gz -
Subject digest:
5b77c3f30475f9e9e2549505c483e0c37b9207dd66d1b9643d169e3f27a7f671 - Sigstore transparency entry: 1193761810
- Sigstore integration time:
-
Permalink:
benzsevern/goldencheck@44790edbb23898c21760167ccef869ba719ff29a -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/benzsevern
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@44790edbb23898c21760167ccef869ba719ff29a -
Trigger Event:
release
-
Statement type:
File details
Details for the file goldencheck-1.0.2-py3-none-any.whl.
File metadata
- Download URL: goldencheck-1.0.2-py3-none-any.whl
- Upload date:
- Size: 136.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51a65e421479ecf9833d654db1f81928c9f6e5a2dc5bba5bed8695a3c93ce448
|
|
| MD5 |
80ce7d00306568df7a6035c97fd07cab
|
|
| BLAKE2b-256 |
d9cb68b22e58fd6f131ae41a2fb24d4faca89a2578aa98624171bf36ee56a9f0
|
Provenance
The following attestation bundles were made for goldencheck-1.0.2-py3-none-any.whl:
Publisher:
publish.yml on benzsevern/goldencheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
goldencheck-1.0.2-py3-none-any.whl -
Subject digest:
51a65e421479ecf9833d654db1f81928c9f6e5a2dc5bba5bed8695a3c93ce448 - Sigstore transparency entry: 1193761844
- Sigstore integration time:
-
Permalink:
benzsevern/goldencheck@44790edbb23898c21760167ccef869ba719ff29a -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/benzsevern
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@44790edbb23898c21760167ccef869ba719ff29a -
Trigger Event:
release
-
Statement type: