The highlight is often an API key
Use this when two JSON documents should be the same shape and are not: yesterday’s API fixture vs today’s, staging config vs prod, the export marketing renamed without telling you. Both panes must parse as JSON. YAML, .env, and “almost JSON” from a log line will error. Pretty-print first with the JSON formatter if brace placement is the only fight you are having.
The unique failure is secrets in configs. A diff of two Kubernetes JSON dumps will light up DATABASE_URL, AWS keys, and the JWT secret that “was only in staging.” The highlight is then a secret on your screen, in your screenshot tool, and in the Slack thread titled “why is prod different.” Redact before you paste, or paste and do not photograph the result. A SaaS diff site is how those strings become someone else’s object storage. This page stays in the tab. Your shoulder and your extensions are still in the room.
Worked example: one integer moved
Left: {"retries":3,"timeoutMs":2000}. Right: {"retries":5,"timeoutMs":2000}. You should see retries as changed, 3 → 5, and timeoutMs quiet. That is the boring, correct case. If marketing also renamed user_id to userId across 40 objects, you will get 40 changed paths, not a friendly “style” warning. JSON does not do synonyms. Count the changed keys before you assume it is “just formatting.”
Worked example: arrays are a blob
Left {"regions":["ap-south-1","eu-west-1"]} vs right {"regions":["ap-south-1","us-east-1"]}. This comparer treats arrays as a whole value when they differ, not as an element-wise list with a plus on line 2. You will see one “changed” on regions, not a surgical “eu-west-1 removed, us-east-1 added.” Nested objects recurse; arrays do not get that courtesy. If you need line-oriented array diffs, dump to pretty JSON and use git. If a 200-line list inside items moved one id, expect one fat changed node.
Worked example: missing key vs null
Left has "debug": null. Right omits debug entirely. Those are different JSON. One is a present null, the other is a missing key. APIs and Terraform both care. The diff should show a removal or an add, not “they look empty so they match.” Same trap: true vs "true". One is a boolean. The other is a string. Stringify equality catches it. Your eyes at 1am will not. 1 vs 1.0 collapse to the same JSON number; if a downstream system is picky about decimal formatting, this page will not show a change and the downstream still will.
What this will not do
It is not git, not a unified patch exporter, not a binary comparer, and not a YAML tool. A 3 MB minified config can freeze the tab; split it or pretty-print first. Key insertion order can make two semantically equal objects look noisy if you compare raw text elsewhere; here the walk is by key set, which is the right default for config. Word docs are not JSON. If you paste a secret, clearing the tab does not unsay a screenshot. Format both sides with the formatter when the only fight is whitespace, then come back here for the keys that actually moved.
Questions
Why did valid-looking text error?
Both panes must parse as JSON. Trailing commas, YAML, and log prefixes fail. Pretty-print in the formatter first if you only needed whitespace.
Why is a whole array one change?
Nested objects recurse; arrays are compared as one value. A single swapped element flags the whole list. Use git if you need line-oriented array diffs.
Is null the same as a missing key?
No. debug: null is present. Omitting debug is a removal. Treat them as different on purpose.
What about secrets in the JSON?
Redact API keys, DATABASE_URL, and tokens before you paste. The highlight is then a secret on screen. Do not screenshot the result into Slack.
Can I export a .patch?
Copy the changed paths by hand. This is a comparer, not git format-patch.
Do the two documents leave this machine?
Not through this page. A screenshot of a highlighted aws_secret_access_key still leaves this machine the usual way.