Features Apograph CMS on GitHub

Version history

Content plugin @apograph/content-server@apograph/content-admin

Reading the timeline, comparing two versions, and the difference between restoring and publishing one.

Documents 0.5.2 Updated Edit this page Report a problem

On this page

Every save keeps a full snapshot of the record. There is nothing to switch on and no setting to configure — it applies to every content type.

The timeline

The editor’s history opens a list of versions, newest first, each with when it was written and by whom, and a badge:

BadgeMeans
LiveThe version currently published
DraftWritten by a save, never published
SupersededWas live, and another version replaced it

At most one version is Live at a time.

Because a save moves the entry to draft while the published version stays live, you can accumulate several draft versions above a live one — and then publish any of them.

On a localized type each language has its own timeline, because a revision is keyed to the row rather than to the translation group.

Comparing

Selecting a version shows a field-by-field diff against the current record.

Two details worth knowing when reading it:

  • Empty values collapse. A field going from unset to "" is not shown as a change, because it is not one.
  • Link order counts. A reordered list of related records is a real difference and appears as one, since the snapshot stores the full ordered link set.

Relations in a snapshot are resolved to their actual titles rather than shown as raw ids. A linked record that has since been deleted or moved to another workspace is flagged as missing rather than having its title displayed.

Restore versus publish

These are different operations, and picking the wrong one is the usual mistake.

Restore re-applies an old version’s content as a new version. Restoring v2 gives you v6, identical to v2, sitting as a draft on top of the timeline. Nothing is rewritten and nothing is lost.

Publish this version makes that version itself live, demoting the previously live one to superseded. If it is an earlier version its content is re-applied to the record first, so what is live matches what is published — but no new version is recorded, so the timeline does not grow a copy every time you do it.

You wantUse
To get old content back and keep editingRestore
To put an old version live immediatelyPublish this version

After publishing an older version, the newest is not the live one

Publish v2 while v5 exists and the top of the timeline is a draft that was never published, while v2 carries the Live badge. That is correct, and the next save puts a version matching the live record back on top.

Publishing a version runs the publish gate. If it fails, the content is left re-applied as a draft — a recoverable state rather than a half-finished one.

Permissions

ActionNeeds
View the timeline and a versioncontent:read
Restore a versioncontent:update
Publish a versioncontent:publish

What it does not do

History is append-only, and never pruned

Versions cannot be edited or deleted, which is the point — but it also means nothing prunes them. There is no retention policy, no cap and no archival: a busy type with large rich-text bodies grows its revision table indefinitely. It is the table to watch on a long-lived installation.

Permanently deleting an entry does take its history with it.