Git-style gutter diff for your unsaved edits — no Git required.
See exactly what changed since your last save, revert any single change, and roll back to snapshots.
SavePoint Diff adds live, colour-coded gutter markers and a familiar Source Control panel entry for your unsaved edits, updated on every keystroke.
It works in any folder — Git repo or not. No .git folder, no network access, no external services.
Git compares against your last commit. SavePoint Diff compares against your last save.
- Anyone editing outside a Git repo — scratch files, quick scripts, config folders, generated code.
- Developers between commits — see in-progress edits in a messy working tree, or on files Git doesn't track.
- People reviewing AI-assisted edits — spot exactly what changed in your buffer before you hit save.
- Beginners and students — get Git-like visual feedback without learning Git first.
- Anyone about to try a risky refactor — drop a savepoint first and diff against "a minute ago".
- Install from the Marketplace, or open Quick Open (
Ctrl+P/Cmd+P) and run:ext install StayElite.StayElite-Savepoint-Diff - Open any file and start typing. Gutter markers appear instantly and clear when you save.
- Toggle the extension any time from the
SavePoint: ON/SavePoint: OFFstatus bar item.
That's it — no configuration needed.
| Feature | What it does | |
|---|---|---|
| 🟢🔵🔴 | Live gutter markers | Green = added, blue = modified, red = deleted-line marker. Recalculated on every edit, before you save. |
| 🔍 | One-click full diff | Opens VS Code's native split diff: last-saved version on the left, your live editable buffer on the right. |
| 📊 | Status bar tally | A running +added ~modified -deleted count for the active file, e.g. SavePoint: ON +12 ~4 -2. |
| 🏷️ | Modified badges | An "M" badge on changed files in the Explorer and on editor tabs, just like Git. |
| Feature | What it does | |
|---|---|---|
| 📁 | SavePoint Diff panel | Lists every open file with unsaved changes, in the same place Git lists its changes. |
| 💾 | Save All / per-file save | Save everything from the panel toolbar, or one file via its inline save icon. No commit-message box, since there's nothing to commit. |
| Feature | What it does | |
|---|---|---|
| ↺ | Revert a single change | Hover any gutter marker and click "↺ Revert this change" to restore just that block. The rest of the file is untouched, and no save is needed first. |
| 📍 | Manual savepoints | Create Savepoint makes the current in-memory content the new diff baseline without writing to disk. Ideal before risky edits. |
| 🕒 | Snapshot history & restore | Create named checkpoints anytime, or auto-snapshot on every save. Browse the timeline, diff any snapshot against your current buffer, or restore the whole file in one click. |
- 🌐 Works everywhere you code — local folders, Remote-SSH, WSL, Dev Containers, GitHub Codespaces, and virtual filesystems like vscode.dev / github.dev.
- ⚙️ Fully configurable — toggle each marker type, the overview ruler, optional background highlighting, and performance thresholds for large files.
- 🔒 100% local & private — everything runs inside the extension host. No Git, no telemetry, no network requests. Baselines live only in memory for the current window session.
| Git gutter | SavePoint Diff | |
|---|---|---|
| Compares against | Last commit | Last save (or last savepoint) |
| Needs a Git repo | Yes | No |
| Works on untracked files | No | Yes |
| Updates as you type | Yes | Yes |
| Revert a single change | Yes | Yes |
| Savepoints & snapshots | No | Yes |
They work well together: use Git for history across commits, and SavePoint Diff for what you're doing right now.
Open the Command Palette (Ctrl+Shift+P / Cmd+Shift+P) and type SavePoint Diff.
| Command | Description |
|---|---|
SavePoint Diff: Toggle |
Turn the extension on/off. |
SavePoint Diff: Refresh |
Force-recalculate the diff for the active editor. |
SavePoint Diff: Clear Decorations |
Clear markers in the active editor without changing the baseline. |
SavePoint Diff: Save File |
Save one file (via the inline save icon in the panel). |
SavePoint Diff: Save All Unsaved Changes |
Save every file listed in the panel (via the panel toolbar button). |
SavePoint Diff: Revert Change (at Cursor) |
Revert the change block at your cursor. Also available from the gutter hover link. |
SavePoint Diff: Create Savepoint (Don't Save to Disk) |
Set the current content as the new baseline without writing to disk. |
SavePoint Diff: Save Snapshot |
Capture a named/timestamped checkpoint of the current file. |
SavePoint Diff: View & Restore Snapshot... |
Open the snapshot history to compare or restore. |
| Setting | Default | Description |
|---|---|---|
savepointDiff.enabled |
true |
Enable/disable the extension globally. |
savepointDiff.showAdded |
true |
Show markers for added lines. |
savepointDiff.showModified |
true |
Show markers for modified lines. |
savepointDiff.showDeleted |
true |
Show markers for deleted-line positions. |
savepointDiff.showOverviewRuler |
true |
Show tick marks in the overview ruler. |
savepointDiff.showBackgroundHighlight |
false |
Lightly tint the background of changed lines. |
savepointDiff.enableRevertInHover |
true |
Show the "↺ Revert this change" link on gutter hover. |
savepointDiff.maxFileSize |
2000000 |
Files larger than this many bytes skip live diffing, to protect performance. Invalid values (zero, negative, non-numeric) fall back to the default. |
savepointDiff.debounceMs |
150 |
Delay after the last keystroke before recalculating. |
savepointDiff.snapshots.enabled |
true |
Enable/disable snapshot history. |
savepointDiff.snapshots.maxSnapshots |
10 |
Maximum snapshots kept per file. |
savepointDiff.snapshots.autoSnapshotOnSave |
true |
Automatically snapshot whenever a file is saved. |
- Baseline — when a file is opened, its content is captured as the "last saved" baseline.
- Live diff — every edit is diffed against the baseline with a small, well-established Myers line-diff library, then rendered as gutter markers. Updates are debounced so typing stays fast.
- Save — saving resets the baseline and clears all markers; tracking starts fresh.
- Undo/redo — the diff is always recomputed from baseline vs. current text, so undoing back to the saved state clears markers and redoing brings them back.
- Reverts & external changes — if a file stops being dirty without a save (e.g. Revert File, or an outside tool rewrote it while your buffer was clean), the baseline re-syncs automatically.
- Reverting one change — applies a single edit that restores just that block's baseline content, then re-diffs. Other changes are untouched.
- Savepoints — move the baseline to the current in-memory content immediately, with no disk write. A later real save simply moves the baseline again.
No Git objects, no filesystem snapshots, no manual delta tracking.
- VS Code
1.60.0or later - Nothing else — no Git, no other extensions, no network access
- Inside Git repositories, VS Code's built-in editor-gutter "quick diff" colours are typically driven by Git's own provider. SavePoint Diff's gutter markers, panel entry, badges, and diff view still work independently, in Git and non-Git folders alike.
- Untitled files start with an empty baseline, so everything typed shows as "added" until you Save As. The saved content then becomes the real baseline.
- Non-UTF-8 files restored with unsaved changes after a restart (see "hot exit" in the changelog) have their on-disk baseline read as UTF-8, which can cause inaccurate markers until the next save. Run SavePoint Diff: Refresh or save once to resync.
- Savepoints reset SavePoint Diff's UI, not the file's real dirty state. After Create Savepoint, the panel entry, "M" badge, and status bar count show "no differences" even though the file still has unsaved edits on disk. Use your editor tab's own dirty indicator (the ● dot) to know whether you still need to press
Ctrl+S.
If SavePoint Diff saves you time, the best ways to help are:
- ⭐ Leave a review on the Marketplace.
- 🌟 Star the GitHub repo.
- 🐛 Report a bug or request a feature.
- 📣 Tell a teammate who edits files outside Git.
Contributions are welcome. See CONTRIBUTING.md for build, packaging, and manual test instructions.
See CHANGELOG.md for the full history.
Everything happens locally, in memory, inside the extension host. No network requests, no telemetry, no external services of any kind.
Created and maintained by Ashish Sharma (Stay Elite).
- GitHub: StayElite/SavePoint-Diff
- Issues: github.com/StayElite/SavePoint-Diff/issues
MIT © 2026 Ashish Sharma (Stay Elite)
Install SavePoint Diff, open any file, and start typing. Green, blue, and red gutter markers appear instantly for added, modified, and deleted lines, and clear as soon as you save. There is nothing to configure and no repository is needed:
ext install StayElite.StayElite-Savepoint-Diff
SavePoint Diff compares your live buffer against the last save, not the last commit, so it works in any folder: scratch files, quick scripts, config directories, generated code, or files Git doesn't track. No .git folder is required.
Git's gutter compares a file to the last commit. SavePoint Diff compares it to the last save (or your last manual savepoint), updates on every keystroke, and doesn't need a repository. They complement each other: use Git for history between commits and SavePoint Diff for what you're doing right now.
Hover over any gutter marker and click "↺ Revert this change". Only that block returns to its baseline content, and the rest of the file is untouched. You can also place your cursor inside a change and run this from the Command Palette:
SavePoint Diff: Revert Change (at Cursor)
Use a savepoint to diff against "a minute ago" without writing anything to disk, or a snapshot for a named checkpoint you can restore later:
SavePoint Diff: Create Savepoint (Don't Save to Disk)
SavePoint Diff: Save Snapshot
Run SavePoint Diff: View & Restore Snapshot... from the Command Palette. You can browse the snapshot timeline for the active file, open a split diff of any snapshot against your current buffer, or revert the whole file to that snapshot in one click. Snapshots are taken automatically on every save, and the last 10 per file are kept by default:
If the assistant's edits land in your editor as unsaved changes, SavePoint Diff highlights them in the gutter, lists the file in the SavePoint Diff panel, and lets you open a full split diff or revert individual blocks. If a tool saves files automatically, the baseline moves forward on each save, so run SavePoint Diff: Save Snapshot first to keep a checkpoint you can diff against.
Inside Git repositories, VS Code's built-in "quick diff" gutter colours are usually driven by Git's own provider. SavePoint Diff's Source Control panel entry, "M" badges, status bar count, and split diff view still work independently, in Git and non-Git folders alike.
Click the Save All button at the top of the SavePoint Diff panel in the Source Control view, or use the inline save icon on a single row to save just that file. You can also run this from the Command Palette:
SavePoint Diff: Save All Unsaved Changes
Every marker type can be toggled, and large files skip live diffing above a size limit (about 2 MB by default). Add any of these to your settings.json:
{
"savepointDiff.showDeleted": false,
"savepointDiff.showBackgroundHighlight": true,
"savepointDiff.maxFileSize": 2000000,
"savepointDiff.debounceMs": 150
}Why does the panel show "no differences" after I created a savepoint, even though my tab still has the unsaved dot?
A savepoint moves the diff baseline to your current in-memory content without writing to disk, so SavePoint Diff's panel entry, badge, and status bar count correctly show no differences from that baseline. The file itself still has unsaved edits. Rely on the editor tab's own dirty indicator (the ● dot) to know whether you still need to press Ctrl+S.
Untitled files start with an empty baseline, so every line you type counts as added. Once you use Save As, the saved content becomes the real baseline and tracking works normally.
Yes. It runs entirely inside the extension host and works with local folders, Remote-SSH, WSL, Dev Containers, GitHub Codespaces, and virtual filesystems like vscode.dev and github.dev.
No. Everything runs locally in memory inside the extension host, with no network requests, no telemetry, and no external services. Baselines are never written to disk and exist only for the current window session.
No. It only tracks unsaved edits and short-term snapshots of individual files. Keep using Git for commits, branches, and project history.

{ "savepointDiff.snapshots.enabled": true, "savepointDiff.snapshots.autoSnapshotOnSave": true, "savepointDiff.snapshots.maxSnapshots": 10 }