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.
- Outputs
- Agents
- Environments

Highlights
- 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
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
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 setinstead 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 mcpfor 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)