<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - releases</title><link href="https://blog.jupyter.org/" rel="alternate"/><link href="https://blog.jupyter.org/feeds/tag-releases.atom.xml" rel="self"/><id>https://blog.jupyter.org/</id><updated>2026-09-11T08:54:00+00:00</updated><subtitle>New versions of Jupyter software, including security fixes and end-of-maintenance notices.</subtitle><entry><title>JupyterHub 6.0</title><link href="https://blog.jupyter.org/posts/2026/jupyterhub-6-0/" rel="alternate"/><published>2026-09-11T08:54:00+00:00</published><updated>2026-09-11T08:54:00+00:00</updated><author><name>Serena Bonaretti</name></author><id>tag:blog.jupyter.org,2026-09-11:/posts/2026/jupyterhub-6-0/</id><summary type="html">&lt;p&gt;JupyterHub is a collection of tools that provides standardized, user-friendly computing environments for education and research. Today, we’re pleased to announce the release of JupyterHub 6.0. This is a substantial release with several new features.&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterhub-6-0/images/001-1_l3xTI5FmlszK3So0jg0-YA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterhub.readthedocs.io"&gt;JupyterHub&lt;/a&gt; is a collection of tools that provides standardized, user-friendly computing environments for education and research. Today, we’re pleased to announce the release of &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html#id2"&gt;&lt;strong&gt;JupyterHub 6.0&lt;/strong&gt;&lt;/a&gt;. This is a substantial release with several new features. The breaking changes ought to be minimal, and should affect very few deployments. There is a small database schema upgrade, so make sure to backup your database prior to upgrading, as usual.&lt;/p&gt;
&lt;p&gt;Some changes to highlight:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stricter named server rules&lt;/strong&gt;: Named servers now have stricter rules on their names, and a new less-restricted “display name” field. This might be the &lt;strong&gt;most significant change&lt;/strong&gt; affecting you! See the &lt;a href="https://jupyterhub.readthedocs.io/en/6.0.0/howto/upgrading-v6.html#named-server-restrictions"&gt;documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Python 3.10 and database upgrade&lt;/strong&gt;: JupyterHub 6.0 now requires Python 3.10 and includes a database schema upgrade. Make sure to &lt;strong&gt;back up your database&lt;/strong&gt; before upgrading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Updates to metrics&lt;/strong&gt;: The old StatsD metrics have been removed, in favor of the Prometheus metrics that most people are already using. For Spawner (and spawn hook) authors, JupyterHub 6.0 also introduces &lt;a href="https://jupyterhub.readthedocs.io/en/6.0.0/reference/spawners.html#exception-handling"&gt;SpawnException&lt;/a&gt;, which provides more granular information for classifying spawn failures in metrics, to help deployments separate &lt;em&gt;errors&lt;/em&gt; from &lt;em&gt;rejections&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Internal communication changes&lt;/strong&gt;: JupyterHub now uses &lt;em&gt;aiohttp&lt;/em&gt; for internal HTTP requests, which may require tuning for large deployments since internal HTTP requests. This update has facilitated using unix sockets for internal communication on single-node deployments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved granularity in API access&lt;/strong&gt;: JupyterHub provides new API endpoints for working with single servers, along with more flexible ways to define permissions, such as &lt;code&gt;start:servers&lt;/code&gt; scope and &lt;code&gt;extra_user_scopes&lt;/code&gt;.&lt;br&gt;
See the &lt;a href="https://jupyterhub.readthedocs.io/en/stable/rbac/roles.html#overriding-default-roles"&gt;documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond these main changes, there have been lots of other improvements and bugfixes. You can find more details in the &lt;a href="https://jupyterhub.readthedocs.io/en/stable/howto/upgrading-v6.html"&gt;upgrading documentation&lt;/a&gt; and &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html#changelog"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="thank-you-to-our-contributors"&gt;Thank you to our contributors&lt;/h2&gt;
&lt;p&gt;The following people contributed discussions, new ideas, code and documentation contributions, and review: &lt;a href="https://github.com/agoose77"&gt;agoose77&lt;/a&gt;, &lt;a href="https://github.com/anny0811"&gt;anny0811&lt;/a&gt;, &lt;a href="https://github.com/ateucher"&gt;ateucher&lt;/a&gt;, &lt;a href="https://github.com/betatim"&gt;betatim&lt;/a&gt;, &lt;a href="https://github.com/bl-aire"&gt;bl-aire&lt;/a&gt;, &lt;a href="https://github.com/clhedrick"&gt;clhedrick&lt;/a&gt;, &lt;a href="https://github.com/consideRatio"&gt;consideRatio&lt;/a&gt;, &lt;a href="https://github.com/dometto"&gt;dometto&lt;/a&gt;, &lt;a href="https://github.com/dragz"&gt;dragz&lt;/a&gt;, &lt;a href="https://github.com/erawn"&gt;erawn&lt;/a&gt;, &lt;a href="https://github.com/ericvd-ucb"&gt;ericvd-ucb&lt;/a&gt;, &lt;a href="https://github.com/jezwilkinson"&gt;jezwilkinson&lt;/a&gt;, &lt;a href="https://github.com/jnywong"&gt;jnywong&lt;/a&gt;, &lt;a href="https://github.com/jrdnbradford"&gt;jrdnbradford&lt;/a&gt;, &lt;a href="https://github.com/kellyrowland"&gt;kellyrowland&lt;/a&gt;, &lt;a href="https://github.com/kreuzert"&gt;kreuzert&lt;/a&gt;, &lt;a href="https://github.com/LUC4R4T0R"&gt;LUC4R4T0R&lt;/a&gt;, &lt;a href="https://github.com/manics"&gt;manics&lt;/a&gt;, &lt;a href="https://github.com/mayli"&gt;mayli&lt;/a&gt;, &lt;a href="https://github.com/milliams"&gt;milliams&lt;/a&gt;, &lt;a href="https://github.com/minrk"&gt;minrk&lt;/a&gt;, &lt;a href="https://github.com/mynkyu"&gt;mynkyu&lt;/a&gt;, &lt;a href="https://github.com/nsychev"&gt;nsychev&lt;/a&gt;, &lt;a href="https://github.com/Paul2708"&gt;Paul2708&lt;/a&gt;, &lt;a href="https://github.com/Rameshkumar31595"&gt;Rameshkumar31595&lt;/a&gt;, &lt;a href="https://github.com/rgaiacs"&gt;rgaiacs&lt;/a&gt;, &lt;a href="https://github.com/shaneknapp"&gt;shaneknapp&lt;/a&gt;, &lt;a href="https://github.com/sixonenines"&gt;sixonenines&lt;/a&gt;, &lt;a href="https://github.com/tbizouerne"&gt;tbizouerne&lt;/a&gt;, &lt;a href="https://github.com/Tech-Abhang"&gt;Tech-Abhang&lt;/a&gt;, &lt;a href="https://github.com/wilkinvr"&gt;wilkinvr&lt;/a&gt;, &lt;a href="https://github.com/willingc"&gt;willingc&lt;/a&gt;, &lt;a href="https://github.com/yuvipanda"&gt;yuvipanda&lt;/a&gt;&lt;/p&gt;
</content><category term="JupyterHub"/><category term="releases"/></entry><entry><title>JupyterGIS 0.16: New visualization capabilities, collaborative Story Maps, and more</title><link href="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/" rel="alternate"/><published>2026-08-24T16:09:00+00:00</published><updated>2026-08-24T16:09:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:blog.jupyter.org,2026-08-24:/posts/2026/jupytergis-0-16-new-visualization-capabilities/</id><summary type="html">&lt;p&gt;This release adds support for new geospatial formats, tighter integration with the scientific Python ecosystem, a redesigned Story Map editor, and a more expressive way to style geographic data.&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://blog.jupyter.org/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/"&gt;Earlier this year, we introduced STAC browsing and Story Maps in JupyterGIS&lt;/a&gt;, making it easier to discover geospatial datasets and communicate results without leaving Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geojupyter/jupytergis/releases/tag/v0.16.0"&gt;JupyterGIS 0.16&lt;/a&gt; continues in the same direction. This release adds support for new geospatial formats, tighter integration with the scientific Python ecosystem, a redesigned Story Map editor, and a more expressive way to style geographic data.&lt;/p&gt;
&lt;h2 id="story-maps-are-getting-a-new-look"&gt;Story Maps are getting a new look!&lt;/h2&gt;
&lt;p&gt;Story Maps in JupyterGIS let you build a scrollable presentation around your map. A Story Map is made up of a sequence of segments that can combine Markdown content with map views, so you can guide the reader through a geographic story as they scroll.&lt;/p&gt;
&lt;p&gt;Each segment can define its own map state, including the current map location, visible layers, and layer styling. This means that the map can change as the reader moves through the story: layers can appear or disappear, the view can move to a new location, and symbology can change to highlight different aspects of the data.&lt;/p&gt;
&lt;p&gt;Story Maps have received a significant update in this release.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/001-1_gyuKfOzFSbmRhH9LVBTJiA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-better-story-maps-editing-experience"&gt;A better Story Maps editing experience&lt;/h2&gt;
&lt;p&gt;We’ve also made substantial improvements to the Story Map editing experience.&lt;/p&gt;
&lt;p&gt;The editor has been redesigned around Jupyter’s &lt;strong&gt;real-time collaboration infrastructure, allowing multiple people to edit the same Story Map simultaneously&lt;/strong&gt;. Changes appear immediately for everyone, making it much easier to prepare presentations, reports, or educational material as a team.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Collaboratively edit the Story Map markdown." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/002-1_yLMypnIGkeKXrR1BfXgvHg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Collaboratively edit the Story Map markdown.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The editor now gives you a much better sense of what the final story will look like while you are working on it. Markdown sections can be previewed directly in the editor, and a new Story Map preview makes it possible to see the complete presentation without leaving the editing workflow. This makes it easier to write, arrange, and refine a story while keeping an eye on the final result. We’ve also introduced a new layout that is better suited for long-form content. In addition to guided geographic narratives, Story Maps can now be used to create richer articles combining text, maps, images, and other interactive content.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/003-1_1eO0MShCVn71uIhAkC61ZA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="openeo-layers"&gt;OpenEO layers&lt;/h2&gt;
&lt;p&gt;More and more geospatial workflows rely on remote processing instead of downloading datasets locally. openEO provides a common API to describe these processing pipelines as process graphs that are executed by a backend.&lt;/p&gt;
&lt;p&gt;JupyterGIS can now display &lt;strong&gt;openEO&lt;/strong&gt; process graphs directly as map layers. Instead of exporting intermediate results before visualizing them, you can connect an openEO backend and inspect the output of your processing pipeline directly in the map.&lt;/p&gt;
&lt;p&gt;The visualization is tile-based and lazy: JupyterGIS only requests the data needed for the current map view and zoom level. This makes it possible to explore large remote sensing workflows interactively, without materializing the full result locally.&lt;/p&gt;
&lt;p&gt;JupyterGIS can make use of any openEO server that supports tiling, such as &lt;a href="https://sentinel-hub.github.io/titiler-openeo"&gt;titiler-openeo&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupytergis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo.processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openeo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authenticate_basic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASIC_AUTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASIC_AUTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;sentinel-2-global-mosaics&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;B03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;B08&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temporal_extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2022-04-15&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2022-12-31&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dimension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reducer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;first&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;10000.0&lt;/span&gt;

