Skip to main content

Orange Bricks logo Ripple

Reactive notebook execution in Jupyter

Github Actions Status Try on notebook.link jupyterlab-ripple

Run a cell, and Ripple automatically re-runs every cell that depends on it. No more hunting for stale outputs or manually replaying half the notebook. Install it, and reactivity is on from the start.

Ripple demo: change a variable and watch downstream cells update automatically

Highlights

  • Always in sync — change a variable, downstream cells re-run automatically
  • Visual dependency map — colored borders show upstream (blue), downstream (green), stale (amber), and conflict/cycle (red) cells at a glance
  • Zero migrationpip install, and it just works. Standard ipykernel, your existing .ipynb files, no custom kernel or new notebook format. Reactive by default.
  • Cycle-safe — circular dependencies are detected and flagged, never silently looped
  • Per-notebook control — toggle reactive mode independently for each notebook

Why Ripple

Notebooks give you the freedom to run cells in any order, but that flexibility comes with a cost: forget to re-run a downstream cell and your outputs go stale. The longer the notebook, the easier it is to lose track. Ripple takes care of that for you.

Imagine three cells:

# Cell 1
x = 1
# Cell 2
y = x * 2
# Cell 3
print(f"Result: {y}")

Change x = 1 to x = 10 and run Cell 1. Ripple re-executes Cell 2 and Cell 3 in dependency order — no manual re-running, no stale outputs.

Install

Requires JupyterLab >= 4.0.0.

pip install jupyterlab_ripple

Or try it online without installing anything.

Getting Started

After installing, Ripple is active by default. Just work as you normally would:

  1. Edit and run a cell
  2. Watch every downstream cell update automatically

To disable reactivity for a notebook, click the Ripple button in the toolbar.

Configuration

Ripple exposes three settings in Settings → Ripple (or schema/plugin.json):

Setting Default Description
enabled true Whether reactive mode is on by default for new notebooks
debounceInterval 500 ms Time to wait after the last keystroke before re-analyzing a cell
stopOnError true Whether to stop executing downstream cells when a cell errors

Limitations

  • Side effects not trackedlist.append(x) or obj.attr = val won't trigger downstream re-runs
  • Magic commands% and ! lines are stripped before AST analysis
  • Dynamic codeexec(), eval(), and metaprogramming may confuse the analyzer
How it works under the hood

Ripple sends each cell's source to the kernel for static analysis using Python's ast.parse(), extracting variable definitions and references. From these it builds a dependency graph across all cells in the notebook. When you execute a cell, Ripple walks the graph to find every transitive downstream dependent and re-runs them in topological order — all through JupyterLab's standard execution machinery, no custom kernel needed.

See CONTRIBUTING.md for the full architecture, algorithms, and data-flow details.

Contributing

Contributions are welcome. See CONTRIBUTING.md for development setup, architecture overview, code style, testing, and linting instructions.

Uninstall

pip uninstall jupyterlab_ripple

License

MIT

Release files for jupyterlab-ripple 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jupyterlab-ripple 0.1.1
File Size Uploaded
jupyterlab_ripple-0.1.1.tar.gz 288.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jupyterlab-ripple 0.1.1
File Interpreter ABI Platform
jupyterlab_ripple-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 427.5 kB

Release files / jupyterlab_ripple-0.1.1.tar.gz

Download URL jupyterlab_ripple-0.1.1.tar.gz
Size 288.5 kB
Tags Source
SHA-256 checksum
How to use checksums
828db2e61866d2430a69adc26e159cdc16c03af786c1943ef6a98633df5c63c4
BLAKE2b-256 checksum
How to use checksums
e9fff9eb316267acc38d1c4cda89c114262cf5b38bb30d7d96e559aa821d59c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / jupyterlab_ripple-0.1.1-py3-none-any.whl

Download URL jupyterlab_ripple-0.1.1-py3-none-any.whl
Size 139.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2dcbf2ff8ad75611e669d587367ece3bf2c66c2911473e543da79067f8b52f6f
BLAKE2b-256 checksum
How to use checksums
b82b0d5a8773e46f413fa09be7f2287db42a8381fafe7e94f94bff5a70cd902a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page