Skip to content

Notebook limitations

Lapis notebooks are markdown-native and intentionally narrower than full Observable notebooks or general-purpose Jupyter environments.

  • JavaScript, TypeScript, SQL, and dynamic markdown cells
  • Explicit execution with stale-cell tracking
  • DuckDB over vault files and app metadata tables
  • Reactive view(Inputs.*) inputs with downstream reruns
  • Tables, charts, markdown, text, images, errors, and trusted html/svg
  • Static ESM imports for configured or installed packages
  • Generated output persistence across reloads
AreaStatus
Python (py / python)Not available
Full Observable JSMutable variables, generators, implicit invalidation, and @observablehq/runtime imports are out of scope
Observable importsUse Lapis lapis.* helpers instead of Observable notebook imports
Relative cell importsRejected until notebook-local module resolution exists
Some input typesbutton, checkbox, radio, select, file, search, table, form throw if used
Public nb namespaceRemoved; use lapis.* or documented bare globals

The System Guide notebook in a fresh vault exercises the current parity slice: async cells, display(), plain inputs, markdown interpolation, trusted html, and lapis.FileAttachment(). It documents what the runtime targets, not every Observable feature.

  • Browser / PWA uses DuckDB-Wasm and vault adapter reads for file registration.
  • Desktop (Electron) can use a native DuckDB sidecar for filesystem vaults, which avoids moving large file buffers through the renderer.

Both hosts share the same cell syntax and lapis.* surface.

Safe Mode can disable notebook execution while you review untrusted vault content. When execution is blocked, run commands surface a recovery notice instead of starting cells.

See Safe mode.