The notebooks

Interactive marimo notebooks — one per part of the design

Everything runs in pure Python against PyOpenColorIO: the notebooks model the proposed OpenImageIO behavior, they do not require an OpenImageIO build. The exception is 09 (and the master presentation, which embeds its demo): it deliberately uses the released OpenImageIO wheel from PyPI to work on real .exr files.

Each notebook is self-contained — a PEP 723 header declares its dependencies, and every dependency ships a binary wheel, so nothing builds from source. There is nothing to install first beyond uv.

NoteZero-clone one-liners

Most notebooks below run straight from GitHub with nothing cloned — they fetch the two demo modules themselves on first run. Swap run for edit in any command to open the editable view instead of the app view.

The two exceptions are called out: the master presentation reads the figures from the repository, and 09 generates test data through the repository’s shared temp-directory helper. Both want a checkout.

Start here — the standalone demo

The flagship: parse an ID, resolve it in a real config, watch unlabeled color spaces get identified by what their transforms do, and convert between two different configs by ID alone.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/color_interop_demo.py

The master presentation

00_presentation.py is the whole story with the key demo moments inline, arranged as slides (a marimo slides layout — arrow keys advance; every widget stays live mid-presentation). It reads the figures from the repository, so it wants a checkout:

git clone https://github.com/zachlewis/color_interop_demo
cd color_interop_demo
just present    # or: uvx marimo run --sandbox notebooks/00_presentation.py

The index

01_id_grammar.py — the ID grammar

The interop-ID grammar, sanitization, and search — parse and resolve any ID, live. Maps to proposed PR 1: color interop ID parsing in the existing resolve()/equivalent(). Guide chapter: 4.1.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/01_id_grammar.py

02_registry_and_cache.py — the registry and the cache

The published ID list as data, and cacheID-keyed memoization on immutable configs. Maps to proposed PR 2: the built-in interop-identities config and the caching contract. Guide chapter: 4.2.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/02_registry_and_cache.py

03_read_reconciliation.py — read-side reconciliation

The resolution priority list adjudicating contradictory file signals, with evidence. Maps to proposed PR 3: central read-side reconciliation. Guide chapter: 4.3.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/03_read_reconciliation.py

04_identification.py — transform-comparison identification

“Studio Linear” identified as numerically ACEScg — recognition by what a transform does. Maps to proposed PR 4: transform-comparison identification. Guide chapter: 4.4.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/04_identification.py

05_write_derived.py — the write side and derived IDs

Write / Derive / Omit / Suppress — every output attribute decided, with a reason. Maps to proposed PR 5: native colorInteropID writing for OpenEXR. Guide chapter: 4.5.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/05_write_derived.py

06_crossconfig.py — cross-config conversion

One ID, two configs, one processor — through the interchange roles. Maps to proposed PR 6: cross-config conversion. Guide chapter: 4.6.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/06_crossconfig.py

07_harness.py — the metadata harness

The three identity classes and the two-bucket scrub, before and after. Maps to a follow-up round: automatic color-metadata maintenance around the ImageBufAlgo color operations. Guide chapter: 4.7.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/07_harness.py

08_api_bundle.py — the inspection machinery

resolve plus ColorSpaceInfo with per-field provenance; reserved, inert option fields. Maps to the internal inspection machinery, surfaced through the experimental oiiotool --colorinfo and --colorspacesearch diagnostics. Guide chapter: 4.8.

uvx marimo run --sandbox https://raw.githubusercontent.com/zachlewis/color_interop_demo/main/notebooks/08_api_bundle.py

09_exr_interop_id.py — real .exr files

The released OpenImageIO wheel transports colorInteropID today; the proposal resolves it. Context for the whole series. This one generates test data through the repository’s shared temp-directory helper, so it wants a checkout:

just edit 09    # or: uvx marimo run --sandbox notebooks/09_exr_interop_id.py

Where generated files go

Everything transient goes to one shared location, resolved in order by tools/paths.py (all scripts and notebooks import it — nothing re-implements the rule):

  1. the COLOR_INTEROP_DEMO_TMPDIR environment variable, if set;
  2. the tmpdir key in a .demo-config.toml at the repository root, if present;
  3. otherwise <platform tempdir>/color_interop_demo.

Generated files are cleaned up at interpreter exit unless persistence is requested with COLOR_INTEROP_DEMO_PERSIST=1 (or persist = true in .demo-config.toml). just check parse-checks every notebook, runs both module self-checks, and proves the wheels-only dependency claim.