Skip to content
TwinScope0.3.10
Local-first · open source · v0.3.10 for macOS, Windows and Linux

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.

Or try it right now, with nothing installedbash
npx twinscope before.json after.json

Free and MIT-licensed · no account · no telemetry · one network call, off by default

users-v2.3.json users-v2.4.json
GIF · press play
Sixteen engines

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.

Text & code

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.

GIF · press play
Text & code diffs
JSON

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.

Click to enlarge
Structural JSON diffs
Folders

Recursive, with per-file status, rename pairing, filters, and drill-in to any file pair — without re-scanning the tree when you come back.

GIF · press play
Folder comparison
Images

Side-by-side, overlay, blink and difference, with changed regions boxed, zoom to 400%, and a threshold you can move.

GIF · press play
Image comparison
Binary

A verdict from sizes and a SHA-256, instead of pages of mojibake. Honest about what it cannot tell you.

Click to enlarge
Binary files
And eleven more

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.

All sixteen engines
How it works

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.

Privacy is the product

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
Keyboard first

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
Click to enlarge