Changelog¶
0.9.1 (July 2026)¶
New features¶
- Dependency-aware cache (
cache="graph"): a new opt-in cache mode that recomputes a filter only when it is actually affected by a change — its own sliders moved, one of its producers in the data-flow graph was recomputed, or acontextkey it reads was updated (tracked at runtime). Unlikecache=True(a sequential prefix cache that recomputes every filter after the change in source order), independent branches are left untouched.cache=True/cache=Falsebehavior is unchanged. cache="graph-strict"behaves like"graph"but hands outcontextnumpy arrays as read-only views, so accidental in-place mutation of shared context data raises at the offending line (debugging helper).
Improvements & bug fixes¶
- Read-only filter inputs by default (
readonly_inputs=True): filters now receive their numpy inputs as read-only views, so an in-place mutation (img += 1) raises immediately instead of silently corrupting sibling filters or cached buffers. Declare@interactive(inplace=True)on a filter that intentionally mutates its inputs — it then receives private writable copies. Passreadonly_inputs=Falseto@interactive_pipeline(...)to restore the previous permissive behavior. - In-place mutation of torch tensor inputs is now detected as well (torch tensors do not support numpy's read-only flag), surfacing the same class of silent-corruption bug for PyTorch-based filters.
0.9.0 (July 2026)¶
Breaking changes¶
- Removed implicit dict injection: declaring
global_params/global_parameters/global_state/global_context/context/stateas a filter keyword argument now raisesTypeErrorat filter construction. Use thecontext,layoutandaudioproxies instead (see migration guide below). - Removed pipeline-init aliases (
global_params=,state=, ...): passcontext={...}. - Removed
SharedContext/SharedContext.injected(). - Removed layout aliases
layout.set_style/set_grid/canvas/set_canvas(uselayout.style/layout.grid) and the write-onlyControl.groupattribute (useControl.panel). - Requires Python >= 3.9.
Improvements & bug fixes¶
import interactive_pipeno longer fails when neither OpenCV nor Pillow is installed (the error is raised on first image save/load) and no longer overridessys.excepthookas an import side effect.- Fixed the wavio availability flag, an unbound variable in audio saving, the dropped step default for string controls, and the filter-signature cache that never cached.
- Runtime validation uses proper
TypeError/ValueErrorexceptions instead of asserts; library diagnostics go throughlogginginstead ofprint.
Migration from old context={} or global_params={} patterns¶
# OLD (removed in 0.9.0 - now raises TypeError at filter construction)
from interactive_pipe import interactive
@interactive(brightness=(0.5, [0., 1.]))
def apply_brightness(img: np.ndarray, brightness: float = 0.5, global_params={}):
global_params["brightness"] = brightness # Storing shared data
global_params["__output_styles"]["output"] = {"title": "Brightened"} # Setting layout
return img * brightness
# NEW (recommended) - using context and layout proxies
from interactive_pipe import interactive, context, layout
@interactive(brightness=(0.5, [0., 1.]))
def apply_brightness(img: np.ndarray, brightness: float = 0.5):
context["brightness"] = brightness # or: context.brightness = brightness
layout.style("output", title="Brightened")
return img * brightness
The new API provides:
- context - For sharing data between filters (replaces global_params["key"])
- layout - For controlling output display (replaces global_params["__output_styles"])
- audio - For audio playback control
- get_context() - Get the shared context dictionary directly
0.8.10 (March 2026)¶
- Bugfix for jupyter notebooks backends.
0.8.9 (February 2026)¶
New features¶
- Panel system: Control panel layout and organization
- Flexible panel positioning (left, right, top, bottom)
- Detached control panels for separate windows
- Nested panels and subpanels support
- Grouped controls within panels
- Improved spacing and borders for better visual organization
- Full backend support (Qt, Gradio, matplotlib, notebook)
- Table data type: Display tabular data natively
- Core Table functionality without external dependencies
- Optional pandas DataFrame support for advanced use cases
- Rendering support across all backends (Qt, Gradio, matplotlib)
- Headerless tables option
- TimeControl enhancements: Better time-based parameter control
- Improved slider help display
- Additional demos showcasing time-based animations
API improvements¶
- Context support at pipeline initialization
- Backend selection via enum (string format still supported)
- Graph visualization for GUI pipelines (press
G)
Deprecations¶
- Inline syntax deprecated (use decorator syntax instead)
output_canvasargument removed- Context aliases (
global_params,statesetc...) deprecated at initialization
0.8.8 (January 2026)¶
New features¶
- Clean context API: Access shared context directly without
global_paramspollution get_context()- Get the shared context dictionarycontext- Direct dict-like access to contextlayout- Access layout configuration directlyaudio- Access audio functionality directly
Code quality improvements¶
- Replaced all assertions with proper exceptions (
ValueError,TypeError,RuntimeError) - Fixed all mutable default arguments across the codebase (prevents shared state bugs)
- Improved type hints with proper
OptionalandAnytypes - Better error messages for debugging
UX improvements¶
- Dropdown menus are now hidden when only a single choice is available
- Helpful message displayed when Graphviz is not available (when pressing
G) - Fixed warning in linestyle for curves
Bug fixes¶
- Fixed audio initialization order in Qt backend
- Fixed pytest failures for optional dependencies in CI
- Fixed various edge cases in error handling
License¶
- Updated to MIT License
History¶
- Interactive pipe was initially developed by Balthazar Neveu as part of the irdrone project based on matplotlib.
- Later, more contributions were also made by Giuseppe Moschetti and Sylvain Leroy.
- August 2023: rewriting the whole core and supporting several graphical backends!
- September 2024: Gradio backend
- January 2026: Clean context API and code quality improvements (v0.8.8)
- February 2026: Panel system and Table support (v0.8.9)
- July 2026: Removal of the legacy
global_paramsinjection in favor of the context API (v0.9.0)