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.
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.pyThe 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.pyThe 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.py02_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.py03_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.py04_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.py05_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.py06_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.py07_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.py08_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.py09_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.pyWhere 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):
- the
COLOR_INTEROP_DEMO_TMPDIRenvironment variable, if set; - the
tmpdirkey in a.demo-config.tomlat the repository root, if present; - 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.