PasteDiff

Compare two lists — paste one item per line into each pane and instantly see which items are only in one list and which are in both. Entirely in your browser; nothing is uploaded.

Paste text above and hit Compare (or just type — it updates live).

Compare two lists online — see what's missing, what's shared, what's extra

Paste one list into each pane, one item per line, and you get three columns instead of a diff: items only in the first list, items in both, and items only in the second. The sample above is an invite list vs. the people who actually showed up — three invitees missing, two walk-ins, one duplicate collapsed and counted. Each column has a one-click copy, so "email everyone who didn't come" is a ten-second job.

What people use this for

Email lists (subscribed vs. bounced), order or invoice IDs (exported vs. reconciled), SKUs (catalog vs. in stock), usernames (staff list vs. accounts that exist), filenames (backup vs. source), keywords (last month vs. this month). Anywhere you'd otherwise build a VLOOKUP or COUNTIF just to answer "which of these are missing?"

How matching works — exactly

Each line is trimmed of leading and trailing whitespace, and empty lines are dropped. Matching is exact and case-sensitive by default; tick Ignore case to match Alice@… with alice@…, and Ignore whitespace to also collapse runs of internal spaces. If your list arrived comma-separated (like an email To: field), tick Split on commas too — it then splits on commas, semicolons and tabs as well as newlines.

Duplicates: collapsed, but counted

Each distinct item is counted once, and a note below the columns tells you how many duplicates were collapsed on each side. This is set comparison, not multiset: an item pasted three times on one side and once on the other still lands in "in both". If duplicate counts are the thing you're auditing, sort each list and use the regular diff view instead.

Honest limits

Matching is literal — it won't decide that J. Smith and John Smith are the same person, and a stray invisible character (a non-breaking space pasted from a web page) makes two identical-looking items differ. If two items that look the same land in the "only" columns, run the lists through TextWash to see the hidden character, or tick Ignore whitespace. Large lists are fine — tens of thousands of lines compare instantly, because your machine does all the work.

Private by design

Customer emails and order IDs shouldn't be pasted into a random website that uploads them. Here they aren't: this page is static and the comparison runs as plain JavaScript in your browser. Nothing you paste leaves your machine. Need a real line-by-line diff instead? That's the main PasteDiff view — one click away on the same page.

FAQ

Is my text uploaded anywhere?

No. The page is static; the diff algorithm (Myers line diff with word-level refinement) runs entirely in your browser. Nothing you paste or open ever leaves your machine — safe for configs, contracts, logs, and anything else you can't paste into a random website. The only network traffic is loading this page and an anonymous visit count.

What kinds of text does it handle?

Any plain text: source code, JSON/YAML/config files, SQL, CSV, logs, prose, email drafts. Drop or open files directly, or paste. Large files are fine — everything is local, so speed depends only on your machine.

How do I compare two files without installing anything?

Click "open file…" above each pane (or drag a file onto it), then Compare. No install, no signup, works on any device with a browser.

Why do two "identical" texts show differences?

Usually invisible characters — trailing spaces, tabs vs spaces, non-breaking spaces, zero-width spaces, or different line endings. Try "Ignore whitespace", or run both texts through TextWash to see exactly which hidden characters differ.

Side-by-side vs unified view?

Side-by-side shows original and changed text in two columns — best for widescreen review. Unified interleaves removed and added lines like a git diff — best for narrow screens and for copying a patch-style summary.

Can I jump between changes with the keyboard?

Yes — once a diff is showing, press n / p (or j / k) anywhere outside the text boxes to jump to the next or previous changed block; the ◀ ▶ buttons next to the tally do the same and show which change you're on. Handy when two long files differ in a handful of places.

Can I diff two JSON files?

Yes — paste both and click { } Format JSON. It pretty-prints each side with 2-space indentation (and optionally sorts object keys) so the diff shows real changes instead of formatting or key-order noise. Parsing happens in your browser like everything else. One honest caveat: JavaScript numbers round integers above 253, so extremely large numeric IDs may lose precision when reformatted.

Can I compare two lists?

Yes — paste one item per line into each pane and click ≡ Compare lists. Instead of a line diff you get three columns: items only in the first list, items in both, and items only in the second. Duplicates are collapsed (and counted), matching can ignore case, and each column has a one-click copy. Same privacy as everything else here: it all runs in your browser.

Can I ignore timestamps when comparing log files?

Yes — type a JavaScript regular expression into the Ignore pattern box (or click ⏱ timestamps for a ready-made one) and lines are compared with every match removed, so two log runs that differ only in timestamps show only the real changes. The pattern is fully editable: add |id=\w+ to also ignore request IDs, or |\d+ms for durations. See compare log files for a worked example. One honest note: Copy patch always exports the complete, unfiltered differences — the ignore pattern only affects what's shown.

Can I ignore a column when comparing CSV files?

Yes — type the columns to skip into the Ignore columns box, either by header name (updated_at, id) or by number: 5, 2,5-7, or 6- for column six onward (1-based). Names are matched against each side's own first row, case-insensitively — so if a column moved position between exports, it's still ignored correctly on both sides; quote a name ("total, gross") if it contains a comma or looks like a number. Rows are parsed with proper CSV quote handling — commas inside quoted fields don't count as column breaks — and the delimiter (comma, tab, semicolon or pipe) is auto-detected, with a manual override. Two side effects worth knowing: a quoted and an unquoted field with the same value compare as equal once a column list is set, and in changed rows the highlights become per-cell. If row order also changed between exports, switch to ≡ Compare lists with the same column list — rows are then matched as a set instead of line by line. As with the ignore pattern, Copy patch still exports the complete, unfiltered differences. See compare CSV exports for a worked example.

Can I export the diff as a patch file?

Yes. "Copy patch" generates a standard unified diff — the same format as diff -u and git diff, with @@ hunk headers and 3 lines of context — entirely in your browser. Paste it into a code review or ticket, or save it as a .patch file and apply it with the patch command.

How do share links work — is the diff stored on a server?

No server, no storage. "Share link" compresses both texts into the link itself (the part after #), which browsers never send over the network. Whoever opens the link decompresses it locally. If the texts are too big to fit in a practical URL, the button tells you instead of silently truncating.