Observable JavaScript notebooks as reusable Python widgets
Project description
pyobservablejs
pyobservablejs embeds reactive Observable notebooks in Python. Author cells or
load an existing notebook, render all or selected cells, synchronize Python
values, read structured browser results, and inspect the dependency graph.
It works in JupyterLab, marimo, VS Code notebooks, Google Colab, and other environments that support anywidget.
Install or try
Add pyobservablejs to an existing Python 3.11 or newer environment:
uv pip install pyobservablejs
Or open a disposable marimo environment with the package available:
uvx --with pyobservablejs marimo edit notebook.py
This command installs marimo and pyobservablejs in the temporary environment.
Quickstart
Paste this into the marimo editor opened above:
import marimo as mo
import observablejs as obs
control = obs.ojs(
"""
viewof threshold = Inputs.range([0, 1], {
value: 0.5,
step: 0.1,
label: "Threshold"
})
""",
key="threshold",
)
result = obs.js(
'html`<strong>Threshold: ${threshold}</strong>`',
key="result",
)
notebook = obs.Notebook(
control,
result,
variables={"threshold": 0.5},
)
mo.ui.anywidget(notebook.view())
Each cell key is its portable Python identity. Render one result with
notebook.view("result").
Capabilities
| Task | API |
|---|---|
| Author JavaScript, Observable JavaScript, Markdown, and HTML cells | obs.js, obs.ojs, obs.md, obs.html |
| Load Notebook Kit HTML or an ObservableHQ notebook | Notebook.from_html, Notebook.from_observablehq |
| Render a whole notebook or selected keyed cells | notebook.view() and notebook.view("chart") |
| Update Python-owned variables | notebook.update_variables({"threshold": 0.8}) |
| Read pending, successful, and failed browser results | view.state and view.state.result("chart") |
| Inspect dependencies or export a diagram | view.state.graph, to_mermaid(), and to_d2() |
Views from one Notebook share controller variables and supported browser
inputs. Each view keeps its own result state plus input and settled revision
metadata.
Import notebooks
Notebook cells execute as JavaScript in the host page. Treat imported Notebook Kit HTML, ObservableHQ notebooks, and remote modules as trusted code. See Browser execution.
import marimo as mo
import observablejs as obs
notebook = obs.Notebook.from_observablehq("@d3/world-tour")
mo.ui.anywidget(notebook.view())
Documentation
Read the documentation for the quickstart, task guides, recipes, troubleshooting, and API reference.
Acknowledgements
Thanks to the Observable team for Notebook
Kit, which provides the notebook
format and runtime. pyobsplot informed
the Python variable API. Trevor Manz's anywidget
composition demo shaped the shared-session design.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyobservablejs-0.0.5.tar.gz.
File metadata
- Download URL: pyobservablejs-0.0.5.tar.gz
- Upload date:
- Size: 1.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b24870d0e22df0e45d5269766f7150f5369bab44688077f8e90185367940f991
|
|
| MD5 |
c2fee7262f93be041fe211809510c2d7
|
|
| BLAKE2b-256 |
c3fc1907dfb6432295f728eafd60859e22c0b25621e437a39d9b870eeed93810
|
File details
Details for the file pyobservablejs-0.0.5-py3-none-any.whl.
File metadata
- Download URL: pyobservablejs-0.0.5-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aef3de705121cb894f2c45b26144871763b496bbde03a4c09b66c2f2a46cb7c0
|
|
| MD5 |
dec49e3c4bc8927d12a8cbee4e9fa2e8
|
|
| BLAKE2b-256 |
f0527478f014dca0ea70fd1dd7586af65697531f9c566e3a3192d1bb222bc973
|