← Changelog
nteract 2.4

IPython REPL for Pi Agents

@runtimed/node opens the daemon behind the nteract desktop app to any Node runtime, and @nteract/pi uses it to give pi.dev agents a persistent Python REPL with notebook memory.

  • node.js
  • agents
  • pi
  • runtimed
IPython REPL for Pi Agents

Highlights

  • @runtimed/node exposes the runtimed daemon to Node: create notebooks, run cells, read outputs
  • @nteract/pi gives pi.dev agents a persistent, notebook-backed Python REPL, installed with pi install npm:@nteract/pi
  • Ask your pi agent to hack with @runtimed/node and build you what you need

It's IPython in your pi agent!

The runtimed daemon, now from Node

npm install @runtimed/node

@runtimed/node is the Node.js binding for runtimed, the same daemon behind the nteract app. Node.js, Deno, and Bun can now talk to the local daemon directly with FFI bindings for runtimed. Create notebooks, run cells, read outputs, sync dependencies, save notebooks, and open a live session in the desktop app. It is a thin JavaScript wrapper over a native binding, with the platform .node shipped as an optional install. The persistent kernels, hot dependency sync with uv, and warm environment pools that the app relies on are all reachable from a script.

That is what makes a real agent harness possible on top of nteract, not a shim around a subprocess. The harness drives an actual IPython kernel through the daemon, so kernel state, environments, and outputs are the same objects the desktop app sees.

A Python REPL for pi.dev agents

pi install npm:@nteract/pi

The pi harness is really fun to hack on. We could have just given you the nteract-mcp and called it a day. Since pi is so hackable, I figured it was time to show how once you free yourself from the shackles of MCP-bound harnesses, there is a whole world of unlock. I wanted a full synthesis of IPython and chat all in one.

The nteract extension for pi gives your agent a persistent notebook-backed Python REPL, allowing it to run code in an IPython session. You get to see plots inline in chat while your model gets to read them directly too. It's more like AIPython, am I right (sorry, I had to). Best part is variables survive across turns. No more python3 -c to keep reloading the same parquet file or making the same query. Just reuse it.

Now, the tools given to the pi extension are purposefully minimal to begin with. Run code, manage dependencies, save notebook, and "reset" (start a new session). You're free to build your own workflow by asking your agent to hack on @runtimed/node. The agent can pair with you in your notebook, use it for their own research, or even use a notebook as a communication mechanism across other agents.

[Feature flag] DataFrames that describe themselves

We've started rolling out an experimental table viewer for dataframes. I've always wanted to make a more arrow-native notebook that allows you to go straight from dataframe to visuals with minimal interference. That's starting to be a reality. In this release, if you have the dx feature flag enabled (check your settings), tables travel over as Parquet or Arrow IPC with a manifest to allow clients (AKA Frontends and MCP) to read the same typed columns the runtime produced. This is hooked up for polars, pandas, and HuggingFace's datasets. We've taken the datasets feature even further by rendering their image columns directly in the viewer. Following up on our previous work to have reprs for LLMs, this brings precomputed hints so that agents can read a useful summary before pulling the whole dataframe.

Full technical changelog

All 258 changes in 2.4

2.4.8 - May 14, 2026

