Version history
Every checkpoint snapshot of a doc is preserved. Open the History panel, scrub through the timeline, preview any past version, restore in one click.
Every snapshot of a document is preserved. Open the History panel, click a version, the canvas swaps to a side-by-side diff against the current doc. Restore it in one click; the restore itself creates a new version, so it’s reversible.
Opening the panel
| Method | What happens |
|---|---|
| Click the clock icon in the doc toolbar | Right-side History panel opens |
| Press Esc while the panel is open | Panel closes |
The panel is a side panel like Comments / AI / Share — it doesn’t take over the doc area unless you click into a version.
The timeline
The list shows a unified audit feed for the document, not just versions. Each entry has an icon, a label, and a subtitle (actor + relative time):
| Entry type | What it represents |
|---|---|
| Version | A point-in-time snapshot of the content (clickable) |
| Restore | Someone restored an earlier version |
| Share | The doc was shared with a person, group, or org |
| Public toggle | The public link was enabled or disabled |
| View | Someone (else) viewed the doc — visible if the audit log records it |
Only Version rows are clickable. The others are read-only timeline markers.
When versions are created
A new entry is added to the version table when:
- You switch from Edit mode to Preview mode (logical “I’m done editing for now” checkpoint)
- You leave the document (close the tab, navigate to another doc)
- A restore happens (the restored content becomes a new version)
The dedup trigger in the DB collapses identical snapshots — if the version you’d be creating matches the previous one byte-for-byte, it’s skipped. So a “preview, edit nothing, preview again” sequence doesn’t multiply versions.
The most recent version row is automatically labeled “Current” while its content matches what’s in the live editor. As soon as you type, the label reverts to a standard version timestamp because the doc has diverged.
Previewing a version
Click any version row and the full canvas swaps from the editor to a side-by-side diff view:
The diff is Markdown-aware:
- Both the current and previewed contents are parsed into top-level Markdown tokens (headings, paragraphs, lists, code blocks)
- A block-level diff matches blocks of the same type that sit next to each other in the timeline
- Matched blocks get a word-level diff inside them, so you see inline
<ins>/<del>markers without the block fracturing - Unmatched blocks render as full-block additions or removals
This keeps the diff readable for prose changes (you see the words that changed inside a paragraph) while clearly flagging structural changes (a deleted bullet point, a moved code block) at block level.
Color convention:
- Green (
<ins>): present in this version, missing in the current doc. Restoring brings it back. - Red strike-through (
<del>): added since this version. Restoring removes it.
Restoring
Two buttons sit at the top of the diff view:
| Button | Effect |
|---|---|
| Restore | Overwrites the current doc with the previewed version’s content. The restore is itself a new version, so it’s reversible. |
| Exit | Closes the diff view, returns to the editor. |
You can also press Esc to exit without restoring, or click the same row in the History panel again (which toggles the diff off).
Clicking the “Current” anchor in the panel always returns you to the live editor.
Switching documents
The previewed version is scoped to the current doc. Switching documents clears the preview and closes the diff view — different doc, different timeline.
Retention
Versions are retained for as long as your plan covers. See Plans for the per-tier durations.
When a version is purged (because retention expired), the timeline entry stays but its content pointer is unlinked — clicking it will surface “Could not load that version.”
What versions don’t capture
| Not captured | Why |
|---|---|
| Per-keystroke history | Versions are at edit/preview checkpoints, not every save (every save is durable already; see Autosave) |
| Cursor positions or selections | Only the document content is snapshotted |
| Comments, share state, settings | These have their own timelines and aren’t part of the body version |
| Image binary contents | Versions store the Markdown body; image URLs stay live as long as the image isn’t deleted |