JSON diff — paste two JSON files, normalize formatting & key order, see only the real changes. Entirely in your browser; nothing is uploaded.
The sample above is two versions of the same config: one side is pretty-printed, the other was minified with its keys in a different order. A naive text diff would flag nearly every line. PasteDiff parsed both sides in your browser, re-printed them with 2-space indentation and sorted keys, and diffed the result — so only the four real changes show: the version bump, a longer timeout, a debug log level, and one new region.
JSON doesn't care about whitespace or the order of object keys, but text diffs do. The same object serialized by two different tools — or the same API response fetched twice — can differ on every line while being semantically identical. Normalizing both sides before diffing (fixed indentation, sorted keys) removes that noise.
JSON.parse each side, then re-serialize with 2-space indentation. With Sort keys ticked, object keys are sorted alphabetically at every nesting level (array order is preserved — it's meaningful in JSON). If a side isn't valid JSON, the button tells you the character position of the first error instead of mangling your text.
Numbers are parsed as JavaScript numbers, so integers above 253 (some database IDs, tweet IDs) lose precision when reformatted — compare those raw instead. Duplicate keys in the same object collapse to the last value, per standard JSON.parse behavior. And this normalizes formatting, not structure: a value moved between two different keys still shows as a remove + add.
API responses and configs often contain tokens, internal hostnames, and customer data. This page is static — parsing, normalizing, and diffing all run as plain JavaScript in your browser. Nothing you paste leaves your machine.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.