I make small browser-only tools, mostly for text and CSV cleanup. This one exists because I had two stock files and a SKU list, and I wasn't going to upload a supplier inventory to a website I found on Google.
The job is simple: keep the rows in A that are not in B. Pick the key column in each file, compare, download what's left.
The first version only matched one column, and that's where it went wrong. In the screenshot, A is matched to B on sku alone. Six rows in, two matched, four left. The two that went were ACME/100 and BETA/100. Only one of them was the row I meant to remove. Same SKU, different supplier, so "duplicate" was the wrong word for one of them.
I could have added a warning. Instead I added a second key, so supplier + SKU has to match together. A single key is still the default, and there's a case toggle for emails, because CARL@ and carl@ are the same person while two codes that differ by case usually are not.
Under the hood it's nothing clever. A Worker in the tab parses both files, builds a set from B, filters A, and gives you two downloads. For an unedited file, remaining rows come out byte-preserved (original header, quoting, BOM, line endings), and the matching rows come out as a separate file so you can see what got dropped before you import anything. There's a small XLSX export too, written as text so 00123 stays 00123.
Limits, because they matter more than the features. Not a join: B's columns never get added to A. Not a cell-level diff: it drops whole records. UTF-8 CSV only, 2 MiB and 100,000 rows per file, two keys maximum, no automatic delimiter guessing. It also does not trim whitespace or normalize Unicode, so a trailing space from a web form really will stop two values from matching. I left that one visible on purpose. Quietly "fixing" it is how a file gets filtered wrong and nobody notices until the emails are already out. There is a check that lists remaining rows differing from B only by surrounding spaces, but it does not change the result.




