Known gaps
Widgets are anywidget-style (
jupyter.widget). The classic ipywidgets controls (sliders, dropdowns) are Python classes, so they're not available.Inspection tooltips show what's found at runtime (type, signature, preview, properties), not TypeScript types or JSDoc. On Bun, workerd and celld, a getter on the path is reported but not called. History is kept for the current kernel session only.
The debugger is for Node and Deno targets only. Breakpoints are per line, conditional breakpoints and logpoints aren't supported, variables can't be set from the debugger, and "copy to globals" isn't offered.
npm:on Node, Bun, workerd and celld:- one npm alias per
name@range(or exact version, when locked); - the cache is shared by every notebook, so peer dependencies resolve by real name from it;
- a project's own
package.jsondoesn't decide annpm:import's version (bare imports do use itsnode_modules).
- one npm alias per
On Node, a
.tsfile a cell imports is loaded with Node's own type stripping, which rejectsenum,namespacewith values and parameter properties. Cells themselves accept them. See Architecture › Imported TypeScript files.No type checking. Deno doesn't type-check REPL cells either.
Results are formatted by each runtime's own inspector:
util.inspecton Node, Bun, workerd and celld, andDeno.inspecton Deno. On a fixture of 30 typical values, 23 format identically on Node and Deno. The rest differ in two ways:- strings are quoted
'…'on Node and"…"on Deno, wherever they appear; - a displayed
Error's stack also lists Node's own module-loader frames.
That's deliberate: each runtime's users see the format they expect, and Node's inspector has no quote-style option, short of porting Deno's formatter.
test/formatting.test.tsruns both runtimes on the fixture and fails if a new kind of difference appears (#17).- strings are quoted
WebGPU texture and buffer display is dropped.
On Bun:
- Interrupting a busy cell restarts Bun and loses state. An awaiting cell keeps it.
- Top-level declarations are properties of
globalThis. Aconstcan be reassigned, and declaring a global's name (const fetch = ...) replaces that global rather than shadowing it. - Only a trailing expression statement shows a result:
xdoes, butif (c) { x }doesn't. - Bun 1.4 can't import a module whose path contains
?. - No
--deno-compatnamespace.
On workerd:
- All cells share one request, so it never ends. Unlike production Workers, there is no per-request CPU or duration limit, and
ctx.waitUntilisn't available in a cell. - No
prompt()orconfirm()answers: they returnnull, as without a stdin channel.jupyter.image(path)can't read files; pass the bytes. - Each imported module is bundled with its dependencies. Two imports that share a dependency each get their own copy.
- Interrupting a busy cell restarts workerd and loses state.
- Top-level declarations and results behave as on Bun: declarations are
globalThisproperties, and only a trailing expression shows a result. - In a Workers project,
mainis bundled with esbuild directly, not with wrangler's build. Custombuildcommands,aliasand modulerulesaren't applied.
- All cells share one request, so it never ends. Unlike production Workers, there is no per-request CPU or duration limit, and
On celld, as on workerd, except:
- Only the binding and compatibility keys of a project's config are copied.
assets,triggersandcontainersaren't, and neither is.dev.vars. Relative paths inside the copied keys resolve from.celld/cdp-kernel, not from the project. - Interrupting a busy cell restarts celld and loses state.
- Only the binding and compatibility keys of a project's config are copied.