Start with a useful question
For inventory, “Did each SKU at each warehouse change quantity?” is more useful than comparing file order. Choose SKU and warehouse as a composite key, then compare quantity and any labels that matter.
- Load both UTF-8 CSVs, selecting each delimiter first.
- Map key components across the two header names. Choose normalization deliberately.
- Select comparison fields. Numeric tolerance is absolute, in the field’s units.
- Compare, inspect count checks, and review duplicate groups one row at a time.
- Download details, exceptions, the pair index and appropriate clean subsets. Save a rule recipe for the next run.
About this AppKatz Kit
AppKatz Kits · Duplicate-Aware CSV Reconciliation · v1.0. Original implementation authored for AppKatz, 2026. The AppKatz logo, wordmark, tool identity, help, source attribution, recipe identifier and human-readable reports carry the AppKatz identity. Clean CSV schemas receive no branding rows or columns.
Branding is a casual copying deterrent. Client-side code can be inspected and changed. There is no tracking, activation, anti-debugging, copy restriction or tamper check. All code and assets are included; there are no third-party runtime dependencies.
How comparisons behave
Keys: exact text tuples, optionally trimmed and lowercased. Composite components are encoded separately, so embedded separators cannot create accidental key collisions. Blank/whitespace-only components and wrong CSV row widths are exceptions.
Duplicates: a repeated key on either side always creates a review group, even when the other side has no row. Identical rows and one-to-many matches are not automatically resolved. Each explicit decision consumes a row at most once.
Text: exact unless trim or ignore-case is selected. “Ignore case” uses JavaScript lowercase, not locale-specific linguistic matching; Unicode normalization is not inferred.
Numbers: signed plain decimals only, up to 50 digits total and 18 decimal places. No separators, exponent notation, dates, currencies, or locale guessing. 5.005 and 5.00 match at tolerance 0.01. Invalid numeric values create paired exceptions, even when both contain the same invalid text.
Unchanged means equal under your selected fields and rules. Different original values accepted by normalization/tolerance appear as equivalent in the detail report. Unselected fields are not checked. Key-presence-only mode checks no values.
What the example demonstrates
Nine left and ten right stock records start with two unchanged pairs, one changed pair, one paired numeric exception, one left-only row, two right-only rows, one invalid-key row, and seven unresolved rows in two duplicate groups. Warehouse keys ignore case; quantity uses a 0.01 absolute tolerance. Leading zeros, quoted commas, Unicode, and formula-like data remain visible. Notes are intentionally not compared.
Limits, privacy & troubleshooting
Per CSV: 10 MiB, 50,000 data records, 100 columns, 1,000,000 cells including headers, 100,000 characters per field, 200 per header. All limits apply together. Up to 5 key components, 30 comparison fields, 500,000 paired-field evaluations, and 250,000 non-identical field details. Each export is capped at 40 Mi characters. Recipes are limited to 1 MiB.
Verified in Chrome 154 on Windows: 50,000 records × 10 columns per side (about 2.15 MB each), 449,100 paired-field comparisons, 50 duplicate groups and 200 unresolved rows. Worker cancellation, actual downloads, repeat imports, reset, and 390 px layout passed focused tests. Other browsers and physical mobile devices are not qualified.
Verified standalone processing: a Chrome audit of the offline load, compare, review, recipe and download workflow observed no outgoing HTTP(S) or WebSocket requests. Static inspection found no network or persistent-storage APIs. This file has no external assets, analytics or ad scripts; its content security policy blocks outgoing connections. This audit does not cover browser extensions or a future hosting page.
Saving work and safe downloads
The workspace lives in memory. Reload and clear remove loaded files, rules, results and decisions; downloaded files remain. New files or rule edits clear comparison decisions. Save reports before changing the setup. Recipes save rules and exact ordered header schemas, never record-level decisions. Schema drift blocks recipe application.
Clean exports exclude unresolved rows, invalid keys/widths, and paired numeric exceptions. Partial clean outputs require acknowledgement. Every clean CSV retains that side’s original columns and source order. Use the pair index for relationships; separate paired files are not row-aligned.
Formula-risk starts include =, +, - and @ after whitespace, their full-width variants, and initial tabs/newlines. Quoting alone does not prevent spreadsheet execution. Default exports block risky cells; apostrophe escaping changes data and is not a universal spreadsheet safeguard. Exact-risk export requires acknowledgement. Spreadsheet apps may reformat identifiers; import those columns as Text.
If something looks wrong
One giant column usually means the wrong delimiter. Change it and reload. Fix duplicate or blank headers upstream; header spaces and case are preserved. Malformed quotes reject the entire file. Wrong-width data records become exceptions. Truly blank records are kept and checked. Re-save invalid UTF-8/UTF-16 files as UTF-8 CSV.
Cancel terminates the worker and retains the last successful state. Header-only CSVs are valid. These rules cannot determine real-world identity or guarantee import acceptance. This tool does not perform accounting reconciliation, journal matching, payment splitting, fuzzy matching, XLSX parsing, or external-system updates.
Use a current desktop browser with JavaScript, Web Workers, TextDecoder, BigInt and Blob downloads. Restricted browsers may block local workers. Future hosting pages and browser extensions are outside this file’s privacy verification.