Skip to main content

Content releases

A content release is a named collection of unpublished entity versions. It is useful for work that crosses entity boundaries: launching a brand and its products, preparing a campaign and its pages, or coordinating a taxonomy change with the content that uses it.

A release is an overlay on published content, not an isolated workspace. A release perspective resolves each entity like this:

version in the selected release
↓ otherwise
published version

Ordinary drafts and releases are independent. An ordinary draft never appears in a release accidentally. Copying a draft into a release is an explicit operation, after which each version evolves independently.

Lifecycle​

A release has one of four statuses:

StatusMeaning
DraftEditable and not scheduled.
ScheduledEditable and queued for a future publication time. The latest saved versions will publish.
ErrorA validation, uniqueness, or field-group conflict blocked publication. The release remains editable.
PublishedPublished successfully and immutable. Its item history and release perspective remain available.

Creating a release materializes its perspective over the current published model. Later published changes are rebased into every active release unless that release changed the same field group. This gives release queries, relations, calculations, context memberships, caches, and search the same semantics as ordinary draft preview.

Creating and editing through .NET​

var release = await releases.CreateAsync(
new VoxCreateContentRelease("Autumn launch", "New brand and products"),
cancellationToken);

var product = await updater.UpdateAsync(
"mug",
new VoxContentVersion(VoxContentMode.Published, published.Version),
new ProductActions.SetName { Name = "Autumn mug" },
VoxSaveTarget.Release(release.Id),
cancellationToken: cancellationToken);

var preview = await products.GetAsync(
"mug", VoxContentScope.ForRelease(release.Id), cancellationToken);

Saving to a release automatically adds that entity to the release. Continue editing from the release version by using VoxContentMode.Release and its release ID in VoxContentVersion.

IVoxContentReleaseManager lists release items, copies an ordinary draft into a release, removes an item, resolves conflicts, schedules or unschedules the release, and publishes it.

Atomic publishing and conflicts​

Before publishing, Vox validates every release version and checks the caller's publish permissions. The storage provider then checks all field-group bases and publishes every item in one transaction. Any conflict, validation failure, uniqueness violation, or concurrency failure rolls back the entire release.

When published content changes a group that a release also changed, the release item reports that group as a conflict. Resolve it explicitly with TakeDraft (keep the release value and rebase it) or TakePublished (discard the release change for that group). Scheduled publication never resolves conflicts automatically; its Nexus queue item enters Error and the release becomes Error.

Atomicity is a storage capability. A release may contain only entities whose authoritative provider can publish the whole release transactionally. The Entity Framework provider supports this. Vox rejects unsupported providers instead of publishing part of a release.

Scheduling​

Scheduling creates one delayed Nexus message for the release. Editing a scheduled release preserves its schedule, so the newest versions go live. Publishing manually makes the queued message stale; duplicate and stale messages are safe no-ops. Unscheduling also invalidates the queued message.

Preview clients​

Use content=Release&release={releaseId} on reads. An API client can make this its default by setting ContentMode to Release and ContentReleaseId to the release ID. This is suitable for a dedicated preview deployment. Published remains the default perspective for delivery clients.

Permissions​

Creating, updating, scheduling, publishing, and deleting releases requires vox:ContentReleases. Saving an entity action into a release requires both that permission and the ordinary entity create/edit/action permission. Publishing additionally requires {EntityType}:Publish for every entity type with an item in the release.