Phase 1 · Local Rules · Client-Only

Trusted Data. Simplified.

Apply enterprise-ready rules or custom checks to any CSV, XLSX, or JSON. Find errors fast and fix them before they spread.

  • Schema-aware & cross-field rules
  • Declarative JSON + TS snippets
  • Optimized for CSV / XLSX (JSON too)
  • Deterministic, scored, auditable
orders.csv
orderId,email,amount,currency,startDate,endDate,country
1,ada@example.com,120.50,USD,2025-10-01,2025-10-03,US
2,grace@example.com,999999.99,USD,2025-10-02,2025-10-04,CA
3,wrong@,12,USD,2025-10-05,2025-10-01,GB
1
Source
Upload CSV/XLSX/JSON or start blank

Auto-detect headers, sample rows, and inferred types. Keep data local in Phase 1.

Open Demo
2
Rules
Assign validations per column

Use RuleAdder to add required, type, length, range, enum, regex, date order and more. Edit options inline; bulk-apply “required.”

See Rule Builder
3
Run & Report
Validate, profile, and export issues

KPIs, profiling table, and downloadable CSV of issues—matching the demo experience.

Try Validation

Validation Packs

Mix and match enterprise-ready checks. Extend with custom TS snippets.

Identity & Contact

Email pattern+MX, E.164 phone, name heuristics, DOB range, UUID/ULID, username policy.

Address & Geo

Postal formats, ISO-3166, state/region coherence, lat/lon bounds, distance rules.

Finance

Luhn (NPI, IBAN, CC, CUSIP), IBAN, SWIFT/BIC shape, ISO-4217 currency, precision/scale, tax ID lengths.

Data Quality

Required/nullable, enum, regex, min/max, ISO-8601 dates, uniqueness, referential checks.

Cross-Field Logic

“If A then B”, conditional ranges, temporal ordering, dependency graphs.

External Sources

Phase 2: HTTP/SQL/Snowflake/CSV refs with TTL cache, per-rule timeouts, backoff.

Declarative JSON

{
  "entity": "Orders",
  "columns": {
    "orderId": ["required","uuid_v4"],
    "email": ["required","email_pattern"],
    "currency": ["iso4217"],
    "amount": ["number","precision:2","min:0"],
    "createdAt": ["date_iso"],
    "shipTo.country": ["iso3166_alpha2"],
    "shipTo.postal": ["postal_by_country:shipTo.country"]
  },
  "policy": { "fail": "any" }
}

Custom Rule (TS)

export default function postalByCountry({ get, add }: any) {
  const c = String(get('shipTo.country') || '').toUpperCase()
  const p = String(get('shipTo.postal') || '')
  const MAP: Record<string, RegExp> = {
    US: /^[0-9]{5}(-[0-9]{4})?$/,
    CA: /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/,
    GB: /^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$/i
  }
  const re = MAP[c]
  if (re && !re.test(p)) add('postal.pattern', `Postal does not match ${c}`)
}