B@RT372 downloadsOn-disk version history for your notes: highlight changed lines, capture a timeline, and diff or restore any earlier version, fully local.
Local Version History gives every note its own on-disk version history, JetBrains style. It highlights the lines you change as you type, captures a timeline of earlier versions that survives restarts, and lets you diff, restore, or revert any point, all fully local with no account and no network. It follows a show-but-do-not-interfere principle: useful feedback during long edits, large-note refactors, multi-author reviews, or recovery from a bad sync or git pull, without getting in the way.
It complements Obsidian Sync version history rather than replacing it. Sync keeps periodic server-side snapshots as a paid cloud backup; this plugin gives immediate in-editor feedback plus a free local per-file time machine that also tracks deleted and moved files. The two work together.
| Gutter change bars in the editor | Gutter hover panel |
|---|---|
![]() |
![]() |
| Diff, side by side | Diff, line by line |
![]() |
![]() |
| Diff, copyable patch | Settings |
![]() |
![]() |
Requires Obsidian 1.13.0 or newer (see manifest.json); runs on desktop and mobile.
Community plugins (pending review): once listed, install from Settings, then Community plugins, then Browse for "Local Version History".
Via BRAT: install and enable BRAT, choose "Add Beta plugin", and enter https://github.com/bartlab/obsidian-local-history.
Manual: download the latest release, copy main.js, manifest.json, and styles.css into VaultFolder/.obsidian/plugins/local-version-history/, reload Obsidian, and enable the plugin.
Open Settings, then Community plugins, then Local Version History. Most options are self-describing; the non-obvious ones:
0 to disable that particular cap.file close (drop it when you close the file), app close (keep it for the session), or kept across restarts (persist it to disk). At kept across restarts the highlighted change set (file tree, tab headers, editor gutter, and vault changes panel) is bounded by your retention caps: a file whose changes all predate the retention window drops off those status surfaces, while its full per-file history stays browsable in the history modal.The indicator colors resolve from CSS variables, so a snippet can recolor every surface at once:
/* Recolor the editor gutter bars and reading-mode block indicators. */
.lct,
.lct-rm-indicator {
--lct-color-changed: #4a9eff;
--lct-color-added: #ff6b35;
--lct-color-restored: #fcdb89;
--lct-color-removed: #b6b6b6;
}
/* Or target a single change type on the gutter bar directly. */
.cm-gutter.lct-gutter-bar-col .lct-added .lct-gutter-bar {
background-color: #4ecdc4;
}
/* Recolor directories independently of the file rows. Folders resolve their own
--lct-dir-* colours, defaulting to the file-status colours. The global colour
intensity (the share of the hue kept before it is blended with transparency)
is now the "Marker intensity" setting; a snippet can still override the
underlying --lct-tint-strength, but must use !important to beat the value the
plugin writes inline on <body>. */
body {
--lct-dir-modified: var(--color-purple);
--lct-dir-added: var(--color-green);
/* --lct-tint-strength: 60% !important; */
}
The plugin runs entirely on your device: no network access, no telemetry, no account. History is stored as JSON shards under .obsidian/plugins/local-version-history/history/ in your vault, each holding the captured file text needed to diff and restore.
If you version-control or cloud-sync your vault configuration, those shards ride along unless you exclude them:
.obsidian/plugins/local-version-history/history/ to your .gitignore.The plugin follows Obsidian's UI language, shipping a dictionary per language under lang/<code>.json and falling back to English. To add a translation, copy lang/en.json to lang/<code>.json (using the exact Obsidian language code), translate every value while keeping the keys and {name} placeholders intact, register the catalog in src/helpers/i18n.helper.ts, and add it to tests/i18n-catalog-parity.test.ts.
If this plugin is useful to you:
npm install
npm run dev # build in watch mode
npm run build # type-check and build for production
npm run lint # run ESLint
npm test # run the vitest suite
For the architectural rationale and history-model invariants, see ARCHITECTURE.md. For the release history, see CHANGELOG.md.
Licensed under the MIT License. See LICENSE for details.