Changelog

Local-first notebooks, built from the ground up for mingling with agents. Realtime collab with a colorful, jazzy streak. Here's how it gets better, release by release.

2.5

[redacted] Secrets, Explorable DataFrames, Navigable Tracebacks

The nteract 2.5 release invites you to stop leaking credentials in notebooks, emit Arrow for rich data exploration, and jump from tracebacks to the cell that raised.

  • Python errors render as navigable, structured tracebacks
  • Explorable DataFrames with interactive crossfiltering
  • Outputs scrub secret-looking environment values to [redacted env]
[redacted] Secrets, Explorable DataFrames, Navigable Tracebacks

2.5 brings rich context tracebacks, less leaky env vars, and a crossfiltering data explorer built on pretext and Apache Arrow to every dataframe in Python: pandas, polars, datasets, narwhals, duckdb; wherever __arrow_c_stream__ can be found.

I've always wanted an Arrow-native notebook for data work. Here it is.

Python errors now render as structured, navigable tracebacks. Click the cell target and get warped to the offending cell.

Explorable DataFrames

Return (or display!) a DataFrame and it renders in Sift, an interactive data explorer. The sparklines and category bars in the column headings allow you to brush filter across columns with smooth interactions thanks to Arrow IPC and WASM.

Secrets stay out of outputs

Notebook output with a secret environment value scrubbed to [redacted env]

Ever leak an environment variable that had a secret inside a notebook? Now that agents are reading outputs into chat logs, that problem can compound.

nteract 2.5 brings your login shell env into kernels. You get your PATH and API keys and those values are scrubbed from outputs before they hit disk or an agent's context window. Your shell's secrets are available to your code, but they don't leak into a shared notebook or agent's view.

Note: this feature can be disabled in settings.

Full technical changelog

All 232 changes across 2.5.0 and 2.5.1

2.5.1 - May 26, 2026

