Side-by-side, unified and inline. Edited lines pair up and are marked word by word instead of appearing as unrelated deletes and adds. Long unchanged runs fold. Syntax highlighting and ⌘F search.
Compare anything. Understand what changed.
Drop two files, folders, images or clipboard contents. TwinScope picks from sixteen engines by looking at what you gave it, and shows you what actually changed — not a wall of red and green.
npx twinscope before.json after.jsonFree and MIT-licensed · no account · no telemetry · one network call, off by default
The right diff for the thing you dropped
Type detection picks the engine. You can always override it — and every engine explains what it did.
A structural comparison, not a line diff — reformat a file and nothing changes. Arrays match by identity, objects compare as key sets, type changes get their own row, and five layouts including a tree.
Recursive, with per-file status, rename pairing, filters, and drill-in to any file pair — without re-scanning the tree when you come back.
Side-by-side, overlay, blink and difference, with changed regions boxed, zoom to 400%, and a threshold you can move.
A verdict from sizes and a SHA-256, instead of pages of mojibake. Honest about what it cannot tell you.
YAML and XML, CSV as a grid, dependency manifests and lockfiles, OpenAPI contracts and HAR captures, .env and Kubernetes config with secrets masked, saved web pages, PDFs, git refs, screenshot suites, and a windowed mode for files too large to load.
Three moves, then read the answer
Give it two things
Drag them in, pick them from disk, or paste with ⌘V. Clipboard images spill to a temp file automatically.
Press ⏎
Detection resolves the pair to an engine and says which one. Comparisons run off the UI thread and can be cancelled mid-flight.
Read, then share
Counts first, detail second. Step through changes with ⌥↑ ⌥↓, then export an HTML report, Markdown, or a patch.
Your files never leave your machine
There is no account, no telemetry, and not even an opt-in crash reporter. TwinScope makes exactly one network call, and it is off by default: an update check that asks GitHub for the latest version number and tells you. It never downloads or installs anything. This website ships no analytics and no third-party requests at all, which you can verify in your browser’s network panel.
How to verify it yourself- ✓Stored: paths, sizes, engine, options and summary counts, in a local SQLite file
- ✕Never stored: file contents — main strips them itself rather than trusting the caller
- ✓The renderer is sandboxed, context-isolated, and cannot reach
fs - ✕No uploads, no cloud sync, no “anonymous usage statistics”
- ✓Exports are written only when you ask, to the path you choose
Every mouse action has a key
One registry drives what fires, what the Settings grid lists, and what the palette offers — so the app can never document a key it does not have. Press ⌘K and type.
Full keyboard map