← Back to CineLeopard

Developer Reference

Timeline Bundle Format

A timeline bundle is an open folder format that CineLeopard imports as a ready-to-edit project. It contains ordinary media — standard .mp4 clips and an optional voiceover audio file — alongside a timeline.json manifest that lays out the edit. Any tool can produce one; CineLeopard reads it the same way it reads any imported files.

To import: File → Import Timeline Bundle… and select the folder containing timeline.json.

Available in CineLeopard 1.2.1 and later.

Folder layout

MyBundle/                     ← the folder the user selects
├── timeline.json             ← required — the manifest
├── clips/
│   ├── shot-01.mp4           ← referenced by clips[].file (relative path)
│   └── shot-02.mp4
└── voiceover.mp3             ← optional — referenced by "voiceover"

timeline.json

A complete, valid example. Every field marked required below must be present, or the import fails.

{
  "version": 1,
  "project": "My Project",
  "scene": "",
  "aspectRatio": "16:9",
  "renderSize": { "width": 1920, "height": 1080 },
  "title": { "text": "My Title", "show": true },
  "style": {
    "subtitlesEnabled": true,
    "fontName": "HelveticaNeue-Bold",
    "fontSize": 44,
    "colorHex": "#FFFFFF",
    "position": "bottom",
    "effect": "outline"
  },
  "voiceover": "voiceover.mp3",
  "voiceoverVoice": null,
  "totalDuration": 8.0,
  "clips": [
    {
      "index": 0,
      "shotNumber": 1,
      "file": "clips/shot-01.mp4",
      "in": 0.0,
      "out": 4.0,
      "duration": 4.0,
      "caption": ""
    },
    {
      "index": 1,
      "shotNumber": 2,
      "file": "clips/shot-02.mp4",
      "in": 4.0,
      "out": 8.0,
      "duration": 4.0,
      "caption": ""
    }
  ],
  "subtitles": [
    { "text": "First line",  "start": 0.0, "duration": 4.0 },
    { "text": "Second line", "start": 4.0, "duration": 4.0 }
  ]
}

Top-level fields

FieldTypeRequiredNotes
versionnumberRequiredFormat version. Currently 1.
projectstringRequiredBecomes the imported project name.
scenestringRequiredAppended to the project name when non-empty.
aspectRatiostringRequiredOne of 16:9, 9:16, 4:3, 1:1. Any other value is ignored and renderSize is used.
renderSize{ width, height }RequiredRender dimensions in pixels.
title{ text, show }RequiredTitle card. Shown only when show is true and text is non-empty.
styleobjectRequiredSubtitle/title styling (see below).
voiceoverstring | nullOptionalFilename of an audio file placed at time 0 on its own audio track. Omit or null for none.
voiceoverVoicestring | nullOptionalInformational only.
totalDurationnumberRequiredTotal timeline length in seconds.
clipsarrayRequiredOne entry per shot (see below). Ordered by index.
subtitlesarray | nullOptionalTimed burned-in titles (see below). Applied only when style.subtitlesEnabled is true.

style object

FieldTypeRequiredNotes
subtitlesEnabledbooleanRequiredWhen false, the subtitles array is ignored.
fontNamestringRequiredPostScript font name, e.g. HelveticaNeue-Bold.
fontSizenumberRequiredSubtitle font size; the title card scales up from this.
colorHexstringRequiredText color. Leading # is optional.
positionstringRequiredtop, center, or bottom.
effectstringRequiredoutline draws a stroke; none and shadow draw no stroke.

Clip entries

FieldTypeRequiredNotes
indexnumberRequiredOrdering key (clips are sorted by this).
shotNumbernumberRequiredInformational only.
filestringRequiredPath relative to the bundle folder. A file that cannot be found is skipped.
innumberRequiredWhere the clip sits on the timeline, in seconds (not a source in-point).
outnumberRequiredReserved — currently not read, but must be present.
durationnumberRequiredHow much of the source plays, in seconds. Playback always starts at the source start.
captionstringRequiredInformational only.

Subtitle entries

FieldTypeRequiredNotes
textstringRequiredThe line to display.
startnumberRequiredStart time in seconds.
durationnumberRequiredOn-screen duration in seconds.

Notes

  • Strict manifest. Every required key must be present — even the informational ones — or the whole import fails. Optional keys (voiceover, voiceoverVoice, subtitles) may be omitted or set to null.
  • Clip timing. in is the clip's position on the timeline; duration is how much of the source plays from its start. out is reserved for future use.
  • Relative paths. file and voiceover are resolved relative to the bundle folder. Clips may live in a subfolder (e.g. clips/) or alongside the manifest.
  • Extra keys are ignored. Unknown fields in the manifest are skipped, so producers may include additional metadata without breaking the import.
  • Standard media only. Clips are ordinary video files and the voiceover is an ordinary audio file. There is no proprietary container — a bundle is just a folder you can inspect, edit, or build by hand.