← Changelog
nteract 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!

  • Environments
  • Runtime
  • Desktop
Environments That Find Themselves

Highlights

  • 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

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)