Skip to main content

Import ObservableHQ notebooks

Notebook.from_observablehq fetches the original source of a public Observable notebook and returns a Notebook definition. Call view() to render it. Cell languages and the notebook's standard-library version are preserved, including classic OJS and modern JavaScript or TypeScript.

Imported notebooks and remote modules run with the host page's browser privileges. Review the trust boundary in Browser execution.

import observablejs as obs

notebook = obs.Notebook.from_observablehq("@observablehq/plot-scatterplot/2")
full_view = notebook.view()
full_view

The specifier can be an ObservableHQ URL, a notebook slug, a notebook id, or a document API URL. Use timeout to bound the fetch.

obs.Notebook.from_observablehq("https://observablehq.com/@d3/bar-chart")
obs.Notebook.from_observablehq("@d3/bar-chart", timeout=10)

The constructor fetches notebook source on every call. To skip that request during a build or test, save the response once and pass it to Notebook.from_observablehq_document(...). Imports, uploaded files, libraries, and datasets may still load from the network when the view renders.

Keep imported notebooks pinned

Append @version to a notebook URL or id to request an exact source revision. Dependencies with explicit revisions keep those revisions. For archived classic records, retain resolutions together with id and version to preserve the declared dependency pins. These records survive HTML export and reimport. Unpinned imports resolve when the view loads them.

For an archived node collection, pass {"nodes": nodes}. Native Notebook Kit models use {"cells": cells, "stdlib": "2"} and retain each cell's language. Notebook imports load through Python, so the kernel must remain connected.

Override variables

Pass variables to override notebook-defined values from Python.

document = {
"id": "1234567890abcdef",
"version": 7,
"title": "Report",
"nodes": [
{"id": 1, "mode": "js", "name": "answer", "value": "answer = 42"},
{"id": 2, "mode": "js", "value": "md`Answer: ${answer}`"},
],
}
notebook = obs.Notebook.from_observablehq_document(
document,
variables={"answer": 100},
)

Remote uploaded files become URL-backed file records. Explicit files override fetched files with the same name.

Cell language and standard library

Classic node documents use Observable JavaScript cells and default to the classic standard library, which includes require. Native notebook models preserve JavaScript, TypeScript, and Observable JavaScript cells and default to Notebook Kit's current library. An explicit stdlib value overrides that default. Cell language and standard-library choice survive to_notebook_html() round trips. See Browser execution and network access.

See Source constructors for the constructor contracts, error behavior, and source-revision import resolution.