Features

  • add one-shot PutBlob uploads (#2739) (protocol)(d4c0450)
  • add PutBlob one-shot clients (#2742) (protocol)(bf22688)
  • round-trip frontend binary widget state via PutBlob (#2744) (widgets)(dcbd1e7)
  • add ephemeral durability hint (#2746) (blob-store)(103ab8b)
  • drop legacy sendUpdate buffers + free superseded ephemeral blobs (#2747) (widgets)(dedb179)
  • reap resumable rooms with combined registry + LRU cap (#2752) (runtimed)(82c6b94)
  • add PutBlob multipart uploads (#2753) (runtimed)(83579d6)

Bug Fixes

  • stop phantom renderer-plugins rebuilds (#2729) (xtask)(cd2e5b7)
  • prioritize kernel lifecycle signals (#2728) (runtimed)(e083540)
  • coalesce display updates off iopub path (#2734) (runtimed)(1293d2d)
  • bump crates/notebook/Cargo.toml to break update loop (#2735) (release)(ab85a4c)
  • preserve null widget state values (#2736) (wasm)(967b82b)
  • tolerate no internet for uv:pyproject kernel launches (#2740) (runtimed)(4aae1a3)
  • tolerate no internet for pixi:toml kernel launches (#2745) (runtimed)(3c948bc)
  • disable macos sccache for release builds (#2748) (ci)(401fcd0)
  • keep rooms resident after kernel teardown (#2750) (runtimed)(81c7381)
  • repair macos rustup shims in releases (#2759) (ci)(ce601b0)
  • unblock headless conda/uv kernels stuck on AwaitingTrust (#2760) (runtimed)(2bd0b42)

Documentation

  • clarify display update wake semantics (#2737) (runtimed)(60eb239)

2.4.7 - May 12, 2026

Features

  • inline image rendering from HF parquet metadata (#2621) (sift)(4c59bcd)
  • collapse text rows by default, expand on click (#2623) (sift)(9bb8fbb)
  • surface HF rich types end-to-end via launcher + Sift (#2625)(e17300a)
  • preserve table blob metadata (#2629) (outputs)(d818490)
  • emit arrow ipc table payloads (#2632) (outputs)(801f436)
  • add cream markdown typography (#2639) (notebook)(f348e3b)
  • prototype cached recall search (#2640) (history)(f7b2a36)
  • add output frame typography (#2641) (notebook)(0403f94)
  • simplify output layout behavior (#2660) (notebook)(756a23c)
  • add magnetic sift focus affordance (#2663) (notebook)(49f66ad)
  • add bedrock sdk review harness (#2667) (pr-reviewer)(cc9fa29)
  • add arrow-native table manifests (#2658) (outputs)(740ad98)
  • persist arrow stream manifest chunks (#2705) (outputs)(46160c1)
  • precompute arrow manifest llm hints (#2715) (outputs)(e283c27)

Bug Fixes

  • use codex-local nteract-mcp config (#2613) (plugins)(0d9d14d)
  • resume runtimed binding publishing (#2614) (release)(a1a3b33)
  • keep tail outputs reachable (#2617) (notebook)(e8de12a)
  • strip RUNTIMED_* from inherited env on child spawn (#2618) (runt-mcp-proxy)(a8713e1)
  • rebuild runtimed-wasm on rebuild=true (#2619) (mcp-supervisor)(623bee6)
  • load frozen automerge genesis docs (#2620) (sync)(e3871c0)
  • preserve image-cell <img> across focus toggle (#2626) (sift)(783dbfe)
  • theme scrollbar corner (#2627) (sift)(eb459b4)
  • enable Tauri CSP (#2633) (notebook)(9001a81)
  • scope auxiliary window capabilities (#2631) (security)(7432ba2)
  • tolerate heartbeat misses and drop dx injection (#2634) (runtime)(374f411)
  • allow isolated iframe scripts in CSP (#2637) (notebook)(8e2b012)
  • load output frames from custom scheme (#2643) (notebook)(4f4a276)
  • hide chrome for small outputs (#2648) (notebook)(02b7a10)
  • refine history search shortcut (#2649) (notebook)(eea9e59)
  • keep output visibility toggle (#2650) (notebook)(887894d)
  • cache-bust wasm plugin loads (#2651) (sift)(b7387ce)
  • keep wasm cache bust focused (#2652) (sift)(373601c)
  • hash daemon plugin asset urls (#2654) (mcp-app)(af464b3)
  • polish scroll handoff cue (#2664) (sift)(825101f)
  • retry recoverable automerge receive failures (#2666) (sync)(b5a2d9e)
  • pin maturin develop to active venv (#2670) (build)(5efdaf1)
  • wait for selected pool readiness (#2674) (onboarding)(16ff958)
  • skip quiescence wait for one-shot sync (#2673) (settings)(19e8a32)
  • recover patch-log mismatch from JSON (#2677) (settings)(6d31974)
  • clear execution state on interrupt (runtime)(caf4f80)
  • retry busy Windows named pipes (#2697) (protocol)(347b97e)
  • coalesce noisy stream output flushes (#2700) (runtimed)(a6aca2f)
  • resolve execution results through daemon (#2701) (runtimed)(3f0b14c)
  • scale scroll geometry past browser max element height (#2702) (sift)(edb82d6)
  • drop App.tsx setDaemonCommSender export to restore HMR (#2703) (notebook)(f5f700f)
  • probe Vite over localhost instead of 127.0.0.1 (#2704) (supervisor)(e9943b0)
  • return store batch initialization errors (#2706) (sift)(090e08c)
  • rebuild renderer plugins when workspace sources change (#2708) (notebook)(e72d38d)
  • include arrow-stream-manifest MIME in sift predicates (#2710) (notebook)(7805edc)
  • keep sift focus until click-elsewhere, not pointer-out (#2711) (notebook)(99f549d)
  • narrow arrow manifest gc collection (#2712) (outputs)(4cba309)
  • drop atomic iframe selection (#2719) (isolated)(a3e57da)
  • drop scroll-to-deactivate on focused sift (#2721) (outputs)(b1fe19e)
  • keep Arrow LLM text canonical (#2718) (outputs)(a7e9b1c)
  • name iframes for dev-tools picker (#2723) (isolated)(1bc2150)
  • unexport anyOutputNeedsIsolation for Fast Refresh (#2724) (outputs)(351cc85)
  • three scroll-scale follow-ups from #2702 (#2725) (sift)(fbd6fdc)

Performance

  • skip fresh maturin rebuilds (#2661) (runtimed-py)(5b4a243)
  • render streams only when flushing (#2716) (runtimed)(67cca26)

Documentation

  • add design system guide (#2642)(ebb9437)
  • add pr reviewer skill (#2672) (agents)(f8d54f6)

2.4.6 - May 8, 2026

Features

  • add browser dev relay transport (#2593) (notebook-host)(8c6c94a)
  • add create notebook environment mode (#2592) (runtimed)(d86c66c)
  • expose browser relay health (#2597) (notebook)(92df9eb)
  • output mode strip (compact / expanded / focused) (#2600) (notebook)(33645d2)

Bug Fixes

  • remove private runtimed dependency from node wrapper (#2559) (npm)(c7bdcb6)
  • open ephemeral notebooks by id (#2561) (runt)(e5d48e4)
  • register llm repr formatter (#2562) (kernel-launcher)(ceeff36)
  • surface environment preparation failures (#2563) (runtimed)(6d5d294)
  • make test key path override thread-local (#2581) (runt-trust)(3622305)
  • render markdown on ctrl-enter (#2582) (notebook)(26fbaad)
  • avoid unnecessary dev wasm setup (#2583) (xtask)(7c00d20)
  • pin automerge patch log recovery (#2584) (sync)(979820c)
  • move presence heartbeat into sync engine (#2586) (runtimed)(08d528e)
  • shield static iframes from scroll (#2585) (notebook)(4c18f23)
  • send presence heartbeat immediately (#2587) (runtimed)(3b2c076)
  • guard project detection and settings sync compatibility (#2591) (runtimed)(eb3a10a)
  • require channel approval (#2599) (trust)(36e6169)
  • contain renderer plugin load failures (#2596) (outputs)(6c40706)
  • migrate plugin to earendil package scope (#2601) (pi)(ed84273)
  • publish nteract Codex marketplace (#2602) (plugins)(4f44ce3)
  • filter inactive pool retry banners (#2605) (notebook)(a777f09)
  • avoid promoting pyproject dev deps (#2606) (runtimed)(08fe3e4)

Documentation

  • consolidate agent instructions into nested AGENTS.md (#2565)(21ef30a)
  • consolidate frontend + UI docs into nested AGENTS.md (#2568) (frontend)(ba2f78b)
  • correct consolidated agent guidance (#2569)(35fbc2a)
  • consolidate env management into crates/kernel-env/AGENTS.md (#2571) (environments)(770ed5b)
  • align environment guide with resolver code (#2572) (env)(e24a89c)
  • consolidate architecture + daemon into crates/runtimed/AGENTS.md (#2573) (runtimed)(377375b)
  • correct runtime architecture guidance (#2574) (runtimed)(a2c9fda)
  • trim nested agent guidance (#2577) (codex)(10cf402)
  • collapse 15 skills to 7 (#2578) (skills)(855acc8)
  • expose repo skills via agents standard (#2580) (skills)(b88fd51)

2.4.5 - May 5, 2026

Bug Fixes

  • keep idle notebook windows alive and survive daemon disconnect (#2556)(39d6d20)

Documentation

  • document json authority (#2554) (settings)(6351ba3)

2.4.4 - May 5, 2026

Features

  • add package icon and improve metadata (#2499) (pi)(1ff49fe)
  • simplify narrative and expose runt CLI (#2500) (pi)(119339e)
  • show uv project preparation phase (#2511) (runtimed)(733f247)
  • install default data packages in pools (#2507) (env)(7bb9228)
  • stream projected execution events (#2508) (runtimed-node)(2021a9e)
  • add pi launcher (#2524) (xtask)(7a78d2d)
  • add config show and config path subcommands (#2534) (runt)(f042ad3)
  • DataTable sparklines, width pruning, output alignment (#2536) (pi)(4957a9d)
  • spinner in In[*] while waiting for first code token (#2540) (pi)(afc56a0)
  • add iframe output height toggle (#2545) (notebook)(ab570f7)
  • surface install hint when daemon is missing (#2544) (pi)(203ba23)

Bug Fixes

  • mark all in-flight executions on interrupt to prevent orphaned cells (#2495) (runtime-agent)(c0350a0)
  • remove coordinator-side sweep to fix create_cell(and_run) race (#2501) (interrupt)(2dca4d7)
  • satisfy windows cli install clippy (#2510) (notebook)(40b9d62)
  • make json canonical (#2512) (settings)(959680e)
  • abort kernel launch when conda env sync fails (#2514) (kernel-env)(7cfd451)
  • seed default pool packages into trusted package store (#2520) (runtimed)(fefd14a)
  • spawn node subscriptions on napi runtime (#2523) (pi)(d17f6e5)
  • use nteract desktop patch fork (#2530) (automerge)(6909ae0)
  • gate relay frames per bootstrap generation (#2529) (notebook)(6b9bc5f)
  • return typed rebuild errors (#2532) (automerge-recovery)(4f4e7e6)
  • propagate transaction rebuild errors (#2537) (runtime-doc)(93038c3)
  • render Arrow null columns as null cells (#2546) (sift)(80cc87a)
  • recover sync from canonical json (#2547) (settings)(fb9f2e6)
  • prevent orphan kernel leak from stale peer connections (#2549) (daemon)(ac3b87a)
  • warn on dropped IOPub execution signals (#2552) (runtimed)(3fbe1d1)
  • persist daemon writes through json (#2553) (settings)(012dd55)

Performance

  • isolate pool warming in subprocess (#2516) (runtimed)(a9c6cbf)

Documentation

  • update install instructions to use latest tag (#2498) (pi)(68e47ac)
  • reframe comments per rgbkrk review (#2502) (interrupt)(9614f1f)
  • refresh transaction and recovery guidance (#2531) (automerge)(1b8bd87)
  • refresh transaction guidance (#2542) (automerge)(b3a15f4)

2.4.2 - May 2, 2026

Features

  • add AppImage release installer (#2485) (linux)(86e2ceb)
  • expand native notebook control API (#2486) (runtimed-node)(15172a3)

Bug Fixes

  • eliminate env var race in trust tests (#2479) (runt-trust)(c84a5e0)
  • release daemon singleton lock on drop (#2481) (runtimed)(41fa3e6)
  • 4 gremlin-discovered MCP surface fixes (#2483) (mcp)(9380cab)
  • surface conda env build failures instead of silent not_started (#2487) (runtimed)(56ba560)
  • detect Python version mismatch in conda:env_yml envs, guard user-managed envs (#2478) (kernel-env)(5f28eb6)

2.4.1 - May 2, 2026

Features

  • surface hot-sync env-progress via RuntimeStateDoc (#2469) (runtime-agent)(5c3a705)
  • park sessions on notebook switch to prevent eviction (#2472) (runt-mcp)(d2c938d)

Bug Fixes

  • pin Python version in sync_dependencies to prevent version drift (#2470) (kernel-env)(c89e2ba)
  • forward bufferPaths to iframe so binary data renders as DataView (#2474) (widgets)(2c04231)
  • coerce ipywidgets Image/Video width+height to CSS pixels (#2476) (widgets)(e4990de)

2.4.0 - May 2, 2026

Features

  • gate kernel actions on first RuntimeStateSync (#2256) (notebook)(01bca34)
  • add attach and isolated dev modes (#2260) (mcp-supervisor)(37c4c1d)
  • persist terminal execution results (#2267) (runt-mcp)(7c5b5bb)
  • add manage dependencies tool (#2316) (mcp)(2fa69a3)
  • add environment build decision state (#2322) (runtime)(1a26b33)
  • add trusted package allowlist (#2324) (trust)(39da360)
  • expose durable execution results (#2327) (runtimed-py)(b846e84)
  • add execution result handles (#2331) (runtimed-node)(04b6efa)
  • add nteract pi package (#2332) (pi)(1cb9225)
  • switch kernel launch from TCP to IPC on Unix (#2398) (runtimed)(319ff16)
  • promote attachments to crdt schema (#2414) (notebook-doc)(292b760)
  • add Windows code signing via Azure Trusted Signing (#2428) (ci)(3b64d86)
  • seed canonical root schema (#2441) (notebook-doc)(2026af5)
  • seed state schema and surface queued executions (#2447) (runtime-doc)(4194107)
  • gate requests on required notebook heads (#2457) (protocol)(fdba624)
  • expose tokio runtime metrics via daemon status (#2463) (runtimed)(ea4a57a)

Bug Fixes

  • anchor viewport during column resize (#2257) (sift)(34c279d)
  • serve dev plugin assets from workspace (#2262) (runtimed)(a901ea3)
  • derive worktree env for dev daemon (#2264) (xtask)(616e030)
  • ignore cancelled bootstrap handles (#2265) (notebook)(3ad4bdb)
  • guard post-approval actions (#2261) (trust)(97830bf)
  • include pixi deps in trust verification (#2268) (trust)(f084973)
  • stop iframe wheel handoff (#2273) (outputs)(25d8ef1)
  • reserve kernel ZMQ ports outside Windows ephemeral range (#2276) (runtimed)(8a4493f)
  • keep frame pump hot during parallel sync (#2279) (notebook-sync)(8649cc4)
  • retry kernel launch on EADDRINUSE port race (#2278) (runtimed)(805478f)
  • drop reserved listeners before kernel spawn on Windows (#2283) (runtimed)(155a579)
  • decouple peer socket writes (#2288) (runtimed)(27bba44)
  • add clang to cloud-setup.sh for sift-wasm cross-compilation (#2293) (cloud)(792e158)
  • move peer requests off reactor (#2292) (runtimed)(2691e4f)
  • remove daemon metadata request path (#2296) (protocol)(65a2f78)
  • enforce trust for launch and env sync (#2297) (runtimed)(515fb57)
  • build WASM once on Linux, share across all jobs (#2298) (ci)(ebf015a)
  • pin llvm@18 for macOS WASM clang fallback (#2299) (ci)(8f7cbf1)
  • use Tauri API to close the upgrade window (#2305) (upgrade)(89a7b4f)
  • bootstrap nightly installs on Windows (#2306) (installer)(bc1eb60)
  • add Win32_Security to windows-sys features (#2307) (installer)(173ee83)
  • show stale approval errors inline (#2309) (trust)(7351ac8)
  • approve headless dependency changes (#2314) (trust)(0e11748)
  • detach Windows daemon spawn so the NSIS installer can return (#2308) (installer)(aa838d9)
  • suppress ty type-checker errors for duck-typed test stubs (#2318) (runtimed)(c327a3e)
  • graceful session disconnect on SIGTERM (#2319) (runt-mcp)(5104865)
  • report package_manager as "deno" for Deno notebooks (#2320) (runt-mcp)(0e5e31e)
  • unblock Windows CI by skipping daemon start in NSIS hook (#2323) (installer)(e484a88)
  • align conda integration trust expectations (#2326) (runtimed-py)(931e3dd)
  • keep project deps out of notebook metadata (#2334) (runtimed)(65b0b9d)
  • reap managed child processes (#2336) (mcp)(02a0caf)
  • persist runtime agent ownership manifests (#2343) (runtimed)(68b4438)
  • adapt session env source types (#2353) (runtimed-py)(3821263)
  • use LaunchSpec::Auto for save-as kernel relaunch (#2357) (notebook)(d73a455)
  • resolve execution counts by sequence (#2364) (runtime)(5fc5626)
  • sanitize AppImage daemon bootstrap (#2363) (linux)(a240f32)
  • clean wasm build warnings (#2370) (build)(d7314bd)
  • bound sync flush before deno execution (#2374) (e2e)(231274b)
  • autosave runtime outputs explicitly (#2375) (runtimed)(220a1d7)
  • handle sync delivery timeouts (#2376) (e2e)(e55acc4)
  • flush autosave on room eviction (#2379) (runtimed)(8c16d58)
  • clean partial streaming load state (#2384) (runtimed)(31696eb)
  • reserve kernel ports in daemon (#2391) (runtimed)(40370fb)
  • persist reconciled settings json (#2396) (runtimed)(560574b)
  • document user-local daemon security model (#2404) (linux)(0450b16)
  • lease pool envs during launch (#2403) (runtimed)(c677f8c)
  • auto-wire brew LLVM clang for wasm builds (#2421) (xtask)(c5dac1f)
  • capture env_source before kernel shutdown in restart_kernel (#2420) (runt-mcp)(171fd15)
  • resolve bundled nightly AppImage runt sidecar (#2422)(20a81f6)
  • stabilize runtimed eviction test setup (#2423) (ci)(0ea72f6)
  • tolerate mcp EOF in Fedora AppImage smoke (#2426) (ci)(72e8482)
  • detect signtool and Azure CLI paths for Windows signing (#2431) (ci)(8f8c6be)
  • add signing smoke test and verbose tauri build for diagnostics (#2432) (ci)(3f9ca2c)
  • harden concurrency diagnostics (#2430) (mcp)(4930562)
  • refresh trust fingerprint after stale approval (#2435) (notebook)(2ea4861)
  • allow iframe output scroll chaining (#2436) (notebook)(9e453d5)
  • stabilize embedded git metadata (#2434) (build)(6c388e2)
  • polish nightly startup (#2437) (windows)(0fd6b42)
  • derive dependency guards from observed heads (#2439) (trust)(ff0c5bd)
  • stabilize setup flow (#2440) (onboarding)(bc7df34)
  • quiet pool status logging (#2446) (runtimed)(5c3ee91)
  • install parquet encoder for bootstrap envs (#2445) (dx)(5803bb4)
  • lower default pool sizes (#2449) (runtimed)(5dc8183)
  • propagate schema seed errors (#2450) (runtime-doc)(40e2bdd)
  • prefer cached conda repodata for pool warming (#2453) (runtimed)(f0fd71b)
  • preserve stale pool envs until replacement (#2452) (runtimed)(86787e9)
  • add rich runtime launch diagnostics (#2455) (runtime)(f6074c4)
  • clear session immediately on daemon disconnect (#2448) (mcp)(b706e8a)
  • try cached uv installs before network (#2456) (runtimed)(5cb916b)
  • pulse isolated renderer layout after output changes (#2461) (notebook)(ef05c5e)
  • finish env-progress CRDT migration, close stuck banner (#2465) (protocol)(299a455)

Performance

  • batch viewport cell reads (#2254) (sift)(63aa454)
  • drop unused production bundle from cargo xtask dev (#2287) (xtask)(fc6992b)
  • skip volatile wasm rebuild when notebook --attach (#2467) (xtask)(44b73aa)

Documentation

  • trim AGENTS.md to a repo map (#2354) (agents)(9e300d5)
  • document apt.runtimed.com installs (#2371) (linux)(9dbf4ba)
  • clarify legacy execution count boundary (notebook-doc)(1cc0d08)
  • refresh runtime architecture guidance (#2411)(9c489c0)
  • refresh runtime protocol docs (#2417) (protocol)(78da38a)
  • design PutBlob frame (#2419) (protocol)(ce41a10)
  • refresh protocol architecture docs (#2424) (protocol)(e2493f8)
  • add automerge protocol guidance (#2438) (skills)(76e906c)
  • add automerge-sync and mcp-session-lifecycle Claude skills (#2460) (skills)(f282b9b)
  • polish package publishing metadata (#2466) (npm)(b6c52d1)