tellers-timeline
The timeline engine for tools that make the cut.
Read timelines. Make edits. Keep everything in sync.
Install · Try it · Features · Standardization · Contribute
tellers-timeline is an open-source timeline engine, written in Rust and available
in Python, built around OpenTimelineIO.
Use it to build editors, automate cuts, and exchange timelines between tools.
Our ambition is full OTIO coverage, with an editing API that handles the work around the format: insert and overlap policies, linked audio and video, stable identity, media bounds, and document cleanup. We're also developing shared conventions for effects and IDs so more of an edit can travel between applications.
Install
Python — prebuilt wheels for Linux x86-64, macOS Intel and Apple Silicon, and Windows x86-64:
pip install tellers-timeline
Rust — add the library to your application:
cargo add tellers-timeline-core
Python imports tellers_timeline; Rust imports tellers_timeline_core.
Building the Python package from source requires Rust and Cargo.
Make your first edit
Create a video track, insert a clip at two seconds, and serialize the timeline:
from tellers_timeline import Clip, MediaReference, Stack, Timeline, Track
stack = Stack([Track(kind="video", id="main-video")])
clip = Clip(
5.0,
{"DEFAULT_MEDIA": MediaReference("file:///media/shot.mov")},
id="opening-shot",
)
stack.insert_item_at_time_by_id(
"main-video",
2.0,
clip,
"override", # Replace material overlapping the new clip.
"split_and_insert", # Split a gap when inserting inside one.
)
timeline = Timeline(stack)
timeline.sanitize()
assert not timeline.validate()
print(timeline.to_json())
Editing APIs take time in seconds; OTIO serialization carries RationalTime
values and rates. Load an existing document with Timeline.parse_json(text).
In Rust, work directly with the core types and shared effect conventions:
use tellers_timeline_core::{ColorLut, Timeline, Track, TrackKind};
let mut timeline = Timeline::default();
timeline.add_track(Track::new(TrackKind::Video, Some("main-video".into())));
timeline.push_color_lut(ColorLut::new("film-look").with_name("Film look"));
timeline.sanitize();
println!("{}", timeline.to_json().unwrap());
What works today
Full coverage is the goal. This table tracks the current implementation and the remaining work; it is not a claim of complete OTIO conformance.
| Area | Status | Available today / remaining work |
|---|---|---|
| Timeline structure | ✅ Supported | Timelines, stacks of audio/video/other tracks, clips, gaps, and enabled state. |
| Time and ranges | 🟡 Partial | RationalTime, TimeRange, rate conversion, and editing in seconds. Broader OTIO time APIs remain. |
| Media references | 🟡 Partial | External and generator references, multiple references per clip, and available ranges. Missing references load as empty external references; image sequences remain. |
| Metadata and serialization | ✅ Supported | Arbitrary JSON metadata, OTIO JSON reading/writing, configurable numeric precision, and JSON Schema generation. |
| Markers | ✅ Supported | Point/range markers, names, comments, colors, IDs, and source-to-timeline time conversion. |
| Effect data | 🟡 Partial | Effect lists on clips, tracks, and stacks; Resolve parameter parsing; transform, crop, volume, and LUT helpers. Portable effect schemas remain a standardization target. |
| Insert and overlap policies | ✅ Supported | Push or override overlaps; insert before, after, nearest boundary, or split a gap to insert. |
| Timeline editing | ✅ Supported | Move, replace, split, resize, delete, reorder tracks, and find snap targets. |
| Audio/video sync and groups | ✅ Supported | Linked editing, sync partner placement, associated tracks, group discovery, and optional track normalization. |
| Sanitization | ✅ Supported | Clamp clips to available media, repair missing/duplicate track and item IDs, merge gaps, remove zero-length items/trailing gaps, and clean dangling sync links. |
| Validation | 🟡 Partial | Negative item-duration checks. Comprehensive structural and schema validation remains. |
| Rich text and styling | ✅ Supported | Resolve rich-text generators, timeline font declarations, named CSS text styles, and LUT asset/URL helpers. |
| Nested compositions | ⬜ Missing | Arbitrary stacks and tracks nested inside other compositions. |
| Transitions and time effects | ⬜ Missing | Transition-aware editing, speed changes, time warps, and freeze-frame semantics. |
| Full OTIO schema coverage | ⬜ Missing | Remaining object types, schema-version handling, and comprehensive interoperability fixtures. |
| Format adapters | ⬜ Missing | Native AAF, EDL, FCPXML, and other format adapters. Use the OTIO ecosystem to convert to/from .otio. |
| Language bindings | 🟡 Partial | Rust and typed Python APIs today; additional bindings are future work. |
The library manipulates edit data. Media playback, effect rendering, and export encoding belong to the application using it.
Building a shared language for editing
OTIO is the foundation. Alongside broader format support, we want applications to agree on what an effect means, which object an edit addresses, and how related clips stay together. These are project conventions and proposals for wider interoperability; they are not ratified OTIO standards.
| Convention | Implemented today | Standardization direction |
|---|---|---|
| Object identity | metadata["tellers.ai"]["timeline_id"]; IDs on tracks, items, and markers; missing/duplicate track and item IDs repaired during sanitization. |
Stable identity and clear rules for moves, copies, splits, and imports across tools. IDs are strings, not a UUID requirement. |
| Effect identity and parameters | LUTs use Effect.1 with effect_name: "tellers.ai.ColorLut" and parameters under metadata["tellers.ai"]["parameters"]. |
A documented, versioned vocabulary for portable effects, parameter units, defaults, and evaluation order. |
| Transform, crop, and volume | Read/write helpers currently use Resolve representations. | Shared effect schemas and mappings between application-specific encodings. |
| Color grading assets | Ordered LUTs on clips, video tracks, and the stack; persistent asset_id, resolvable parameters.cube_url. |
Predictable grading stages and a common distinction between asset identity and temporary delivery URLs. |
| Sync and edit groups | Sync links use Resolve_OTIO["Link Group ID"]; edit groups use tellers.ai["Tellers Group ID"]. Associated tracks are computed. |
Portable sync/group semantics without persisting redundant track associations. |
| Text and fonts | tellers.ai.availableFonts and tellers.ai.textStyles; rich-text generator helpers. |
Portable typography, named styles, and text generator conventions. |
| Provenance | tellers.ai.created_by on markers and automatically created tracks. |
Documented creator/provenance semantics, with room to separate user identity from automatic creation. |
Bring real timelines, editor integrations, and competing representations. The standardization work should be shaped by interoperability tests and adoption.
Explore and build
- Developer guide — architecture, local setup, editing semantics, visual test UI, and releases.
- Contributing — bug reports, feature proposals, compatibility fixtures, and pull requests.
- Rust API · Python type signatures · Example timelines · JSON Schema
Built by Tellers for timelines that can move between tools.
Metadata
Release files for tellers-timeline 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tellers_timeline-0.1.4.tar.gz | 239.2 kB | With provenance | Details for tellers_timeline-0.1.4.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| tellers_timeline-0.1.4-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details for tellers_timeline-0.1.4-cp38-abi3-win_amd64.whl |
| tellers_timeline-0.1.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ x86-64 | Details for tellers_timeline-0.1.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
| tellers_timeline-0.1.4-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details for tellers_timeline-0.1.4-cp38-abi3-macosx_11_0_arm64.whl |
| tellers_timeline-0.1.4-cp38-abi3-macosx_10_12_x86_64.whl | CPython 3.8 | abi3 | macOS 10.12+ x86-64 | Details for tellers_timeline-0.1.4-cp38-abi3-macosx_10_12_x86_64.whl |
Total release size: 4.5 MB
Release files / tellers_timeline-0.1.4.tar.gz
| Download URL | tellers_timeline-0.1.4.tar.gz |
|---|---|
| Size | 239.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c60ae8c7cfdddc5386368cc6999175b16e313a05df186a38c11b01f1a12a6952
|
|
BLAKE2b-256 checksum How to use checksums |
9b6ff997ee8b51aece925e5afb0f1e530c737f3e6a0230bdb36d35be3a0f1162
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / tellers_timeline-0.1.4-cp38-abi3-win_amd64.whl
| Download URL | tellers_timeline-0.1.4-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 985.8 kB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
bc18b5d9c75867f75f5aafc737d5287dfd37a13e6a62b08d851d65d06a42b90e
|
|
BLAKE2b-256 checksum How to use checksums |
47c647eabeda7c18f095ab302de75042de316f0725aad5fef23ed68079aa46d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / tellers_timeline-0.1.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | tellers_timeline-0.1.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
ce2e39c5ef3d6ae4dabbf1612753dffe72684d7793cc78d64ce7b97b03211ca8
|
|
BLAKE2b-256 checksum How to use checksums |
395a5fbca106b4ba2752b8e021843e70085c01da86e4afa8d9162038d9d5f665
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / tellers_timeline-0.1.4-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | tellers_timeline-0.1.4-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
77d92b4c0efba82d46fb4736b5800c18b49e02d9c5ed9e22f876afbc951135e7
|
|
BLAKE2b-256 checksum How to use checksums |
46e79b3f69762e577e7aa91c019a7a42da4a2ffadd306280a5beaddc35731657
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / tellers_timeline-0.1.4-cp38-abi3-macosx_10_12_x86_64.whl
| Download URL | tellers_timeline-0.1.4-cp38-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.8 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f2481e158376568bffb0e8fc4cd599dd1e28a7d06ce20d250a10745bdd8552c9
|
|
BLAKE2b-256 checksum How to use checksums |
2e0c592fe49f1976842a12fb781d856894fd07e6eea60ac40e25cc6c3b461f1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logSecurity for tellers-timeline 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for tellers_timeline-0.1.4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.