&lt;span class="c1"&gt;# NDWI = (GREEN - NIR) / (GREEN + NIR)&lt;/span&gt;
&lt;span class="n"&gt;ndwi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndvi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ndwi_vis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ndwi&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;ndwi_png&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndwi_vis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linear_scale_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;input_min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;input_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndwi_png&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PNG&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;40.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;73.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_openeo_tile_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/004-1_L5MrEnxXuvIkT5rVl0dahw.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to defining openEO process graphs from the scripting Python API, JupyterGIS provides an advanced openEO process graph editor, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connect to an openEO tile server&lt;/li&gt;
&lt;li&gt;define the graph graphically, with boxes and arrows&lt;/li&gt;
&lt;li&gt;load data collections and define processes with a drag-and-drop UI&lt;/li&gt;
&lt;li&gt;directly edit the JSON content&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Editing an openEO process graph from the JupyterGIS front-end" src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/005-1_3AGsNcwe384V1P4-ZkzcYw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Editing an openEO process graph from the JupyterGIS front-end&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another interesting aspect of openEO is that process graphs have a well-defined, declarative JSON representation. Because of this structured format, &lt;strong&gt;they are a natural target for LLM-assisted workflows&lt;/strong&gt;. Users can describe the analysis they want in natural language, have an LLM generate or refine the corresponding process graph (e.g. using jupyterlite-ai), and immediately visualize the result in JupyterGIS. Combined with the lazy, tile-based rendering, this makes it possible to quickly iterate on processing pipelines without waiting for complete datasets to be exported or downloaded.&lt;/p&gt;
&lt;h2 id="lazy-visualization-of-xarray-datasets-with-jupyter-tiler"&gt;Lazy visualization of Xarray datasets with jupyter-tiler&lt;/h2&gt;
&lt;p&gt;JupyterGIS now integrates with the new &lt;a href="https://jupyter-tiler.readthedocs.io"&gt;jupyter-tiler&lt;/a&gt; package, making it straightforward to visualize Xarray datasets from Python.&lt;/p&gt;
&lt;p&gt;Datasets can come from anywhere: they may already exist in your notebook, or they can be loaded on demand from a STAC catalog using stackstac. Once you have an Xarray object, JupyterGIS can display it in the map without requiring an export to another format.&lt;/p&gt;
&lt;p&gt;Rendering happens lazily, generating only the tiles needed for the current view. This makes it possible to explore datasets that are much larger than memory while keeping navigation responsive.&lt;/p&gt;
&lt;p&gt;The result is a smoother workflow from data loading, to analysis, to visualization, all within the same notebook.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_data_array_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NDSI Layer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_array&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ndsi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;viridis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Visualizing an Xarray dataset in JupyterGIS." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/006-1_GsxLjpQu33wvCx8KZxBUWA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Visualizing an Xarray dataset in JupyterGIS.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This feature requires the optional dependency jupyter-tiler to be installed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyter-tiler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="a-more-expressive-symbology-model"&gt;A more expressive symbology model&lt;/h2&gt;
&lt;p&gt;Styling geographic data often requires combining multiple visual properties to communicate patterns effectively.&lt;/p&gt;
&lt;p&gt;JupyterGIS 0.16 introduces a &lt;strong&gt;new symbology model inspired by the Grammar of Graphics.&lt;/strong&gt; Instead of relying on a fixed set of styling options, visual properties such as color, size, and opacity can be defined in a more flexible and composable way.&lt;/p&gt;
&lt;p&gt;This makes it easier to build everything from simple thematic maps to more advanced visualizations while keeping styling definitions consistent and reproducible.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color." src="https://blog.jupyter.org/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/007-1_SU9Ll713eVozkjVQNQNmMA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="geozarr-and-geopackage-support"&gt;GeoZarr and GeoPackage support&lt;/h2&gt;
&lt;p&gt;This release also expands the range of formats that JupyterGIS can open directly.&lt;/p&gt;
&lt;p&gt;Support for GeoZarr makes it possible to work with cloud-native multidimensional geospatial datasets, while GeoPackage support improves interoperability with existing GIS software and common data exchange workflows.&lt;/p&gt;
&lt;h2 id="new-collaborative-editing-capabilities"&gt;New Collaborative Editing Capabilities&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also brings collaborative editing to vector layers. When working on a shared JupyterGIS document, multiple users can now edit the same vector data at the same time.&lt;/p&gt;
&lt;p&gt;Features can be created, moved, and edited collaboratively, with changes synchronized in real time between users. This makes it possible to work together on tasks such as digitizing features, annotating a map, or refining a dataset without having to exchange files or manually merge changes.&lt;/p&gt;
&lt;p&gt;Combined with the collaborative Story Map editor, this makes collaboration a more integral part of JupyterGIS: users can work together on the data itself, and then use the same shared document to explore and communicate their results.&lt;/p&gt;
&lt;h2 id="a-new-r-api"&gt;A new R API&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also introduces an R client, bringing JupyterGIS to R users through the new &lt;a href="https://github.com/geojupyter/r-jupytergis"&gt;&lt;code&gt;r-jupytergis&lt;/code&gt;&lt;/a&gt; package. The R client provides bindings for interacting with JupyterGIS widgets from an R notebook, using the same JavaScript front-end as the Python client.&lt;/p&gt;
&lt;p&gt;The main interface is the &lt;code&gt;GISDocument&lt;/code&gt; widget, which can be used to create and manipulate JupyterGIS documents directly from R. This makes it possible to build geospatial workflows in R while using the same interactive map interface available to Python users.&lt;/p&gt;
&lt;p&gt;The R client also uses the same underlying collaborative infrastructure as the Python client, including the Yrs CRDT library. This means that R users can participate in the same collaborative JupyterGIS workflows rather than working in a separate environment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;france_hiking.jGIS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;add_raster_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://mt1.google.com/vt/lyrs=y&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google Satellite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;attribution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.6&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="bug-fixes-and-performance-improvements"&gt;Bug fixes and performance improvements&lt;/h2&gt;
&lt;p&gt;As usual, this release also includes many smaller improvements throughout the project.&lt;/p&gt;
&lt;p&gt;We’ve fixed a number of bugs, improved performance in several parts of the application, and continued polishing both the user interface and the Python API.&lt;/p&gt;
&lt;p&gt;JupyterGIS continues to evolve as a collaborative GIS environment that fits naturally within the Jupyter ecosystem. Whether your workflow starts from a notebook, a STAC catalog, an openEO backend, or a local dataset, the goal remains the same: make it easier to move between analysis, visualization, and communication without switching tools.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work on JupyterGIS by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by &lt;a href="https://www.esa.int/"&gt;the European Space Agency (ESA)&lt;/a&gt; for the Story-maps development, the R API, openEO layers support and the collaborative labelling. Additionally, QuantStack was funded by &lt;a href="https://cnes.fr/"&gt;the French National Centre for Space Studies (CNES)&lt;/a&gt; for the lazy visualization of xarray datasets.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="contributors-to-this-release"&gt;Contributors to this release&lt;/h2&gt;
&lt;p&gt;By order of &lt;a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports"&gt;number of contributions&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;&lt;strong&gt;Arjun Verma&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He worked on the server-side geoprocessing infrastructure and on the openEO editor in the JupyterGIS front-end.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/martinRenou"&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt;&lt;/a&gt; is a Technical Director at QuantStack and a maintainer of JupyterGIS. For this release, Martin coordinated and guided much of the development, and worked on the integration of openEO layers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gjmooney"&gt;&lt;strong&gt;Gregory Mooney&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack and a long-time contributor to JupyterGIS. He led much of the work on the new Story Map editor and its collaborative editing capabilities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/MMesch"&gt;&lt;strong&gt;Matthias Meschede&lt;/strong&gt;&lt;/a&gt; is Chief Operating Officer at QuantStack. He introduced the new Grammar of Graphics-inspired symbology model, bringing a more expressive and composable approach to styling geographic data.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mfisher87"&gt;&lt;strong&gt;Matt Fisher&lt;/strong&gt;&lt;/a&gt; is the Community Manager of &lt;a href="https://github.com/geojupyter"&gt;GeoJupyter&lt;/a&gt;. He contributed to many of the discussions around the release and helped shape several of the design decisions across the project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nakul-py"&gt;&lt;strong&gt;Nakul Verma&lt;/strong&gt;&lt;/a&gt; is an open-source contributor to JupyterGIS. He contributed numerous bug fixes and improvements throughout the release, and introduced support for Vega expressions in the new symbology system.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/AntoinePrv"&gt;&lt;strong&gt;Antoine Prouvost&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He led the initial work on the R API for JupyterGIS, building its first skeleton and establishing the foundations for the &lt;code&gt;r-jupytergis&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/SandrineP"&gt;&lt;strong&gt;Sandrine Pataut&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. She worked on bringing many of JupyterGIS’s features to the R API, helping make the new client more complete and useful for R users.&lt;/p&gt;
&lt;p&gt;We are grateful to everyone who contributed code, reviews, ideas, discussions, and feedback to this release. JupyterGIS continues to benefit from an increasingly diverse community of contributors, and we look forward to seeing what comes next!&lt;/p&gt;
</content><category term="collaboration"/><category term="geoscience"/><category term="JupyterGIS"/><category term="releases"/><category term="science"/></entry><entry><title>JupyterLite 0.8 is released! 🎉</title><link href="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/" rel="alternate"/><published>2026-07-10T05:01:00+00:00</published><updated>2026-07-10T05:49:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2026-07-10:/posts/2026/jupyterlite-0-8-is-released/</id><summary type="html">&lt;p&gt;JupyterLite is a Jupyter distribution that runs entirely in the web browser without any server components. Deployment and hosting are easy as JupyterLite sites are just static websites.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://jupyterlite.readthedocs.io/"&gt;JupyterLite&lt;/a&gt; is a Jupyter distribution that runs entirely in the web browser without any server components. Deployment and hosting are easy as JupyterLite sites are just static websites.&lt;/p&gt;
&lt;p&gt;The new 0.8 release includes a number of new features, bug fixes, and enhancements. This release also brings significant improvements to the user experience and new customization options for JupyterLite deployments.&lt;/p&gt;
&lt;h2 id="sharing-a-repl"&gt;Sharing a REPL&lt;/h2&gt;
&lt;p&gt;When the &lt;a href="https://jupyterlite.readthedocs.io/en/stable/quickstart/embed-repl.html#enable-the-toolbar"&gt;REPL toolbar&lt;/a&gt; is enabled, it now includes a &lt;strong&gt;Copy Shareable Link&lt;/strong&gt; button. Clicking it captures the current state of the REPL, the prompt content, the selected kernel and theme, and any non-default options, into the page URL, and copies the resulting link to the clipboard. A notification confirms the link was copied, making it easy to share a ready-to-run REPL with others.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/001-1_nj2zTCdB_5ZOP9UpQ1q_yg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="refreshed-loading-screen"&gt;Refreshed Loading Screen&lt;/h2&gt;
&lt;p&gt;The loading indicator shown while JupyterLite starts up has been redesigned to match the JupyterLab splash screen to make the transition from the initial loading screen to the fully loaded application feel more seamless.&lt;/p&gt;
&lt;p&gt;The loading indicator remains configurable, and can be enabled or disabled for specific applications. See the &lt;a href="https://jupyterlite.readthedocs.io/en/stable/howto/configure/loading_indicator.html"&gt;loading indicator guide&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/002-1_EFPxwNDTRN3933qULcA3Rg.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="file-system-reliability-improvements"&gt;File System Reliability Improvements&lt;/h2&gt;
&lt;p&gt;JupyterLite 0.8 includes many fixes to the in-browser file system used to store your notebooks and files. Creating files and directories is now faster and more reliable, saving a file to a directory that does not exist is now rejected with a clear error rather than failing silently, and files are no longer opened twice on startup when using query parameters. These changes make working with files in JupyterLite smoother and more dependable.&lt;/p&gt;
&lt;h2 id="jupyterlab-46-and-notebook-76"&gt;JupyterLab 4.6 and Notebook 7.6&lt;/h2&gt;
&lt;p&gt;JupyterLite 0.8 is built on top of JupyterLab 4.6 and Notebook 7.6, and brings many of the respective improvements and bug fixes. Check out the &lt;a href="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/"&gt;announcement post&lt;/a&gt; to learn more about these new releases.&lt;/p&gt;
&lt;p&gt;This JupyterLite release includes 9 new features and enhancements, 11 bug fixes, and 5 documentation improvements. 13 people contributed to this release. Across 85 maintenance tasks and dependency updates, we kept JupyterLite up to date with the latest JupyterLab and Notebook releases.&lt;/p&gt;
&lt;h2 id="a-terminal-in-the-browser"&gt;A Terminal in the Browser&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/jupyterlite/terminal"&gt;JupyterLite Terminal&lt;/a&gt; adds a fully in-browser command-line terminal to JupyterLite, powered by the &lt;a href="https://github.com/jupyterlite/cockle"&gt;cockle&lt;/a&gt; shell. Commands run as WebAssembly directly in the browser, with no server involved. Version 1.5 adds compatibility with JupyterLite 0.8, and recent releases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A growing set of familiar command-line tools compiled to WebAssembly, including &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, and the &lt;code&gt;vim&lt;/code&gt; and &lt;code&gt;nano&lt;/code&gt; editors.&lt;/li&gt;
&lt;li&gt;Tab completion for commands, arguments, and file names, with a confirmation prompt before listing a very large number of matches.&lt;/li&gt;
&lt;li&gt;New JupyterLab commands for running shell commands programmatically and capturing their output, without opening a terminal panel.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Running terminal commands in the browser" src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/003-0_Zdo8FbjAiAGkh3IH.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Running terminal commands in the browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="more-kernels-with-jupyterlite-xeus"&gt;More Kernels with jupyterlite-xeus&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://jupyterlite-xeus.readthedocs.io/"&gt;jupyterlite-xeus&lt;/a&gt; builds JupyterLite deployments around &lt;a href="https://xeus.readthedocs.io/"&gt;Xeus&lt;/a&gt;-based kernels and lets you pre-install packages from &lt;a href="https://conda-forge.org/"&gt;conda-forge&lt;/a&gt; and emscripten-forge straight into the browser environment through an &lt;code&gt;environment.yml&lt;/code&gt; file. Its recent releases (the 4.5 series and the new 5.0) are compatible with JupyterLite 0.8 and add a number of improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A growing list of supported kernels, including &lt;code&gt;xeus-python&lt;/code&gt;, &lt;code&gt;xeus-r&lt;/code&gt;, &lt;code&gt;xeus-cpp&lt;/code&gt;, &lt;code&gt;xeus-lua&lt;/code&gt;, &lt;code&gt;xeus-nelson&lt;/code&gt;, &lt;code&gt;xeus-octave&lt;/code&gt;, and &lt;code&gt;xeus-javascript&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Installing packages at runtime now feels more natural: you can run &lt;code&gt;pip install&lt;/code&gt; or &lt;code&gt;conda install&lt;/code&gt; directly in a cell, with the leading &lt;code&gt;%&lt;/code&gt; or &lt;code&gt;!&lt;/code&gt; now optional.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about pre-installing packages, mounting files, and the available kernels, see the &lt;a href="https://jupyterlite-xeus.readthedocs.io/"&gt;jupyterlite-xeus documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="python-314-with-the-pyodide-kernel"&gt;Python 3.14 with the Pyodide Kernel&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/jupyterlite/pyodide-kernel"&gt;Pyodide kernel&lt;/a&gt; has been updated to version 0.8.0. It bundles the latest &lt;a href="https://pyodide.org/"&gt;Pyodide&lt;/a&gt; release, which upgrades the in-browser Python interpreter to &lt;strong&gt;Python 3.14&lt;/strong&gt;. Notebooks and consoles running on the Pyodide kernel now use the newest Python version, including recent standard library additions such as the new &lt;code&gt;compression.zstd&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;For deployments that pre-compute the set of packages to ship offline, the kernel’s lock add-on can now build a customized &lt;code&gt;pyodide-lock.json&lt;/code&gt; from your own requirements — including reading dependencies from a &lt;code&gt;requirements.txt&lt;/code&gt; file or a &lt;code&gt;pyproject.toml&lt;/code&gt; dependency group — giving site authors finer control over which packages are available without a network connection.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://github.com/jupyterlite/pyodide-kernel/releases/tag/v0.8.0"&gt;pyodide-kernel 0.8.0 release notes&lt;/a&gt; for the full list of changes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Pyodide 314 in JupyterLite" src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/004-1_kMihemTy3YNeaStnK6bH1A.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Pyodide 314 in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="javascript-kernel-improvements"&gt;JavaScript Kernel Improvements&lt;/h2&gt;
&lt;p&gt;The in-browser &lt;a href="https://github.com/jupyterlite/javascript-kernel"&gt;JavaScript kernel&lt;/a&gt; has gained several improvements in its 0.4 development line:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new iframe-based execution mode with better support for libraries that need direct access to the DOM, such as &lt;a href="https://p5js.org/"&gt;p5.js&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Initial support for Jupyter Widgets, through Comm channels and a set of base widgets.&lt;/li&gt;
&lt;li&gt;Clearer error messages and tracebacks, including a fix for errors that previously rendered as blank in Firefox.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Widgets and dynamic imports with the JavaScript kernel" src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/005-1_uhOWj2tSrsSP_maQk3vWaA.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Widgets and dynamic imports with the JavaScript kernel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="try-it-in-your-browser"&gt;Try it in your browser&lt;/h2&gt;
&lt;p&gt;If you would like to try the new release in your browser, click on the following link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://jupyter.org/try-jupyter/"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/006-0_WKrNZ-b6NXSbf5UG.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;a href="https://x.com/TechAtBloomberg"&gt;Bloomberg&lt;/a&gt; for funding the work on JupyterLite at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;, and for their ongoing support for JupyterLite in general.&lt;/p&gt;
&lt;p&gt;Many thanks to all the contributors to JupyterLite. The list below is based on GitHub usernames for the 0.8 release across the different projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New contributors: @Darshan808, @MMesch, @MUFFANUJ, @wata727&lt;/li&gt;
&lt;li&gt;Returning contributors: @DerThorsten, @agriyakhetarpal, @bollwyvl, @ianthomas23, @jasongrout, @jtpio, @martinRenou, @trungleduc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to the extended group of contributors in Jupyter Frontends and related project in the Jupyter ecosystem 💛&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-0-8-is-released/images/007-0_AJW_fYChAaoUhRbD.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLite"/><category term="releases"/><category term="WebAssembly"/></entry><entry><title>JupyterLab 4.6 and Notebook 7.6 are out!</title><link href="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/" rel="alternate"/><published>2026-07-02T16:13:00+00:00</published><updated>2026-07-02T16:15:00+00:00</updated><author><name>Michał Krassowski</name></author><id>tag:blog.jupyter.org,2026-07-02:/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/</id><summary type="html">&lt;p&gt;JupyterLab 4.6 features new interface customization options, improved file browser and debugger, an easy way to jump between recently edited cells, and numerous other notebook experience improvements. Keyboard shortcuts, navigation and accessibility is another focus area in this release.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-6"&gt;JupyterLab 4.6&lt;/a&gt; features new interface customization options, improved file browser and debugger, an easy way to jump between recently edited cells, and numerous other notebook experience improvements. Keyboard shortcuts, navigation and accessibility is another focus area in this release. &lt;a href="https://jupyter-notebook.readthedocs.io/en/stable/changelog.html#id1"&gt;Jupyter Notebook 7.6&lt;/a&gt; has also been released, including the fixes and enhancements of JupyterLab along with a new Scratchpad console and other Notebook-specific improvements. This article highlights notable changes in both applications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can try out the changes in your browser: &lt;a href="https://jupyter.org/try-jupyter/lab/index.html"&gt;JupyterLab 4.6&lt;/a&gt;, &lt;a href="https://jupyter.org/try-jupyter/notebooks/?path=notebooks/Intro.ipynb"&gt;Notebook 7.6&lt;/a&gt;&lt;br&gt;
At the time of publication, the preview runs on &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;JupyterLite&lt;/a&gt; 0.8.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="Overview of some user interface enhancements visible in JupyterLab UI" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/001-1_zni6m_lgsXqu-zsGH77zBw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of some user interface enhancements visible in JupyterLab UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="enhancements-shared-by-jupyterlab-and-notebook"&gt;Enhancements shared by JupyterLab and Notebook&lt;/h2&gt;
&lt;h3 id="notebook-improvements"&gt;Notebook improvements&lt;/h3&gt;
&lt;p&gt;Two new navigation commands, “Select previous last modified cell” and “Select next last modified cell”, allow jumping back and forward through recently edited cells. The commands are accessible from the Command Palette and as buttons in the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/toc.html"&gt;Table Of Contents&lt;/a&gt; toolbar when a notebook is active.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Clicking the highlighted button will jump to a previously edited cell" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/002-0_3gi9bAn6k4-yH8MP.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Clicking the highlighted button will jump to a previously edited cell&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Copy, cut, and paste text commands have been added to the notebook context menu. This feature requires permission to access clipboard to work reliably and may not work in Firefox depending on version and additional restrictions.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Copy/Cut/Paste Selected cells expose clipboard actions on cell source" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/003-0_fuYCAQUXQwuqp6cG.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Copy/Cut/Paste Selected cells expose clipboard actions on cell source&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The cell toolbar delete button now shows a confirmation dialog to prevent accidental deletion. The “Do not ask me again” checkbox is available and the preference is persisted in &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/notebook.html#cell-toolbar"&gt;Cell Toolbar&lt;/a&gt; settings. The standard keyboard shortcut (D, D) is unaffected.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Dialog shown when deleting a cell from cell tollbar" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/004-0_vITL_K8lFE_UIsHj.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Dialog shown when deleting a cell from cell tollbar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Pressing Ctrl + B (Cmd + B on macOS) in a markdown cell wraps the selected text in bold formatting.&lt;/p&gt;
&lt;p&gt;When exporting a notebook as HTML via &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/export.html"&gt;File → Save and Export Notebook As → HTML&lt;/a&gt;, a dialog now asks whether to sanitize the HTML output before download.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="file-browser-new-column-editable-breadcrumbs-open-in-terminal"&gt;File browser: new column, editable breadcrumbs, open in terminal&lt;/h3&gt;
&lt;p&gt;A new “Date Created” column has been added to the file browser, showing when files were created. The column can be toggled via Settings → File Browser → “Show date created column” or by right-clicking the column header. The latest &lt;code&gt;jupyter-server&lt;/code&gt; (&lt;code&gt;v2.18&lt;/code&gt;+) is required for accurate values across operating systems.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New date created column in file browser" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/005-0_epZrkZYQDIzropSt.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New date created column in file browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The breadcrumb bar now supports &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/files.html#editable-breadcrumbs"&gt;direct path editing&lt;/a&gt; with tab-completion. Clicking the area behind breadcrumbs (highlighted on hover), or using the Command Palette, opens an editable text field where pressing Tab completes the longest common prefix of matching subdirectories.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Editable breadcrumbs" src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/006-0_grxuAxyEQqLFVn6d.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Editable breadcrumbs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A new “Open in Terminal” option in the file browser context menu opens a terminal navigated to the selected directory. When multiple directories are selected, one terminal is opened per directory.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Opening terminal for a specific directory is now easier." src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/007-0_aespdpw35miy6vmr.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Opening terminal for a specific directory is now easier.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Additional file browser improvements include: a configurable &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/files.html#file-name-sort-order"&gt;file name sort order&lt;/a&gt;, persistence of the sort state across sessions, automatic clearing of the file filter when changing directories, and a loading animation during file browser refresh.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="debugger-kernel-sources-filter-floating-overlay"&gt;Debugger: kernel sources filter, floating overlay&lt;/h3&gt;
&lt;p&gt;The debugger Sources panel has been moved out of the debugger sidebar; the Sources now open as read-only editors in the main area, keeping the sidebar uncluttered while you &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/debugger.html#explore-the-code-state"&gt;explore the code state&lt;/a&gt;. The previous behavior can be restored by disabling the “Show Sources in Main Area” setting in the Debugger settings.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/008-0_l0V_AJYDsYfEOA54.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;An overlay with continue/step in/stop buttons has been added easing the control of the debugger steps:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/009-0_-kwAopUu6uow4ERY.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The Kernel Sources filter bar has been moved to the toolbar and now supports live filtering, making it easier to search through kernel source files while debugging.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/010-0_lXUep59E1svw80P6.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The refresh button for sources list was removed — the sources will now update automatically after each code execution.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="keyboard-navigation-and-accessibility"&gt;Keyboard navigation and accessibility&lt;/h3&gt;
&lt;p&gt;Keyboard navigation has been improved across several components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The terminal no longer traps keyboard focus, allowing users to move focus away with the keyboard.&lt;/li&gt;
&lt;li&gt;The console and file browser breadcrumbs both received keyboard navigation fixes.&lt;/li&gt;
&lt;li&gt;Focus is now correctly restored after closing the command palette, and input elements in dialogs opened from the command palette receive focus immediately.&lt;/li&gt;
&lt;li&gt;The find-and-replace button focus in the document search box has been corrected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Screen reader behavior has been improved in the launcher and notebook. Toolbar buttons now correctly reflect their pressed state via the &lt;code&gt;aria-pressed&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;The Keyboard Shortcuts settings panel has been updated to improve accessibility, including better keyboard interaction and screen reader announcements within the shortcuts editor dialog.&lt;/p&gt;
&lt;p&gt;Focus indicators have been improved across the interface, including the status bar and other interactive components.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="keyboard-shortcuts"&gt;Keyboard shortcuts&lt;/h3&gt;
&lt;p&gt;Shortcuts can now be added from the UI shortcut editor for any command (previously this required writing JSON in Advanced Settings Editor).&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/011-0_JYHGSldDZ4bsNCVk.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;“Find and Replace” has been added to the Edit menu with the keyboard shortcut Ctrl + H (Cmd + H on macOS).&lt;/p&gt;
&lt;p&gt;Ctrl + Y has been added as a redo shortcut on Windows and Linux.&lt;/p&gt;
&lt;p&gt;Pressing 1, 2, 3, 4, 5 and 6 will no longer convert a focused code or raw cell to Markdown to avoid accidental conversions. These shortcuts continue working on markdown cells, switching the heading level, as they did before.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="internationalization"&gt;Internationalization&lt;/h3&gt;
&lt;p&gt;Language packs can now be installed directly from within JupyterLab by selecting “Install more languages…” at the bottom of the Settings → Language menu. This opens the Extension Manager pre-filled with a search for available language pack extensions.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/012-0_IAY1NHv2eUZlhsoQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="terminal-enhancements"&gt;Terminal enhancements&lt;/h3&gt;
&lt;p&gt;Pressing Shift+Enter in the terminal now inserts a newline without executing the current line. This matches the behavior expected by certain terminal applications.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="inline-completion-enhancements"&gt;Inline completion enhancements&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/completer.html#inline-completer"&gt;Inline completion suggestions&lt;/a&gt; can now be rendered with syntax highlighting that matches the active editor language. This can be enabled in Settings → Inline Completer → “Ghost text syntax highlighting”.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/013-0_eUvIfOASnsZ0RTSH.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Ghost text is now also shown for all active cursors in a multi-cursor editing session.&lt;/p&gt;
&lt;h2 id="jupyterlab-specific-enhancements"&gt;JupyterLab-specific enhancements&lt;/h2&gt;
&lt;h3 id="layout-and-interface-customization"&gt;Layout and interface customization&lt;/h3&gt;
&lt;p&gt;The activity bar can now be positioned at the top or bottom of the interface, in addition to the default left and right placement. The setting is available under Settings → Interface → &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#activity-bar-position"&gt;Activity Bar Position&lt;/a&gt;.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/014-0_FZnWSzWq9TsSfnYH.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Sections of accordion sidebars can now be &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#move-accordion-sections-between-panels"&gt;moved between panels&lt;/a&gt; via a context menu. Right-clicking a section header shows a “Move To” menu. The placement and collapsed state of moved sections are persisted across sessions.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/015-0_EaVBoUQh5fMYTOCs.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/016-0_cGeR3SdD_1GL4pcS.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The sidebar panels themselves can be &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#move-open-widgets"&gt;moved between areas&lt;/a&gt;. Right-clicking a sidebar shows submenu with options to move it to the main area, a different sidebar, or the down area.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/017-0_vZPh7LgFw5VKY96R.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/018-0_tqASYUG9UE6LoV2y.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Tabs can now be split in four directions using the “Split Tab” context menu item (or the command palette), which adds split left, right, up, and down options.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/019-0_7qxAk2wzTtYyiR7c.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Individual panels can be zoomed in or out using Ctrl + mouse wheel (when “Enable Ctrl+ Scroll Zoom” is turned on in Settings → Interface) or via the command palette, without affecting other panels.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/020-0_COyiDcTCqgm8mJcD.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="performance"&gt;Performance&lt;/h3&gt;
&lt;p&gt;Panel resizing is now more responsive; the width of individual widgets inside resized panels is frozen during the drag. This behaviour can be disabled by toggling “Optimize panel resize” in Settings → Application Shell.&lt;/p&gt;
&lt;h2 id="notebook-specific-enhancements"&gt;Notebook-specific enhancements&lt;/h2&gt;
&lt;h3 id="scratchpad-console"&gt;Scratchpad console&lt;/h3&gt;
&lt;p&gt;A scratchpad console can now be opened next to a notebook, sharing the same kernel. This makes it easy to run quick experiments or inspect variables without modifying the notebook itself.&lt;/p&gt;
&lt;p&gt;The scratchpad console can be opened from the &lt;code&gt;File&lt;/code&gt; -&amp;gt; &lt;code&gt;New&lt;/code&gt; -&amp;gt; &lt;code&gt;Scratchpad console&lt;/code&gt; menu, from the command palette, or with the Ctrl + B (or Cmd + B on macOS) keyboard shortcut, which toggles the console panel.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/021-1_cxBr835uxAtjpO9Tlqg7bw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="confirmation-dialog-when-closing-and-shutting-down-a-notebook"&gt;Confirmation dialog when closing and shutting down a notebook&lt;/h3&gt;
&lt;p&gt;The “Close and Shut Down Notebook” command now asks for confirmation before closing the browser tab and shutting down the kernel. The confirmation prompt can be disabled in the Settings Editor with the “Prompt for confirmation before closing and shutting down” setting.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/022-1_hWEaY7HfHBjzbajj9OIKtQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="miscellaneous"&gt;Miscellaneous&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tab widths in JupyterLab are kept frozen while the mouse pointer hovers over them, making it easier to close multiple tabs with the mouse&lt;/li&gt;
&lt;li&gt;Autocompletion heuristics were improved; the autocompletion (which remains opt-in) should no longer trigger in unexpected scenarios&lt;/li&gt;
&lt;li&gt;The output scroll overlay collapse icon is now visible regardless of the output size and scroll state&lt;/li&gt;
&lt;li&gt;The fonts used across components were standardized and fonts specified by themes or overrides are respected in every component of the application&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-extension-authors"&gt;For extension authors&lt;/h2&gt;
&lt;p&gt;Building extensions (and JupyterLab/Notebook themselves) is now ~5 times faster thanks to migration from webpack to Rspack. Building extensions no longer requires a full JupyterLab installation as the relevant machinery was extracted to &lt;a href="https://github.com/jupyterlab/jupyter-builder"&gt;jupyter-builder&lt;/a&gt; (see this &lt;a href="https://blog.jupyter.org/posts/2026/announcing-jupyter-builder-a-standalone-build-system/"&gt;blog post&lt;/a&gt; for more details). This (among others) enables faster build environment setup on CI. Future improvements to the build system can now be released independently of the JupyterLab release cadence.&lt;/p&gt;
&lt;p&gt;Please refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-5-to-4-6"&gt;Extension Migration Guide&lt;/a&gt; for more details on API changes and up-to-date advice.&lt;/p&gt;
&lt;h2 id="as-large-as-minor-releases-go"&gt;As large as minor releases go&lt;/h2&gt;
&lt;p&gt;This JupyterLab release includes 68 new features and enhancements, 97 bug fixes, and 38 documentation improvements. 95 people contributed to this release. Across record-breaking 171 maintenance tasks we kept the dependencies up-to-date, improved quality of code and reduced the time to PRs getting merged by improving the CI performance and robustness. These efforts were in part funded by &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;Community Proposals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While the size of minor releases fluctuated across years, this one is on the higher side, with only v3.1 featuring slightly more merged PRs. The reviewers worked hard to ensure no regressions are introduced, but if any slipped through, please open an issue in respective repository (&lt;a href="https://github.com/jupyterlab/jupyterlab/issues/new/choose"&gt;JupyterLab&lt;/a&gt; or &lt;a href="https://github.com/jupyter/notebook/issues/new/choose"&gt;Notebook&lt;/a&gt;).&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the new contributors, we hope to see you back!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab (39): @aarondr77, @Akshitguptaa, @altis0725, @amanparganiha, @anafontan, @autodots-AHassan, @aviu16, @bittoby, @boskodev790, @chenjiahan, @cursoragent, @dhgoal, @DTiming24, @github29tani, @GlassOfWhiskey, @harshaagrawal20, @hroncok, @jayaprajapatii, @JaYRaNa213, @jianyexi, @ktaletsk, @lin9long, @mfisher87, @MMesch, @moktamd, @nightcityblade, @nthiery, @raffaelemancuso, @RamiNoodle733, @reteps, @rodrigosf672, @Siddhazntx, @statxc, @TheChyeahhh, @tsharma-dev, @tubaman, @u-wlkjyy, @Yahiewi, @ZhYGuoL&lt;/li&gt;
&lt;li&gt;Notebook (9): @bodhisilberling, @Darshan808, @goelakash, @joaovml, @KH-Coder865, @Mirochill, @xlumzee, @yangsong97, @Yann-P&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to returning contributors for their continued work!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab (56): @aaron-seq, @afshin, @agriyakhetarpal, @AliMahmoudDev, @andrii-i, @apoorvdarshan, @arjxn-py, @arun-357, @bollwyvl, @brichet, @Carreau, @ceasermikes002, @cmarmo, @CrafterKolyan, @Darshan808, @davidbrochart, @DeborahOlaboye, @doshi-kevin, @erkin98, @fcollonval, @filipeoliveira05, @flaviomartins, @fleming79, @FoSuCloud, @frenzymadness, @HaudinFlorence, @i-aki-y, @ianhi, @ianthomas23, @IsabelParedes, @itsmejay80, @itsmevichu, @JamesWrigley, @jasongrout, @JasonWeill, @jimangel, @jtpio, @krassowski, @Krish-876, @linlol, @martinRenou, @Meriem-BenIsmail, @MUFFANUJ, @peytondmurray, @prajyot-porje, @pranshugupta01, @RRosio, @schmidi314, @soniya-malviy, @superlevure, @SylvainCorlay, @tmetzl, @utsav-develops, @xc2, @Yann-P, @Zsailer&lt;/li&gt;
&lt;li&gt;Notebook (9): @andrii-i, @brichet, @Carreau, @jtpio, @krassowski, @martinRenou, @minrk, @RamiNoodle733, @takluyver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab and Notebook issues: @RRosio, @krassowski, @andrii-i, @rodrigosf672, @ktaletsk among others who attend.&lt;/p&gt;
&lt;h2 id="further-reading"&gt;Further reading&lt;/h2&gt;
&lt;p&gt;For more details, see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full Release Notes for &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-6"&gt;JupyterLab 4.6&lt;/a&gt; and &lt;a href="https://jupyter-notebook.readthedocs.io/en/stable/changelog.html#id1"&gt;Notebook 7.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Full changelog on GitHub: &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.0"&gt;JupyterLab&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.6.0"&gt;Notebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>What’s New in MyST Markdown 1.8.2</title><link href="https://blog.jupyter.org/posts/2026/whats-new-in-myst-markdown-1-8-2/" rel="alternate"/><published>2026-03-26T15:10:00+00:00</published><updated>2026-03-26T15:10:00+00:00</updated><author><name>Jupyter Book</name></author><id>tag:blog.jupyter.org,2026-03-26:/posts/2026/whats-new-in-myst-markdown-1-8-2/</id><summary type="html">&lt;p&gt;The Jupyter Book team just released mystmd 1.8.2 and a new version of the MyST react theme! Below are a few things that stand out.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Jupyter Book team just released &lt;strong&gt;mystmd 1.8.2&lt;/strong&gt; and a new version of the MyST react theme! Below are a few things that stand out.&lt;/p&gt;
&lt;h2 id="interactive-widgets-with-the-anywidget-directive"&gt;Interactive widgets with the &lt;code&gt;{anywidget}&lt;/code&gt; directive&lt;/h2&gt;
&lt;p&gt;You can now &lt;a href="https://mystmd.org/guide/widgets"&gt;embed JavaScript widgets&lt;/a&gt; in your MyST pages using the new &lt;code&gt;{anywidget}&lt;/code&gt; directive. Widgets follow the &lt;a href="https://anywidget.dev/"&gt;anywidget specification&lt;/a&gt;, which gives plugin authors an extension point for embedding JS capabilities in their documents.&lt;/p&gt;
&lt;p&gt;A widget is a JavaScript module that exports a &lt;code&gt;render&lt;/code&gt; function. You pass it initial state as JSON in the directive body, and it renders an interactive element on the page. You could use this for interactive figures, explorable explanations, or custom visualizations without leaving MyST.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A little confetti demo that we use to show off embedding widgets in a MyST document with anywidget!" src="https://blog.jupyter.org/posts/2026/whats-new-in-myst-markdown-1-8-2/images/001-0_lkUWCUNKiKhXcUUK.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A little confetti demo that we use to show off embedding widgets in a MyST document with anywidget!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Widget support is experimental. The interfaces may change as we learn more about usage patterns. Only load widgets from sources you trust, since they execute JavaScript in the reader’s browser!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="table-of-contents-improvements"&gt;Table of contents improvements&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;{toc}&lt;/code&gt; directive now supports a &lt;a href="https://github.com/jupyter-book/mystmd/pull/2705"&gt;&lt;code&gt;children&lt;/code&gt; context option&lt;/a&gt;, which lets you display only the child pages of the current page rather than the full project table of contents. Use it on landing pages and index pages that introduce a section and link to its sub-pages. You can see an example in the &lt;a href="https://jupyterbook.org/latest/get-started/"&gt;Jupyter Book getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="better-link-handling-across-multi-site-projects"&gt;Better link handling across multi-site projects&lt;/h2&gt;
&lt;p&gt;If your project spans multiple domains (e.g., a docs site and a blog), you can now &lt;a href="https://github.com/jupyter-book/myst-theme/pull/816"&gt;configure a domain to be treated as “internal”&lt;/a&gt; for link styling. Links to that domain will look like in-site navigation instead of external links. Check out &lt;a href="https://jupyterbook.org/latest/get-started"&gt;the Getting Started guide&lt;/a&gt; for an example.&lt;/p&gt;
&lt;h2 id="upgrade"&gt;Upgrade&lt;/h2&gt;
&lt;p&gt;To get the latest version of mystmd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;mystmd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or for pip users:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;mystmd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The theme updates automatically. Delete your &lt;code&gt;_build&lt;/code&gt; folder and mystmd will download the latest theme on your next build.&lt;/p&gt;
&lt;h2 id="changelogs"&gt;Changelogs&lt;/h2&gt;
&lt;p&gt;Find an ongoing list of releases in the Jupyter Book ecosystem here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterbook.org/releases"&gt;jupyterbook.org/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also read the original &lt;a href="https://github.com/jupyter-book/mystmd/releases/tag/mystmd%401.8.2"&gt;mystmd release notes&lt;/a&gt; and &lt;a href="https://github.com/jupyter-book/myst-theme/releases/tag/myst-to-react%401.1.4"&gt;myst-theme release notes&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="anywidget"/><category term="Jupyter Book"/><category term="MyST"/><category term="publishing"/><category term="releases"/></entry><entry><title>JupyterLite 0.7 is released! 🎉</title><link href="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/" rel="alternate"/><published>2025-12-04T22:11:00+00:00</published><updated>2025-12-04T22:11:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2025-12-04:/posts/2025/jupyterlite-0-7-is-released/</id><summary type="html">&lt;p&gt;JupyterLite is a Jupyter distribution that runs entirely in the web browser without any server components. Deployment and hosting are easy as JupyterLite sites are just static websites.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://jupyterlite.readthedocs.io/"&gt;JupyterLite&lt;/a&gt; is a Jupyter distribution that runs entirely in the web browser without any server components. Deployment and hosting are easy as JupyterLite sites are just static websites.&lt;/p&gt;
&lt;p&gt;The new 0.7 release includes a number of new features, bug fixes, and enhancements. This release also brings significant improvements to the user experience and new customization options for JupyterLite deployments.&lt;/p&gt;
&lt;h2 id="workspace-support"&gt;Workspace Support&lt;/h2&gt;
&lt;p&gt;Support for workspaces is now available in JupyterLite. Workspaces allow you to organize your notebooks and files into separate workspace environments, making it easier to switch between different projects or contexts.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Workspaces are now supported in JupyterLite" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/001-0_9Zx1pB5PRtEUdrYR.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Workspaces are now supported in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The UI layout is also now automatically persisted across sessions. When you return to JupyterLite, your panel arrangements, open files, and workspace configuration will be restored exactly as you left them.&lt;/p&gt;
&lt;h2 id="audio-and-video-playback"&gt;Audio and Video Playback&lt;/h2&gt;
&lt;p&gt;JupyterLite now includes built-in audio and video viewers, allowing users to open audio and video files directly from within the UI.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Open audio and video files in JupyterLite" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/002-0__FaFC2jYOUzmdmzN.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Open audio and video files in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="basic-interrupt-functionality"&gt;Basic Interrupt Functionality&lt;/h2&gt;
&lt;p&gt;The interrupt button now cancels the execution of cells that are scheduled to run after the currently executing cell. While this doesn’t interrupt the currently running cell itself, it provides better control when executing multiple cells in sequence.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The stop button now cancels the execution of scheduled cells" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/003-0_BNaPV7T03CPtnemP.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The stop button now cancels the execution of scheduled cells&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="basic-notebook-export"&gt;Basic Notebook Export&lt;/h2&gt;
&lt;p&gt;JupyterLite now includes basic notebook export functionality through a custom export plugin. Users can export notebooks to different formats including &lt;code&gt;.ipynb&lt;/code&gt; (notebook format) and script formats directly from the File menu.&lt;/p&gt;
&lt;p&gt;Additionally, JupyterLite provides extension points for third-party extensions to register custom exporters. This enables the development of additional export formats, such as PDF, in future extensions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: there is currently no built-in support for PDF export, but this may be added in the future via a third-party extension.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Basic notebook exports are now available" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/004-0_lqn02-318xj6qHVX.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Basic notebook exports are now available&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="file-menu-download-option"&gt;File Menu Download Option&lt;/h2&gt;
&lt;p&gt;A download entry has been added to the File menu, making it easier to download files from your JupyterLite environment.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Download a notebook using the file menu entry" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/005-0_yaURYoXXA2Ujf_Ti.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Download a notebook using the file menu entry&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="enhanced-markdown-support"&gt;Enhanced Markdown Support&lt;/h2&gt;
&lt;p&gt;Markdown cells now support displaying base64-encoded images stored in the browser’s local storage. This makes it easier to include images in your notebooks without requiring external hosting or network access.&lt;/p&gt;
&lt;h2 id="jupyterlab-45-and-notebook-75"&gt;JupyterLab 4.5 and Notebook 7.5&lt;/h2&gt;
&lt;p&gt;JupyterLite 0.7.0 is built on top of JupyterLab 4.5.0 and Notebook 7.5.0, and brings many of the respective improvements and bug fixes. Check out the &lt;a href="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/"&gt;announcement post&lt;/a&gt; to learn more about these new releases.&lt;/p&gt;
&lt;p&gt;JupyterLab 4.5 notably includes significant &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#performance-and-windowing"&gt;notebook performance improvements&lt;/a&gt;, such as the new optimized cell rendering with the new &lt;code&gt;contentVisibility&lt;/code&gt; windowing mode.&lt;/p&gt;
&lt;h2 id="walkthrough-video"&gt;Walkthrough video&lt;/h2&gt;
&lt;p&gt;For a more interactive tour of the new features, watch the video below:&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/utNtppEyK5Y" title="New features in JupyterLite 0.7💡" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id="try-it-in-your-browser"&gt;Try it in your browser&lt;/h2&gt;
&lt;p&gt;If you would like to try the new release in your browser, click on the following link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://jupyter.org/try-jupyter/lab/"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/006-0_nbMbf0ppEOPuY0Ur.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;a href="https://x.com/TechAtBloomberg"&gt;Bloomberg&lt;/a&gt; for funding the work on JupyterLite at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;, and for their ongoing support for JupyterLite in general.&lt;/p&gt;
&lt;p&gt;Many thanks to all the contributors to JupyterLite. The list below is based on GitHub usernames for the 0.7.0 release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New contributors: @rgaiacs, @tan-i-ham&lt;/li&gt;
&lt;li&gt;Returning contributors: @DerThorsten, @bollwyvl, @diegofcornejo, @ianthomas23, @jtpio, @krassowski, @martinRenou&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to the extended group of contributors in Jupyter Frontends and related project in the Jupyter ecosystem 💛&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/jupyterlite-0-7-is-released/images/007-0_5lm4W0GV98Yy1q9l.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLite"/><category term="releases"/><category term="WebAssembly"/></entry><entry><title>JupyterLab 4.5 and Notebook 7.5 are available!</title><link href="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/" rel="alternate"/><published>2025-11-24T09:32:00+00:00</published><updated>2025-11-24T09:32:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2025-11-24:/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/</id><summary type="html">&lt;p&gt;JupyterLab 4.5 has been released! This new minor release of JupyterLab includes 51 new features and enhancements, 81 bug fixes, 44 maintenance tasks and 38 documentation improvements. There were 51 contributors to this release.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; 4.5 has been released! This new minor release of JupyterLab includes 51 new features and enhancements, 81 bug fixes, 44 maintenance tasks and 38 documentation improvements. There were 51 contributors to this release.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/notebook"&gt;Jupyter Notebook&lt;/a&gt; 7.5 has also been released, including many of the fixes and enhancements in this JupyterLab 4.5 release. While the releases on GitHub provide additional detail on the updates made to both &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.5.0"&gt;JupyterLab 4.5&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.5.0"&gt;Notebook 7.5&lt;/a&gt;, this article highlights some particularly notable changes.&lt;/p&gt;
&lt;p&gt;Extension authors can refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-4-to-4-5"&gt;Extension Migration Guide&lt;/a&gt; for information on API updates and details regarding changes to core packages.&lt;/p&gt;
&lt;h2 id="performance-and-windowing"&gt;Performance and windowing&lt;/h2&gt;
&lt;p&gt;The default windowing mode is now &lt;code&gt;contentVisibility&lt;/code&gt; which improves cell rendering and alleviates previously reported issues. The minimap can be enabled for all windowing modes and all notebooks via the &lt;code&gt;Settings&lt;/code&gt; menu, or by toggling the minimap per notebook with the &lt;code&gt;View&lt;/code&gt; -&amp;gt; &lt;code&gt;Show Minimap&lt;/code&gt; option. Additional fixes improve layout containment and scrollbar behavior when working with long cells.&lt;/p&gt;
&lt;h2 id="notebook-improvements"&gt;Notebook improvements&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Saving large notebooks is now faster&lt;/strong&gt; and more responsive thanks to streamed uploads and users can now open notebooks without starting a kernel, via the &lt;code&gt;Open With&lt;/code&gt; context menu option.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Open a notebook without a kernel" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/images/001-0_zjjwutgF-mDuypaA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Open a notebook without a kernel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Markdown support has been expanded&lt;/strong&gt; for using grid and flex based layouts and the Table of Contents has been significantly improved to better handle markdown headings, fixing issues with HTML tags, comments, and horizontal lines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copying and pasting cells across browser tabs is now supported&lt;/strong&gt; and the “Line Wrap” toggle in settings now correctly applies line wrapping to cells.&lt;/p&gt;
&lt;p&gt;Other improvements include: restored scrolling to in-notebook links, manual saving support in collaborative mode, and improved performance and memory usage when streaming text outputs.&lt;/p&gt;
&lt;h2 id="debugger-and-console-improvements"&gt;Debugger and Console improvements&lt;/h2&gt;
&lt;p&gt;The debugger’s evaluate dialog has been replaced with an interactive console with syntax highlighting and code completion, and the variables panel now preserves its contents when switching editors. Selected breakpoints are now visually highlighted and breakpoints correctly handle empty lines and duplicate clicks. A visual indicator is displayed when the debugger is paused.&lt;/p&gt;
&lt;p&gt;Debugger panels as well as console debugging panels now reference the cell execution count helping users relate breakpoints, call stacks and source code to the cells they originate from.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab 4.5 includes many improvements to the debugger" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/images/002-0_5p78_XdDJh5oSnci.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab 4.5 includes many improvements to the debugger&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For the Log Console, users can now configure the default log level via settings, as well as customise the toolbar.&lt;/p&gt;
&lt;h2 id="new-search-functionality-inside-terminals"&gt;New search functionality inside terminals&lt;/h2&gt;
&lt;p&gt;The terminal now includes search functionality, with search highlights that adapt to theme changes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Search is now compatible with terminals" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/images/003-0_cJt44woU3gYoMhHu.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Search is now compatible with terminals&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="media-and-content-support"&gt;Media and content support&lt;/h2&gt;
&lt;p&gt;JupyterLab now includes built-in audio and video viewers, allowing users to open audio and video files directly from within JupyterLab.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Open audio and video files in JupyterLab" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/images/004-0_Jd_3FHeg3saSiwRs.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Open audio and video files in JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="file-browser-enhancements"&gt;File browser enhancements&lt;/h2&gt;
&lt;p&gt;Uploaded files can auto-open, with controls for size limits and behavior, and a new &lt;code&gt;allowFileUploads&lt;/code&gt; setting provides control over upload permissions.&lt;/p&gt;
&lt;p&gt;There is now a menu option for creating new Python, R, or Julia files, and a “Select All” command has also been added, also accessible via the &lt;code&gt;Ctrl + A&lt;/code&gt; keyboard shortcut.&lt;/p&gt;
&lt;p&gt;Users can now configure file browser breadcrumbs through the settings editor options &lt;code&gt;breadcrumbsLeftItems&lt;/code&gt; and &lt;code&gt;breadcrumbsRightItems&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab 4.5 includes many improvements to the file browser" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-5-and-notebook-7-5-are-available/images/005-0_V05aZinAy9fytWaU.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab 4.5 includes many improvements to the file browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Updates to file dialogs and navigation have addressed column spacing, preferred-directory handling and double-click behavior.&lt;/p&gt;
&lt;h2 id="keyboard-shortcuts-and-commands"&gt;Keyboard shortcuts and commands&lt;/h2&gt;
&lt;p&gt;Code fold and unfold commands have been added and shortcuts for these can be set in the settings editor.&lt;/p&gt;
&lt;p&gt;The “Show Workspace Indicator” command has been added to the command palette and the “Send Code to Console” shortcut has been restored. The previous issue involving editing shortcuts on Safari loosing focus, has been resolved.&lt;/p&gt;
&lt;p&gt;With Jupyter Notebook 7.5.0, the &lt;code&gt;O&lt;/code&gt; key has been defined as the keyboard shortcut to toggle cell outputs, restoring this familiar functionality from the classic notebook.&lt;/p&gt;
&lt;h2 id="settings"&gt;Settings&lt;/h2&gt;
&lt;p&gt;The settings editor now supports a &lt;code&gt;toSkip&lt;/code&gt; configuration to hide specific plugins from view.&lt;/p&gt;
&lt;p&gt;A new setting, &lt;code&gt;addExtraLineOnCellMerge&lt;/code&gt;, allows to remove the extra line added when merging cells, which is expected behavior based on the classic notebook.&lt;/p&gt;
&lt;h2 id="user-interface-and-accessibility"&gt;User interface and accessibility&lt;/h2&gt;
&lt;p&gt;JupyterLab can now automatically switch between light and dark themes when “Synchronize with System Settings” is enabled.&lt;/p&gt;
&lt;p&gt;Dialog components display buttons and checkboxes on separate lines for better readability, and selections in the terminal under high-contrast themes have better visibility.&lt;/p&gt;
&lt;p&gt;Keyboard navigation and tab order in the status bar has also been improved.&lt;/p&gt;
&lt;h2 id="update-from-jupytercon"&gt;Update from JupyterCon&lt;/h2&gt;
&lt;p&gt;At JupyterCon 2025 in San Diego, the Jupyter Frontends team presented an update on features released since JupyterLab 4.0. This session covers the progress made since the previous conference in 2023. You can watch the full recording below.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/xiPJDIbUU0o" title="Lightning Talk: What&amp;#x27;s New in Jupyter Frontends - Jeremy Tuloup, QuantStack &amp;amp; Rosio Reyes, Anaconda" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the new contributors, the Jupyter Frontends team hopes to see you back!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @Ankitaupadhaya, @CrafterKolyan, @EtiennePelletier, @Frank-Steiner, @Meriem-BenIsmail, @arjxn-py, @bnavigator, @bsundaram1, @dnlzrgz, @dotnetautor, @gjmooney&lt;/li&gt;
&lt;li&gt;Notebook: @honnix, @jchen1223, @sangampaudel530&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to returning contributors for their continued work!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @Darshan808, @DenisaCG, @HaudinFlorence, @MUFFANUJ, @RRosio, @SylvainCorlay, @achhina, @afshin, @andrii-i, @bollwyvl, @brichet, @choldgraf, @cmarmo, @davidbrochart, @ianthomas23, @isabela-pf, @itsmevichu, @jasongrout, @jrdnbradford, @jtpio, @kathatherine, @kr-2003, @krassowski, @mahendrapaipuri, @martinRenou, @minrk, @nkn2022, @peytondmurray, @ritzdevp, @robertstrauss, @rschroll, @shreve, @skapin, @trungleduc, @yacchin1205, @yukiiii04, @zanieb&lt;/li&gt;
&lt;li&gt;Notebook: @choldgraf, @itsmevichu, @jasongrout, @jtpio, @krassowski, @minrk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab, Notebook and JupyterLab Desktop issues: @RRosio, @krassowski, @andrii-i, @danyeaw among others who attend.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLite 0.6.0 is released! 🎉</title><link href="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/" rel="alternate"/><published>2025-06-12T15:04:00+00:00</published><updated>2025-06-12T15:04:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2025-06-12:/posts/2025/jupyterlite-0-6-0-is-released/</id><summary type="html">&lt;p&gt;JupyterLite 0.6.0 includes a number of new features, bug fixes, and enhancements and significant improvements to the user interface.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;JupyterLite 0.6.0 includes a number of new features, bug fixes, and enhancements and significant improvements to the user interface.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterlite.readthedocs.io/"&gt;JupyterLite&lt;/a&gt; is an unofficial Jupyter distribution that runs entirely in the web browser without any server components. Deployment and hosting are easy as JupyterLite sites are just static websites.&lt;/p&gt;
&lt;p&gt;The new 0.6.0 release includes a number of new features, bug fixes, and enhancements. This release also brings significant improvements to the user experience and new customization options for JupyterLite deployments.&lt;/p&gt;
&lt;h2 id="interactive-input-support"&gt;Interactive Input Support&lt;/h2&gt;
&lt;p&gt;Support for kernel &lt;code&gt;stdin&lt;/code&gt; requests is now available, enabling interactive input functions like Python’s &lt;code&gt;input()&lt;/code&gt; and &lt;code&gt;getpass()&lt;/code&gt; in notebooks. This fixes a long standing limitation of JupyterLite when executing the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What is your name? &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Using input() and getpass() in a JupyterLite notebook" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/001-0_KpoAVYq3Wi5pBWd2.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using input() and getpass() in a JupyterLite notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Since &lt;code&gt;input()&lt;/code&gt; is used quite extensively in introductory Python courses, this new feature should help make teaching with JupyterLite easier!&lt;/p&gt;
&lt;h2 id="new-repl-options"&gt;New REPL Options&lt;/h2&gt;
&lt;p&gt;The REPL exposes new options as URL parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;promptCellPosition&lt;/code&gt; — place the prompt cell to the top, left, right or bottom&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clearCodeContentOnExecute&lt;/code&gt; — when disabled, the code submitted for execution remains in the code editor, allowing for further edits.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hideCodeInput&lt;/code&gt; — when enabled, only the execution output is shown in the console.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clearCellsOnExecute&lt;/code&gt; — when enabled, only the last cell is displayed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;showBanner&lt;/code&gt; — when disabled, hide the banner for the kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Toggling all the new options transforms the console into an interactive editor resembling an ephemeral notebook with a single cell.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A single executable cell in JupyterLite" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/002-0_Q20JOZb2NQGfLeUT.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A single executable cell in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to these URL parameters, the toolbar includes new items to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execute code&lt;/li&gt;
&lt;li&gt;Restart the kernel&lt;/li&gt;
&lt;li&gt;Clear the cells&lt;/li&gt;
&lt;li&gt;Switch the kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out the &lt;a href="https://jupyterlite.readthedocs.io/en/latest/quickstart/embed-repl.html"&gt;REPL documentation&lt;/a&gt; for more details on how to use these parameters.&lt;/p&gt;
&lt;h2 id="kernel-indicator-and-logs"&gt;Kernel Indicator and Logs&lt;/h2&gt;
&lt;p&gt;A new notebook toolbar item has been added to show the kernel status with three different states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loading: the kernel is starting or performing some actions&lt;/li&gt;
&lt;li&gt;Success: the kernel is ready to execute code&lt;/li&gt;
&lt;li&gt;Failure: an error occurred while starting the kernel or during execution, and likely requires a restart of the kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This new toolbar item gives users better visibility into the kernel’s status and allows them to view the kernel logs by clicking on the toolbar item to open the log console.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Kernel logs can help troubleshoot JupyterLite issues" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/003-0_GaXGJVtpTFN0_nPM.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kernel logs can help troubleshoot JupyterLite issues&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="clear-browser-data"&gt;Clear Browser Data&lt;/h2&gt;
&lt;p&gt;By default JupyterLite stores user-created notebooks and settings in the browser.&lt;/p&gt;
&lt;p&gt;In previous versions, users had to manually clear the data using the browser developer tools. With JupyterLite 0.6.0 it is now possible to clear the browser data from the UI by clicking on the &lt;code&gt;Help &amp;gt; Clear Browser Data&lt;/code&gt; menu item. The confirmation dialog will show options to clear settings and contents.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The confirmation dialog for clearing browser data" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/004-0_zRK_R5mnRajeqlpa.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The confirmation dialog for clearing browser data&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="loading-indicator"&gt;Loading indicator&lt;/h2&gt;
&lt;p&gt;A new indicator has been added to let users know JupyterLite is currently starting up, which is useful for deployments that take some time to load, especially on slow connections.&lt;/p&gt;
&lt;p&gt;By default, the loading indicator is only visible in the JupyterLab application (not for Jupyter Notebook or REPL). If you would like to enable or disable the indicator for some or all applications, check out the &lt;a href="https://jupyterlite.readthedocs.io/en/latest/howto/configure/loading_indicator.html"&gt;guide in the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The loading indicator lets users know something is happening when the page is loaded" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/005-1_4ExdD0fKhHbnaVM5XjbUcg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The loading indicator lets users know something is happening when the page is loaded&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="settings-import-and-export"&gt;Settings import and export&lt;/h2&gt;
&lt;p&gt;Settings can now be exported to an &lt;code&gt;overrides.json&lt;/code&gt; file from the Settings Editor. This file can then be used to pre-configure defaults in deployments or to restore settings.&lt;/p&gt;
&lt;p&gt;This allows users to interact with a JupyterLite deployment, make a couple of changes to the settings, and export them to an &lt;code&gt;overrides.json&lt;/code&gt; that can be then included in a JupyterLite deployment, or imported in another one.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The new export and import buttons in the Settings Editor" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/006-0_dAPLUZFcDVPUKUeu.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The new export and import buttons in the Settings Editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="plugin-manager"&gt;Plugin Manager&lt;/h2&gt;
&lt;p&gt;Open the command palette and search for &lt;code&gt;Advanced Plugin Manager&lt;/code&gt; to open the plugin manager. With the plugin manager, users can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View active plugins in the running JupyterLite environment&lt;/li&gt;
&lt;li&gt;Understand dependency relationships between plugins&lt;/li&gt;
&lt;li&gt;Gain better visibility into the configuration of their environment&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="The plugin manager lists active plugins in a JupyterLite deployment" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/007-0_HRQIND8DW4sYlvzy.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The plugin manager lists active plugins in a JupyterLite deployment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="improved-multi-site-contents-management"&gt;Improved Multi-site Contents Management&lt;/h2&gt;
&lt;p&gt;The default in-browser storage is now scoped using the &lt;code&gt;baseUrl&lt;/code&gt; of the deployment. This allows hosting multiple sites under the same domain, and keeps user created files isolated from each other.&lt;/p&gt;
&lt;p&gt;For example if two sites are hosted on GitHub Pages and available under the following URLs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://username.github.io/jupyterlite-foo"&gt;&lt;code&gt;https://username.github.io/jupyterlite-foo&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://username.github.io/jupyterlite-bar"&gt;&lt;code&gt;https://username.github.io/jupyterlite-bar&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice this fixes the issue where users would create new files in one site, and they would show up in another site hosted under the same domain.&lt;/p&gt;
&lt;h2 id="multi-tab-file-system-access"&gt;Multi-Tab File System Access&lt;/h2&gt;
&lt;p&gt;Using JupyterLite in multiple browser tabs at the same time should now result in less issues, in particular when interacting with the file system.&lt;/p&gt;
&lt;h2 id="extension-system"&gt;Extension system&lt;/h2&gt;
&lt;p&gt;In previous versions, JupyterLite was creating a separate application to register “server” extensions. Examples of such extensions are the different managers (sessions, kernels, settings, contents) but also the actual kernels (Pyodide, Xeus Python). This was not ideal because it introduced a separate namespace for these extensions, and extension authors had to configure their extension to be either a regular JupyterLab extension or a JupyterLite “server” extension.&lt;/p&gt;
&lt;p&gt;Starting with JupyterLite 0.6.0, all extensions are now registered at the same level as regular JupyterLab extensions, making use of the new &lt;code&gt;ServiceManagerPlugin&lt;/code&gt; type of extension introduced in JupyterLab 4.4.&lt;/p&gt;
&lt;h2 id="jupyterlab-44-and-notebook-74"&gt;JupyterLab 4.4 and Notebook 7.4&lt;/h2&gt;
&lt;p&gt;JupyterLite 0.6.0 is built on top of JupyterLab 4.4 and Notebook 7.4, and brings many of the respective improvements and bug fixes. Check out the &lt;a href="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/"&gt;announcement blog post&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h2 id="kernel-and-other-updates"&gt;Kernel and other updates&lt;/h2&gt;
&lt;p&gt;In addition to the JupyterLite 0.6.0 release, the &lt;a href="https://github.com/jupyterlite/pyodide-kernel"&gt;Pyodide&lt;/a&gt; and &lt;a href="https://github.com/jupyterlite/xeus"&gt;Xeus Python&lt;/a&gt; kernels have also been updated to be compatible with the latest release.&lt;/p&gt;
&lt;p&gt;Other components of the stack such as &lt;a href="https://blog.jupyter.org/posts/2023/and-voici/"&gt;Voici&lt;/a&gt; and &lt;a href="https://github.com/jupyter-book/thebe"&gt;thebe-lite&lt;/a&gt; will also soon be updated.&lt;/p&gt;
&lt;h2 id="closing-the-gap-with-jupyterlab"&gt;Closing the gap with JupyterLab&lt;/h2&gt;
&lt;p&gt;As mentioned above, JupyterLab 4.4 introduced the ability to replace some of the core &lt;code&gt;ServiceManager&lt;/code&gt; plugins responsible for interacting with the server, such as the kernel and session managers.&lt;/p&gt;
&lt;p&gt;This allows JupyterLite to progressively become a set of JupyterLab extensions that can be integrated in regular JupyterLab instances.&lt;/p&gt;
&lt;h3 id="using-in-browser-and-regular-kernels-together"&gt;Using in-browser and regular kernels together&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;⚠️ This is still very experimental!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;An example of such integration is the &lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-hybrid-kernels"&gt;jupyterlab-hybrid-kernels&lt;/a&gt; extension.&lt;/p&gt;
&lt;p&gt;This extension allows using both in-browser (JupyterLite) and regular Jupyter kernels together in the same JupyterLab session.&lt;/p&gt;
&lt;p&gt;There is also some work happening to explore automatically promoting in-browser kernels as regular kernels when some computations are not possible in the browser, or when some modules are not available.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Promoting in-browser as regular kernels" src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/008-1_cjJGJmrDUisWFcVejvqytg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Promoting in-browser as regular kernels&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="migrating-to-060"&gt;Migrating to 0.6.0&lt;/h2&gt;
&lt;p&gt;If you maintain a JupyterLite deployment and would like to update to the latest version, check out the &lt;a href="https://jupyterlite.readthedocs.io/en/latest/migration.html#to-0-6-0"&gt;migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="walkthrough-video"&gt;Walkthrough video&lt;/h2&gt;
&lt;p&gt;For a more interactive tour of the new features, watch the video below:&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/jkQ9ORG5qAM" title="What&amp;#x27;s new in JupyterLite 0.6 💡" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id="try-it-in-your-browser"&gt;Try it in your browser&lt;/h2&gt;
&lt;p&gt;If you would like to try the new features in your browser, click on the following link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://jupyter.org/try-jupyter/lab?path=notebooks%2FIntro.ipynb"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/009-1_mDE6gcWgCV_izR-LxNdf5g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;The work on JupyterLite at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was contributed by &lt;strong&gt;Anastasia Sliusar&lt;/strong&gt;, &lt;strong&gt;Ian Thomas&lt;/strong&gt;, &lt;strong&gt;Jeremy Tuloup&lt;/strong&gt;, &lt;strong&gt;Martin Renou&lt;/strong&gt; and &lt;strong&gt;Thorsten Beier&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://x.com/TechAtBloomberg"&gt;Bloomberg&lt;/a&gt; for funding this work and for their ongoing support for JupyterLite in general.&lt;/p&gt;
&lt;p&gt;Thanks to the &lt;a href="https://www.gatesfoundation.org/"&gt;&lt;strong&gt;Bill &amp;amp; Melinda Gates Foundation&lt;/strong&gt;&lt;/a&gt; (through a grant to &lt;strong&gt;CourseKata&lt;/strong&gt;) for funding the work on the interactive input feature.&lt;/p&gt;
&lt;p&gt;Many thanks to all the contributors to JupyterLite, Jupyter Frontends and related project in the Jupyter ecosystem (list below is based on GitHub usernames):&lt;/p&gt;
&lt;p&gt;@2xB | @anutosh491 | @bollwyvl | @davidbrochart | @ianthomas23 | @jtpio | @juntyr | @lesteve | @martinRenou | @RMattB1 | @trungleduc | @westurner | @yogabonito&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/jupyterlite-0-6-0-is-released/images/010-1_ELbE4YunBEU1TtlXT0jxuA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLite"/><category term="releases"/></entry><entry><title>JupyterLab 4.4 and Notebook 7.4 are available!</title><link href="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/" rel="alternate"/><published>2025-05-21T09:54:00+00:00</published><updated>2025-05-21T09:54:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2025-05-21:/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/</id><summary type="html">&lt;p&gt;JupyterLab 4.4 has been released! This new minor release of JupyterLab includes 28 new features and enhancements, 76 bug fixes, 63 maintenance tasks and 34 documentation improvements. There were 56 contributors to this release.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; 4.4 has been released! This new minor release of JupyterLab includes 28 new features and enhancements, 76 bug fixes, 63 maintenance tasks and 34 documentation improvements. There were 56 contributors to this release.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/notebook"&gt;Jupyter Notebook&lt;/a&gt; 7.4 has also been released, including many of the fixes and enhancements in this JupyterLab 4.4 release. While the releases on GitHub provide additional detail on the updates made to both &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.4.0"&gt;JupyterLab 4.4&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.4.0"&gt;Notebook 7.4&lt;/a&gt;, this article highlights some particularly notable changes.&lt;/p&gt;
&lt;p&gt;Extension authors can refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/stable/extension/extension_migration.html#jupyterlab-4-3-to-4-4"&gt;Extension Migration Guide&lt;/a&gt; for information on API updates and details regarding changes to core packages.&lt;/p&gt;
&lt;h2 id="code-console-improvements"&gt;Code console improvements&lt;/h2&gt;
&lt;p&gt;The code console prompt can now be positioned on the top, left, or right side of the console, in addition to the default bottom placement. The placement is persisted in the Prompt Cell Position setting. The console toolbar now includes buttons to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execute code&lt;/li&gt;
&lt;li&gt;Restart the kernel&lt;/li&gt;
&lt;li&gt;Clear the cells&lt;/li&gt;
&lt;li&gt;Switch the kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Changing the position of the prompt cell in JupyterLab code consoles" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/images/001-0_xR1yXwkrzFar51Rh.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Changing the position of the prompt cell in JupyterLab code consoles&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Additional settings for console behavior have been added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear Code Content on Execute (enabled by default) — When disabled, the code submitted for execution remains in the code editor, allowing for further edits.&lt;/li&gt;
&lt;li&gt;Hide Code Input — When enabled, only the execution output is shown in the console.&lt;/li&gt;
&lt;li&gt;Clear Cells on Execute — When enabled, only the last cell is displayed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Toggling all the three new settings transforms the console into an interactive editor resembling an ephemeral notebook with a single cell.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The code console configured as a single executable cell" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/images/002-0_yzStobKzh8gMimoc.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The code console configured as a single executable cell&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="settings-import-and-export"&gt;Settings import and export&lt;/h2&gt;
&lt;p&gt;Settings can now be exported to &lt;code&gt;overrides.json&lt;/code&gt; from the Settings Editor, which can be used to pre-configure defaults in deployments or to restore settings.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Import and export settings from the Settings Editor" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/images/003-0_MaZubqod8W1g-JHz.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Import and export settings from the Settings Editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="workspace-indicator"&gt;Workspace indicator&lt;/h2&gt;
&lt;p&gt;An opt-in workspace indicator is displayed on the top bar (next to the menu bar). It can be enabled in the &lt;code&gt;Settings → View → Appearance → Show Workspace Indicator&lt;/code&gt;:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The workspace indicator" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/images/004-0_9RGYIRu0foogfJC-.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The workspace indicator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="support-for-collaboration-without-rtc-drive"&gt;Support for collaboration without &lt;code&gt;RTC:&lt;/code&gt; drive&lt;/h2&gt;
&lt;p&gt;Real time collaboration in previous versions of JupyterLab (which can be enabled by installing jupyter-collaboration package) was implemented by swapping the default JupyterLab file system drive to a collaborative drive with the &lt;code&gt;RTC:&lt;/code&gt; prefix. This approach was incompatible with multiple extensions. JupyterLab 4.4 introduces the Content Providers API, which allows the next version of &lt;code&gt;jupyter-collaboration&lt;/code&gt; to work without changing the drive prefix. This improves compatibility with extensions that do not support arbitrary drives.&lt;/p&gt;
&lt;h2 id="kernel-subshells-support"&gt;Kernel subshells support&lt;/h2&gt;
&lt;p&gt;Kernel subshells, introduced in &lt;a href="https://jupyter.org/enhancement-proposals/91-kernel-subshells/kernel-subshells.html"&gt;JEP 91&lt;/a&gt;, enable concurrent code execution in kernels that support them. When performing long-running computations (such as training a model), subshells enable users to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ipywidgets&lt;/code&gt; with updates displayed immediately&lt;/li&gt;
&lt;li&gt;Monitor kernel resource usage (e.g. memory usage)&lt;/li&gt;
&lt;li&gt;Invoke arbitrary commands (e.g., refine code for a subsequent cell) while maintaining live access to previously defined variables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Subshells are supported by &lt;code&gt;ipykernel&lt;/code&gt; 7 (currently in alpha).&lt;/p&gt;
&lt;p&gt;To create a subshell, open context menu (right-click) over a notebook using a kernel supporting subshells and select “New Subshell Console for Notebook”. A new console panel will open allowing access to variables from the main session.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Creating a new subshell console for a notebook in JupyterLab 4.4" src="https://blog.jupyter.org/posts/2025/jupyterlab-4-4-and-notebook-7-4-are-available/images/005-0_Ivi-4TMFnn-lcz4S.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Creating a new subshell console for a notebook in JupyterLab 4.4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;JupyterLab can automatically create subshells for comm messages if kernels support this feature. This enables concurrent execution of &lt;code&gt;ipywidgets&lt;/code&gt; callbacks without requiring a user action. This behavior can be changed from the settings, with options to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;disable that feature to not use subshells for comms&lt;/li&gt;
&lt;li&gt;(default) automatically create one subshell per comm-target (e.g. one subshell for all &lt;code&gt;ipywidgets&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;automatically create one subshell per comm (this can lead to issues if creating many comms)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context-menu-opt-out"&gt;Context menu opt-out&lt;/h2&gt;
&lt;p&gt;The context menu, available under right mouse click in browsers, can now be disabled globally by toggling the &lt;code&gt;Enable Context Menu&lt;/code&gt; option available in the Command Palette, or via the JSON Settings Editor in the Application Context Menu.&lt;/p&gt;
&lt;h2 id="slimmer-status-bar"&gt;Slimmer status bar&lt;/h2&gt;
&lt;p&gt;The terminals counter no longer appears in the status bar if no terminals are open. The kernels counter can be disabled by toggling the &lt;code&gt;Show the status bar item&lt;/code&gt; setting in &lt;code&gt;Running Terminals and Kernels&lt;/code&gt; (code name &lt;code&gt;showStatusBarItem&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="walkthrough-video"&gt;Walkthrough video&lt;/h2&gt;
&lt;p&gt;If you prefer a more interactive tour of the new features mentioned in the post, check out the video below:&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/YhYor8LWeJY" title="What&amp;#x27;s new in JupyterLab 4.4 and Notebook 7.4" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the contributors (list below is based on GitHub usernames):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @Adam-D-Lewis @afshin @ajbozarth @AmberArr @andrewfulton9 @andreytaboola @andrii-i @bollwyvl @brichet @Carreau @claytonparnell @cmarmo @Darshan808 @davidbrochart @deephbz @dlqqq @echarles @fcollonval @fleming79 @holzman @hxrshxz @ianthomas23 @iisakkirotko @itsmevichu @JasonWeill @jesuino @joaopalmeiro @jtpio @kellyrowland @krassowski @kuraga @maitreya2954 @martenrichter @martinRenou @mgeier @MUFFANUJ @nkn2022 @Nriver @pawel99k @pdarshane @peytondmurray @pre-commit-ci @Princekumarofficial @Rishab87 @rpwagner @RRosio @rsaditya01 @SamuelMarks @SatyajitRedekar @SylvainCorlay @trungleduc @Zsailer&lt;/li&gt;
&lt;li&gt;Notebook: @andrii-i @jdavid @jtpio @krassowski @RRosio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Special thank you to all the new contributors, the Jupyter Frontends team hopes to see you back!&lt;/p&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab, Notebook and JupyterLab Desktop issues: @krassowski, @RRosio, @andrii-i, @danyeaw among others who attend.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Announcing JupyterCAD 3.0</title><link href="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/" rel="alternate"/><published>2025-02-17T09:38:00+00:00</published><updated>2025-02-17T09:38:00+00:00</updated><author><name>Arjun Verma</name></author><id>tag:blog.jupyter.org,2025-02-17:/posts/2025/announcing-jupytercad-3-0/</id><summary type="html">&lt;p&gt;The latest iteration of the web-based collaborative CAD editor&lt;/p&gt;
</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/001-1_m9xr-RYt-bA0tfE6YwjNMQ.webp" alt="Screenshot of JupyterCAD, showing a model of gear, with an anotation editor opened." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to introduce JupyterCAD 3.0, the newest version of the collaborative CAD modeler designed for JupyterLab.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/jupytercad/jupytercad"&gt;JupyterCAD&lt;/a&gt; is an unofficial JupyterLab extension for 3D geometry modeling with collaborative editing support. It is designed to allow multiple people to work on the same file at the same time, and to facilitate discussion and collaboration around the 3D shapes being created.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;JupyterCAD 3.0 represents a significant leap forward in usability and user experience compared to the previous release.&lt;/p&gt;
&lt;h2 id="whats-new-in-jupytercad-30"&gt;What’s new in JupyterCAD 3.0?&lt;/h2&gt;
&lt;h3 id="color-customization"&gt;Color customization&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/kTePlIUbgik" title="JupyterCAD color customization" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;JupyterCAD 3.0 allows you to customize object colors directly within the application, while we were limited to gray models in earlier versions. Adjust colors easily to suit your design needs or preferences.&lt;/p&gt;
&lt;h3 id="embedded-python-console"&gt;Embedded Python console&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/eyZmY9jt6GY" title="JupyterCAD embedded console" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The new embedded Python console offers advanced users direct access to JupyterCAD’s Python API, enabling on-the-fly scripting and automation for power users.&lt;/p&gt;
&lt;h3 id="ux-improvements"&gt;UX improvements&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/j5ypepW8QxU" title="JupyterCAD Axes Helper" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The new &lt;strong&gt;AxesHelper&lt;/strong&gt; provides a clear visual reference for coordinate axes, making it easier to navigate and align models in 3D space.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/lxYKdLS62Zw" title="JupyterCAD copy-paste functionality" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;We have also added &lt;strong&gt;copy-paste functionality&lt;/strong&gt; using &lt;strong&gt;Ctrl+C&lt;/strong&gt; and &lt;strong&gt;Ctrl+V&lt;/strong&gt; shortcuts, making it faster and easier to duplicate objects within your models.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Dx13O7adpj8" title="JupyterCAD 3.0 improved toolbar" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;An &lt;strong&gt;improved toolbar&lt;/strong&gt; now includes options to &lt;strong&gt;toggle wireframe&lt;/strong&gt;, &lt;strong&gt;toggle transform controls&lt;/strong&gt;, &lt;strong&gt;toggle clip plane&lt;/strong&gt; and a &lt;strong&gt;toggleable console&lt;/strong&gt;, giving users quick access to essential tools.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/790f6Wc4_Wk" title="JupyterCAD smooth camera tracking" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;JupyterCAD 3.0 also introduces &lt;strong&gt;smooth camera tracking&lt;/strong&gt;, where selecting an object from the object tree triggers a smooth transition of the camera to focus on the selected object, enhancing navigation and model exploration.&lt;/p&gt;
&lt;h3 id="mouse-based-3d-controls"&gt;Mouse-based 3D controls&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/xMCvxiIglZk" title="JupyterCAD Mouse-based 3D transform controls" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Move or rotate your 3D models effortlessly with &lt;strong&gt;mouse-based controls&lt;/strong&gt; that bring fluidity and precision to model editing and interaction.&lt;/p&gt;
&lt;h3 id="suggestions-support"&gt;Suggestions support&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Zu0AT6IRA98" title="JupyterCAD suggestions" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;With JupyterCAD 3.0, collaboration becomes even more seamless with suggestions. Collaborators can propose changes to a model, which can be reviewed and applied collaboratively, fostering a dynamic and efficient workflow.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it!&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the JupyterCAD GitHub repository." src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/002-1_DmBkGvfYG37OR0UueGpdag.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;JupyterCAD GitHub repository&lt;/a&gt;, with a link to try JupyterCAD (circled in red) with JupyterLite. This is simply deployed as a static website on “GitHub Pages”.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Explore JupyterCAD 3.0 in action with our &lt;strong&gt;JupyterLite deployment&lt;/strong&gt; — no installation required. Visit us at &lt;a href="https://jupytercad.github.io/JupyterCAD"&gt;jupytercad.github.io/JupyterCAD&lt;/a&gt; and start modeling directly in your browser.&lt;/p&gt;
&lt;h2 id="installing-jupytercad"&gt;Installing JupyterCAD&lt;/h2&gt;
&lt;p&gt;You can easily install JupyterCAD with pip or mamba:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mamba&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;conda&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Additionally, you can install FreeCAD along with the JupyterCAD-FreeCAD plugin to enable support for FCstd files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mamba&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;conda&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt; &lt;span class="n"&gt;freecad&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;freecad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;JupyterCAD is evolving rapidly, with some exciting updates just around the corner and others in active development:&lt;/p&gt;
&lt;h3 id="upcoming-features"&gt;Upcoming Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enhanced User Experience&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Smoother exploded view&lt;/li&gt;
&lt;li&gt;Support for renaming objects directly from object tree&lt;/li&gt;
&lt;li&gt;Incremental rotation controls for precise adjustments&lt;/li&gt;
&lt;li&gt;Enhanced 3D view settings for better customization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nested &amp;amp; Refined Side Panel&lt;/strong&gt;: Navigate and organize objects more easily with a refined and nested side panel experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for more File Formats&lt;/strong&gt;: Broaden compatibility with support for more file formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features-in-development"&gt;Features in Development&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New CAD Operations&lt;/strong&gt;: New tools for operations like &lt;strong&gt;linear&lt;/strong&gt; and &lt;strong&gt;radial patterns&lt;/strong&gt; to expand modeling capabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for measuring distances&lt;/strong&gt;: Tools to measure distances and dimensions directly in the viewport.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved 2D Sketcher&lt;/strong&gt;: Enhanced features to make 2D sketching more intuitive and robust.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The development of the JupyterCAD open-source project by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by a grant from &lt;a href="https://ecologie.gouv.fr/direction-generale-laviation-civile-dgac"&gt;DGAC&lt;/a&gt; in the framework of the French “Plan de Relance” (refinanced by &lt;a href="https://next-generation-eu.europa.eu/index_en"&gt;Next generation EU&lt;/a&gt;) as part of a collaboration between &lt;a href="https://www.safran-group.com/companies/safran-aircraft-engines"&gt;Safran Aircraft Engines&lt;/a&gt;, &lt;a href="https://www.inria.fr/en"&gt;INRIA&lt;/a&gt;, and &lt;a href="https://www.akkodis.com/"&gt;Akkodis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also extend our gratitude to the &lt;a href="https://github.com/jupytercad/JupyterCAD/graphs/contributors"&gt;external contributors&lt;/a&gt; whose efforts and feedback have been instrumental in shaping this release. Your support and collaboration drive the ongoing success of JupyterCAD.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/003-1_4LK5G7er7fRNtT4gbUoWWw.webp" alt="Logo of Safran Aircraft Engines" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;This work was built upon the strong foundation laid by open-source software projects such as &lt;a href="https://threejs.org/"&gt;&lt;strong&gt;Three.js&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://dev.opencascade.org/"&gt;&lt;strong&gt;OpenCascade&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://ocjs.org/"&gt;&lt;strong&gt;OpenCascade.js&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.freecad.org/"&gt;&lt;strong&gt;FreeCAD&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;&lt;strong&gt;JupyterLab&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;&lt;strong&gt;JupyterLite&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;JupyterCAD is an open-source project resulting from &lt;a href="https://github.com/jupytercad/JupyterCAD/graphs/contributors"&gt;contributors&lt;/a&gt;’ collective efforts. Below, we highlight the primary contributors for this release:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/004-0_lIAP4xLgMI8KptQn.jpg" alt="Portrait of Trung Le" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; is a Scientific Software Developer at QuantStack. He works on several projects within the Jupyter ecosystem, from the main projects like &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt;, &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt;, and &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt; to various JupyterLab extensions and widgets.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/005-0_RPV4uLZ7SYZ0_KwH.jpg" alt="Portrait of Martin Renou" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Technical Director at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and a maintainer of &lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt;. Among other projects Martin is a core team member of the ipywidgets project and maintains many Jupyter widget packages such as &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt;, &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt;, &lt;a href="https://github.com/QuantStack/ipygany"&gt;ipygany&lt;/a&gt;, &lt;a href="https://github.com/martinRenou/ipycanvas"&gt;ipycanvas&lt;/a&gt;, and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt;. He is a co-creator of the &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt; dashboarding system, and the &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt; kernel.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/006-1_ne6lm0Wifp81ZLEIB6fxiQ.webp" alt="Portrait of Arjun Verma" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;Arjun Verma&lt;/a&gt; is a Scientific Software Development Intern at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;. He is also a final year undergraduate student at Cluster Innovation Centre, University of Delhi. He loves 3D &amp;amp; GIS and also contributes to &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; and is one of the maintainers of &lt;a href="https://pybamm.org/"&gt;PyBaMM&lt;/a&gt; where he has also been &lt;a href="https://summerofcode.withgoogle.com/"&gt;GSoC&lt;/a&gt; contributor and mentor.&lt;/p&gt;
</content><category term="collaboration"/><category term="JupyterCAD"/><category term="releases"/></entry><entry><title>JupyterLab 4.3 and Notebook 7.3 are available!</title><link href="https://blog.jupyter.org/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/" rel="alternate"/><published>2024-12-05T22:41:00+00:00</published><updated>2024-12-05T22:41:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2024-12-05:/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/</id><summary type="html">&lt;p&gt;JupyterLab 4.3.0 has been released! This new minor release of JupyterLab includes 1 new feature, 42 enhancements, 62 bug fixes, 48 maintenance tasks and 35 documentation improvements. There were 38 contributors to this release including 18 new contributors to JupyterLab.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; 4.3.0 has been released! This new minor release of JupyterLab includes 1 new feature, 42 enhancements, 62 bug fixes, 48 maintenance tasks and 35 documentation improvements. There were 38 contributors to this release including 18 new contributors to JupyterLab.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/notebook"&gt;Jupyter Notebook&lt;/a&gt; 7.3.0 has also been released, including many of the fixes and enhancements in this JupyterLab 4.3.0 release. While the releases on GitHub provide additional detail on the updates made to both &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.3.0"&gt;JupyterLab 4.3&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.3.0"&gt;Notebook 7.3&lt;/a&gt;, this article highlights some particularly notable changes.&lt;/p&gt;
&lt;p&gt;Extension authors can refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-2-to-4-3"&gt;Extension Migration Guide&lt;/a&gt; for information on API updates and details regarding changes to core packages.&lt;/p&gt;
&lt;h2 id="minimap"&gt;Minimap&lt;/h2&gt;
&lt;p&gt;The virtual scrollbar now acts as a minimap and exposes information on whether a cell:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;is running/scheduled (&lt;code&gt;[*]&lt;/code&gt;), idle (&lt;code&gt;[ ]&lt;/code&gt;) or was already run (e.g. &lt;code&gt;[1]&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;was modified since it was last executed (“dirty”) — orange background,&lt;/li&gt;
&lt;li&gt;has an output that contains an error — red background,&lt;/li&gt;
&lt;li&gt;is markdown/code (&lt;code&gt;[ ]&lt;/code&gt;/&lt;code&gt;[*]&lt;/code&gt;/&lt;code&gt;[1]&lt;/code&gt; for code, nothing for markdown),&lt;/li&gt;
&lt;li&gt;an how much text/code it contains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable the minimap, click on the hamburger icon (≡) which appears in the notebook toolbar. If you do not see the hamburger icon, go to Settings → Notebook → Windowing mode and choose “full”.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The notebook minimap in JupyterLab 4.3" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/images/001-0_ylz6jx3MOOD7NqFb.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The notebook minimap in JupyterLab 4.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="fullscreen-mode"&gt;Fullscreen mode&lt;/h2&gt;
&lt;p&gt;JupyterLab now offers two ways to toggle the full screen mode from within the application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;using the View → Appearance → Fullscreen Mode menu entry,&lt;/li&gt;
&lt;li&gt;using a customizable shortcut, by default F11 (custom shortcuts are supported in Chrome, Safari and Edge).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="file-browser-enhancements"&gt;File browser enhancements&lt;/h2&gt;
&lt;p&gt;The file browser now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;supports resizing the columns and remembers the column sizes after reloading JupyterLab,&lt;/li&gt;
&lt;li&gt;supports uploading folders by drag-and-drop,&lt;/li&gt;
&lt;li&gt;supports navigation with a single click (opt-in in JupyterLab, default in Jupyter Notebook),&lt;/li&gt;
&lt;li&gt;has the file filter collapsed by default (funnel icon), increasing the space available.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="File browser enhancements in JupyterLab 4.3" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/images/002-0_vi_Hia43dNGLxQxD.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;File browser enhancements in JupyterLab 4.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="server-side-execution-and-collaboration"&gt;Server-side execution and collaboration&lt;/h2&gt;
&lt;p&gt;JupyterLab 4.2 added the option for extensions to implement server-side execution, which preserves outputs created when the browser window is closed or disconnected. The server-side execution builds on the same shared models API as the real-time collaboration (RTC).&lt;/p&gt;
&lt;p&gt;You can try these features by installing extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/datalayer/jupyter-server-nbmodel"&gt;jupyter-server-nbmodel&lt;/a&gt;* provides server-side execution for jupyter-server,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab/jupyter-collaboration"&gt;jupyter-collaboration&lt;/a&gt; provides the real-time collaboration features,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-server/jupyverse"&gt;jupyverse&lt;/a&gt; is an alternative server (a replacement for jupyter-server) which supports server-side execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;* while jupyter-server-nbmodel is developed by maintainers of JupyterLab, as of the JupyterLab 4.3.0 release date it is not an official Project Jupyter extension.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="improved-kernel-and-server-interactions"&gt;Improved kernel and server interactions&lt;/h2&gt;
&lt;p&gt;The previous release enabled connecting to external kernels, such as those spawned by a third-party application like Blender. In this release the kernel selector dialog was improved to also show the external kernels.&lt;/p&gt;
&lt;p&gt;The previous release improved the awareness of the kernel/kernel specification distinction by providing both tree and list view in the kernels sidebar panel, but only the tree view featured the kernel identifiers. In this release both the list and tree view show the kernel identifier stub.&lt;/p&gt;
&lt;p&gt;A new toolbar button was added in the kernel allowing to shut down unused kernels (kernels with no widget attached).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Shut down unused kernels in JupyterLab 4.3" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/images/003-0_sZAliNNu3C2wamFo.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Shut down unused kernels in JupyterLab 4.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="full-width-notebook"&gt;Full Width Notebook&lt;/h2&gt;
&lt;p&gt;In Jupyter Notebook 7.3, it is now possible to configure the notebook to take up the full width of the page via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a setting that can be defined by a user via the Settings Editor&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;View &amp;gt; Enable Full Width Notebook&lt;/code&gt; menu entry&lt;/li&gt;
&lt;li&gt;the command palette, searching for &lt;code&gt;Enable Full Width Notebook&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Full width notebook in Jupyter Notebook 7.3" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/images/004-0_6FYCiWSCRcxPNeVP.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Full width notebook in Jupyter Notebook 7.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyterlab-3-end-of-maintenance"&gt;JupyterLab 3 end of maintenance&lt;/h2&gt;
&lt;p&gt;As a reminder, &lt;strong&gt;JupyterLab 3 will reach its end of maintenance date on December 31, 2024, anywhere on Earth&lt;/strong&gt;. Users are highly encouraged to update to JupyterLab 4 as soon as possible.&lt;/p&gt;
&lt;p&gt;For more information, please refer to the &lt;a href="https://blog.jupyter.org/posts/2024/jupyterlab-3-end-of-maintenance/"&gt;announcement post&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the new contributors, the Jupyter Frontends team hopes to see you back!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @jgoodson, @Wzixiao, @krishanbhasin-px, @hnben, @sanskriti2005, @achhina, @mahendrapaipuri, @Renegade334, @Nazeeh21, @pauldruce, @EdsterG, @gderocher, @dhysdrn, @algonell, @nekomeowww, @mjpsyapse, @kaushalaaditya99, @Nagidrop&lt;/li&gt;
&lt;li&gt;Notebook: @bluestealth, @andyscho, @algonell, @gjmooney&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to returning contributors for their continued work!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @afshin, @ajbozarth, @andrewfulton9, @andrii-i, @brichet, @cmarmo, @Darshan808, @davidbrochart, @fcollonval, @gabalafou, @HaudinFlorence, @itsmevichu, @JasonWeill, @joaopalmeiro, @jtpio, @krassowski, @maitreya2954, @Mehak261124, @NexVeridian, @RRosio&lt;/li&gt;
&lt;li&gt;Notebook: @JasonWeill, @jtpio, @krassowski, @martinRenou, @RRosio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab, Notebook and JupyterLab Desktop issues: @JasonWeill, @krassowski, @RRosio, @andrii-i among others who attend.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLab 4.2 and Notebook 7.2 are available!</title><link href="https://blog.jupyter.org/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/" rel="alternate"/><published>2024-05-22T21:00:00+00:00</published><updated>2024-05-22T21:03:00+00:00</updated><author><name>Rosio Reyes</name></author><id>tag:blog.jupyter.org,2024-05-22:/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/</id><summary type="html">&lt;p&gt;JupyterLab 4.2.0 has been released! This new minor release of JupyterLab includes 3 new features, 20 enhancements, 33 bug fixes and 29 maintenance tasks. There were 39 contributors to this release including 10 new contributors to JupyterLab.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; 4.2.0 has been released! This new minor release of JupyterLab includes 3 new features, 20 enhancements, 33 bug fixes and 29 maintenance tasks. There were 39 contributors to this release including 10 new contributors to JupyterLab.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/notebook"&gt;Jupyter Notebook&lt;/a&gt; 7.2.0 has also been released, including many of the fixes and enhancements in this JupyterLab 4.2.0 release. While the releases on Github provide additional detail on the updates made to both &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.2.0"&gt;JupyterLab 4.2&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.2.0"&gt;Notebook 7.2&lt;/a&gt;, this article highlights some particularly notable changes.&lt;/p&gt;
&lt;p&gt;Extension authors can refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-1-to-4-2"&gt;Extension Migration Guide&lt;/a&gt; for information on API updates and details regarding changes to core packages.&lt;/p&gt;
&lt;h2 id="easier-workspaces-management-with-gui"&gt;Easier Workspaces Management with GUI&lt;/h2&gt;
&lt;p&gt;It is now possible to manage workspaces from within JupyterLab with the workspaces graphical user interface. This &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/6944"&gt;long awaited feature&lt;/a&gt; offers users an additional way to interact with workspaces beyond the existing URL and CLI-based options, providing a more user-friendly and accessible alternative for some.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab 4.2 Workspaces Sidebar" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/images/001-1_vEiDh6zMT9nlBX3oNDK-pw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab 4.2.0 Workspaces UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="recently-openedclosed-files"&gt;Recently opened/closed files&lt;/h2&gt;
&lt;p&gt;Jupyterlab-recents, an extension for tracking recent files and directories has now been integrated into core JupyterLab. This extension adds a main menu entry for recently opened/closed files. JupyterLab users now have this native functionality that provides a quick reference to files they have recently worked with. Further development work in JupyterLab core now also allows users to search for and access recently closed files and folders through a modal via the shortcut &lt;em&gt;Ctrl + Alt + A&lt;/em&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab 4.2.0 Recently Closed Submodal" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/images/002-1_0p77Tr6helRfOkwBIEt5Mg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab 4.2.0 Recently Closed Submodal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="full-notebook-windowing-mode-by-default"&gt;Full notebook windowing mode by default&lt;/h2&gt;
&lt;p&gt;The previously available full notebook windowing mode has now been made the default mode. This mode renders only the cells visible in the window, leading to improved performance. With this mode using the JupyterLab search function is recommended due to false negatives with the web browser’s native search functionality.&lt;/p&gt;
&lt;h2 id="improved-shortcuts-editor"&gt;Improved Shortcuts Editor&lt;/h2&gt;
&lt;p&gt;Users can enjoy an improved experience when customizing shortcuts. Various improvements have been made to the shortcuts editor, namely: default shortcuts can be deleted, and shortcuts are sorted appropriately when using a language pack. Entries for shortcuts with varying arguments are also now accurately presented as separate items.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Delete shortcut key binding option in modal." src="https://blog.jupyter.org/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/images/003-1_z8boqvL968A1NbhHbIDAdA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Modal option to delete shortcut key binding.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="dark-high-contrast-theme"&gt;Dark High Contrast Theme&lt;/h2&gt;
&lt;p&gt;The JupyterLab Dark High Contrast Theme is now available for users who might benefit from higher contrast as outlined by the WCAG AAA accessibility standards for color contrast.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab 4.2 Dark High Contrast Theme" src="https://blog.jupyter.org/posts/2024/jupyterlab-4-2-and-notebook-7-2-are-available/images/004-1_A-q4OYlI3gptT2CyU_mzoA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab 4.2.0 Dark High Contrast Theme&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="keyboard-shortcuts"&gt;Keyboard Shortcuts&lt;/h2&gt;
&lt;p&gt;The shortcuts extension received some improvements based on user feedback. The &lt;em&gt;Ctrl + D&lt;/em&gt; shortcut has been restored to allow users to use to delete a line. In the interest of code editor compatibility the &lt;em&gt;Ctrl + Shift + K&lt;/em&gt; shortcut can still be used for deleting lines and multi-cursor selection is now available via the default shortcut: &lt;em&gt;Ctrl + Shift + D&lt;/em&gt;. Users are now able to toggle line comments with the shortcut &lt;em&gt;Ctrl + /&lt;/em&gt; and toggle block comments with &lt;em&gt;Alt + A&lt;/em&gt;, both of which are customizable via the Settings Editor. This release also addresses &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/15744"&gt;issues&lt;/a&gt; related to using various keys on international keyboards in macOS.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the new contributors, we hope to see you back!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @linlol, @erkin98, @mdietz94, @UntitledError-09, @Susilkessav, @Tanmay-Deshmukh, @AnastasiaSliusar, @milinm, @Rob-P-Smith, @NexVeridian.&lt;/li&gt;
&lt;li&gt;Notebook: @afeld&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to returning contributors for their continued work!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @davidbrochart, @fcollonval, @FoSuCloud, @JasonWeill, @jtpio, @krassowski, @Alanhou1222, @divyansshhh, @itsmevichu, @kolibril13, @sawickid, @andrii-i, @bollwyvl, @brichet, @Mehak261124, @e218736, @echarles, @gabalafou, @m158261, @afshin, @minrk, @RRosio, @trungleduc, @blink1073, @diyoyo, @AllanChain, @ericsnekbytes, @HaudinFlorence&lt;/li&gt;
&lt;li&gt;Notebook: @jtpio, @krassowski&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab, Notebook and JupyterLab Desktop issues: @JasonWeill, @krassowski, @RRosio among others who attend.&lt;/p&gt;
&lt;p&gt;Contributors to this blog post: @krassowski, @jtpio, @JasonWeill, @RRosio.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLab 4.1 and Notebook 7.1 are here 🎉</title><link href="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/" rel="alternate"/><published>2024-02-26T22:57:00+00:00</published><updated>2024-02-28T17:47:00+00:00</updated><author><name>Project Jupyter</name></author><id>tag:blog.jupyter.org,2024-02-26:/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/</id><summary type="html">&lt;p&gt;JupyterLab 4.1 and Notebook 7.1 are now available! These releases include several new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0 and Notebook 7.0.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; 4.1 and &lt;a href="https://github.com/jupyter/notebook"&gt;Notebook&lt;/a&gt; 7.1 are now available! These releases include several new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0 and Notebook 7.0.&lt;/p&gt;
&lt;p&gt;JupyterLab 4.1 is one of the largest minor releases of JupyterLab to date, bringing 6 new features, 39 enhancements, and 114 bug fixes to users, and addressing 140 maintenance tasks. Project Jupyter thanks the 70 contributors, including 13 new code/documentation contributors, who helped us build this new version.&lt;/p&gt;
&lt;p&gt;Jupyter Notebook 7.1 is the first minor release after &lt;a href="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/"&gt;the transition to the new codebase&lt;/a&gt;, which re-uses JupyterLab components. As such, Notebook 7.1 inherits many of the new features and fixes from JupyterLab 4.1. Feature parity with Notebook 6 was also improved in this release.&lt;/p&gt;
&lt;p&gt;JupyterLab Desktop was also upgraded to version 4.1, receiving additional bug fixes and enhancements. Thank you to Mehmet Bektas for your continuing work to improve JupyterLab Desktop!&lt;/p&gt;
&lt;p&gt;Extension authors should consult the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-0-to-4-1"&gt;Extension Migration Guide&lt;/a&gt;, which lists deprecations and changes to the public API.&lt;/p&gt;
&lt;h2 id="custom-css"&gt;Custom CSS&lt;/h2&gt;
&lt;p&gt;JupyterLab now supports automatic loading of custom CSS. &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_dev.html#theme-plugins"&gt;Themes&lt;/a&gt; are the recommended way for customizing the JupyterLab look and feel, while custom CSS is intended for minor personal adjustments.&lt;/p&gt;
&lt;p&gt;To opt in, start JupyterLab with the &lt;code&gt;--custom-css&lt;/code&gt; flag. The location of the custom.css file is documented in the section on &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#custom-css"&gt;customizing the user interface&lt;/a&gt;. Please note that the CSS selectors may vary between versions and applications (JupyterLab vs Notebook).&lt;/p&gt;
&lt;h2 id="diagrams-in-markdown"&gt;Diagrams in Markdown&lt;/h2&gt;
&lt;p&gt;Matching GitHub-Flavoured Markdown, JupyterLab and Notebook now support &lt;a href="https://github.com/mermaid-js/mermaid"&gt;Mermaid&lt;/a&gt; diagrams. To create a Mermaid diagram, use the mermaid language specifier for a code block in a markdown cell or document, for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;```mermaid
flowchart LR

A[Hard] --&amp;gt;|Text| B(Round)
B --&amp;gt; C{Decision}
C --&amp;gt;|One| D[Result 1]
C --&amp;gt;|Two| E[Result 2]
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which renders as:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/001-0_PpZ4a6IMZOkvxz7W.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="inline-code-completion"&gt;Inline code completion&lt;/h2&gt;
&lt;p&gt;JupyterLab and Notebook now support automatic code (and text) completion presented as ghost text in the cell and file editors, allowing generative AI models to provide multi-line completions. The suggestions are provided by plugins implementing the IInlineCompletionProvider API. By default a single provider using the user’s kernel history is available.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/002-0_xMRyjiyaizpZ33vE.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The suggestions can be invoked as-you-type or manually using a configurable shortcut (by default &lt;code&gt;Alt + \&lt;/code&gt;). The default keyboard shortcuts are displayed in the small widget shown when hovering over the ghost suggestion.&lt;/p&gt;
&lt;p&gt;To enable the inline suggestions based on the kernel history, go to Settings → Settings Editor → Inline Completer → History provider → check the “enabled” checkbox.&lt;/p&gt;
&lt;p&gt;In addition to the built-in history suggestions, additional inline completion providers can be installed. For example, the &lt;a href="https://github.com/jupyterlab/jupyter-ai"&gt;jupyter-ai&lt;/a&gt; extension, version &lt;a href="https://github.com/jupyterlab/jupyter-ai/releases/tag/v2.10.0"&gt;2.10.0&lt;/a&gt; and newer, provides suggestions from compatible large language models.&lt;/p&gt;
&lt;p&gt;The Inline Completer API is still considered experimental and may be subject to change. Please share your feedback!&lt;/p&gt;
&lt;h2 id="keyboard-navigation-improvements"&gt;Keyboard navigation improvements&lt;/h2&gt;
&lt;p&gt;Numerous improvements to keyboard navigation with focus on accessibility and usability are included in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the notebook cells now retain focus&lt;/li&gt;
&lt;li&gt;the focus can now be moved beyond the active notebook&lt;/li&gt;
&lt;li&gt;the toolbars can now be navigated using arrow keys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details, see &lt;a href="https://blog.jupyter.org/posts/2023/recent-keyboard-navigation-improvements-in-jupyter/"&gt;the post on the Jupyter Blog about keyboard navigation improvements&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="execution-history-in-notebook"&gt;Execution history in notebook&lt;/h2&gt;
&lt;p&gt;The code from previously executed cells can be used to populate empty cells, letting users iterate on code from previous cells or even previous sessions, depending on how a specific kernel stores its history.&lt;/p&gt;
&lt;p&gt;To cycle between history items, press Alt + Arrow Up and Alt + Arrow Down.&lt;/p&gt;
&lt;p&gt;To enable execution history, go to Settings Editor → Notebook → check the “Kernel history access” checkbox.&lt;/p&gt;
&lt;p&gt;This feature was already available in the console in previous releases; it only works with kernels supporting execution history requests. To clear the execution history, consult the documentation of the kernel you are using (e.g., IPython/ipykernel).&lt;/p&gt;
&lt;h2 id="opening-files-from-tracebacks"&gt;Opening files from tracebacks&lt;/h2&gt;
&lt;p&gt;Paths to code files detected in error tracebacks are now turned into links. These links will open the corresponding file for editing, if it is in the Jupyter root directory, or they will open a read-only preview if the file is outside of the root directory and the active kernel supports the debugger.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/003-0_9RAGHslzMNiejAyi.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="error-indicator-in-the-table-of-contents"&gt;Error indicator in the table of contents&lt;/h2&gt;
&lt;p&gt;When a cell fails during execution, an error indicator will be displayed by the corresponding heading, increasing awareness of the notebook state and enabling users to quickly navigate to the cell which requires attention.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/004-0_LvMrjrwtXoQas0KA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="plugin-manager"&gt;Plugin Manager&lt;/h2&gt;
&lt;p&gt;Individual plugins can now be disabled or enabled from a new Plugin Manager user interface. While the existing extension manager can enable/disable entire extensions, each extension is composed of one or more plugins (and plugins form the basis of JupyterLab itself) thus the plugin manager enables more extensive customization of the JupyterLab experience in addition to the previously available extension manager.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/005-0_xFUeQMS4Ul12H5JG.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;This feature is intended for advanced users and is documented in depth in the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#managing-plugins-with-plugin-manager"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Administrators may want to &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#locking-and-unlocking-plugins"&gt;lock specific plugins&lt;/a&gt; if they are required for any reason; this will prevent users from disabling the plugins via Plugin Manager and remote API calls. The Plugin Manager itself can be &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#enabling-and-disabling-extensions"&gt;disabled using the CLI&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="virtual-scrollbar-for-notebook-in-windowed-mode"&gt;Virtual scrollbar for notebook in windowed mode&lt;/h2&gt;
&lt;p&gt;The windowed notebook now has an optional scrollbar that shows the active cell and selected cells. Users can jump to a specific cell.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2024/jupyterlab-4-1-and-notebook-7-1-are-here/images/006-0_XIIHUorBt2_HPYIh.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;To enable the virtual scrollbar, go to Settings → Notebook → Windowing mode, choose “full”, and click on the hamburger icon (≡) which appears in the notebook’s toolbar.&lt;/p&gt;
&lt;p&gt;Virtual scrollbar is an experimental feature. Please share your feedback!&lt;/p&gt;
&lt;h2 id="notifications"&gt;Notifications&lt;/h2&gt;
&lt;p&gt;JupyterLab 3.6 added a notification center which so far was only used for announcements and version update notifications (both opt-in). JupyterLab 4.1 adds two notifications to guide users in potentially confusing situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when a user attempts to save a read-only document, a transient notification suggesting using “save as” is displayed&lt;/li&gt;
&lt;li&gt;when a user attempts to execute a cell before a slow-starting kernel has initialized, a notification is shown to indicate that the cell cannot be yet executed (this is opt-in and needs to be enabled in settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="full-notebook-windowing-mode-improvements"&gt;Full notebook windowing mode improvements&lt;/h2&gt;
&lt;p&gt;Notebooks in the full windowing mode only render the visible cells, significantly improving the performance of the application. Numerous improvements for the full windowing mode behavior (such as scrolling, search, rendering, and navigation) are included in this release (see the list of issues in &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/15258"&gt;#15258&lt;/a&gt; for details). Note: the windowing mode is still experimental and &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/15258"&gt;known issues&lt;/a&gt; remain to be solved.&lt;/p&gt;
&lt;h2 id="search-improvements"&gt;Search improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The search box will now grow automatically to accommodate longer text&lt;/li&gt;
&lt;li&gt;Search in selection can now be toggled using Alt + L and automatic search in selection can be configured in settings&lt;/li&gt;
&lt;li&gt;Tooltips with shortcuts were added to the buttons in the search box to improve discoverability of the shortcuts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Special shout out to new code/documentation contributors (hope to see you again!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @alden-ilao @AllanChain @ashna1jain @brijsiyag @DcWire @DenisaCG @Deepali1211 @dhml @dolevf @eliaslma @emmanuel-ferdman @e4e @g547315 @jans-code @j264415 @kiliansinger @KiranmaiKalla @misterfads @mmichilot @mdengler @MFA-X-AI @m158261@nbowditch-einblick @nluetts @paolocarinci @pauky @paulkim3151 @phil-zxx @Rmarieta @RRosio @Sarthug99 @sinistersnare @t03857785 @Wh1isper&lt;/li&gt;
&lt;li&gt;Notebook: @Dilip-Jain @haok1402 @akx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to the returning contributors (please do feel invited to review pull requests as well!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab: @afshin @akx @andrewfulton9 @andrii-i @bollwyvl @bikash30851 @brichet @davidbrochart @divyansshhh @dharmaquark @DonJayamanne @echarles @ericsnekbytes @fcollonval @firai @FoSuCloud @gabalafou @hbcarlos @JasonWeill @jtpio @krassowski @mctoohey @minrk @nishikantparmariam @parmentelat @skyetim @smacke @SylvainCorlay @telamonian @tibdex @timkpaine @trungleduc @yuvipanda&lt;/li&gt;
&lt;li&gt;Notebook: @brichet @jtpio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and everyone who tested the pre-releases!&lt;/p&gt;
&lt;p&gt;Additionally, we would like to thank our community triage leaders who helped sort issues for JupyterLab (@JasonWeill), Notebook (@RRosio) and JupyterLab Desktop during the course of &lt;a href="https://github.com/jupyterlab/team-compass?tab=readme-ov-file#weekly-jupyter-triage-meeting"&gt;weekly triage meetings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contributors to this blog post: @JasonWeill @krassowski @gabalafou @jtpio&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLab 3 end of maintenance</title><link href="https://blog.jupyter.org/posts/2024/jupyterlab-3-end-of-maintenance/" rel="alternate"/><published>2024-02-19T22:07:00+00:00</published><updated>2024-02-19T22:07:00+00:00</updated><author><name>Project Jupyter</name></author><id>tag:blog.jupyter.org,2024-02-19:/posts/2024/jupyterlab-3-end-of-maintenance/</id><summary type="html">&lt;p&gt;The JupyterLab Council has agreed to an important change to JupyterLab’s version lifecycle. Each major version of JupyterLab will now receive updates until one year after the following major version’s first release.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The JupyterLab Council has agreed to an important change to &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/lifecycle.html"&gt;JupyterLab’s version lifecycle&lt;/a&gt;. Each major version of JupyterLab will now receive updates until &lt;strong&gt;one year after the following major version’s first release&lt;/strong&gt;. JupyterLab 4.0.0 was released on May 15, 2023, so &lt;strong&gt;JupyterLab 3 will reach its end of maintenance date on May 15, 2024, anywhere on Earth&lt;/strong&gt;. To help us make this transition, fixes for critical issues will still be backported until December 31, 2024. If you are still running JupyterLab 3, we strongly encourage you to &lt;strong&gt;upgrade to JupyterLab 4 as soon as possible&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This represents a change from JupyterLab’s previous policy, by which we supported two major versions of JupyterLab at a time, and which would have obligated us to continue supporting JupyterLab 3 until JupyterLab 5.0.0 became generally available. We decided to make this change to let developers, contributors, and users focus their attention on the newest major version, JupyterLab 4. Maintaining multiple major versions requires additional time and effort, which could instead be put towards making the current version better for all users. Recent releases on the 3.6.x branches have included mainly security fixes and maintenance fixes, not new features.&lt;/p&gt;
&lt;p&gt;We recognize that there are many users still using JupyterLab 3, having downloaded it directly from package repositories or using it as distributed by a commercial vendor. We strongly encourage all users and vendors to upgrade to Lab 4 as soon as possible. If this is not possible, out of acknowledgement for the short notice of this announcement, &lt;strong&gt;we will consider pull requests addressing critical issues against the 3.6.x branch through December 31, 2024, anywhere on Earth&lt;/strong&gt;, provided that they meet &lt;em&gt;all&lt;/em&gt; of the following requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The fix addresses a critical issue: a security vulnerability, data loss, or another issue of very high severity.&lt;/li&gt;
&lt;li&gt;The fix includes tests, is reasonably small and low in complexity, and the author communicates actively with maintainers who review their work.&lt;/li&gt;
&lt;li&gt;The fix is approved by a JupyterLab maintainer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The JupyterLab team recognizes that a few regressions from JupyterLab 3 were present in JupyterLab 4.0.0; &lt;a href="https://github.com/jupyterlab/jupyterlab/issues?q=is%3Aopen+is%3Aissue+label%3Atag%3ARegression+milestone%3A4.0.x"&gt;some of them are still open&lt;/a&gt;. Project Jupyter is driven by volunteers, community contributors, and support from individual and corporate users. We thank our community for their patience and we encourage our contributors to help us resolve bugs that block users from upgrading to the newer version. The JupyterLab maintainers are committing to review any pull requests submitted to address regressions as a priority over pull requests&lt;/p&gt;
&lt;p&gt;We want to hear from you! If you have questions or comments about this new version lifecycle, please leave them below, or join the conversation on the &lt;a href="https://discourse.jupyter.org/t/jupyterlab-3-end-of-maintenance/23867"&gt;Jupyter Community Forum&lt;/a&gt;. We also welcome discussion about the change at our weekly JupyterLab meetings, which are held every Wednesday at 09:00 US Pacific (17:00 UTC as of today, 16:00 UTC starting on March 10, 2024).&lt;/p&gt;
&lt;p&gt;Thank you for using JupyterLab and for being a part of our great global community!&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Voilà 0.5.0: Homecoming</title><link href="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/" rel="alternate"/><published>2023-09-25T14:54:00+00:00</published><updated>2023-09-25T14:54:00+00:00</updated><author><name>Duc Trung Le</name></author><id>tag:blog.jupyter.org,2023-09-25:/posts/2023/voila-0-5-0-homecoming/</id><summary type="html">&lt;p&gt;Voilà turns Jupyter notebooks into standalone web applications and dashboards. It provides a simple way for Jupyter users to share their work. For a detailed introduction to Jupyter’s Voilà subproject, you can check out this earlier blog post.&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/001-1_Oqkkz64NWqTFoS45sfprGQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Voilà&lt;/strong&gt;&lt;/em&gt; turns Jupyter notebooks into standalone web applications and dashboards. It provides a simple way for Jupyter users to share their work. For a detailed introduction to Jupyter’s Voilà subproject, you can check out this earlier &lt;a href="https://blog.jupyter.org/posts/2019/and-voila/"&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Up until the previous version, Voilà relied on custom JavaScript code to load extension assets and handle kernel connection. However, this approach had drawbacks since it only supported the now outdated Jupyter Notebook 6 extensions.&lt;/p&gt;
&lt;p&gt;Following the launch of &lt;a href="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/"&gt;Jupyter Notebook 7&lt;/a&gt;, it is now Voilà’s turn to join the JupyterLab family. In Version 0.5.0, the front-end of Voilà has been rebuilt from scratch using JupyterLab 4.0 components, just like in the case of Notebook 7. A JupyterLab plugin-based application replaces the current custom extension loader approach. This transition enables Voilà to leverage all the latest features and enhancements available upstream.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="new-features-in-voila-050"&gt;New features in Voilà 0.5.0&lt;/h2&gt;
&lt;h3 id="extension-loading-system"&gt;Extension loading system&lt;/h3&gt;
&lt;p&gt;As of Version 0.5.0, Voilà uses the same prebuilt extension system as JupyterLab. The extension assets are loaded from local paths rather than relying on a CDN, resulting in a significant enhancement to Voilà’s extension compatibility with the rest of the JupyterLab ecosystem. This change also avoids making requests for external services. Additionally, users can now develop extensions for Voilà using the same approach as for JupyterLab extensions.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A Voila dashboard with top bar extension and custom JupyterLab theme." src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/002-1_W1dHdjWC0CYoLjCWXXxU2w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A Voila dashboard with &lt;a href="https://github.com/voila-dashboards/voila-topbar"&gt;top bar extension&lt;/a&gt; and &lt;a href="https://github.com/timkpaine/jupyterlab_miami_nights"&gt;custom JupyterLab theme&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="mimetype-rendering-mechanism"&gt;Mimetype rendering mechanism&lt;/h3&gt;
&lt;p&gt;In 0.5.0, the logic for rendering cell outputs containing mimetypes has been revised, moving away from relying on &lt;code&gt;nbconvert&lt;/code&gt; and instead depending on JupyterLab mimetype renderers. This change adds support for a wide range of custom JupyterLab renderers such as &lt;code&gt;jupyterlab-fasta&lt;/code&gt;, &lt;code&gt;vega&lt;/code&gt;, &lt;code&gt;jupyterlab-geojson&lt;/code&gt;, etc.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Rendering mimetypes data in Voila" src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/003-1_WWRmwTs5v_U8HL27JzY7Uw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Rendering mimetypes data in Voila&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="new-tree-page"&gt;New tree page&lt;/h3&gt;
&lt;p&gt;The default tree page in Voilà has transitioned into a JupyterLab-based application incorporating the file browser widget. While the Jinja-based tree page remains available, users must opt for it using either the &lt;code&gt;--classic-tree&lt;/code&gt; CLI option or by appending &lt;code&gt;?classic-tree=True&lt;/code&gt; to the query string.&lt;/p&gt;
&lt;p&gt;The new tree page in Voilà supports JupyterLab custom themes, whereas the classic tree page is limited to light and dark themes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New tree page with a custom theme." src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/004-1_Yp5wC6yCRbCNejKtKZV8Ww.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New tree page with a &lt;a href="https://github.com/martinRenou/jupyterlab-night"&gt;custom theme&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="token-based-authentication-system"&gt;Token-based authentication system&lt;/h3&gt;
&lt;p&gt;Depending on the identity provider of &lt;code&gt;jupyter-server&lt;/code&gt; 2, Voilà now supports token authentication but is disabled by default.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To start Voilà with auto-generated token:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;voila&lt;span class="w"&gt; &lt;/span&gt;--token&lt;span class="w"&gt; &lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To start Voilà with a personalized token:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;voila&lt;span class="w"&gt; &lt;/span&gt;--token&lt;span class="o"&gt;=&lt;/span&gt;my-secret-token&lt;span class="w"&gt; &lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="installing-voila"&gt;Installing Voilà&lt;/h2&gt;
&lt;p&gt;Voila is available on both &lt;code&gt;PyPI&lt;/code&gt; and &lt;code&gt;conda-forge&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install with pip&lt;/span&gt;
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;voila

&lt;span class="c1"&gt;# Install with mamba&lt;/span&gt;
mamba&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;conda-forge&lt;span class="w"&gt; &lt;/span&gt;voila
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can try Voilà online using &lt;a href="https://voila-dashboards-voila-huggingface.hf.space/"&gt;this link&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;The contributions to Voilà by &lt;a href="https://github.com/QuantStack"&gt;&lt;strong&gt;QuantStack&lt;/strong&gt;&lt;/a&gt; are supported by &lt;a href="http://www.techatbloomberg.com/"&gt;&lt;strong&gt;Bloomberg&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-contributors"&gt;About the Contributors&lt;/h2&gt;
&lt;p&gt;Voilà is an official Jupyter subproject, it has resulted from the collective efforts of &lt;a href="https://github.com/voila-dashboards/voila/graphs/contributors"&gt;numerous contributors&lt;/a&gt;. Below, we highlight the primary contributors for this release:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/005-0_x5BSQzmN_DVAFLc5.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;&lt;strong&gt;Jeremy Tuloup&lt;/strong&gt;&lt;/a&gt; is a Technical Director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Maintainer and contributor of JupyterLab, Jupyter Notebook, JupyterLite, Voilà, and projects within the Jupyter ecosystem.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/006-0_jOsGiBpJ5Qt2t15C.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt;&lt;/a&gt; is a Project Director at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Martin works on a variety of projects, from &lt;a href="https://github.com/QuantStack/xtensor"&gt;xtensor&lt;/a&gt; and &lt;a href="https://github.com/QuantStack/xeus-python/"&gt;xeus-python&lt;/a&gt; in C++ to &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt;, &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt; in Python and TypeScript.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/voila-0-5-0-homecoming/images/007-1_uSLpGo9pf1l4HIaxPFYysg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/trungleduc"&gt;&lt;strong&gt;Le Duc Trung&lt;/strong&gt;&lt;/a&gt; is a Scientific Software Developer at QuantStack. He works on several projects within the Jupyter ecosystem, from the main projects like JupyterLab, Voilà, and ipywidgets to various JupyterLab extensions and widgets.&lt;/p&gt;
</content><category term="dashboards"/><category term="releases"/><category term="Voilà"/></entry><entry><title>Announcing Jupyter Notebook 7</title><link href="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/" rel="alternate"/><published>2023-07-26T16:08:00+00:00</published><updated>2023-07-28T21:24:00+00:00</updated><author><name>Project Jupyter</name></author><id>tag:blog.jupyter.org,2023-07-26:/posts/2023/announcing-jupyter-notebook-7/</id><summary type="html">&lt;p&gt;Jupyter Notebook 7 is the most significant release of the Jupyter Notebook in years. Some highlights of this release include real-time collaboration, interactive debugging, table of contents, theming and dark mode, internationalization, improved accessibility, compact view on mobile devices.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jupyter Notebook 7 is the most significant release of the Jupyter Notebook in years. Some highlights of this release include real-time collaboration, interactive debugging, table of contents, theming and dark mode, internationalization, improved accessibility, compact view on mobile devices.&lt;/p&gt;
&lt;p&gt;Both Jupyter Notebook and JupyterLab are widely used across data science, machine learning, computational research, and education. With the release of &lt;a href="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/"&gt;JupyterLab 4&lt;/a&gt; and Jupyter Notebook 7, the two sibling applications offer a unified, flexible, and integrated experience that allows you to get the best of both, in whatever combination that makes sense for you.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Notebook 7 with a running Python 3 notebook" src="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/images/001-0_1RXUtbuPrEJC95ut.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Notebook 7 with a running Python 3 notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Since Notebook 7 is based on JupyterLab, it includes many of the new features and improvements that have been added to JupyterLab over the past few years.&lt;/p&gt;
&lt;p&gt;Here is a small glimpse of what users can expect when they upgrade from Jupyter Notebook version 6 to version 7.&lt;/p&gt;
&lt;h2 id="a-familiar-document-oriented-experience"&gt;A Familiar Document-Oriented Experience&lt;/h2&gt;
&lt;p&gt;Starting with what does not change, Notebook 7 still focuses on the &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html#a-document-centric-user-experience"&gt;document-centric user experience&lt;/a&gt; that made the classic IPython and Jupyter Notebook application so popular.&lt;/p&gt;
&lt;p&gt;It keeps the clean and lean interface that users love, and it enables you to create and edit the same Jupyter notebook &lt;code&gt;.ipynb&lt;/code&gt; files that contain live code, equations, visualizations and narrative text.&lt;/p&gt;
&lt;h2 id="visual-debugger"&gt;Visual Debugger&lt;/h2&gt;
&lt;p&gt;Notebook 7 includes the &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html#debugger"&gt;interactive debugger&lt;/a&gt; from JupyterLab, which enables you to step through your code cell by cell. You can also set breakpoints and inspect variables.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Visual debugging in Jupyter Notebook 7" src="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/images/002-0_E7VuIsVkLGz_0qWM.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Visual debugging in Jupyter Notebook 7&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="real-time-collaboration"&gt;Real-Time Collaboration&lt;/h2&gt;
&lt;p&gt;Notebook 7 enables you to use the same &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html#real-time-collaboration"&gt;real-time collaboration&lt;/a&gt; extension as JupyterLab so you can share your notebook with other users and edit it in real time. This even works across JupyterLab and Jupyter Notebook! To start using real-time collaboration, you will need to install the &lt;code&gt;jupyter-collaboration&lt;/code&gt; extension:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyter-collaboration
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="A side-by-side animated example of real-time collaboration in Jupyter Notebook 7" src="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/images/003-0_aiZac10EROHCzjDH.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A side-by-side animated example of real-time collaboration in Jupyter Notebook 7&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="theming-and-dark-mode"&gt;Theming and Dark Mode&lt;/h2&gt;
&lt;p&gt;A dark &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html#theming-and-dark-mode"&gt;theme&lt;/a&gt; is now available in the Jupyter Notebook by default.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Notebook 7 with JupyterLab Dark theme" src="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/images/004-0_dB66sd0Lj_Tkj1zv.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Notebook 7 with JupyterLab Dark theme&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You can also install many other JupyterLab themes. For example to install the JupyterLab night theme:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyterlab-night
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Notebook 7 with JupyterLab Night theme" src="https://blog.jupyter.org/posts/2023/announcing-jupyter-notebook-7/images/005-0_IpQyDee4zZ5VJAkM.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Notebook 7 with JupyterLab Night theme&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="improved-integration-between-jupyterlab-and-notebook"&gt;Improved integration between JupyterLab and Notebook&lt;/h2&gt;
&lt;p&gt;We have built Notebook 7 and JupyterLab 4 to work well together. When you run either application using &lt;code&gt;jupyter lab&lt;/code&gt; or &lt;code&gt;jupyter notebook&lt;/code&gt;, we automatically detect if the other application is installed and enable its user experience as well. This is possible as both JupyterLab and Notebook use the same underlying server and extension system. From a user experience perspective, this allows you to easily open a notebook in the other application using the “JupyterLab” and “Notebook” buttons as the top of each notebook. This makes it seamless to move back and forth between the two applications to best match your work.&lt;/p&gt;
&lt;h2 id="more-features"&gt;More features&lt;/h2&gt;
&lt;p&gt;You can find a list of the new features in the &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html"&gt;Jupyter Notebook documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-a-new-version"&gt;Why a new version?&lt;/h2&gt;
&lt;p&gt;Following feedback from the community, we decided in late 2021 to continue developing the Jupyter Notebook application and sunrise it as Notebook 7.&lt;/p&gt;
&lt;p&gt;The major change is building the Jupyter Notebook 7 interface with JupyterLab components so that the two applications share a common codebase and extension system. We have worked hard to ensure that the experience users know and love from Jupyter Notebook 6 is preserved, even as we have added many new features to Notebook 7. Let’s dive into those new features!&lt;/p&gt;
&lt;p&gt;You can find more details about the rationale behind this new release in &lt;a href="https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html"&gt;Jupyter Enhancement Proposal 79&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="migrating-to-notebook-7"&gt;Migrating to Notebook 7&lt;/h2&gt;
&lt;p&gt;The Jupyter Notebook Team has been working to make the transition from Notebook 6 to Notebook 7 as smooth as possible. The Notebook 7 release is a good opportunity to try out the new features and report any issues you may encounter.&lt;/p&gt;
&lt;p&gt;Because the architecture of Notebook 7 is rebuilt from the ground up, we recognize that some existing users might need a medium-term option for backward-compatibility with Notebook 6 using &lt;a href="https://nbclassic.readthedocs.io/en/latest/nbclassic.html"&gt;NbClassic&lt;/a&gt;, which delivers the same user experience and can be run on the same server as JupyterLab and Notebook 7. This means that the server hosting your Notebook can deliver those 3 difference user interfaces at the same time.&lt;/p&gt;
&lt;p&gt;There is also a &lt;a href="https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html"&gt;migration guide&lt;/a&gt; to help you upgrade to the new version.&lt;/p&gt;
&lt;h2 id="try-it-on-binder"&gt;Try it on Binder&lt;/h2&gt;
&lt;p&gt;You can try Notebook 7 on Binder using &lt;a href="https://mybinder.org/v2/gist/jtpio/d368ab89cee5123ecee60683115e15f3/master?urlpath=/tree"&gt;this link&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The work on Notebook 7 by Jeremy Tuloup was supported by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://anaconda.com/"&gt;Anaconda&lt;/a&gt; supported work on Notebook 6 and 7, NbClassic, documentation and maintenance.&lt;/p&gt;
&lt;h2 id="get-involved"&gt;Get Involved&lt;/h2&gt;
&lt;p&gt;There are many ways you can participate in the Notebook 7 effort. We welcome contributions from all members of the Jupyter community:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make your own extensions. You can also help the community by porting Classic Notebook extensions to Notebook 7.&lt;/li&gt;
&lt;li&gt;Contribute to the development, documentation, and design of Jupyter Notebook on GitHub. To get started with development, please see the Contributing Guide and Code of Conduct. Many issues are ideal for new contributors and are tagged as “good first issue” or “help wanted”.&lt;/li&gt;
&lt;li&gt;Connect with the community on GitHub or on Discourse. If you find a bug, have questions, or want to provide feedback, please join the conversation!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="Jupyter Notebook"/><category term="releases"/></entry><entry><title>JupyterLab 4.0 is Here</title><link href="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/" rel="alternate"/><published>2023-06-05T20:04:00+00:00</published><updated>2023-06-05T21:25:00+00:00</updated><author><name>Jason Weill</name></author><id>tag:blog.jupyter.org,2023-06-05:/posts/2023/jupyterlab-4-0-is-here/</id><summary type="html">&lt;p&gt;The Jupyter contributor community is proud to announce JupyterLab 4.0, the next major release of our full-featured development environment. The package is now available on PyPI and conda-forge. You can upgrade by running pip install --upgrade jupyterlab or conda install -c conda-forge jupyterlab.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Jupyter contributor community is proud to announce JupyterLab 4.0, the next major release of our full-featured development environment. The package is now available on PyPI and conda-forge. You can upgrade by running &lt;code&gt;pip install --upgrade jupyterlab&lt;/code&gt; or &lt;code&gt;conda install -c conda-forge jupyterlab&lt;/code&gt;. We have updated our &lt;a href="https://jupyterlab.readthedocs.io/en/latest/index.html"&gt;JupyterLab Documentation&lt;/a&gt; for this new version.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/images/001-1_Y3aNGoRED2q0pWjlHmr9wg.webp" alt="A screen shot of JupyterLab 4, showing many of its new and improved features." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Here are some of the major new features in JupyterLab 4.0, excerpted from our &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html"&gt;changelog&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JupyterLab is now faster&lt;/strong&gt;, thanks to improvements such as CSS rules optimization, CodeMirror 6, MathJax 3, and notebook windowing. By rendering only the parts of a notebook that fit in the web browser viewport, JupyterLab 4 is much more efficient than JupyterLab 3 was when working with large notebooks.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/images/002-1_382cHBlUd2-kgWzpci8OOw.mp4" alt="A side-by-side animated comparison of performance between JupyterLab 3 and 4." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;There are additional performance improvements available via opt-in settings. You can help test them out by enabling them in your settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faster tab-switching on Chromium browsers:&lt;br&gt;
“Settings” → “JupyterLab Shell” → switch “Hidden mode” to “contentVisibility”&lt;/li&gt;
&lt;li&gt;Better performance with long notebooks:&lt;br&gt;
“Settings” → “Notebook” → switch “Windowing mode” to “full”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;An upgraded text editor.&lt;/strong&gt; CodeMirror, the text editor used for cells and file editors, has been updated to &lt;a href="https://codemirror.net/"&gt;CodeMirror 6&lt;/a&gt;. This brings important accessibility and performance improvements as well as better customization capabilities. We have also improved the editor settings to be more powerful and more flexible.&lt;/p&gt;
&lt;p&gt;We have moved &lt;strong&gt;real-time collaboration&lt;/strong&gt; (RTC) into a separate package, &lt;a href="https://github.com/jupyterlab/jupyter_collaboration"&gt;jupyter_collaboration&lt;/a&gt;, version 1.0.0 of which is &lt;a href="https://github.com/jupyterlab/jupyter_collaboration/releases/tag/v1.0.0"&gt;now available&lt;/a&gt;. Highlights include support for displaying multiple cursors and selections, and support for registration of new shared model types. If you’d like to use RTC in JupyterLab 4, please install the jupyter_collaboration package.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/images/003-1_DL6GE3nEYT9SGn7oDGnydQ.mp4" alt="A side-by-side animated view of two users collaborating in JupyterLab 4 using the jupyter_collaboration package for real-time collaboration (RTC)" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A new extension manager.&lt;/strong&gt; In JupyterLab 4, the Extension Manager includes both prebuilt Python extensions and extensions from &lt;a href="https://pypi.org/search/?c=Framework+%3A%3A+Jupyter+%3A%3A+JupyterLab"&gt;pypi.org&lt;/a&gt;. Installing from PyPI removes the need to build when installing an extension using the Extension Manager. Developers can provide an alternative package repository to display their own set of extensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Improved document search.&lt;/strong&gt; The Search and Replace functionality has been improved with new features when searching in a notebook, including highlighting matches in rendered markdown cells, searching in the current selection, multi-line search, replacement using regular expression capture-group references, and replacement while preserving case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UI improvements,&lt;/strong&gt; including a reworked running kernels section, an “Add a new cell” button at the bottom of a notebook, a dialog to display keyboard shortcuts as in the Classic Notebook (use Ctrl + Shift + H), and displaying the first line of collapsed cell inputs and outputs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility improvements,&lt;/strong&gt; including improved focus and keyboard navigation in the file browser, more ARIA roles and labels for UI elements, and the main menu collapsing to a hamburger menu if there is not enough space to display all items.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development tool updates&lt;/strong&gt; to TypeScript v5, Yarn v3, React v18, and Lumino v2. We recommend using Node.js v18 or newer, to ensure that you’re using a version that will continue to receive updates through at least the end of 2023.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bug fixes.&lt;/strong&gt; More than 100 bugs have been addressed and resolved, enhancing JupyterLab’s stability and performance. You can find a full list of bug fixes &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.0.0rc0"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition, a few features in JupyterLab 4 have also been backported to JupyterLab 3.6, but if you’re upgrading from 3.5 or earlier, they will also be new to you:&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;dual-mode settings editor&lt;/strong&gt; now offers a JSON editor and a new, user-friendly interactive mode, built with React JSON Schema. This intuitive interface makes customization accessible to users of all skill levels.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;cell toolbar&lt;/strong&gt;, a graphical interface for quick cell manipulation (copy, move, insert, delete), provides an alternative to hotkeys or dropdown menu editing. The cell toolbar appears in the current cell as long as there is room for it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notifications&lt;/strong&gt; come from extensions and from JupyterLab itself, for real-time announcements, alerts, and updates. This enhances JupyterLab’s responsiveness and provides a way to stay informed about ongoing processes. Announcements from the JupyterLab team, including new version notifications, can be disabled; see the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/announcements.html"&gt;documentation&lt;/a&gt; for instructions.&lt;/p&gt;
&lt;p&gt;Thank you to all the users, contributors, extension developers, and community members who helped make this major new release possible. We encourage everyone to try this new version out. If you notice anything unexpected, please &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/new/choose"&gt;file an issue on GitHub&lt;/a&gt; or ask us about it on &lt;a href="https://discourse.jupyter.org/"&gt;Discourse&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Author’s note: This article is published on behalf of Project Jupyter. I appreciate the contributions of the JupyterLab developers who contributed to it.&lt;/em&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Jupyter Server 2.0 is released!</title><link href="https://blog.jupyter.org/posts/2022/jupyter-server-2-0-is-released/" rel="alternate"/><published>2022-12-06T23:25:00+00:00</published><updated>2022-12-06T23:25:00+00:00</updated><author><name>Zach Sailer</name></author><id>tag:blog.jupyter.org,2022-12-06:/posts/2022/jupyter-server-2-0-is-released/</id><summary type="html">&lt;p&gt;This release brings many new features and lays groundwork for a more multi-user, (real-time) collaborative Jupyter experience.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are thrilled to announce the release of Jupyter Server 2.0!&lt;/p&gt;
&lt;p&gt;Jupyter Server provides the core web server that powers JupyterLab and Jupyter Notebook.&lt;/p&gt;
&lt;p&gt;This release brings many new features and lays groundwork for a more multi-user, (real-time) collaborative Jupyter experience.&lt;/p&gt;
&lt;h2 id="major-highlights"&gt;Major Highlights&lt;/h2&gt;
&lt;p&gt;Below is a short list of highlights for everyone! 🚀&lt;/p&gt;
&lt;h3 id="new-identity-api"&gt;New Identity API&lt;/h3&gt;
&lt;p&gt;As Jupyter continues to innovate its real-time collaboration experience, &lt;strong&gt;identity&lt;/strong&gt; is an important component. While we all love that mysterious “Anonymous Jovyan” appearing in our notebooks, we’d prefer to know who is editing/viewing our documents.&lt;/p&gt;
&lt;p&gt;The new &lt;a href="https://jupyter-server.readthedocs.io/en/latest/operators/security.html#identity-providers"&gt;Identity API&lt;/a&gt; in Jupyter Server makes this possible. It is a configurable, pluggable API that provides a clear extension point to customize how Jupyter Server authenticates and identifies its users.&lt;/p&gt;
&lt;p&gt;Deployers of Jupyter Server can configure Server’s default &lt;code&gt;IdentityProvider&lt;/code&gt; or swap in their own &lt;code&gt;IdentityProvider&lt;/code&gt; to authenticate users with any auth provider.&lt;/p&gt;
&lt;h3 id="new-authorization-api"&gt;New Authorization API&lt;/h3&gt;
&lt;p&gt;Enabling collaboration on a notebook shouldn’t mean &lt;em&gt;“allow everyone with access to my Jupyter Server to edit my notebooks”&lt;/em&gt;. What if I want to share my notebook with e.g. a subset of my teammates?&lt;/p&gt;
&lt;p&gt;The new &lt;a href="https://jupyter-server.readthedocs.io/en/latest/operators/security.html#authorization"&gt;Jupyter Server Authorization API&lt;/a&gt; is a critical step towards making this type of “fine-grained” permission management possible.&lt;/p&gt;
&lt;p&gt;It provides a clear, pluggable extension point where we can build authorization layers (e.g. RBAC) backed by any auth provider. Deployers of Jupyter Server can extend Jupyter Server’s new &lt;code&gt;Authorizer&lt;/code&gt; API to control user access in a running Jupyter Server.&lt;/p&gt;
&lt;h3 id="new-event-system-api"&gt;New Event System API&lt;/h3&gt;
&lt;p&gt;Looking ahead at Jupyter’s future, it became clear that there is a whole class of untapped features — like &lt;strong&gt;notebook commenting&lt;/strong&gt; or &lt;strong&gt;notifications&lt;/strong&gt;— that need a Jupyter “&lt;a href="https://github.com/jupyter-server/jupyter_server/issues/780"&gt;event system&lt;/a&gt;&amp;quot;; these features &lt;em&gt;react&lt;/em&gt; to events happening in and around a running Server.&lt;/p&gt;
&lt;p&gt;This led us to create &lt;a href="https://github.com/jupyter/jupyter_events"&gt;jupyter_events&lt;/a&gt;—a package that provides a JSON-schema-based event-driven system to Jupyter Server and server extensions. Jupyter Server leverages this new system to emit events from the server. Keep an eye out for future development where we will define more “core” events (similar to the &lt;a href="https://github.com/jupyter-server/jupyter_server/blob/main/jupyter_server/event_schemas/contents_service/v1.yaml"&gt;Contents Service Events&lt;/a&gt;) to enable better event-driven functionality in the Server.&lt;/p&gt;
&lt;h2 id="other-major-changes"&gt;Other major changes&lt;/h2&gt;
&lt;p&gt;Below is list of other major changes and features that impact folks who extend + customize the Jupyter Server experience. This section is a little more technical in nature, but offers some exciting updates for folks who customize Jupyter Server.&lt;/p&gt;
&lt;h3 id="new-kernel-websocket-api"&gt;New Kernel Websocket API&lt;/h3&gt;
&lt;p&gt;Jupyter Server now provides a configurable, pluggable layer between the kernel’s ZMQ sockets and websocket, called the &lt;code&gt;KernelWebsocketConnection&lt;/code&gt;. This enables folks to innovate in the space between kernels and the server’s clients.&lt;/p&gt;
&lt;h3 id="server-ships-its-own-kernel-manager"&gt;Server ships its own Kernel Manager&lt;/h3&gt;
&lt;p&gt;Jupyter Server now provides its own kernel manager class, &lt;code&gt;ServerKernelManager&lt;/code&gt;. This enables us to innovate the kernel management layer to specifically fit the needs of Jupyter Server and add features like kernel-based events, persistence, and other kernel lifecycle-related functionality&lt;/p&gt;
&lt;p&gt;This affects folks who have extended the default &lt;code&gt;KernelManager&lt;/code&gt; with custom functionality — they will need to derive from this new class in order to take advantage of new server-specific functionality.&lt;/p&gt;
&lt;h3 id="terminals-service-is-now-a-server-extension"&gt;Terminals Service is now a Server Extension&lt;/h3&gt;
&lt;p&gt;Jupyter Server now ships the “Terminals Service” as an extension (installed and enabled by default) rather than a core Jupyter Service.&lt;/p&gt;
&lt;p&gt;Most users will not notice this change, but this enables terminals to be optionally &lt;em&gt;disabled&lt;/em&gt;. For more sensitive deployment environments, this is a big win!&lt;/p&gt;
&lt;h3 id="pytest-jupyter-a-pytest-plugin-for-jupyter"&gt;pytest-jupyter, a pytest plugin for Jupyter&lt;/h3&gt;
&lt;p&gt;As we worked to increase our test coverage to ~80% (major “thank you” to Steve Silvester!), we built a handy set of &lt;a href="https://docs.pytest.org/en/6.2.x/fixture.html"&gt;pytest fixtures&lt;/a&gt; that can benefit Jupyter developers and extension authors.&lt;/p&gt;
&lt;p&gt;This led us to release &lt;a href="https://github.com/jupyter-server/pytest-jupyter"&gt;pytest-jupyter&lt;/a&gt;, a packaged pytest plugin for testing Jupyter core libraries and extensions.&lt;/p&gt;
&lt;h2 id="changelog"&gt;Changelog&lt;/h2&gt;
&lt;p&gt;This post was only an overview of what’s new in 2.0! If you are looking for a more complete list of the changes including bug fixes, be sure to have a look at the &lt;a href="https://github.com/jupyter-server/jupyter_server/releases/tag/v2.0.0"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install Jupyter Server with &lt;code&gt;pip&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyter_server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or with conda:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;conda install -c conda-forge jupyter_server=2.0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="documentation"&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Find our full documentation &lt;a href="https://jupyter-server.readthedocs.io/en/latest/index.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are still catching up! Please have patience with us as we continue to update our documentation. If this is something you’d be interested in helping us improve, we’d love your help!&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Massive “thank you” to the whole Jupyter Server Team. The Jupyter Server project is largely shepherded by the amazing folks listed &lt;a href="https://jupyter-server-team-compass.readthedocs.io/en/latest/team.html#active-members"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’re also incredibly grateful to the large list of contributors outside the team. Y’all are the best! Thank you for helping us make Jupyter Server better each day!&lt;/p&gt;
&lt;p&gt;If you’re interested in meeting or getting involved with the team, stop by one of our &lt;a href="https://jupyter-server.readthedocs.io/en/latest/contributors/team-meetings.html"&gt;weekly community meetings&lt;/a&gt;, or better yet, join our &lt;a href="https://github.com/jupyter-server/team-compass/issues/22"&gt;Contributing Hour&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Zsailer"&gt;Zach Sailer&lt;/a&gt; is a Senior Software Engineer at Apple, where he is the Jupyter Open Source Champion. He is a Jupyter Distinguished Contributor and the Jupyter Server Steering Council Representative.&lt;/p&gt;
</content><category term="Jupyter Server"/><category term="releases"/></entry><entry><title>Jupyter Notebook 6.5.0 Release Candidate</title><link href="https://blog.jupyter.org/posts/2022/jupyter-notebook-6-5-0-release-candidate/" rel="alternate"/><published>2022-09-15T15:01:00+00:00</published><updated>2022-09-15T15:57:00+00:00</updated><author><name>Rosio Reyes</name></author><id>tag:blog.jupyter.org,2022-09-15:/posts/2022/jupyter-notebook-6-5-0-release-candidate/</id><summary type="html">&lt;p&gt;We’d like to announce the Notebook 6.5.0 release candidate which is available on PyPI.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We’d like to announce the Notebook 6.5.0 release candidate which is available on PyPI.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Notebook 6.5.0rc0 on PyPI" src="https://blog.jupyter.org/posts/2022/jupyter-notebook-6-5-0-release-candidate/images/001-1_xw3KHBE_XmDg72zKiZ-LZw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Notebook 6.5.0rc0 on PyPI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="notebook-6-vs-notebook-7"&gt;Notebook 6 vs Notebook 7&lt;/h2&gt;
&lt;p&gt;Jupyter Notebook is a longstanding project that has been loved by many for years. Even with the 2018 release of JupyterLab, a feature-full user interface with a more modern codebase, many people have continued to use Jupyter Notebook. In an effort to continue providing updates to the UI that people know and love, many developers have been working on Jupyter Notebook 7. This transition was outlined in the Jupyter Enhancement Proposal or &lt;a href="https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html"&gt;JEP 79&lt;/a&gt;, which highlights the motivation behind an updated codebase and the plans that are currently being carried out. Notebook 7 uses components from &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; and the Jupyter Server package as does JupyterLab, and the UI provides an experience much like the classic user interface that Jupyter Notebook users are familiar with. There are various new features which will be readily available, and improvements are to be made in Jupyter Notebook 7.&lt;/p&gt;
&lt;p&gt;Due to this upcoming release, there were some necessary changes that had to be made to Jupyter Notebook 6. Jupyter Notebook 6 has lived in the &lt;a href="https://github.com/jupyter/notebook"&gt;jupyter/notebook&lt;/a&gt; repository whose main branch reflects Notebook 7. Notebook 6 uses the same Python Tornado server architecture, and the NotebookApp class that has been present all through previous Notebook releases. However, as of Notebook 6.5 the static HTML/CSS/JS assets that constitute the user interface have been moved to a different repository, the &lt;a href="https://github.com/jupyter/nbclassic"&gt;jupyter/nbclassic&lt;/a&gt; repository. Notebook 6.5 aims to be end of life in a reasonable timeframe. With this in mind, Notebook 6.5 will focus on security and bug fixes rather than new features.&lt;/p&gt;
&lt;h2 id="nbclassic"&gt;NbClassic&lt;/h2&gt;
&lt;p&gt;With the more sustainable Notebook 7 in the horizon, and Notebook 6.5 being EOL, the NbClassic project is the repository through which enhancements and new features can be offered. NbClassic is a forked version of the 6.5.x branch of Notebook, refactored as a &lt;a href="https://jupyter-server.readthedocs.io/en/latest/developers/extensions.html"&gt;Jupyter Server extension&lt;/a&gt;. Through this, users can benefit from the updates to other parts of the ecosystem such as Jupyter Server. While the classic user interface will be available through both Notebook 6 and NbClassic, immediate updates to the classic Notebook UI will be provided through NbClassic.&lt;/p&gt;
&lt;p&gt;Since as of Notebook 6.5, the static assets for the UI have been removed from the Notebook repository and are made available to Notebook 6.5 through NbClassic, and the NbClassic repository is also where issues with the classic user interface should be reported. The NbClassic project aims to provide intermediary support to those users of Notebook 6 who for various reasons may not yet be able to upgrade to Notebook 7. As NbClassic can be seen as a drop-in replacement to Notebook 6, its support and lifecycle will follow the one defined for the Notebook 6 product line. For more details on the maintenance of Notebook projects please have a look at the Maintained versions section in the &lt;a href="https://github.com/jupyter/Notebook#readme"&gt;readme&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As from version 0.4.0, NbClassic is a Jupyter Server extension that is backwards compatible with most extensions built for Notebook for version 6. If your extension does not work on NbClassic, we invite you to open an issue on the &lt;a href="https://github.com/jupyter/nbclassic/issues"&gt;NbClassic GitHub repository&lt;/a&gt; so we can help you resolve it.&lt;/p&gt;
&lt;h2 id="some-use-cases"&gt;Some Use Cases&lt;/h2&gt;
&lt;p&gt;One reason a user might not be able to update may be due to a user toolset that incorporates an extension that has not yet been ported to Notebook 7 and JupyterLab. In these cases, it will be important for extension developers to place an upper bound in their Notebook dependencies so that only versions below Notebook 7 will be installed. There may also be users who have both JupyterLab extensions and Notebook extensions as a part of their toolset.&lt;/p&gt;
&lt;p&gt;Another scenario may include DevOps Engineers who may provide Notebook 6 or 7, NbClassic, and JupyterLab to users to account for the different needs of many teams. In that scenario, the user can choose his user interface that runs on the same server port. For example if both Notebook 7 and NbClassic are installed, the default interface will be Notebook 7 under &lt;code&gt;/tree&lt;/code&gt; URL while the NbClassic interface will be available under &lt;code&gt;nbclassic/tree&lt;/code&gt; URL&lt;/p&gt;
&lt;h2 id="compatibility"&gt;Compatibility&lt;/h2&gt;
&lt;p&gt;For the various use cases, we aim to foster the coexistence of these projects while users and developers begin adapting to Notebook 7. Jupyter Notebook 7, JupyterLab and NbClassic share the same server architecture, allowing users to more feasibly use them interchangeably. On the other hand, Jupyter Notebook 6 will only be tied to NbClassic for the static assets that it will use. Extensions that work with Notebook 6 will be compatible with NbClassic while extensions developed for JupyterLab will work with Notebook 7. If users wish to use the upcoming Notebook 7 but have the ability to occasionally work with extensions that have not been ported, NbClassic will provide this. You can use NbClassic with the CLI command &lt;code&gt;jupyter nbclassic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;DevOps Engineers will have to use a slightly different command to enable the notebook extension on NbClassic. For example, they will have to use &lt;code&gt;jupyter nbclassic-extension&lt;/code&gt; instead of &lt;code&gt;jupyter nbextension&lt;/code&gt;. We are working on updating the documentation to reflect those changes.&lt;/p&gt;
&lt;h2 id="next-steps"&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;With the release of Jupyter Notebook 6.5.0rc0, we hope to reach those who continue to use Notebook 6 and hear about your experience. The Jupyter Notebook 6.5.0 release candidate can be installed with pip: &lt;code&gt;pip install notebook==6.5.0rc0&lt;/code&gt;. For those who wish to continue using a user interface much like the classic Notebook that is familiar, Notebook 7 has an alpha release and will provide a well supported and evolving user interface. Alongside working to release Notebook 6.5 and the upcoming Notebook 7 release, we will be continuing to work on preparing NbClassic to be used with the various other Jupyter projects and gearing up for the first major release.&lt;/p&gt;
&lt;p&gt;We would be happy to hear about your experience using Notebook 6.5.0rc0. For any questions, feedback, or bug reports, we invite you to &lt;a href="https://github.com/jupyter/nbclassic/issues"&gt;open an issue&lt;/a&gt; in the NbClassic repository.&lt;/p&gt;
&lt;p&gt;Sincerely,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rosio Reyes&lt;/strong&gt; is a Software Engineer at Anaconda working as a part of the OSS Jupyter team. She is a Jupyter Notebook Steering Council Member and contributes to the Notebook and NbClassic projects.&lt;/p&gt;
&lt;h2 id="thank-you-to-contributors-to-this-blog"&gt;Thank You to Contributors to this blog&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Eric Charles&lt;/strong&gt; is a Software Engineer at Anaconda, Datalayer and Quansight working as a Tech Lead on the OSS Jupyter team. He is a Jupyter contributor and a member of the Jupyter Notebook Steering Council. He contributes to many Jupyter Projects and provided an outline for the blog as well as many edits and additions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eric Gentry&lt;/strong&gt;, a Software Engineer at Anaconda working on the OSS Jupyter team. He is a Jupyter Notebook Steering Council Member and contributes to the Notebook and NbClassic projects. He also provided many edits for the blog.&lt;/p&gt;
&lt;p&gt;Special thanks to the Jupyter Notebook Meeting Group for their feedback.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="releases"/></entry><entry><title>Upgrading Nbgrader</title><link href="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/" rel="alternate"/><published>2022-09-15T07:51:00+00:00</published><updated>2022-09-15T08:09:00+00:00</updated><author><name>Nicolas Brichet</name></author><id>tag:blog.jupyter.org,2022-09-15:/posts/2022/upgrading-nbgrader/</id><summary type="html">&lt;p&gt;Project Jupyter provides a broad collection of open-source tools for interactive computing that has become ubiquitous in data science and scientific computing, and is very popular in educational contexts.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Project Jupyter&lt;/em&gt; provides a broad collection of open-source tools for interactive computing that has become ubiquitous in data science and scientific computing, and is very popular in educational contexts.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nbgrader.readthedocs.io/en/stable/"&gt;&lt;em&gt;Nbgrader&lt;/em&gt;&lt;/a&gt;, started by &lt;a href="https://twitter.com/jhamrick"&gt;Jessica Hamrick&lt;/a&gt; in 2014, is an extension for creating notebook-based assignments, online courses, and for auto-grading these assignments. It is central to many Jupyter-based services used by teaching institutions.&lt;/p&gt;
&lt;p&gt;As a large part of the Jupyter user base has adopted the JupyterLab frontend, most of the popular extensions to the classic notebook UI now have an equivalent in the JupyterLab world. Unfortunately, the nbgrader extension was still outstanding as it had not yet been ported to the JupyterLab extension system. Resolving this has become critical as it was recently decided in a &lt;a href="https://github.com/jupyter/enhancement-proposals/blob/master/79-notebook-v7/notebook-v7.md"&gt;Jupyter Enhancement Proposal&lt;/a&gt; (JEP) that the next major version of the Notebook package (v7) will be based on JupyterLab components, and will rely on the JupyterLab extension mechanism. As part of this JEP, it was decided that the release of Notebook 7 should be contingent on porting certain popular classic notebook extensions to JupyterLab, including nbgrader.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Upgrading nbgrader is an important step for the advancement of the Jupyter project!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="nbgrader-08"&gt;Nbgrader 0.8&lt;/h2&gt;
&lt;p&gt;The port of nbgrader to JupyterLab is a longstanding request of the community. A lot of work had already been done on this front by contributors to the &lt;a href="https://ngshare.readthedocs.io/en/latest/"&gt;ngshare&lt;/a&gt; project (Kevin Rong, Abigail Almanza, Lawrence Lee, and Eric Li) who developed a large part of the JupyterLab-based UI, but did not finalize the migration due to lack of time. Fortunately, they made their work available to the community for others to complete the upgrade. This includes the development of the remaining elements of the UI, the adaptation of the server-side extension, and adding tests on the JupyterLab extensions to improve the CI. The nbgrader 0.8 release also includes other significant work items such as the upgrade to nbconvert 6, the switch from the notebook server to jupyter-server, and the adoption of the jupyter releaser.&lt;/p&gt;
&lt;p&gt;Today, we are pleased to announce the release of nbgrader 0.8.0, the first release of the extension to support the JupyterLab frontend.&lt;/p&gt;
&lt;h3 id="creating-an-assignment"&gt;Creating an assignment&lt;/h3&gt;
&lt;p&gt;Teachers can create assignments directly in the notebook UI by setting the proper information for each cell, such as the cell type (whether it is a locked cell, a manually graded answer, or an automatically graded answer) and the number of points the answer is worth.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screencast, of the UI for creating an assignment in the notebook (teachers)." src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/001-1_apqtMnPMoBql8XXbIQOpYA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The UI for creating an assignment in the notebook (teachers).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="managing-assignments-on-the-teacher-side"&gt;Managing assignments on the teacher side&lt;/h3&gt;
&lt;p&gt;Formgrader is the part of the nbgrader UI for the teachers to manage the assignments.&lt;/p&gt;
&lt;p&gt;From this UI, teachers will be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generate assignments from a Notebook file&lt;/li&gt;
&lt;li&gt;share assignments with students&lt;/li&gt;
&lt;li&gt;fetch assignments after student submission&lt;/li&gt;
&lt;li&gt;grade assignments&lt;/li&gt;
&lt;li&gt;provide feedback to students&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Formgrader UI" src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/002-1_S2B9CFCZi4fLA-spXbqhzg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Formgrader UI to manage assignments (teachers).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="managing-assignments-on-the-student-side"&gt;Managing assignments on the student side&lt;/h3&gt;
&lt;p&gt;The assignments list UI is used by students to fetch assignments released by the teacher, submit their answers, and benefit from the feedback after the evaluation by teachers.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="assignments list UI" src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/003-1_iDhidg4ebeIL2a6pYJOOvw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The assignments list UI to fetch and submit assignments (students).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-about-the-future"&gt;What about the future?&lt;/h2&gt;
&lt;p&gt;Creating and grading assignments in nbgrader uses the metadata of individual notebook cells. The current release of nbgrader provides a widget to interact with the corresponding metadata.&lt;/p&gt;
&lt;p&gt;As other extensions need a similar functionality, we are expanding the generic cell metadata editor to address this requirement in a more generic and pluggable way. The new metadata editor allows any extension to create a specific form to interact with the relevant part of the metadata, specified with a JSON schema and rendered with &lt;a href="https://react-jsonschema-form.readthedocs.io/en/latest/"&gt;react-jsonschema-form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nbgrader could take advantage of this improvement in a future release.&lt;/p&gt;
&lt;h2 id="try-it-online"&gt;Try it online&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter/nbgrader.git/v0.8.0"&gt;&lt;img src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/004-1_KlCHlIFqOeXmqzGmwlh52w.webp" alt="binder" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;You can install the latest version of nbgrader using pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install nbgrader
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The GitHub repository can be found &lt;a href="https://github.com/jupyter/nbgrader/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; was partly funded by &lt;a href="https://u-paris.fr/"&gt;Université Paris Cité&lt;/a&gt; in the context of the &lt;a href="http://plasmabio.org"&gt;PlasmaBio&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://twitter.com/jhamrick"&gt;Jessica Hamrick&lt;/a&gt;, &lt;a href="https://twitter.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt;, and Ian Stuart for their help and code reviews during the upgrade to nbgrader 0.8.0.&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/NicolasBrichet_"&gt;Nicolas Brichet&lt;/a&gt; is a scientific software developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; active in the Jupyter ecosystem. In the past few months, he has been working on the Nbgrader extension, as well as other developments in core JupyterLab such as an improved notebook metadata editor. Before joining QuantStack, Nicolas was a software engineer at INRAE.&lt;/p&gt;
</content><category term="education"/><category term="extensions"/><category term="JupyterLab"/><category term="releases"/></entry></feed>