Skip to content

Project schema reference

Use createProject() or createComposition() for normal authoring. The current machine-readable schema is schemas/project/v2.0/project.schema.json.

Dialect$schemaschemaVersionPurpose
Legacy v1.0https://schemas.aelion.dev/project/v1.json1.0.0Immutable schema published with 1.0
Stable v1.2https://schemas.aelion.dev/project/v1.2.json1.2.0Immutable 1.2 image-sequence and caption contract
Current v2.0https://schemas.aelion.dev/project/v2.0.json2.0.0Track roles, occupancy, gap Items and editor layout contract

The default validator recognizes supported v1.0 and stable v1.2 identities, captures an ownership-isolated snapshot, changes only the two identity fields, and validates the result against v2.0. It never mutates the caller object. Use migrateProjectToCurrent(value) when the upgraded document should be persisted. defaultSchemas.previousProject and defaultSchemas.legacyProject remain available for strict historical validation.

A Track may declare role: 'storyline' | 'overlay' and occupancy: 'exclusive' | 'free'. Missing role means overlay; missing occupancy means exclusive for a storyline and free otherwise. An exclusive Track rejects overlapping Items except pairs joined by an explicit Transition. Each Sequence may declare at most one storyline Track. A gap Item occupies timeline space without rendering content, so packing and ripple operations can preserve an intentional hole.

FieldPurpose
$schema, schemaVersion, projectIdProtocol identity and stable Project identity
metadata, settings, extensionsJSON-only product metadata, defaults and namespaced extensions
assetsPersistent media identities and representations; never File, credentials or decoder objects
sequences, tracks, itemsNormalized timeline graph and ordered ownership references
materialInstances, transitionsEffect instances and explicit transition ranges
markers, linkGroupsTimeline annotations and AV/edit grouping

Map keys must equal entity id values. Ordered ID lists cannot contain duplicates. Every reference must resolve to an entity owned by the correct Sequence or Track.

Timeline and source timestamps are integer microseconds. Frame rate is rational. A Sequence owns the canvas, sample rate, channel layout and explicit color contract. Media Items map Sequence time to an Asset stream with linear or curve time maps and a declared boundary policy.

An image-sequence Asset contains imageSequence.frameDurationUs and ordered frameAssetIds. Every referenced frame must be an existing image Asset. The compiler copies this manifest into immutable Render IR, and preview/export resolve the same frame at every boundary.

Caption Items are owned by caption Tracks. SRT/WebVTT cue settings remain JSON data; advanced ASS styling is not part of the current schema contract.

loadProject() performs bounded admission, schema validation, entity ownership and reference checks, nested-sequence cycle checks, time-map semantics, transitions, masks, Material/audio/color rules and image-sequence reference checks. Failure leaves the Session unchanged and returns stable, path-aware diagnostics. A successful legacy migration is reported in ProjectValidationSuccess.migration.