Skip to main content

Ripple: Reactive notebook execution in JupyterLab. Automatically re-executes downstream cells when their dependencies change.

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupyterlab_ripple-0.1.1.tar.gz (288.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jupyterlab_ripple-0.1.1-py3-none-any.whl (139.0 kB view details)

Uploaded Python 3

File details

Details for the file jupyterlab_ripple-0.1.1.tar.gz.

File metadata

  • Download URL: jupyterlab_ripple-0.1.1.tar.gz
  • Upload date:
  • Size: 288.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for jupyterlab_ripple-0.1.1.tar.gz
Algorithm Hash digest
SHA256 828db2e61866d2430a69adc26e159cdc16c03af786c1943ef6a98633df5c63c4
MD5 f0bb9e69dd3d957b2a94031815f291d1
BLAKE2b-256 e9fff9eb316267acc38d1c4cda89c114262cf5b38bb30d7d96e559aa821d59c3

See more details on using hashes here.

File details

Details for the file jupyterlab_ripple-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for jupyterlab_ripple-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2dcbf2ff8ad75611e669d587367ece3bf2c66c2911473e543da79067f8b52f6f
MD5 48a9f56233966aa0b28ebd7481a1d6d8
BLAKE2b-256 b82b0d5a8773e46f413fa09be7f2287db42a8381fafe7e94f94bff5a70cd902a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page