Per-note version timeline with restore. Full design: docs/design/note-history.md.
Why
Notes are Automerge CRDT docs that already retain every change (used for sync),
so a history/restore feature needs no new stored data, no wire change, and does
not affect the zero-knowledge relay — it is a read-only derivation done on-device.
Locked decisions
- Version boundary = device change OR ≥ 5 min idle gap between changes.
- Zero-diff dedup only (drop a boundary only if its content equals the previous
kept version). Never drop for "small" diffs.
- Retention: 100 most recent versions per note — a display/derivation cap, NOT a
storage bound. Underlying ops are kept, so the cap is reversible.
- Scope of a version: title, body, tags, folder. Restore replaces the whole set
as a forward, merge-safe change (itself a new history entry).
Sub-issues
Out of scope
Operation compaction/pruning (own ADR), diff/blame view, per-field or partial
restore, branching/named versions, history search.
Per-note version timeline with restore. Full design: docs/design/note-history.md.
Why
Notes are Automerge CRDT docs that already retain every change (used for sync),
so a history/restore feature needs no new stored data, no wire change, and does
not affect the zero-knowledge relay — it is a read-only derivation done on-device.
Locked decisions
kept version). Never drop for "small" diffs.
storage bound. Underlying ops are kept, so the cap is reversible.
as a forward, merge-safe change (itself a new history entry).
Sub-issues
pn history/--at/restoreto the CLIOut of scope
Operation compaction/pruning (own ADR), diff/blame view, per-field or partial
restore, branching/named versions, history search.