splice.json is the edit. It is meant to be read, diffed and committed. Commands
validate before saving, so a file produced by a command opens.
Shape
Fields
canvas:width,height,fpsas a rational string.tracks.layers[]: the z-ordered stack.id,z,start,place {x,y,size}, optionalmotion(camera keys), optionalplace_keys(position over time), optionalmask, andclips[].tracks.overlays[]: text and image overlays, each with a time range and anchor.tracks.audio: the music bed.tracks.captions: an attached SRT, withburn.tracks.index: the word index pointer, transcript path, provider and language.grade: one grade for the whole program.
source, src_in, src_out and speed; a speed ramp also carries
speed_keys.
Invariants
A file that breaks any of these will not load:versionmust be2. A1on disk is upgraded on open; anything else is refused.canvas.widthandcanvas.heightare non-zero.- Exactly one layer at
z: 0, and it must fill the canvas (placeof{ "x": 0, "y": 0, "size": 1 }). - Layer
zvalues are unique. - Every clip has
speed > 0andsrc_out >= src_in.
project_invalid, whose fix is splice undo.
Paths have exactly two rules
- A source inside the project directory is stored relative to it, with
/separators:media/a.mp4. - A source outside is stored absolute.
Comments and hand edits
Hand-editing is allowed — the file is a document — but commands exist for everything they cover, and a command validates and snapshots. If you edit by hand, runsplice inspect afterwards: project_invalid tells you which
invariant broke.