Bug Fixes

  • avoid framed output shell (#3013) (mcp-app)(261953e)

2.5.0 - May 26, 2026

Features

  • redact environment values from outputs (#2610) (runtime)(c7bf704)
  • import login-shell env into kernels via per-launch env_vars (#2767) (runtimed)(e73be9d)
  • make runtime state execution id only (#2773) (runtime)(811dbcf)
  • materialize execution view in wasm (#2774) (runtime)(c53819c)
  • route interaction_state over JSON-RPC (#2783) (isolated)(792b683)
  • expose execution view snapshots (#2782) (runtimed-node)(6536a19)
  • add embed host context bridge (#2790) (isolated)(798ea01)
  • add embeddable output surface (#2796) (isolated)(a30a18d)
  • add output embed deck harness (#2797) (slidev)(7288868)
  • add nteract identity crate (#2803) (identity)(f953446)
  • expose frame size limits (#2805) (runtimed)(c6f91a7)
  • share blob resolvers (#2807) (runtimed)(1c04419)
  • expose presence cbor helpers (#2806) (wasm)(87728d1)
  • load notebook snapshot pairs (#2808) (wasm)(25e14bf)
  • materialize hosted snapshot pairs (#2809) (notebook-cloud)(0cd8f19)
  • render published outputs through shared iframe (#2810) (notebook-cloud)(11f2e3b)
  • configure plugin asset base (#2812) (renderer)(0440483)
  • use shared notebook viewer surface (#2815) (notebook-cloud)(fbdf74b)
  • default nteract launcher (#2821) (settings)(d8d6130)
  • use read-only CodeMirror source (#2824) (notebook-cloud)(521a9f9)
  • stream blob HTTP reads from disk [stack 6/6] (#2823) (runtimed)(c346ca2)
  • publish live snapshot pairs (#2825) (notebook-cloud)(5bc09ca)
  • split renderer asset origin (#2827) (notebook-cloud)(656837f)
  • share read-only notebook cells (#2833) (notebook-cloud)(7389efa)
  • share read-only notebook view (#2840) (notebook-cloud)(eddab85)
  • attach cell provenance to rich errors (tracebacks)(b3bc84b)
  • attach execution provenance to rich errors (#2843) (tracebacks)(7f42d6b)
  • add report viewer mode (#2844) (notebook-cloud)(80609cb)
  • show viewer presence status (#2848) (notebook-cloud)(0c31f09)
  • link frames to notebook cells (#2847) (traceback)(54e6e2b)
  • segment mixed output rendering (#2853) (traceback)(f2e8119)
  • gate rooms with ACL authorization (#2867) (notebook-cloud)(bda65c5)
  • materialize room sync in durable objects (#2868) (notebook-cloud)(abf3972)
  • authenticate Cloudflare Access JWTs (#2869) (notebook-cloud)(bc36013)
  • limit editor room edits to markdown (#2870) (notebook-cloud)(a62e52b)
  • add runtime peer ingress handle (#2871) (notebook-cloud)(c60bbe7)
  • wire live markdown collaboration (#2873) (notebook-cloud)(9d214fb)
  • add owner ACL management routes (#2872) (notebook-cloud)(52cc059)
  • expose hosted session metadata (#2891) (notebook-cloud)(28b3ef5)
  • add Access demo ops runbook (#2890) (notebook-cloud)(c98bf5b)
  • replace table data in place (#2903) (sift)(b75ed0e)
  • add sharing invite storage (#2939) (notebook-cloud)(b9676f8)
  • support hosted output document URLs (#2942) (notebook-cloud)(a65d124)
  • resolve Access invites on login (#2944) (notebook-cloud)(bdd5cd7)
  • add owner invite routes (#2945) (notebook-cloud)(0b6532c)
  • adapt structured output for shared renderer (#2958) (mcp-app)(7424ffd)
  • isolate output document origin (#2959) (notebook-cloud)(384ca6f)
  • render through shared output frame (#2960) (mcp-app)(ed73a13)
  • expose notebook cell resources (mcp)(929caa0)
  • annotate notebook resources (#2972) (mcp)(c9e9483)

Bug Fixes

  • source shell startup env for kernels (#2770) (runtime)(124dae7)
  • surface notebook execution and output summaries (#2769) (runt-mcp)(daaf0b0)
  • append source cells by default (#2772) (runtimed-node)(4182e89)
  • support inline uv python override (#2777) (notebook)(692093f)
  • avoid false execution pointer clears (#2778) (runtime)(205a3a2)
  • restore rich iframe rendering (#2784) (isolated)(975126c)
  • deliver renderer bundle after iframe bootstrap (#2788) (isolated)(7d87ade)
  • harden iframe renderer diagnostics (#2789) (isolated)(bd293b1)
  • tighten host context cleanup (#2791) (isolated)(d1ec68d)
  • coordinate relay bootstrap readiness (#2795) (notebook)(af877c7)
  • align presence cap to 4 KiB [stack 2/6] (#2817) (notebook-wire)(bb1ae56)
  • derive execution counts from outputs (notebook-cloud)(ee29406)
  • reject renders with missing blobs (#2829) (notebook-cloud)(1f58df8)
  • validate snapshot publishes (#2830) (notebook-cloud)(4022daf)
  • restrict output count fallback (notebook-cloud)(3a9ac54)
  • derive counts from runtime outputs (#2826) (notebook-cloud)(a64e4dd)
  • guard renderer asset paths (notebook-cloud)(f320fc1)
  • bound render blob validation (notebook-cloud)(694d3dc)
  • align read-only markdown source (notebook-cloud)(c45abd6)
  • keep execution state notebook agnostic (tracebacks)(7e165c3)
  • normalize notebook execution sources (tracebacks)(0253962)
  • sanitize notebook traceback text (tracebacks)(6464470)
  • align standalone vite dev port (#2845) (xtask)(47142c2)
  • gate room events to owners (notebook-cloud)(6a1dc4b)
  • remove prototype room events api (#2846) (notebook-cloud)(6caa6d0)
  • harden hosted viewer shell (#2851) (notebook-cloud)(f68501f)
  • send host-facing renderer logs (#2852) (mcp-app)(08935e9)
  • keep dev auth tokens out of deployed URLs (#2854) (notebook-cloud)(2e9688c)
  • resolve dataframe blobs through host URLs (#2855) (outputs)(03d624c)
  • verify runtime blob uploads (#2859) (notebook-cloud)(53f5468)
  • derive render caches from snapshots (#2860) (notebook-cloud)(e1fc042)
  • harden hosted asset routes (#2862) (notebook-cloud)(a244ca5)
  • require loopback for untokened dev auth (#2863) (notebook-cloud)(7bfb23b)
  • resolve OutputWidget images as blobs (#2861) (outputs)(46932ae)
  • link traceback cells in cloud viewer (#2865) (notebook-cloud)(e56ad55)
  • keep cell targets identity-only (traceback)(8c75ce9)
  • keep mixed isolated renders unsplit (#2864) (outputs)(971b9b9)
  • harden Access auth fallback and key rotation (notebook-cloud)(3a8bc2c)
  • load runtime wasm from asset origin (notebook-cloud)(9f1fa0c)
  • clean up failed live sync init (notebook-cloud)(201d8c6)
  • bound live sync startup (notebook-cloud)(c7a225c)
  • preserve ACL owners atomically (notebook-cloud)(2631448)
  • report guarded ACL delete conflicts (notebook-cloud)(65f1907)
  • abbreviate traceback package paths with ellipsis (#2874) (notebook)(2bcf568)
  • fit sift output within iframe cap (#2876) (notebook-cloud)(54a084d)
  • bootstrap live markdown sync (#2875) (notebook-cloud)(e64de8b)
  • stream live updates to viewers (notebook-cloud)(9b1fc09)
  • add collaboration observability (notebook-cloud)(cf68dcf)
  • disable cloud pool sync (notebook-cloud)(497d0ce)
  • add collaborator auth diagnostics (#2878) (notebook-cloud)(8a0ff75)
  • support local browser collab smoke (notebook-cloud)(7e73b9a)
  • recover cloud editor sync (notebook-cloud)(30000cb)
  • reconnect on send-side socket failure (#2881) (notebook-cloud)(0c3dd03)
  • support chunked arrow streams in dx (outputs)(f82474d)
  • use crdt bridge for live markdown (#2883) (notebook-cloud)(bd74c90)
  • apply remote text attribution patches (notebook-cloud)(b649cf0)
  • surface collaborator auth diagnostics (#2884) (notebook-cloud)(ab27ffc)
  • skip storing read-only sync no-ops (#2885) (notebook-cloud)(1c8e37e)
  • harden credential transport (#2889) (notebook-cloud)(eeaa4c8)
  • seed ACL-backed smoke rooms (#2893) (notebook-cloud)(da98c05)
  • harden Access smoke credentials (notebook-cloud)(ec61624)
  • accept Access token headers (#2894) (notebook-cloud)(32b0909)
  • harden Access auth edges (#2898) (notebook-cloud)(033b670)
  • settle terminal stream outputs (#2899) (notebook-sync)(72d1c98)
  • redact output text before send (#2896) (kernel-launcher)(0afcfed)
  • vendor output redaction modules (kernel-launcher)(e5aecbb)
  • harden opencode runner (pr-reviewer)(02adb1b)
  • preserve malformed reviewer output (pr-reviewer)(000f56d)
  • parse final opencode review json (pr-reviewer)(535759c)
  • bound opencode review runs (pr-reviewer)(401c266)
  • enforce inline opencode permissions (pr-reviewer)(a3bcb80)
  • dispose wasm table data (#2901) (sift)(4b33a3b)
  • reuse plotly display updates (#2911) (renderer)(9372ffd)
  • allow Access token preflights (#2912) (notebook-cloud)(a45afbc)
  • gate editor runtime state writes (#2916) (notebook-cloud)(6cded37)
  • reuse vega display updates (#2913) (renderer)(145f722)
  • reuse leaflet display updates (#2918) (renderer)(9ead10a)
  • gate artifact mutations by origin (#2921) (notebook-cloud)(2d869cf)
  • require explicit output identity (#2922) (renderer)(186c65c)
  • prefer Access assertions at origin (#2924) (notebook-cloud)(3747692)
  • restrict blob uploads to runtime scopes (#2925) (notebook-cloud)(6c1e279)
  • require Origin for Access assertions (#2931) (notebook-cloud)(f292d18)
  • fail closed on live sync decode errors (#2932) (notebook-cloud)(09ab5ea)
  • preserve polars object date columns (#2935) (kernel-launcher)(94741b4)
  • avoid eager polars imports (kernel-launcher)(4f4504a)
  • refine polars date normalization (kernel-launcher)(e5cb7c3)
  • tighten invite resolution storage (notebook-cloud)(827fcda)
  • stabilize sharing invite storage (notebook-cloud)(aa9f96e)
  • recover duplicate invite races (notebook-cloud)(530a2f4)
  • gate invite acl grants on accepted rows (notebook-cloud)(4cbab1c)
  • isolate stale invite parents (notebook-cloud)(3e524f5)
  • narrow duplicate invite constraint handling (notebook-cloud)(4d9fd4c)
  • skip invite writes when none are pending (notebook-cloud)(0d95b8a)
  • narrow invite list rows (notebook-cloud)(f9de405)
  • validate invite inputs before storage (notebook-cloud)(b5c4532)
  • harden invite route edge cases (notebook-cloud)(eba8da1)
  • fill raster image outputs (#2950) (mcp-app)(7e6c195)
  • autosize HTML outputs (#2952) (mcp-app)(098ff66)
  • harden Access edge cases (#2951) (notebook-cloud)(997116f)
  • keep report iframes scrollable (#2953) (notebook-cloud)(a48d075)
  • prefer Vega outputs over HTML fallbacks (#2954) (mcp-app)(a7f503c)
  • log host container dimensions (#2955) (mcp-app)(6f36a5b)
  • reduce host log noise (#2956) (mcp-app)(373b835)
  • dedupe shared renderer plugin installs (#2961) (mcp-app)(2b5c5f0)
  • expose output resource ui metadata (#2962) (mcp-app)(0ed3b78)
  • align shared output frame sizing (#2963) (mcp-app)(b3e3958)
  • queue cells while kernel launch resolves (#2965) (runtimed)(e396bdd)
  • attribute queued executions to submitter (#2969) (runtimed)(802dbe9)
  • align rich output expansion with renderer (#2976) (mcp-app)(3f196d9)
  • sync viewer output themes (#2983) (notebook-cloud)(06533fd)
  • avoid formatting large binary cells (#2986) (sift)(a38f725)
  • anchor cell moves by cell id (#2990) (mcp)(7698a6d)
  • remove cell positions from summaries (#2991) (mcp)(c7e41d9)
  • route isolated diagnostics through host logging (#2992) (renderer)(d8c98ae)
  • use object init for bindgen modules (#2993) (wasm)(438a126)
  • use shared full-height output sizing (#2985) (mcp-app)(90a02b2)
  • include cell ids in notebook frames (#2995) (traceback)(abb0ee8)
  • align hosted viewer theming (#2996) (notebook-cloud)(583f33a)
  • suppress KaTeX newline warnings (#2997) (renderer)(481836b)
  • declare display capabilities (#3003) (mcp-app)(d62ce68)
  • preview blob output summaries (#2998) (mcp-app)(c844ee9)
  • preserve MCP size dimensions (#3000) (renderer)(3f83276)
  • segment mixed output frames (#3001) (renderer)(6276bb2)
  • clarify output summary reads (#3002) (mcp)(06a2547)
  • restore synced pool targets on startup (#3009) (runtimed)(a44cb21)
  • seed viewer theme before stylesheet (#3007) (notebook-cloud)(faf5fd2)
  • apply host container dimensions (#3008) (mcp-app)(c8084db)
  • keep LLM previews out of MIME selection (#3011) (renderer)(5b85903)
  • respect host frame CSP (#3012) (mcp-app)(e47811e)

Performance

  • defer optional renderer imports (#2887) (kernel-launcher)(6c2090e)
  • optimize output redaction matching (runtime)(54020a4)
  • cache output redaction candidates (kernel-launcher)(f037695)
  • cache output widget replay resolution (runtimed)(c2299c6)
  • type inbound comm messages (protocol)(054fd06)
  • externalize inbound comm buffers (protocol)(c453b56)
  • queue ordinary output commits (runtimed)(ba89ba3)
  • batch display output commits (runtimed)(b816c43)
  • optimize display update output lookup (runtime)(a2bfef0)
  • cache output order metadata (#2967) (runtime-doc)(7f3503a)
  • avoid full state reads in agent sync (#2973) (runtime)(614ec94)
  • remove dormant display update overlay (#2980) (notebook)(3c18ce8)
  • update output id diff snapshot in place (#2979) (wasm)(038caec)
  • split structural output updates (#2984) (notebook)(64247dd)
  • reduce streaming table rerenders (#2988) (frontend)(730b522)

Documentation

  • explain why daemon.json fallback stays (#2775) (runtimed-client)(ea708db)
  • update execution-id runtime-state plan (#2800) (runtime)(6435f32)
  • identity and trust for notebook rooms (#2801) (architecture)(b2cf3c8)
  • refine automerge fork patch plan (#2802) (architecture)(b948a25)
  • four desktop ADRs + cleanup punchlist (#2813) (architecture)(4c99876)
  • inline cleanup pass [stack 1/6] (#2816) (architecture)(2b38fea)
  • four desktop ADRs + execution-liveness memo [stack 4/6] (#2819) (architecture)(aaca969)
  • punchlist WP-12 — replace hand-mirrored TS table with Rust source of truth (architecture)(14d6f2a)
  • punchlist WP-12 — single-source the TS frame-size table (#2841) (architecture)(a213859)
  • define hosted room authorization (#2866) (notebook-cloud)(c8a95d8)
  • add hosted credential transport ADR (#2886) (auth)(5f98689)
  • address hosted credential review (auth)(a7d800a)
  • clarify websocket credential risks (auth)(2b8d18b)
  • tighten ticket and subprotocol guidance (auth)(6cb0c64)
  • require single credential source (auth)(a1110b1)
  • add output protocol ADRs (#2892) (protocol)(225d709)
  • tighten output ADR wording (#2895) (protocol)(71fbb15)
  • align Access trial runbook (#2900) (notebook-cloud)(a4425e3)
  • list Access trial blockers (notebook-cloud)(dfcf636)
  • define hosted deployment topology (#2904) (architecture)(22f2fbf)
  • address topology review (architecture)(99e89ea)
  • clarify runtime topology (architecture)(1ebd732)
  • design runtime redaction refresh (runtime)(3669348)
  • clarify redaction refresh model (runtime)(e527ff3)
  • audit runtime peer and blob authority (#2909) (architecture)(3e78d42)
  • update redaction boundary ADR (architecture)(64bf25a)
  • clarify python redaction scope (architecture)(0e7cb07)
  • clarify room authority boundaries (#2915) (architecture)(7d613d0)
  • define captured env lifecycle (architecture)(ad359ba)
  • clarify conda captured env hash inputs (architecture)(29ba8be)
  • clarify captured env fallback tradeoffs (architecture)(1f41a47)
  • define captured environment lifecycle (#2914) (architecture)(dc1d8d4)
  • define hosted output origin isolation (#2941) (notebook-cloud)(356efcb)
  • clarify output isolation prior art (notebook-cloud)(837fa1b)
  • address hosted output review notes (notebook-cloud)(035abf6)
  • clarify Access workers.dev setup (#2947) (notebook-cloud)(1c96ffe)
  • define resource addressing (mcp)(b03ff83)
  • arrow
  • pretext
  • polars
  • pandas
Permalink →
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.

  • @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
IPython REPL for Pi Agents

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)
  • node.js
  • agents
  • pi
  • runtimed
Permalink →
2.3

Environments That Find Themselves

Now nteract resolves environments from projects: pyproject.toml, environment.yaml, and pixi.toml. No more futzing with kernel definitions. Use your projects!

  • Project files drive the kernel: pyproject.toml, pixi.toml, and environment.yml detected and used automatically
  • pixi joins uv and conda as a first-class environment manager
  • Prewarmed environment pools and captured-env caching
  • Native Intel Mac builds ship alongside Apple Silicon
Environments That Find Themselves

It's time to double down on environments and projects. Notebooks typically required you to set them up for your project. Now it's the other way around because the project drives the kernel.

Environments that find themselves

Open a notebook next to a pyproject.toml, a pixi.toml, or an environment.yml and nteract picks it up. Detection walks up from the notebook directory, closest project wins, and the notebook uses your environment. No manual environment selection, no kernel setup.

pixi joins uv and conda

A new challenger approaches: pixi joins uv and conda

pixi is now a first-class manager alongside uv and conda. Use it with inline deps in your notebooks or craft a pixi.toml to be declarative.

Prewarmed pools and cached environments

In order to make time-to-first execution fast, reproducible, and isolated, nteract keeps a pool of prewarmed environments. Any kernel launch with a fresh notebook (not in a project directory, mind you) claims a ready one instead of building from cold. Once an environment resolves, it gets captured into notebook metadata and the pool env is promoted to be "for" that notebook. The second time you open that notebook it's a cache hit, not a re-solving of an environment.

Native Intel Mac builds

We're shipping x86_64 macOS binaries next to the Apple Silicon ones. This may not last forever, but for the users that asked, this is for you!

Full technical changelog

All 226 changes in 2.3

2.3.4 - April 26, 2026

Features

  • move path to RuntimeStateDoc, drop NotebookAutosaved + PathChanged + frontend dirty (#2190) (runtimed)(cf2c4f3)
  • per-type frame caps with warn-then-error logging (#2191) (protocol)(9b2dea6)
  • ephemeral clone replaces Save As Copy (#2192) (notebook)(6142bb2)
  • scaffold ProjectContext on RuntimeStateDoc (#2209) (runtime-doc)(56d0b37)
  • enrich session drop errors with cause and notebook_id (#2212) (runt-mcp)(3f300d3)
  • write ProjectContext on notebook open (#2216) (runtimed)(7ce8667)
  • refresh ProjectContext on untitled promotion and save-as (#2218) (runtimed)(8924206)
  • surface execution_id through MCP tools (#2219) (runt-mcp)(aa7c293)
  • cut project-file detection (pyproject, pixi, environment.yml) over to daemon-sync CRDT (#2220)(d2c5d96)
  • surface kernel-launch failures through RuntimeStateDoc (#2234) (runtimed)(4df4118)
  • add timeline splat tool (#2235) (safari-timeline)(f7c7213)
  • banner for untyped kernel-launch failures (#2236) (app)(0d12f45)

Bug Fixes

  • cancel-safe FramedReader actor for typed frames (#2182) (protocol)(86d6882)
  • bump Request cap to 16 MiB for SendComm widget buffers (#2193) (protocol)(5965d3a)
  • copy resolved_assets on ephemeral clone (#2195) (runtimed)(0e25c4c)
  • project-file Tauri commands fall back to working_dir (#2196) (notebook)(511fca2)
  • validate MCP tool inputs to prevent silent bad state (#2205) (runt-mcp)(6b9fc21)
  • move lld rustflag out of .cargo/config.toml (#2213) (ci)(0cc8fc5)
  • surface fast auto-launch errors in create_notebook response (#2214) (runt-mcp)(5867bf0)
  • reject execute_cell on non-code cells (#2224) (runt-mcp)(e37aec5)
  • codex P2 follow-ups — malformed pyproject + watcher arm race + ty (#2229) (runtimed)(040b5ec)
  • reposition lazy measured rows before paint (#2237) (sift)(1327e45)
  • prevent Safari brush text selection (#2239) (sift)(5083dbc)
  • resolve wasm package for tsc (#2241) (sift)(e070001)
  • join multi-line text MIMEs on ingest (#2245) (runtimed)(70edd6b)
  • route JSON-MIME through serialize, not normalize_text (#2246) (runtimed)(13db20d)
  • avoid restoring focus after iframe outputs (#2248) (notebook)(1357ece)
  • prevent markdown focus scroll (#2249) (notebook)(cb2370a)
  • stabilize popover styles in MCP apps (#2251) (sift)(02755be)
  • hand off iframe scroll boundaries (#2252) (notebook)(59d0135)
  • channel-aware cache directories (#2253) (kernel-env)(88c1bad)

Performance

  • slim compile graph, track daemon version via child handshake (#2201) (mcp-supervisor)(8f0b002)
  • drop staticlib/cdylib crate-types from the desktop app (#2203) (notebook)(898c606)
  • link macOS arm64 through lld (#2207) (build)(194504b)
  • supervisor stops rebuilding behind the user's back (#2210) (dx)(26c3e21)
  • sccache for every cargo invocation + fix cargo runt alias (#2211) (dx)(e683d1e)
  • drop sccache auto-wiring for local dev (#2215) (dx)(959c3a4)
  • drop dev-mcp + maturin from cargo xtask build (#2226) (xtask)(3b43fb9)

Documentation

  • add branch and worktree hygiene guide for agents (#2202)(c89c222)

Spec

  • notebook metadata extras round-trip (#2198)(f6812fe)

2.3.1 - April 25, 2026

Bug Fixes

  • mint UUIDs for ID-less cells so save/watch round-trips are stable (#2179) (runtimed)(fc8e1d0)

2.3.0 - April 24, 2026

Features

  • enrich create_notebook response, respect project env (#1831) (runt-mcp)(ee06423)
  • llm_preview fields for blob-spilled stream and error outputs (#1829) (runtimed)(44de8c3)
  • shared await_execution_terminal helper (#1833) (notebook-sync)(d13c392)
  • UUID-first notebook identity (#1838)(0b4cb46)
  • add install-nightly for headless Linux first-install (#1851) (xtask)(06f04e6)
  • bump terminal width from 80 to 128 columns (#1862) (runtimed)(6fbc9e4)
  • use text/plain directly for small DataFrames in text/llm+plain (#1865) (dx)(2138d03)
  • add macOS x64 (Intel) binaries to release pipeline (#1867) (ci)(d7da910)
  • introduce @nteract/notebook-host — de-Tauri-ify the frontend (#1889) (notebook-host)(79b5215)
  • HostWindow + onFocusChange (#1890) (notebook-host)(e4e7038)
  • HostDialog + HostExternalLinks + HostUpdater (#1891) (notebook-host)(6ea9894)
  • add correlation id envelope for NotebookRequest/Response (#1895) (protocol)(98ce4c8)
  • frame-based direct request/response via correlation id (#1897) (transport)(0986188)
  • Node.js bindings for the runtimed daemon client (#1904) (runtimed-node)(dde5f28)
  • Session.saveNotebook(path?) (#1928) (runtimed-node)(9086a2a)
  • addressable outputs with output_id and display_index (#1933) (notebook-doc,runtimed)(2f1d06c)
  • parquet summarization and row reading via nteract-predicate (#1936) (runtimed-node)(69dcd1c)
  • structural RPC refactor — correlation IDs + fire-and-forget (#1937) (runtimed)(2d98dae)
  • add debug logging for MCP response payload analysis (#1938) (runt-mcp)(e6ae703)
  • bootstrap dx into ipykernel via nteract-kernel-launcher (#1939) (kernel)(9fd3f9a)
  • vendor nteract_kernel_launcher into kernel envs instead of pip-installing (#1952) (kernel)(5988d18)
  • unified env hash + base-package constants (PR 1/3) (#1958) (kernel-env)(183b9f8)
  • capture prewarmed env into notebook metadata (PR 2/3) (#1960) (runtimed)(6e13553)
  • flush hot-synced deps and rename env dir on eviction (#1964) (runtimed)(51f0673)
  • add nteract marketplace with repl skill (#1987) (plugin)(6665740)
  • add nteract-nightly plugin variant (#1989) (plugin)(3932de5)
  • replace rattler with GitHub release downloads (#1998) (kernel-launch)(9b95ce9)
  • add Open Recent submenu to File menu (#1999) (notebook)(4a6bc32)
  • stamp output_id as stable React key across renderers (#2017) (outputs)(7256ded)
  • add explicit session status bootstrap (#2018) (notebook-sync)(88d670e)
  • add opt-out daily heartbeat pings (#2028) (telemetry)(e734405)
  • publish Claude Code plugin to nteract/claude-plugin[-nightly] (#2029) (ci)(cbbfdbb)
  • write Parquet from Arrow IPC or SQLite rows (#2032) (sift-wasm)(c463f74)
  • add pixi support to Python Notebook dep helpers (#2045) (runtimed-py)(5bf7f97)
  • prefer stable blob server port per channel (#2054) (runtimed)(65c791d)
  • verify-plugins drift check for renderer bundles (#2063) (xtask)(ce421b5)
  • chain renderer-plugins after sift-wasm rebuild (#2068) (xtask)(f3b42ed)
  • RuntimeLifecycle enum (phase 1 — derived field only) (#2081) (runtime-doc)(57e96c8)
  • RuntimeLifecycle CRDT keys + typed writers (phase 2) (#2085) (runtime-doc)(33c4150)
  • typed KernelErrorReason + set_activity stale-phase fix (#2091) (runtime-doc)(28589f5)
  • route ErrorBoundary errors through host logger (#2101) (notebook-app)(df19f29)
  • migrate session_core to typed RuntimeLifecycle + Python constants (#2100) (runtimed-py)(56e0e36)
  • install console_error_panic_hook (#2105) (runtimed-wasm)(1c53cd1)
  • explicit consent CTA + Privacy pane + install ID rotation (#2109) (telemetry)(2ed6840)
  • timezone-aware timestamp display (#2134) (sift)(175ed7a)
  • vendor nteract-kernel-launcher with display bootstrap in-binary (#2135) (launcher)(5ec99f5)
  • rich traceback renderer + break plugin-log feedback loop (#2138) (outputs)(95e7c91)
  • show time precision for Timestamp columns in cell display (#2139) (sift)(611e48e)
  • rich traceback emission via short-circuiting _showtraceback (#2141) (launcher)(7cab987)
  • UserErrorOutput semantic type (foundation for traceback round-trip) (#2142) (runtimed)(3662f56)
  • wire UserErrorOutput through runtime state + manifest (#2144) (runtimed)(bd2b744)
  • frame cap, SyntaxError layout, single-frame inline evalue (#2153) (traceback)(b024b45)

Bug Fixes

  • set explicit cwd on all UV subprocess commands (#1830) (kernel-env)(04c0409)
  • stream preview tail keeps final lines and stays disjoint from head (#1832) (runtimed)(143de40)
  • prevent empty tool cache from poisoning disk (#1834) (mcpb-runt)(c6e0a44)
  • evict re-keyed rooms by Arc pointer, not stale key (#1836) (runtimed)(8badf16)
  • defensive cell-count guard in rebuild_from_save (#1835) (notebook-sync)(63cd3ab)
  • skip file watcher cell deletion when save snapshot is empty (#1837) (runtimed)(8b0368e)
  • sync mcpb_install.rs tool descriptions and handle escaped quotes in check (#1842) (build)(da13681)
  • handle nested list values in table cells (#1843) (sift)(40d2f89)
  • send RuntimeStateDoc sync replies on initial connection (#1844) (notebook-sync)(7c58446)
  • update integration tests for UUID-first identity and inline sync (#1845) (test)(7b89459)
  • declare type=object on reconnect tool inputSchema (#1848) (runt-mcp-proxy)(601fb91)
  • fix column pin/unpin reordering tearing UI (#1850) (sift)(8437d5b)
  • handle all Timestamp time units + Date32/Date64 in filtered histogram (#1852) (sift)(029d8ab)
  • filtered histogram edge cases + Utf8View decode (#1859) (sift)(475e327)
  • category popover UX pass (#1861) (sift)(dd5c77b)
  • inline text-MIME comm state blobs (#1863) (widgets)(2eef6e3)
  • restore _esm/_css as URL passthrough in comm-state resolver (#1866) (widgets)(e3384d7)
  • await <link rel=stylesheet> load before rendering anywidget (#1868) (widgets)(912795a)
  • skip redundant dep bootstrap in auto_launch_kernel (#1873) (runtimed)(28e7722)
  • render zero-width range filter as point marker (#1874) (sift)(fd90eea)
  • use cocoa::base::YES for macOS x86_64 BOOL compatibility (#1875) (build)(72a1476)
  • reset execution_count on Clear Outputs (#1877) (runtimed)(6946849)
  • stop double-painting on lazy-prepared rows during scroll (#1879) (sift)(e276b3b)
  • catch exceptions in Tauri frame listener so it doesn't silently die (#1883) (notebook)(f2131c3)
  • sync daemon:ready cache on save-as too (#1893) (notebook)(e7b0dd6)
  • respect default_python_env in LaunchKernel auto fallback (#1898) (runtimed)(0af3b21)
  • attribute widget writes to break the echo loop (#1900) (widgets)(eab5e0d)
  • keep a trail of optimistic values, not just the latest (#1902) (widgets)(59595f6)
  • re-surface comm updates dropped while resolver wasn't ready (#1903) (sync-engine)(3aab5cf)
  • IOPub outputs silently dropped by shared-actor fork merges (#1905) (runtimed)(05d250a)
  • poll for eviction persistence instead of sleeping (#1907) (test)(dedd29e)
  • use per-task stable actors for IOPub/shell/coalesce (#1913) (runtimed)(279bac4)
  • eliminate shared-actor fork merges in notebook_sync_server (#1911) (runtimed)(9525119)
  • propagate errors instead of panicking (#1925) (notebook-doc)(248adc6)
  • propagate schema and cwd errors instead of panicking (#1924) (mcp-supervisor)(181a64b)
  • flush persist debouncer before room eviction removes it (#1929) (runtimed)(96ceef3)
  • spawn panic handling — WarmingGuard + task supervisor + migration (#1930) (runtimed)(2fb2291)
  • increase RestartKernel/LaunchKernel/SyncEnvironment timeout to 240s (#1941) (runtimed)(6ad923a)
  • clarify save_notebook path requirement for ephemeral notebooks (#1944) (runt-mcp)(1bcacec)
  • periodic RuntimeStateDoc compaction prevents frame overflow (#1942) (runtimed)(1d0d1a3)
  • drain prewarmed pool when default packages change (#1945) (runtimed)(5a4a689)
  • use in-place CRDT updates for stream coalescence (#1947) (notebook-doc)(93b802f)
  • eliminate TOCTOU gap in RuntimeStateDoc initial sync (#1946) (notebook-doc)(21175ad)
  • correct coalescence test assertions and add stale-key coverage (#1948) (notebook-doc)(1620d8c)
  • use connect_open for file-backed notebook rejoin (#1953) (runt-mcp)(18d16c5)
  • don't clear session during auto-rejoin (#1957) (runt-mcp)(0672237)
  • enable panic=unwind for MCP server to fix silent connection drops (#1959) (runt-cli)(288ea23)
  • survive daemon disconnect during kernel restart (#1949) (runt-mcp)(2daac0b)
  • codex follow-ups on PR #1960 captured-env flow (#1962) (runtimed)(241d42c)
  • preserve captured envs on room eviction for saved notebooks (#1963) (runtimed)(0ae63c3)
  • let the last column resize and absorb viewport slack (#1965) (sift)(1a56f83)
  • refresh trust state after file-watcher merges external edits (#1976) (runtimed)(79a5023)
  • clippy drift (#1974) (runtimed-node)(f993dd6)
  • Option D - pre-send initial sync frame before spawning handler (#1981) (runtimed)(5e4ecee)
  • UTF-8 safe string truncation in debug logger (#1982) (runt-mcp)(6cded6c)
  • respect bar_style and bar_color on progress bars (#1991) (widgets)(da97389)
  • unset RUNTIMED_DEV/WORKSPACE_PATH before exec (#1992) (plugin)(02aab5b)
  • drop runt-mcp health loop, drive state from DaemonConnection (#2000) (#2004) (mcp)(ba7d7ba)
  • bump runt-workspace dep budget 25 → 35 (#2005) (xtask)(111f277)
  • preserve late sync frames during connect (#2006) (notebook-sync)(9665b8a)
  • respawn child after transport closes (follow-up to #2004) (#2008) (mcp-proxy)(0816123)
  • treat empty-string env vars as unset in is_dev_mode() (#2011) (runt-workspace)(1b4140a)
  • show +dirty marker in dev banner and embedded binary versions (#2020) (version)(b932dd9)
  • use not_in exclusion filters for high-cardinality categories (#2022) (sift)(d475802)
  • accept v2 clients on v3 daemon for upgrade compat (#2025) (daemon)(15cce2d)
  • downgrade NotebookConnectionInfo protocol for v2 clients (#2026) (daemon)(68f88fa)
  • accept ISO-8601 timestamps, null on type mismatch (#2034) (sift-wasm)(a3a653f)
  • CreateNotebook auto-launch races CRDT dep sync (#2037) (runtimed)(9013d1d)
  • update .pyi stub for new create_notebook params (#2041) (runtimed-py)(5bbd002)
  • gate binary MIMEs + wire Sift into MCP App renderer (#2040) (structured)(65817a8)
  • replace expect panics with graceful returns in output writers (#2046) (notebook-doc)(b27bf90)
  • gitignore nteract-mcp sidecar binaries (#2047) (notebook)(8567adc)
  • validate and alias package_manager across APIs (#2043)(bae6997)
  • align detect_manager_from_metadata priority with other detectors (#2049) (runtimed)(6b330d0)
  • embed sift.js and sift.css in daemon (#2051) (runtimed)(df15f71)
  • poll RuntimeStateDoc for wait_for_ready instead of broadcast (#2066) (runtimed-py)(4f53400)
  • run pnpm install before build_mcp_widget in build flows (#2070) (xtask)(43a20d1)
  • eliminate TOCTOU race in trust signature approval (#2079) (notebook)(cc7ba1a)
  • migrate v3 schema docs instead of discarding them (#2080) (notebook-doc)(b73a00b)
  • parse string-typed deps instead of silently dropping (#2084) (#2087) (runt-mcp)(ad55a35)
  • disconnect previous session on notebook switch (#2088) (runt-mcp)(8b630e5)
  • bootstrap environment.yml deps into CRDT at auto-launch (#2097) (runtimed)(6007ac8)
  • pixi RPC path publishes MissingIpykernel reason (#2102) (runtimed)(4f34076)
  • unflake integration suite under parallel load (#2110) (runtimed)(7f77e5f)
  • drop needless return in Windows cli_install branch (#2112) (notebook)(85450b0)
  • daemon-owned trust re-sign and settings broadcast coalescing (#2121) (runtimed)(933b210)
  • emit MissingIpykernel for uv and conda envs (#2117) (runtimed)(439abc8)
  • don't delete content-addressed inline caches + tear down agent on restart-time MissingIpykernel (#2123) (runtimed,notebook)(390e864)
  • reject PEP 508 extras in conda/pixi deps before they reach the kernel (#2124) (notebook-doc)(8a50f09)
  • push timestamp formatting to WASM, fix Invalid Date on Date32 columns (#2125) (sift)(d8bb857)
  • allow conda MatchSpec attribute brackets ([key=value]) (#2126) (notebook-doc)(a207b09)
  • rename pool env to inline cache after sync so restarts cache-hit (#2127) (runtimed)(1a159b8)
  • thread bootstrap_dx through try_uv_pool_for_inline_deps (#2128) (runtimed)(d3a79c9)
  • prevent duplicate dep promotion in environment.yml (#2129) (runtimed)(db20477)
  • warn when environment.yml dedup parse fails (#2131) (runtimed)(eac3dd4)
  • fix CRLF corruption and hardcoded indent in env.yml promotion (#2133) (runtimed)(d61acb8)
  • pass all deps to conda solver in pool env additive path (#2137) (runtimed)(5cb0bc5)
  • await blob port in bootstrap to prevent binary output on reload (#2140) (notebook)(2b09b09)
  • validate conda inline cache has all requested packages (#2143) (runtimed)(f4f1726)
  • clear session on ephemeral notebook eviction to stop reconnect loop (#2145) (runt-mcp)(30c307f)
  • preserve initial_target until rejoin succeeds (#2146) (runt-mcp)(5bf59f4)
  • promote blob-ref MIME on DisplayHandle.update() (#2147) (output_store)(e7a7bdb)
  • adopt live Vite, don't sweep-and-respawn (#2149) (mcp-supervisor)(51fc36f)
  • auto-sign project-file deps at bootstrap (#2148) (runtimed)(a383e5d)
  • include kernel stderr in early-exit diagnostics (#2154) (runtimed)(18a1f49)
  • inject launcher PYTHONPATH for conda:env_yml spawn (#2161) (runtimed)(ac84eb0)
  • heal unsigned project-file-matching trust at room init (#2158) (runtimed)(423625d)
  • show_notebook displays correct title for path-resolved rooms (#2165) (notebook)(e71ff2f)
  • raise blob-spill preview caps and add get_cell full_output opt-in (#2166) (mcp)(813fa48)
  • surface typed error for missing conda env.yml env (#2167) (runtimed)(ac0dfea)
  • remove osascript credential prompt on every upgrade (#2171) (notebook)(afc16a4)
  • settings window links, default size, and dead constant (#2172) (notebook)(b872358)
  • stop autosave from rewriting .ipynb on open (#2168) (runtimed)(cc95e44)
  • wrap raw AsyncSession in Notebook for runtime access (#2174) (test)(26688f4)
  • route inline-dep notebooks with version specifiers through the pool (#2173) (inline-env)(ccc47e4)

Performance

  • optimize third-party deps in dev + disable incremental for sccache (#1901) (build)(6c3e812)
  • eliminate prop-alloc hot paths at output+widget boundary (#1914) (outputs)(f355151)
  • skip cargo build when binary exists (#2019) (mcp-supervisor)(ea08f15)
  • exclude inlined WASM from renderer plugin bundle (7.4 MB → 382 kB) (#2136) (sift)(15374c0)

Documentation

  • sync agent + contributor docs to current architecture (#1846)(528fb9f)
  • mark blob GC and ipynb blob-ref specs as shipped (#1869)(a74244a)
  • document the @nteract/notebook-host abstraction (#1894)(bf12c70)
  • explain the two-path output materialization (#1931) (outputs)(d0017ef)
  • audit tokio::spawn panic handling in runtimed (#1926)(cf5f3a2)
  • lead with positive voice for daemon lifecycle (#1940)(56171be)
  • unified env resolution design and invariants (#1966)(34a45e8)
  • fix stale rattler references after kernel-launch cleanup (#2007)(cd8a454)
  • replace Biome reference with vp in AGENTS.md (#2024)(17ae6a9)
  • lead with plugin install; slim PyPI README to a stub (#2036)(80c56e5)
  • add Install Extension for Claude (Desktop) flow (#2039) (readme)(41076d1)
  • update room substruct spec after PR 0 + PR A (#2069)(02825ea)
  • update mime.rs module doc — TS isBinaryMime is gone (#2106) (notebook-doc)(e809013)
  • rewrite bootstrap_dx feature flag copy (#2162) (settings)(746de09)
  • Environments
  • Runtime
  • Desktop
Permalink →
2.2

Throwaway Runtimes, Conda Without the Restart

Agents spin up ephemeral runtimes that close when they finish, conda kernels pick up new packages without a restart, and the whole app gets a warm cream theme.

  • Ephemeral notebooks let agents grab a runtime on demand and throw it away when done
  • Conda kernels hot-sync new dependencies without a restart
  • Whole-app Cream theme
Throwaway Runtimes, Conda Without the Restart

2.2 is about runtimes you don't have to manage and restarts you don't have to take.

Ephemeral notebooks for agents

Watching agents treat notebooks like their own throwaway sandboxes, nteract introduced ephemeral notebooks. An agent can spin one up on demand, run against it, and it all gets cleaned up when the agent disconnects. If they need to save it, it gets upgraded. No loose Untitled229.ipynb. The notebook lives only in memory, with no file on disk and no leftover state to sweep up. An agent or automated job can grab a runtime, get some work done. It's more like a regular REPL than a document you have to think about saving. Which, well, if you want to keep something you can always save_notebook and it's no longer ephemeral. Just a quick little upgrade.

Conda kernels hot-sync new dependencies

Inline dependency hot-sync now works for conda environments, not just uv. Add a package to a running conda kernel and the environment syncs in place, no restart, no lost variables. Environment resolution itself went offline-first this release, so a flaky network at launch time is far less likely to block you.

A whole-app Cream theme

In service to our super-secret data explorer we've added a new warm color theme that covers the entire app. New CodeMirror themes and swapped Prism for Lezer so all our static highlighting uses the same CodeMirror setup. Find it in settings to try out the dark and light modes.


The less ceremony there is in getting to experimentation, the more you can experiment.

Full technical changelog

All 89 changes in 2.2

Features

  • enable conda hot-sync for inline dependencies (#1661) (runtimed)(0627c33)
  • return per-cell outputs from run_all_cells (#1662) (runt-mcp)(e1eb16c)
  • content-aware multi-cell renderer with dev preview (#1665) (mcp-app)(7221be4)
  • add 'kernel' alias for 'runtime' in create_notebook (#1670) (runt-mcp)(99d8797)
  • ephemeral notebooks for MCP agents (#1669) (runtimed)(7ab1efb)
  • blob store GC for orphaned blobs (#1672) (runtimed)(8391471)
  • add nteract Codex and Claude plugin configs (#1666) (plugins)(521d0fc)
  • dynamic pool size configuration via settings doc (#1694) (runtimed)(b7732f5)
  • offline-first environment resolution (#1699) (kernel-env)(15d0394)
  • pool warming with network failure detection (#1703) (runtimed)(c214d48)
  • persist conda/pixi lock files for offline re-creation (#1705) (kernel-env)(908f3c5)
  • add @nteract/sift as packages/sift in monorepo (#1709) (sift)(703f7f6)
  • standalone renderer plugin test app (#1718) (renderer-test)(d89d2f7)
  • add parquet support to SiftTable url prop (#1720) (sift)(62cc46d)
  • add theme picker with Classic and Cream themes (#1725) (sift)(0cba8b3)
  • parquet renderer plugin, WASM blob server, color theme settings (#1730) (sift)(1436329)
  • whole-app cream theme with CodeMirror support (#1739)(140fabe)
  • warm accent colors for cream theme (#1740) (theme)(813c488)
  • own CodeMirror themes, replace Prism with Lezer static highlighting (#1742) (editor)(4b44adb)
  • parquet summaries for LLM + nteract-predicate/sift-wasm crate split (#1759) (mcp)(8188bcb)
  • nteract/dx — data-experience library for Python kernels (#1762) (dx)(5c2e5fd)
  • use project's real conda env for conda:env_yml notebooks (#1766) (conda)(cc0706f)
  • save ipynb with blob refs instead of base64 (spec 2) (#1769) (runtimed)(2350ff3)
  • blob GC correctness (spec 1) (#1770) (runtimed)(e8b4953)
  • expose reconnect tool on the standalone MCP proxy (#1776) (mcpb)(00492df)
  • consolidate tool surface — up, down, status, logs (#1777) (supervisor)(5724c04)
  • register ipython_display_formatter handler for DataFrames (#1780) (dx)(22001e7)
  • register formatters for narwhals DataFrame wrappers (#1782) (dx)(df439c7)
  • add GetDaemonInfo request as replacement for daemon.json (#1803) (protocol)(f35c3c0)
  • query_daemon_info helper prefers socket (#1804) (runtimed-client)(9b8d988)
  • cap Presence frames at 1 MiB in recv_typed_frame (#1806) (protocol)(ab5c0bd)
  • richer per-column stats + Dataset handler in text/llm+plain (#1809) (dx)(a43b2a8)
  • DaemonConnection — long-lived daemon session (Phases 1–3) (#1823) (runtimed-client)(10c3434)

Bug Fixes

  • show daemon error message in pool error banner (#1658) (frontend)(e04085a)
  • ephemeral notebook review cleanups (#1671) (runtimed)(3359216)
  • auto-reset circuit breaker after cooldown (#1674) (runt-mcp-proxy)(321adb8)
  • re-resolve child binary on every restart (#1677) (runt-mcp-proxy)(a812587)
  • coerce string booleans in MCP tool params (claude-code#32524) (#1678) (runt-mcp)(edb5d31)
  • respect SKIP_MATURIN during file-change handling (#1679) (mcp-supervisor)(1ed4371)
  • coerce string arrays in MCP tool params (claude-code#32524) (#1680) (runt-mcp)(b562604)
  • auto-create directories on save + block ephemeral UUID saves (#1683) (runtimed)(c79d0e0)
  • defensive sweep for orphaned executions on kernel restart (#1690) (runtimed)(bab5fd1)
  • graceful fallback for launch_app in headless environments (#1693) (runt-mcp)(53d2ffe)
  • parse UV checksum as hash+filename format (#1695) (kernel-launch)(f644f8b)
  • graceful kernel shutdown with signal escalation (#1696) (runtimed)(8bdffb5)
  • clean up ZeroMQ sockets when kernel dies (#1697) (runtimed)(ee2c48f)
  • clone state objects in AFM model proxy to prevent readonly errors (#1698) (widgets)(92e6ed3)
  • add child process monitoring for transparent restarts (#1701) (runt-mcp-proxy)(48d24db)
  • honor pool_size settings from settings.json (#1702) (runtimed)(967c7b1)
  • socket-aware daemon stop with signal escalation (#1704) (runt)(3005326)
  • runtime agent process groups for clean orphan reaping (#1717) (runtimed)(49f6df1)
  • check child transport state before skipping restart (#1722) (mcp-proxy)(1bd20da)
  • eliminate triple compilation of shared crates (#1724) (build)(01b584e)
  • update Tailwind arbitrary value CSS vars to --sift-* names (#1726) (sift)(7ffa849)
  • stop watching .git files in build scripts (#1727) (build)(258bc82)
  • env cleanup on room eviction and GC improvements (#1723) (runtimed)(b526496)
  • wait for Automerge doc sync before mutating in integration tests (#1729) (test)(2213e65)
  • stop promote_inline_deps_to_project from removing project deps (#1733) (runtimed)(66c12e8)
  • set current_runtime_agent_id in LaunchKernel request path (#1735) (runtimed)(ab12f14)
  • skip stale Python rebuilds in warm builds (#1737) (xtask)(99c9cdd)
  • gate shell_escape with #[cfg(unix)] to fix Windows warning (#1738) (build)(dd3986a)
  • match output area width to CodeMirror editor (#1741) (cell)(248655f)
  • replace shared watch<bool> with per-agent oneshot channel (#1743) (runtimed)(3154e2d)
  • propagate colorTheme to iframe document element (#1745) (iframe)(6586cd5)
  • default create_notebook working_dir to CWD for project detection (#1750) (mcp)(bb958d2)
  • prevent GC from deleting pool envs mid-warmup (#1752) (runtimed)(87f0043)
  • restore Classic Light syntax colors (#1753) (editor)(fdf31a8)
  • cell adder Tailwind classes + cream-aware iframe CSS vars (#1755) (theme)(acf6664)
  • use webkit-prefixed Fullscreen API for WKWebView compatibility (#1756) (sift)(f371577)
  • enable Fullscreen API for output iframes (#1758) (iframe)(efe8cc7)
  • handle LargeUtf8 string columns (pandas parquet default) (#1763) (predicate)(b84a9e1)
  • increase virtualization overscan to prevent blank rows on fast scroll (#1764) (sift)(51a3d16)
  • emit Ready after additive pool delta install (#1765) (env-progress)(bcc89a1)
  • dx-dist artifact path — uv workspace writes to repo-root dist/ (#1775) (ci)(be10507)
  • health-probe vite and reinstall on lockfile drift (#1778) (supervisor)(9188026)
  • render parquet via sift when pandas also emits HTML (#1779) (mime-priority)(53557d3)
  • fail the release when a PyPI publish step errors (#1781) (ci)(b34af2f)
  • pin ruff to 0.15.10 and reformat dx integration tests (#1802) (ci)(c2c5642)
  • reconnect on sync-socket framing errors (#1805) (runtime-agent)(4537498)
  • author text/llm+plain wins over synth (#1808) (output-resolver)(51eddfe)
  • check env sync drift after kernel restart (#1810) (runtimed)(71ae91c)
  • serve cached tools optimistically and bake in build channel (#1827) (mcpb-runt)(4fc2940)

Performance

  • trim tool descriptions to reduce context cost (#1688) (runt-mcp)(0d7061f)

Documentation

  • document daemon isolation setup and add supervisor failsafe (#1700)(8370da0)
  • update agent-facing docs to the up/down/status supervisor surface (#1784)(c95b64d)
  • extend _format_install module docstring to cover ipython_display path (#1785) (dx)(354c217)
  • refresh stale RoomKernel/kernel_manager.rs references (#1791)(4a83eea)
  • add test_dx_integration.py setup + run instructions (#1792) (testing)(2cfb081)
  • rewrite README for PyPI display (#1821) (dx)(58cff24)
  • Agents
  • Environments
  • Notebook editing
  • Desktop
Permalink →
2.1

Outputs for Agents, Outputs for Humans

This is the first cut of repr-llm. Plotly, Vega, Leaflet, and more are supported for both humans and agent views. Native rendering for humans, text/plain+llm for agents.

  • Rich outputs synthesize a text/llm+plain summary for agents to read
  • An agent looking at a Plotly chart or GeoJSON map gets a description
  • Plotly, Vega, Leaflet, LaTeX, audio, video, and PDF all render natively
  • Preliminary Pixi support begins alongside uv and conda
Outputs for Agents, Outputs for Humans

2.1 is where outputs start reading back to agents.

This release brings rich outputs for people and agents alike. Now with early Pixi support!

Outputs for Humans

Rich outputs in nteract: Plotly, Vega, Leaflet, and LaTeX rendering natively

Just like the OG Electron app, nteract supports Plotly, Vega, Vega-Lite, and GeoJSON. These are native JSON formats with rich renderings, allowing your notebooks to be compact while you get full interactivity.

Outputs for Agents

Until now, rich outputs were a dead end for agents. They either had to sift through large Plotly HTML, get no visibility of widgets, or receive massive base64-encoded gunk. 2.1 marks the start of the repr-llm crate. Alongside the visual representation, every rich output also synthesizes a text/llm+plain summary. When an agent connects via the nteract-mcp, they see a text-readable description of what the output shows. If an output has no readable representation at all, the agent at least sees a note that something visual was produced.

Preliminary Pixi support

Pixi starts joining uv and conda as a Python environment option in 2.1. The foundations are here: pixi run kernel launch, pool warming against managed pixi.toml envs, [tool.pixi] detection, drift checks, and a dependency panel in the header that shows what's declared. The fully project-driven environment story lands later, when notebooks can discover project files around them and let the project drive the kernel.


No matter which environment you choose, your agent should be in your corner using your package manager of choice! Give them the context and they will prevail.

Full technical changelog

All 178 changes in 2.1

2.1.3 - April 9, 2026

Features

  • replace vanilla DOM renderer with React + renderer plugins (#1615) (mcp-app)(1324f23)
  • add async-rust-lsp plugin for tokio mutex diagnostics (#1620) (plugins)(4476318)
  • reuse pool envs for inline deps instead of rebuilding (#1622) (runtimed)(d1c60d6)
  • daemon-served renderer plugins for plotly, vega, leaflet (#1619) (mcp-app)(ccda0c2)
  • move markdown+KaTeX to daemon-served plugin (#1625) (mcp-app)(d69ec66)
  • ship resilient mcpb-runt binary in MCPB bundle (#1629) (mcp)(956c988)
  • project-aware dependency management — pixi add / uv add (#1650) (runtimed)(f913da1)
  • show pixi.toml dependency names in header (#1653) (frontend)(924d6cb)

Bug Fixes

  • avoid holding notebook_rooms lock across .await points (#1614) (runtimed)(b958197)
  • address code review — rehypeRaw, blob fetch fallbacks (#1617) (mcp-app)(c2872da)
  • parse JSON arrays in config set instead of blind comma-split (#1621) (runt)(1dd70b4)
  • classify pool errors, show contextual banner messages (#1623) (runtimed)(e741e3a)
  • add lfs: true to release Python wheel builds, bump v2.1.3 (#1627) (ci)(57f77f4)
  • add connectDomains and tile CDN to MCP App CSP (#1632) (mcp-app)(ba22d88)
  • respect default_python_env in create_notebook (#1634) (mcp)(f43d825)
  • add mcpb-runt sidecar to all CI workflow build steps (#1635) (ci)(65a57f8)
  • avoid holding notebook_rooms lock across .await in eviction handler (#1637) (runtimed)(3d69c9a)
  • prevent stale asset resolution in materialization pipeline (#1639) (notebook)(c8d3a0a)
  • fix cross-lock ordering and expand tokio mutex lint to all sources (#1638) (runtimed)(1e6ba53)
  • burn down mutex-across-await violations (58 → 19) (#1642) (runtimed)(f24875a)
  • fall back to room.working_dir in LaunchKernel handler (#1648) (runtimed)(215aeb4)
  • zero mutex-across-await violations, gate all files in CI (#1649) (runtimed)(44934fe)
  • persist trust for untitled notebooks across daemon restarts (#1654) (runtimed)(2a90133)
  • mark in-flight executions as failed on kernel restart/death (#1652) (#1655) (runtimed)(bb4b3ea)

Performance

  • shrink widget bundle from 1.5 MB to 539 KB (#1628) (mcp-app)(50f8de5)

2.1.2 - April 7, 2026

Features

  • add config subcommand + fix stale sole-writer comment (#1600) (runt)(23d795c)
  • replace inline warmup scripts with embedded prewarm package (#1608) (prewarm)(4d81e72)
  • add known package-to-import-name mapping (#1610) (prewarm)(8d9f3c4)

Bug Fixes

  • replace_match context matching + create_notebook dep sync (#1589) (runt-mcp)(f8b2571)
  • Plotly 6 bdata decoding, GeoJSON text parsing, structured viz synthesis (#1595) (repr-llm)(b70b0a1)
  • create_notebook(package_manager='pixi') now persists correctly (#1599) (runt-mcp)(3f8669b)
  • show 'awaiting approval' instead of 'initializing' when blocked on trust (#1601) (#1603) (runtimed)(c084dd6)
  • show trust banner and handle execution for awaiting_trust status (#1604) (frontend)(27c7cef)
  • route conda/pixi notebooks to correct kernel pool (#1605) (#1606) (runt-mcp)(f3c4860)
  • critical imports must fail the script, normalize dep specs (#1609) (prewarm)(e0ba355)

Documentation

  • fix stale references and missing entries across documentation (#1590)(273fe68)

2.1.1 - April 7, 2026

Features

  • add mcp-inspector command for MCP Apps testing (#1575) (xtask)(eebead4)
  • ContentRef resolution + direct CRDT→WidgetStore projection (#1576) (widgets)(119dbc2)
  • debounced CRDT writes + jslink echo suppression (#1580) (widgets)(4da6411)

Bug Fixes

  • wait for pool warming on cold start instead of failing immediately (#1579) (runtimed)(4edfb95)
  • don't restart child on transient errors, auto-rejoin sessions (#1578) (mcp-supervisor)(3910028)
  • retain warm bases and prewarm user defaults (#1581) (runtimed)(4d550fb)
  • eliminate double-bootout race during nightly upgrade (#1582) (runtimed)(8927f96)
  • harden prewarm import generation (#1584) (runtimed)(fc8a30d)
  • update RuntimeStateDoc on interrupt to clear CRDT queue (#1585) (runtimed)(3c17e7a)

2.1.0 - April 6, 2026

Features

  • move cell outputs to RuntimeStateDoc keyed by execution_id (#1343) (sync)(363f32d)
  • support plotly's application/vnd.plotly.v1+json MIME type (#1352) (outputs)(9c26c47)
  • dual-write comm state to RuntimeStateDoc (#761 Phase A) (#1356) (sync)(1025c66)
  • support Vega and Vega-Lite MIME types (#1358) (outputs)(d66e3f0)
  • #761 Phase B — drive WidgetStore from RuntimeStateDoc comms (#1362) (sync)(68abbd9)
  • #761 Phase D — native CRDT widget state (#1368) (sync)(3a4a557)
  • widget binary buffers via blob store (#1371) (sync)(338468e)
  • surface prewarmed packages in RuntimeStateDoc and MCP tools (#1373) (env)(606db7b)
  • Output widget captures to CRDT + broadcast cleanup (#1372) (#1379) (sync)(e766301)
  • add GeoJSON renderer with Leaflet (#1386) (output)(a6f504e)
  • add text/latex MIME type renderer with KaTeX (#1392) (output)(23d2e0e)
  • support bulk clear_outputs with optional cell_ids (#1402) (mcp)(90ccd86)
  • add runtime agent wire types (#1333) (#1404) (protocol)(06b02ac)
  • allow show_notebook on untitled/ephemeral notebooks (#1414) (mcp)(2c58430)
  • runtime agent module — sync-only subprocess main loop (#1411) (runtimed)(105f2a9)
  • add audio, video, PDF, JS renderers and invert isolation model (#1417) (outputs)(e870ade)
  • process-isolated runtime agents (#1333) (runtimed)(c15c4a9)
  • persist agent_mode in settings doc — survives daemon restarts (#1423)(10bebde)
  • add --socket flag to runt mcp for explicit daemon socket path (#1427) (runt)(862659f)
  • add collapsible Feature Flags section with agent mode toggle (#1429) (settings)(9f55f75)
  • serve cached tools optimistically on startup (#1430) (mcp-supervisor)(7568261)
  • agent as Unix socket peer with CRDT-driven execution (#1431) (runtimed)(fb2e470)
  • make agent mode unconditional (#1433) (runtimed)(5daf58d)
  • focus cell on iframe click and broadcast focus presence (#1444) (notebook)(5d4e9e9)
  • agent-internal kernel restart + provenance (#1436 Phase B) (#1449) (runtimed)(e623bf5)
  • pre-install nbformat in all Python runtimes (#1458) (kernel-env)(802ceb7)
  • synthesize text/llm+plain for viz outputs (#1461) (repr-llm)(6560b3c)
  • first-class pixi kernel support via pixi run (#1462) (#1465) (runtimed)(29bb485)
  • synthesize text/llm+plain for SVG, HTML, and large JSON (#1466) (repr-llm)(2ebd37b)
  • dedicated dependency panel, ipykernel pre-check, fix routing (#1469) (pixi)(8d15121)
  • pixi as available default Python environment (#1474) (pixi)(e46d326)
  • finish sweep — [tool.pixi] detection, drift, inline deps UI (#1477) (pixi)(9f34a55)
  • pixi JSON APIs — shell-hook launch, pinned version, pixi info (#1470, #1471) (#1479) (pixi)(4423ac9)
  • route built-in widget updates through CRDT instead of SendComm (#1480) (widgets)(22e5a01)
  • synthesize text/llm+plain for widget outputs (#1482) (output-resolver)(ba9de73)
  • PEP 723 support, default packages in settings, version pin fix (#1483) (pixi)(15c1ffa)
  • highlight Restart+Run All button when deps are out of sync (#1487) (frontend)(240d6fb)
  • real pixi pool warming with managed pixi.toml envs (#1486) (pixi)(bba3c3c)
  • library-based pixi pool warming with rattler (#1509) (daemon)(7848d60)
  • add version info to pool Pong and check on connect (#1515) (protocol)(0aade7e)
  • add symlink currency check on app launch (#1514) (cli)(2783f56)
  • migrate daemon registration to SMAppService on macOS 13+ (#1516) (service)(2213aae)
  • add system-wide CLI installation via menu (#1513) (cli)(545d151)
  • extract markdown into on-demand renderer plugin (#1519) (isolated-renderer)(24e2a46)
  • migrate vega to renderer plugin API (#1521) (isolated-renderer)(5d91761)
  • migrate plotly to renderer plugin API (#1534) (isolated-renderer)(fd59aaf)
  • migrate leaflet to plugin API, document system (#1537) (isolated-renderer)(45ae032)
  • support ~ and relative paths in save_notebook, open_notebook, create_notebook (#1540) (mcp)(02969ca)
  • pre-compute renderer plugins at materialization, fix output widgets (#1539)(f86e672)
  • add per-session file logging for runt mcp (#1554) (mcp)(727fe4c)
  • add GeoJSON summarizer for text/llm+plain synthesis (#1555) (repr-llm)(d56f5b6)
  • selective manifest resolution — only fetch what the LLM needs (#1561) (mcp)(48581e5)
  • selective MIME resolution via priority list (#1562) (wasm)(3d61f31)
  • resolve ContentRefs to Inline/Url/Blob variants (#1564) (wasm)(9be5ecf)
  • text/latex renderer via iframe plugin (#1566) (frontend)(ca719cf)
  • synthesis before priority walk for richer LLM output (#1570) (mcp)(ec736df)

Bug Fixes

  • clarify replace_regex tool description semantics (#1348) (runt-mcp)(6655945)
  • wrap cell-ui-state store setters in useLayoutEffect (#1351) (notebook)(42026b5)
  • disable incremental compilation with sccache and bump cache size (#1355) (xtask)(7e83201)
  • fix output disappearing on structural changes and WASM diff snapshot (#1357) (sync)(edc17c6)
  • poll RuntimeStateDoc for execution completion, remove --legacy (#1359) (runt-mcp)(e19b750)
  • fire-and-forget for SendComm widget state updates (#1366) (sync)(4fde22a)
  • remove flaky bloom filter assertion in Bug #1067 test (#1367) (wasm-tests)(dc7378a)
  • configure ty extra-paths for src-layout workspace members (#1370) (ci)(74338f2)
  • rebuild stale WASM bindings and stabilize flaky tests (#1374) (ci)(3e06398)
  • mark flaky uv inline dep tests as xfail (#1375) (ci)(c5a7202)
  • make cell-ui-state store StrictMode-safe (#1380) (notebook)(9ee7e7a)
  • add build.rs stub for runt-mcp _output.html in fresh worktrees (#1387) (build)(99b6366)
  • refuse placeholder _output.html in release builds (#1388) (build)(297eb99)
  • graceful room migration on re-key collision (#1396) (sync)(8a66de9)
  • address codex review — drop unsafe kernel migration, signal merged doc (#1398) (sync)(d37b865)
  • stamp runtimed version and re-install CLI on upgrade (#1395) (release)(f4c9a60)
  • expand known packages list to prevent false typosquat warnings (#1397) (trust)(6e3c1ea)
  • drain stale response frames after relay timeout (#1399) (sync)(5511665)
  • run pnpm install in cmd_build before frontend build (#1410) (xtask)(3d5b3a1)
  • render Output widget captured outputs via CRDT state (#1412) (widgets)(2b36f94)
  • ensure RuntimeStateDoc sync before reading cell outputs (#1415) (mcp)(3c8009e)
  • use ReplaySubject so initial sync retry timer always arms (#1421) (sync)(50d42c1)
  • buffer relay frames until frontend signals readiness (#1422) (sync)(8c0f17a)
  • use .write().await instead of .blocking_write() in SetAgentMode handler (#1425)(42ce039)
  • drop redundant broadcasts at peer relay point (#1424) (sync)(081d000)
  • add agent_mode to SyncedSettings in notebook crate — fixes nightly build (#1426)(472a0fc)
  • install CLI to ~/.local/bin instead of /usr/local/bin (#1437) (notebook)(8584ac7)
  • clear text selection when focus leaves iframe (#1446) (iframe)(685e3d3)
  • update all outputs matching display_id (#1447) (runtimed)(bde5231)
  • consolidate cell scroll into focusCell, remove fragile ref (#1448) (notebook)(97342ca)
  • add retry for flaky wasm-integration tests (#1450) (test)(9a224e3)
  • use named pipe path for Windows integration tests (#1455) (test)(a82e66d)
  • add content hashes to Vite output filenames (#1456) (notebook)(1c01eca)
  • restore env sync for agent mode (#1452) (#1459) (runtimed)(f63f6ad)
  • strip sourcemap comments from raw library imports (#1468) (iframe)(afbf611)
  • prevent scroll jump during widget slider interaction (#1485) (frontend)(c384ae9)
  • reduce output size for audio, viz, and large MIME types (#1488) (mcp)(48961e2)
  • force CodeMirror repaint on window reactivation (#1490) (frontend)(bb710c8)
  • add error handling and switch to canvas renderer (#1491) (vega)(b398dc6)
  • report execution status and non-text outputs to agents (#1495) (mcp)(18fdd6f)
  • allow HTTPS stylesheets in output iframe CSP (#1496) (security)(2db0626)
  • generate proper changelog for stable releases (#1499) (ci)(a28e439)
  • group stable changelog entries by ignoring nightly tags (#1500) (ci)(a5d399c)
  • resolve widget loading race on notebook open (#1501) (frontend)(7dfcb9f)
  • prevent bootstrap skeleton from shadowing daemon metadata (#1498) (crdt)(542141f)
  • mark execution error in agent CellError handler (#1502) (runtimed)(2d47be0)
  • read execution_count from RuntimeStateDoc instead of stale NotebookDoc (#1503) (mcp)(dcf0e49)
  • resolve execution_count from RuntimeState instead of stale NotebookDoc (#1511) (frontend)(61fd9c4)
  • replace animate-pulse with squish-breathe on stop indicator (#1512) (frontend)(6d1687d)
  • remove "Isolated output frame" tooltip from output iframes (#1532) (ui)(4ac8d6b)
  • stabilize flaky queue dedup and output sync tests (#1520) (sync)(d574206)
  • pass requested runtime to auto_launch_kernel for CreateNotebook (#1535) (daemon)(429d54a)
  • show Pixi pool in daemon status output (#1536) (cli)(69db083)
  • fix dependency pipeline for all env types (uv, conda, pixi) (#1538) (mcp)(d1f4451)
  • use scoped auto-detect with full pixi support on restart (#1541) (mcp,daemon)(e6c6e36)
  • run_all_cells waits for completion with timeout (#1546) (mcp)(4693113)
  • avoid unnecessary reconnect loop on daemon PID change (#1545) (mcp)(8565667)
  • include cell tags in get_cell and get_all_cells rich responses (#1548) (mcp)(d1c646d)
  • prevent spurious ANSI reset after emoji in stream output (#1549) (daemon)(a6d8801)
  • process RuntimeStateSync frames during request/response wait (#1553) (sync)(abf6405)
  • resolve blob port before reading cells, add binary MIME fallback (#1565)(a7af987)
  • invalidate all plugin virtual modules on HMR rebuild (#1567) (frontend)(ac719da)
  • blob-store large comm state values to prevent 58s CRDT writes (#1571) (daemon)(4771625)
  • anywidget ESM rendering — correct MIME types and iframe CSP (#1572)(333395d)

Performance

  • decouple output-widget from iframe-libraries (-69% IIFE size) (#1389) (build)(421ebcd)
  • skip unchanged MCP widget rebuild and parallelize pnpm install (#1432) (xtask)(33a688d)
  • smooth widget rendering with batch updates and image preloading (#1478) (iframe)(3567e5e)
  • always minify renderer plugin builds (#1543) (isolated-renderer)(35505eb)

Documentation

  • simplify env -i commands to use absolute paths instead of PATH (#1400)(e533b77)
  • use tar -O instead of extracting to /tmp (#1403) (diagnostics)(88d52ef)
  • update architecture docs for agent subprocess execution (#1440)(8ba988e)
  • sync AGENTS.md and README.md with current workspace structure (#1476)(7517d41)
  • guide agents to use MCP tools for notebook dependencies (#1506)(f78c0b9)
  • clarify single-session scoping in tool descriptions (#1544) (mcp)(1d97189)
  • update agent and contributing docs for recent architecture changes (#1573)(f678732)
  • document iframe Content Security Policy (#1574)(5412964)

.github/workflows

  • Migrate workflows to Blacksmith runners (#1353)(4a04920)
  • Outputs
  • Agents
  • Environments
Permalink →