
2k stars · Apache-2.0 | [opentimeline.io](http://opentimeline.io) · v0.18.1, read from /releases/latest, shown as '09 Nov' with no year; 9 November 2026 is in the future, so 9 November 2025. Code pushed 2026-10-17 per ungh.cc, so a stale release against live code. · Track this in Scout
An interchange format and library for editing timelines: the order and length of cuts, and references to the media, but not the media.
▶Repo detailsthe review · specs · pros & cons · install
What it does
OpenTimelineIO stores editorial information — which clip, in what order, at what length, with what references to external media files. The core is a C++ library with an in-memory data model and functions to read, change and serialise it, plus a separate dependency-free opentime library that handles timecode and rational time arithmetic. The Python binding adds a plugin system whose main plugin type is the adapter, which reads and writes the formats editing programs already use: the README names Final Cut Pro XML, AAF and CMX 3600 EDL. Other plugin types handle media linking, hook scripts and schema definitions. It supports the VFX Reference Platform years 2022 to 2025 and Python 3.9 to 3.15, and the README describes the API as stable and the framework as mature and widely deployed in film and television. One thing to know before installing: since v0.16 the main PyPI package carries only the core libraries and the native .otio, .otioz and .otiod formats, and every other adapter moved to its own repository, reachable through a separate OpenTimelineIO-Plugins package. It is explicit about its boundary: it is "not however, a container format for media". It holds the decisions about a cut, never the pictures or the sound.
Why it matters
Who it suits. People writing software that has to touch an edit: a studio pipeline, a transcoding service, an automation step that assembles a rough cut, a reporting tool that counts shots. It also suits anyone handed an AAF or an EDL who needs to read it in Python without buying an editing suite. Skip it if you want to edit video — this is not an editor and has no interface beyond an optional viewer — and skip it if your work never leaves one program.
Verdict. Worth an hour if you ever write code that reads or writes an edit, and it is the obvious choice because the alternative is parsing a different proprietary format for every program you meet. It is backed by the Academy Software Foundation, which is the part that makes it safe to build on: this is infrastructure for an industry rather than one company's side project. Two cautions. The release rhythm is slow and the version numbers are honest about it — v0.18.1 is dated 9 November 2025, while code landed on 17 October 2026, so the project is active and simply does not tag often. And the adapter split after v0.16 catches people out: install the core, find that an AAF will not open, and the answer is the separate plugins package, not a bug.
- One format for edit decisions across programs, with adapters for Final Cut Pro XML, AAF and CMX 3600 EDL.
- A C++ core with a Python binding and a stable API, backed by the Academy Software Foundation.
- The
opentimelibrary has no dependencies, so rational-time arithmetic can be used on its own.
- Not an editor and not a media container: no interface to speak of, and it never touches the footage.
- Adapters beyond the native formats now live in a separate
OpenTimelineIO-Pluginspackage, which surprises first-time users. - One release in the last twelve months (v0.18.1, 9 November 2025), so fixes arrive from source rather than from PyPI.
- mltframework/mlt
A multimedia framework for video editing that actually processes and renders footage, where this one only describes the cut.
Track this in Scout - OpenShot/libopenshot
A C++ editing and playback library with Python and Ruby bindings; again it handles the media, not the interchange of edit decisions.
Track this in Scout
python3 -m venv venv source venv/bin/activate pip install opentimelineio pip install "OpenTimelineIO-Plugins" # for AAF, EDL, FCP XML and the rest python -c "import opentimelineio as otio; print(otio.__version__)"
