<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - releases</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-releases.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-07-10T05:49:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>JupyterLite 0.8 is released! 🎉</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2026-07-10:/medium-archive/pelican/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…&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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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="/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://jupyter.org/try-jupyter/"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2026-07-02:/medium-archive/pelican/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…&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/015-0_EaVBoUQh5fMYTOCs.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/017-0_vZPh7LgFw5VKY96R.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;&lt;strong&gt;For extension authors&lt;/strong&gt;&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="/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;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>JupyterLite 0.7 is released! 🎉</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2025-12-04:/medium-archive/pelican/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…&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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="/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&gt;&lt;a href="https://jupyter.org/try-jupyter/lab/"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2025-11-24:/medium-archive/pelican/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…&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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;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="AI"/><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLite 0.6.0 is released! 🎉</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2025-06-12:/medium-archive/pelican/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;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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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="/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="/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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://jupyter.org/try-jupyter/lab?path=notebooks%2FIntro.ipynb"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2025-05-21:/medium-archive/pelican/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 many new features and bug fixes.&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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;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="AI"/><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>JupyterLab 4.3 and Notebook 7.3 are available!</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2024-12-05:/medium-archive/pelican/posts/2024/jupyterlab-4-3-and-notebook-7-3-are-available/</id><summary type="html">&lt;p&gt;JupyterLab 4.3.0 and Notebook 7.3.0 have been released! These new minor releases include many enhancements and bug fixes.&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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="/posts/2024/jupyterlab-3-end-of-maintenance/"&gt;announcement post&lt;/a&gt;.&lt;/p&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>Automate your releases with the Jupyter Releaser 🚀</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2024/automate-your-releases-with-the-jupyter-releaser/" rel="alternate"/><published>2024-10-28T18:09:00+00:00</published><updated>2024-10-28T18:09:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2024-10-28:/medium-archive/pelican/posts/2024/automate-your-releases-with-the-jupyter-releaser/</id><summary type="html">&lt;p&gt;Jupyter Releaser is a tool developed by the Jupyter team to streamline and standardize the release process across Jupyter projects&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In the world of open-source software, releases ensure that the latest features, bug fixes, and improvements reach users promptly. However, the process of managing releases, especially for large projects, can be complex and error-prone. This is where &lt;strong&gt;Jupyter Releaser&lt;/strong&gt; comes into play.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jupyter Releaser&lt;/strong&gt; is an automation tool developed by the Jupyter team to streamline and standardize the release process across Jupyter projects. Its goal is simple: reduce the manual burden on maintainers, ensure consistency, best practices, improve confidence, and eliminate the potential for human error.&lt;/p&gt;
&lt;h2 id="the-problem-manual-release-processes"&gt;😔 The Problem: Manual Release Processes&lt;/h2&gt;
&lt;p&gt;Many maintainers of libraries have experienced the pains of a manual release process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Versioning Issues&lt;/strong&gt;: Manually updating version numbers across multiple files can lead to inconsistencies and errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changelog Generation&lt;/strong&gt;: Creating and maintaining accurate changelogs can be time-consuming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publishing&lt;/strong&gt;: Whether it’s for PyPI or npm, the process involves multiple steps that are easy to mess up, and requires maintainers to manage their own credentials and tokens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These pain points are not just frustrating; they can also delay the release of new versions and introduce issues that affect the end-users.&lt;/p&gt;
&lt;h2 id="the-solution-jupyter-releaser"&gt;🤩 The Solution: Jupyter Releaser&lt;/h2&gt;
&lt;p&gt;Jupyter Releaser automates and standardizes the release process, ensuring that everything from versioning to changelog generation and publishing is handled efficiently. It helps maintainers reduce toil and save time in the release process by enforcing best practices to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automate a changelog for every release&lt;/li&gt;
&lt;li&gt;Verify the install and import of dist assets, such as Python wheels and npm packages, to ensure packaging is done correctly&lt;/li&gt;
&lt;li&gt;Commit a message with hashes of dist files&lt;/li&gt;
&lt;li&gt;Annotate the git tag in a standard format&lt;/li&gt;
&lt;li&gt;Create a GitHub release with a changelog entry, and automatically populate a changelog file&lt;/li&gt;
&lt;li&gt;Trigger a dry run publish on CI, to make sure the project is in a releasable state at any time&lt;/li&gt;
&lt;li&gt;Consistently publish final packages to PyPI and npm&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="getting-started-with-jupyter-releaser"&gt;➡️ Getting Started with Jupyter Releaser&lt;/h2&gt;
&lt;h2 id="step-0-set-up"&gt;Step 0: Set up&lt;/h2&gt;
&lt;p&gt;Setting up a repository to use the Jupyter Releaser involves a few steps which are listed on &lt;a href="https://jupyter-releaser.readthedocs.io/en/latest/how_to_guides/convert_repo_from_repo.html#checklist-for-adoption"&gt;this page of the documentation.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first one is to create a GitHub app for the organization or profile that owns the repo, following &lt;a href="https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps#github-apps-that-act-on-their-own-behalf"&gt;this guide&lt;/a&gt;. Then continue with the steps in the documentation to fill in the values for the app.&lt;/p&gt;
&lt;p&gt;To follow best practices it is also recommended to create a &lt;code&gt;release&lt;/code&gt; environment on the repo to add the &lt;code&gt;APP_ID&lt;/code&gt; variable and &lt;code&gt;APP_PRIVATE_KEY&lt;/code&gt; secret.&lt;/p&gt;
&lt;p&gt;If you publish a package to PyPI, you will also need to add a trusted publisher, which usually corresponds to the source repository.&lt;/p&gt;
&lt;p&gt;For npm, don’t forget to specify a &lt;code&gt;&amp;quot;publishConfig&amp;quot;: { &amp;quot;access&amp;quot;: &amp;quot;public&amp;quot; }&lt;/code&gt; to the &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, copy the &lt;code&gt;prep-release.yml&lt;/code&gt; and &lt;code&gt;publish-release.yml&lt;/code&gt; workflows from the &lt;a href="https://github.com/jupyter-server/jupyter_releaser/tree/main/example-workflows"&gt;example-workflows&lt;/a&gt; folder to your repository.&lt;/p&gt;
&lt;p&gt;Quite a few steps, but you should now be ready to go! Fortunately this setup needs to be done only once per repository. If you release multiple projects hosted under the same organization, you can reuse the same GitHub app.&lt;/p&gt;
&lt;p&gt;Again, feel free to refer to the documentation for the &lt;a href="https://jupyter-releaser.readthedocs.io/en/latest/how_to_guides/convert_repo_from_repo.html#checklist-for-adoption"&gt;complete checklist&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="step-1-prep-release"&gt;Step 1: Prep Release&lt;/h2&gt;
&lt;p&gt;To start the release, go to the “Actions” tab of the repo and select “Step 1: Prep Release”. Open the “Run Workflow” dropdown and fill in the appropriate parameters.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Running the “Prep Release” workflow for a JupyterLab extension (speed x5)" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/automate-your-releases-with-the-jupyter-releaser/images/001-1_FbGYR9TzYpyDBD7HRmHMyg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Running the “Prep Release” workflow for a JupyterLab extension (speed x5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Running this workflow will create a draft GitHub release with the generated changelog for the new version. You can edit the changelog by editing the release if needed. &lt;strong&gt;Don’t forget to click on “Save Draft” and not “Publish Release” if you make any changes!&lt;/strong&gt; (the releaser will do the publishing in the next step)&lt;/p&gt;
&lt;h2 id="step-2-publish-release"&gt;Step 2: Publish Release&lt;/h2&gt;
&lt;p&gt;If the changelog and draft GitHub release look good, go back to the “Actions” tab and click on “Step 2: Prep Release”.&lt;/p&gt;
&lt;p&gt;In most cases, you can leave the fields empty and the releaser will automatically publish the GitHub Release previously created.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Publishing the extension (speed x5)" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/automate-your-releases-with-the-jupyter-releaser/images/002-1_ViuKQhOWZPVULL6kQOPwPw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Publishing the extension (speed x5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Congrats, you just made your first release with the Jupyter Releaser! 🎉&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/automate-your-releases-with-the-jupyter-releaser/images/003-1_GRhRcQOAClvvQbBvWFkOjg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="going-further"&gt;Going further&lt;/h2&gt;
&lt;p&gt;Jupyter Releaser also provides a set of hooks and options, such as running an arbitrary command after a given step, or providing a custom strategy for versioning packages. This allows for great flexibility in more complex repositories.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href="https://jupyter-releaser.readthedocs.io/"&gt;documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id="how-jupyter-releaser-fits-into-the-jupyter-ecosystem-and-beyond"&gt;🌐 How Jupyter Releaser Fits into the Jupyter Ecosystem, and beyond&lt;/h2&gt;
&lt;p&gt;Releases are moments of &lt;a href="https://www.youtube.com/watch?v=9jK-NcRmVcw"&gt;celebration&lt;/a&gt; in any project, a chance to deliver new features, enhancements, and bug fixes to users. But they shouldn’t be a source of stress. Jupyter Releaser makes releases smoother for maintainers across the Jupyter ecosystem and beyond.&lt;/p&gt;
&lt;p&gt;Jupyter Releaser is now used for most of the projects in the Jupyter stack with great success, such a JupyterLab, Jupyter Notebook, Jupyter Server, ipykernel, and many more. It greatly simplified the previously complex JupyterLab release process, which used to take 30 minutes, and now boils down to clicking on just a few buttons on GitHub and waiting for the workflows to complete.&lt;/p&gt;
&lt;p&gt;Although its name has “Jupyter” in it, the releaser is not limited to releasing Jupyter related projects only, If you maintain a simple Python or npm package, you can also use the Jupyter Releaser to publish your package(s) to PyPI, npm or both!&lt;/p&gt;
&lt;p&gt;In the end, Jupyter Releaser can simplify your workflow and save you valuable time. Give it a try and check out the repo &lt;a href="https://github.com/jupyter-server/jupyter_releaser"&gt;here&lt;/a&gt; to see how it can make software releases a breeze!&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;🙏 Acknowledgments&lt;/h2&gt;
&lt;p&gt;Many thanks to &lt;a href="https://github.com/blink1073"&gt;Steven Silvester&lt;/a&gt; for creating the Jupyter Releaser and helping with its adoption across the Jupyter stack.&lt;/p&gt;
&lt;p&gt;Jupyter Releaser is an official Jupyter project, and the Jupyter Releaser maintainers would also like to thank the contributors in the Jupyter community who help improve the tool and provide feedback ❤️&lt;/p&gt;
</content><category term="DevOps"/><category term="releases"/></entry><entry><title>JupyterLab 4.2 and Notebook 7.2 are available!</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2024-05-22:/medium-archive/pelican/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…&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;&lt;strong&gt;Easier Workspaces Management with GUI&lt;/strong&gt;&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 44.2 Workspaces Sidebar" src="https://jasongrout.github.io/medium-archive/pelican/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;&lt;strong&gt;Recently opened/closed files&lt;/strong&gt;&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://jasongrout.github.io/medium-archive/pelican/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;&lt;strong&gt;Full notebook windowing mode by default&lt;/strong&gt;&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;&lt;strong&gt;Improved Shortcuts Editor&lt;/strong&gt;&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://jasongrout.github.io/medium-archive/pelican/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;&lt;strong&gt;Dark High Contrast Theme&lt;/strong&gt;&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://jasongrout.github.io/medium-archive/pelican/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;&lt;strong&gt;Keyboard Shortcut&lt;/strong&gt;s&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;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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2024-02-26:/medium-archive/pelican/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…&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="/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 — custom-css 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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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 Alt + ). 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="/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2024-02-19:/medium-archive/pelican/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…&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;
</content><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Announcing Jupyter Notebook 7</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2023-07-26:/medium-archive/pelican/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…&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="/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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;
</content><category term="Jupyter Notebook"/><category term="releases"/></entry><entry><title>JupyterLab 4.0 is Here</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2023-06-05:/medium-archive/pelican/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…&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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;
</content><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Jupyter Server 2.0 is released!</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2022-12-06:/medium-archive/pelican/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 J&lt;a href="https://jupyter-server.readthedocs.io/en/latest/operators/security.html#authorization"&gt;upyter 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;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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2022-09-15:/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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;p&gt;&lt;strong&gt;Notebook 6 vs Notebook 7&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;NbClassic&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Some Use Cases&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;br&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;p&gt;&lt;strong&gt;Thank You to Contributors to this blog&lt;/strong&gt;&lt;br&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>Release of IPython 8.0</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/release-of-ipython-8-0/" rel="alternate"/><published>2022-01-12T13:37:00+00:00</published><updated>2022-01-12T16:14:00+00:00</updated><author><name>M Bussonnier</name></author><id>tag:jasongrout.github.io,2022-01-12:/medium-archive/pelican/posts/2022/release-of-ipython-8-0/</id><summary type="html">&lt;p&gt;IPython is a powerful Python REPL that gives you tab completion, better tracebacks, multiline editing, and several useful features on top…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;IPython is a powerful Python REPL that gives you tab completion, better tracebacks, multiline editing, and several useful features on top of pure Python Scripts. It is also the library that powers the Jupyter Kernel via the IPykernel.&lt;/p&gt;
&lt;p&gt;Today I am pleased to announce the release of IPython 8.0, which has been long in the making and arrived a bit over three years after the 7.0 release.&lt;/p&gt;
&lt;p&gt;I also suggest to read the &lt;a href="https://labs.quansight.org/blog/2022/01/ipython-8.0-lessons-learned-maintaining-software/"&gt;companion blog post&lt;/a&gt; on Quansight-Labs site that goes into some technical details on how we removed some old code.&lt;/p&gt;
&lt;p&gt;EDIT: You can also ask questions/comments on the jupyter &lt;a href="https://discourse.jupyter.org/t/ipython-8-0-0-out/12554"&gt;discourse&lt;/a&gt;, or &lt;a href="https://news.ycombinator.com/item?id=29906774"&gt;read the discussion on HN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Many new features&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This major release comes with many improvements to the existing codebase and several new features. These new features are code reformatting with Black in the CLI, ghost suggestions, and better tracebacks which highlight the error node, thus making complex expressions easier to debug (see below).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Tracebacks now highlight in which AST node the error occurs. In complex code, this helps to quickly narrow down what causes an error. Here we also turn on xmode verbose to see values of local variables (xmode verbose is disabled by default for security reasons as it could leak secrets, but is highly recommended)" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/release-of-ipython-8-0/images/001-1_2_TYKwP_RInA4QVp9UhMhw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Tracebacks now highlight in which AST node the error occurs. In complex code, this helps to quickly narrow down what causes an error. Here we also turn on &lt;code&gt;xmode verbose&lt;/code&gt; to see values of local variables (xmode verbose is disabled by default for security reasons as it could leak secrets, but is highly recommended)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;But really, if you want to read about all the new features in-depth, we recommend you spend some time &lt;a href="https://ipython.readthedocs.io/en/stable/whatsnew/version8.html#ipython-8-0"&gt;reading the what’s new&lt;/a&gt; and the list of features in &lt;code&gt;7.x&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="moving-forward-by-shedding-weight"&gt;Moving forward by shedding weight&lt;/h3&gt;
&lt;p&gt;While IPython 8.0 has many new features described in &lt;a href="https://ipython.readthedocs.io/en/stable/whatsnew/version8.html#ipython-8-0"&gt;the what’s new section&lt;/a&gt;, the majority of changes that demanded a bump in major version numbers are removals.&lt;/p&gt;
&lt;p&gt;IPython was created more than two decades ago by Fernando Pérez while procrastinating on his graduation. Even if a few lines from this period remain, it was time to remove a large number of deprecated and unused code in the IPython code base and drop old dependencies (like nose) in favor of more recent ones (pytest).&lt;/p&gt;
&lt;p&gt;Thanks to NumFOCUS &lt;a href="https://numfocus.org/programs/small-development-grants"&gt;Small Developer Grant&lt;/a&gt;, we hired &lt;a href="https://github.com/Kojoley"&gt;Nikita Kniazev (@Kojoley)&lt;/a&gt; to help us with some of the heavy lifting. Nikita did a fantastic job updating our codebase, migrating to pytest, enhancing our coverage, and fixing numerous bugs. I highly recommend contacting them if you need help with C++ and Python projects.&lt;/p&gt;
&lt;p&gt;Some of Nikita’s most notable contributions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPython is no longer reliant on Nose, which has been unmaintained for many years.&lt;/li&gt;
&lt;li&gt;Significantly increased IPython coverage.&lt;/li&gt;
&lt;li&gt;Considerable refactor of areas that were calling into deprecated features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of this, IPython 8.0 also comes with the following capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove most of the deprecated functions and parameters that were marked as such between IPython 1.0 and 5.0&lt;/li&gt;
&lt;li&gt;Bumped the minimal required Python version to 3.8 (following NEP 29). This means that we now use the native Python top-level async instead of crazy hacks. And we can start to use &lt;code&gt;def fun(a,/,b=None):&lt;/code&gt; syntax for positional only arguments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nikita also went well beyond the scope of work we gave them by suggesting more robust and often simpler code patterns.&lt;/p&gt;
&lt;p&gt;In total, this allowed us, despite all the added features, added type annotations and added tests, to decrease the size of the codebase from 37 500 LOC across 348 files to 36 100 across 294 files. We hope that this reduction in the codebase size combined with work on speeding the startup of the CLI will make IPython easier to use and contribute to.&lt;/p&gt;
&lt;p&gt;Some advice on how to do that same are on the &lt;a href="https://labs.quansight.org/blog/2022/01/ipython-8.0-lessons-learned-maintaining-software/"&gt;companion blog post&lt;/a&gt; and the Quansight-Labs site.&lt;/p&gt;
&lt;h3 id="moving-toward-pyprojecttoml"&gt;Moving toward pyproject.toml&lt;/h3&gt;
&lt;p&gt;Another place in IPython that has seen many changes in the build process. We now use &lt;code&gt;pyproject.toml&lt;/code&gt;to have a declarative build. We still require setuptools and have &lt;code&gt;setup.py&lt;/code&gt; files right now, but we are working towards removing/simplifying them soon.&lt;/p&gt;
&lt;p&gt;IPython’s wheels and sdist can now be built with &lt;code&gt;python -m build&lt;/code&gt; instead of invoking &lt;code&gt;setup.py&lt;/code&gt; directly.&lt;/p&gt;
&lt;p&gt;Our process still needs manual setup of SOURCE_DATE_EPOCH and repacking of the &lt;code&gt;sdist&lt;/code&gt; wheel to obtain &lt;a href="https://reproducible-builds.org/"&gt;reproducible builds&lt;/a&gt;. We encourage you to get the git repository, build it yourself, and get a byte-for-byte identical artifacts.&lt;/p&gt;
&lt;h3 id="monthly-release-and-following-nep-29"&gt;Monthly Release and following NEP 29&lt;/h3&gt;
&lt;p&gt;We strongly believe that predictability is key to adoption and trust in IPython. In particular, in business settings, it is critical to plan ahead while rapidly receiving bug fixes. This is why for IPython 8.0 we’ll continue to do minor monthly releases on the last Friday of each month as long at it’s reasonable and does not impact maintainers life too much.&lt;/p&gt;
&lt;p&gt;We’ll still publish a few 7.x releases with critical bug fixes, but starting last Friday of this month, you will start to see stable releases of 8.x.&lt;br&gt;
All releases are announced in &lt;a href="https://discourse.jupyter.org/tags/c/meta/8/announcement"&gt;this subcategory in discourse&lt;/a&gt;, to which you can get subscribed to get notifications.&lt;/p&gt;
&lt;p&gt;We also now follow &lt;a href="https://numpy.org/neps/nep-0029-deprecation_policy.html"&gt;NEP 29&lt;/a&gt;, meaning that IPython 8.0 is not only compatible with NumPy 1.19+ and Python 3.8+. But our future Python support schedule is predictably aligned with all other libraries following NEP 29.&lt;br&gt;
We believe the new NEP 29 is critical. It gives the core Scientific Python Ecosystem a clear schedule of available features and the removal of deprecated features.&lt;/p&gt;
&lt;h3 id="looking-forward-to-your-contributions"&gt;Looking forward to your contributions&lt;/h3&gt;
&lt;p&gt;Don’t think IPython is too hard to contribute to or has no missing features. We try to keep a list of beginner-friendly issues, but we really want your feedback and your ideas. In the meantime, have fun with this new release that you can install with :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install ipython ipykernel --upgrade
&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;conda update ipython ipykernel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(updating ipykernel may not be necessary for you, but we recommend it).&lt;/p&gt;
&lt;h3 id="thanks"&gt;Thanks&lt;/h3&gt;
&lt;p&gt;Thanks to Tania Allard and Eric Charles for review , Quansight Labs and &lt;a href="https://www.quansight.com/"&gt;Quansight&lt;/a&gt; (my employer) for all the open-source work I can do. Of course, thanks to all the contributors to the IPython and Jupyter community, and in particular &lt;a href="https://github.com/MrMino"&gt;MrMino&lt;/a&gt; who recently joined as an IPython core dev…&lt;/p&gt;
</content><category term="IPython"/><category term="releases"/></entry><entry><title>CVE-2021–32797 and CVE-2021–32798 Remote Code execution in JupyterLab and Jupyter Notebook</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/cve-2021-32797-and-cve-2021-32798-remote-code-execution/" rel="alternate"/><published>2021-08-09T20:05:00+00:00</published><updated>2021-08-09T20:19:00+00:00</updated><author><name>M Bussonnier</name></author><id>tag:jasongrout.github.io,2021-08-09:/medium-archive/pelican/posts/2021/cve-2021-32797-and-cve-2021-32798-remote-code-execution/</id><summary type="html">&lt;p&gt;TL:DR; All recent JupyterLab and Notebook versions are susceptible to a attack where a maliciously crafted notebook can trigger arbitrary…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;TL:DR; All recent JupyterLab and Notebook versions are susceptible to a attack where a maliciously crafted notebook can trigger arbitrary code execution when a user views these malicious files.&lt;/p&gt;
&lt;p&gt;We strongly advise all users to deploy the new version of JupyterLab and Jupyter Notebook.&lt;/p&gt;
&lt;p&gt;Jupyter Notebook 6.4.1 or above, 5.7.11 or above.&lt;/p&gt;
&lt;p&gt;Jupyter Lab 3.1.4 or above, 3.0.17 or above, 2.3.2 or above, 2.2.10 or above , 1.2.21 or above&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This blog post will be updated with links to the various patches, exploit and disclosure later once the final links are available&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="jupyter-security-model"&gt;Jupyter Security Model&lt;/h2&gt;
&lt;p&gt;Jupyter Notebook act as a REPL (Read Eval Print Loop) in a browser, our main goal is to expose as many functionalities to our users, with the least restrictions. We also want users to be able to share their results with other, and let everyone be capable of reproducing the result.&lt;/p&gt;
&lt;p&gt;When receiving an untrusted notebook from a potentially malicious source we still want users to be able to inspect a notebook without risks, our approach is that an untrusted notebook has restrictive capabilities until all cells have been manually inspected and explicitly run by a user, or the notebook is explicitly marked as trusted. If one finds a way to bypass this trust mechanism, a notebook might be able to execute code in the browser at at a time where a user is not expecting execution to occur.&lt;/p&gt;
&lt;p&gt;This is what happen in these particular CVEs, where some content of a notebook were improperly handled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[This part of the blog post will be updated with links to actual reports, and proof of concept once the patched version have reached enough package repositories]&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="cve-timeline"&gt;&lt;strong&gt;CVE Timeline&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We want to thanks Guillaume Jeanne (Google), and Timo Schmid (Google) for the vulnerability report and helping us through the fixing process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thursday, 15 Jul 2021 07:11:13 -0700 (PDT): Initial question about security issue disclosure on security@ipython.org (no specific on the vulnerability)&lt;/li&gt;
&lt;li&gt;Tuesday, 20 Jul 2021 05:52:09 -0700 (PDT): Actual Vulnerability Report.&lt;/li&gt;
&lt;li&gt;Tuesday, 20 Jul 2021 : Open relevant GitHub security advisory on &lt;a href="https://github.com/jupyter/notebook/security/advisories/GHSA-hwvq-6gjx-j797"&gt;Notebook&lt;/a&gt; and &lt;a href="https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-4952-p58q-6crx"&gt;JupyterLab&lt;/a&gt; Repositories&lt;/li&gt;
&lt;li&gt;Thursday, 5 August 2021 : First releases with patched version on PyPI.&lt;/li&gt;
&lt;li&gt;Monday, 9 August : publication of this blog post and publish security advisory on GitHub.&lt;/li&gt;
&lt;li&gt;[Further item may be added to list publication by downstream repositories, like conda, conda-forge, debian…, contact us to add an item]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-we-learned"&gt;&lt;strong&gt;What we learned&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Dealing with Security vulnerability in Jupyter and more generally in Open-Source is far from easy. We initially thought about treating the Notebook and Lab CVE separately but they are/were too similar and the cross discussion too revealing to treat both independently.&lt;/p&gt;
&lt;p&gt;As Jupyter is mostly a volunteer based organisation, there is often no contributor responsible to replying to security issues, and when someone steps up they might not be a expert, nor available all the time. I want to give special thanks to &lt;a href="https://github.com/blink1073"&gt;Steve Silvester&lt;/a&gt; (Apple) , &lt;a href="https://github.com/afshin"&gt;Afshin Darian&lt;/a&gt; (Two Sigma), and &lt;a href="https://github.com/Zsailer"&gt;Zach Sailer&lt;/a&gt; (Apple), and &lt;a href="https://github.com/Carreau"&gt;Matthias Bussonnier&lt;/a&gt; (Quansight) for writing the fixes, planning through the release and notifying stakeholders.&lt;/p&gt;
&lt;p&gt;Advance notice to stakeholder is complicated, we know of a few large deployment and have personal connections to a couple organisation, and were able to reached out to let them know critical release would be published. There is an inherent tension between publicly warning our user base that security release would be published, which might push malicious actor to closely survey the codebase changes and re-derive the attack vectors, and publishing the release first, with the details later. Especially since we are trying to be transparent in our communication, security fixes are the opposite of our normal communication workflow.&lt;/p&gt;
&lt;p&gt;Our communication process is imperfect. We have 2 mailing list for security-related discussion. The first one – security@ipython.org – has only a couple of members all core contributors and can receive email from the outside, it is used for triage. It receive a high number of spam as this is public email. As it has only a few members and we are all busy, mail can slip through. The second mailing list is slightly larger, and used for internal announcement for stakeholder. It has a fairly open membership model, (ask a Jupyter developer if you can be on it, and the reason why and we’ll likely add you), though it’s content seem to be ignored (it even lands on my spam folder, not sure why).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we’ll do better&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In order to attempt to better react and be proactive with respect to security we &lt;a href="https://github.com/jupyter/governance/issues/111"&gt;are&lt;/a&gt; attempting &lt;a href="https://discourse.jupyter.org/t/project-jupyter-security-subproject/10175/6"&gt;to form&lt;/a&gt; and new &lt;a href="https://github.com/jupyter/security"&gt;security-focused&lt;/a&gt; subproject/workgroup to educate and have procedure for everything security related. We welcome your involvement and feedback in how to improve Jupyter security and how to better involve the community.&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/><category term="security"/></entry><entry><title>JupyterLab 3.0 is released!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/" rel="alternate"/><published>2021-01-05T08:28:00+00:00</published><updated>2021-07-19T16:35:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2021-01-05:/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/</id><summary type="html">&lt;p&gt;The 3.0 release of JupyterLab brings many new features to users and substantial improvements to the extension distribution system.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The 3.0 release of JupyterLab brings many new features to users and substantial improvements to the extension system.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install JupyterLab 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 jupyterlab==3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;a href="https://github.com/mamba-org/mamba"&gt;&lt;code&gt;mamba&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba install -c conda-forge jupyterlab=3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;a href="https://docs.conda.io/"&gt;&lt;code&gt;conda&lt;/code&gt;&lt;/a&gt;:&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 jupyterlab=3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(Note that many third-party extensions are still in the process of updating to be compatible with JupyterLab 3.0 — please check the extensions you use and be patient, or even better, help them update! Also, it may help to uninstall JupyterLab 2 if you already have it installed.)&lt;/p&gt;
&lt;p&gt;Here is an overview of the major user-facing changes in JupyterLab 3.0.&lt;/p&gt;
&lt;h2 id="debugger"&gt;Debugger&lt;/h2&gt;
&lt;p&gt;&lt;a href="/posts/2020/a-visual-debugger-for-jupyter/"&gt;Announced earlier this year&lt;/a&gt;, the visual debugger is now shipped by default with JupyterLab.&lt;/p&gt;
&lt;p&gt;To use the visual debugger, you will need a kernel that supports debugging. An example of such kernel is &lt;a href="https://xeus-python.readthedocs.io"&gt;&lt;code&gt;xeus-python&lt;/code&gt;&lt;/a&gt;, the first Jupyter Kernel for Python with support for debugging.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Stepping into Python code in JupyterLab with the visual debugger" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/001-1_RoJnb1XpB6g5geG15WgrMg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Stepping into Python code in JupyterLab with the visual debugger&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Check out the &lt;a href="https://jupyterlab.readthedocs.io/en/stable/user/debugger.html"&gt;user documentation&lt;/a&gt; for more information, including a notebook based tutorial to interactively learn how to use the debugger.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;p&gt;The table of contents extension now ships with JupyterLab. This makes it easy to see and navigate the structure of a document.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using the Table of Content in JupyterLab 3.0" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/002-1_bSH9IcyWHLaNML2q9lRThg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the Table of Content in JupyterLab 3.0&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="support-for-multiple-display-languages"&gt;Support for multiple display languages&lt;/h2&gt;
&lt;p&gt;JupyterLab now provides the ability to set the display language of the user interface.&lt;/p&gt;
&lt;p&gt;Users will need to install the language pack as a separate Python package. Language packs are grouped in the &lt;a href="https://github.com/jupyterlab/language-packs/"&gt;language packs repository on GitHub&lt;/a&gt;, and can be installed with &lt;code&gt;pip&lt;/code&gt;. For example, it is possible to install the language pack for Simplified Chinese using the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyterlab-language-pack-zh-CN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab in Simplified Chinese" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/003-0_8CYAXfBDt0v95iOc.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab in Simplified Chinese&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Check out the &lt;a href="https://jupyterlab.readthedocs.io/en/stable/user/language.html"&gt;user documentation&lt;/a&gt; to learn more about the feature and how to add new language packs.&lt;/p&gt;
&lt;h2 id="improvements-to-the-simple-interface-mode"&gt;Improvements to the Simple Interface mode&lt;/h2&gt;
&lt;p&gt;The Simple Interface mode (previously known as the Single-Document Mode) has been significantly updated to have a more streamlined, document-oriented feel.&lt;/p&gt;
&lt;p&gt;To make the Simple Interface mode more discoverable, there is now a switch to toggle it in the status bar. You can also toggle it from the View menu or the command palette, or use the default keyboard shortcut Ctrl/Cmd+Shift+D.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Enabling and disabling the Simple Interface Mode" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/004-1_ZLDBAmTHYyGVp3RNQN09KQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Enabling and disabling the Simple Interface Mode&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Support for mobile has also greatly improved with a more compact layout. JupyterLab automatically switches to the Simple Interface when the window is resized down.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab switches to the Simple Interface Mode on smaller screen" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/005-1_K24B_sxJ6Y-PHeLTURyRTw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab switches to the Simple Interface Mode on smaller screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There is &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/9464"&gt;ongoing work&lt;/a&gt; to iterate on this concept and make the interface even more accessible on mobile devices.&lt;/p&gt;
&lt;h2 id="install-new-extensions-with-pip-and-conda-mamba"&gt;Install new extensions with pip and conda / mamba&lt;/h2&gt;
&lt;p&gt;JupyterLab extensions can now be distributed as &lt;em&gt;prebuilt extensions&lt;/em&gt;, which do not require a user to rebuild JupyterLab or have &lt;a href="https://nodejs.org"&gt;Node.js&lt;/a&gt; installed. Prebuilt extensions can be distributed as Python packages using familiar package managers such as &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;conda&lt;/code&gt;, and &lt;code&gt;mamba&lt;/code&gt;. This makes installing and using extensions much faster and more convenient!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Installing a new extension with pip" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/006-1_DXwxXMj-B1Jqpsx3RmUitA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Installing a new extension with pip&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Prebuilt extensions can be published to &lt;a href="https://pypi.org/"&gt;PyPI&lt;/a&gt; and &lt;a href="https://conda-forge.org/"&gt;conda-forge&lt;/a&gt; as separate packages, or bundled into existing packages with Jupyter Server extensions and Classic Notebook extensions. This helps make the ecosystem as a whole more coherent.&lt;/p&gt;
&lt;p&gt;For example, install the new &lt;code&gt;ipywidgets&lt;/code&gt; 7.6.0 with pip or conda to automatically enable ipywidgets in both the classic Jupyter Notebook and in JupyterLab 3.0 — no extra installation step or JupyterLab rebuild needed!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Installing ipywidgets works automagically in JupyterLab 3.0!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/007-1_jg5drA_J783_IrqdLzye5w.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Installing ipywidgets works automagically in JupyterLab 3.0!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="improved-development-workflow-for-extension-authors"&gt;Improved development workflow for Extension Authors&lt;/h2&gt;
&lt;p&gt;The new prebuilt extensions are more convenient for extension authors to develop. The &lt;a href="https://github.com/jupyterlab/extension-cookiecutter-ts"&gt;TypeScript extension cookiecutter&lt;/a&gt; has been updated to develop prebuilt extensions by default and provides all the necessary tooling to quickly create a new extension from scratch.&lt;/p&gt;
&lt;p&gt;For more information, check out the &lt;a href="https://jupyterlab.readthedocs.io/en/stable/extension/extension_dev.html"&gt;Extension Developer Guide&lt;/a&gt; and the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html"&gt;JupyterLab 2.x to 3.x Migration Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="extension-examples"&gt;Extension Examples&lt;/h3&gt;
&lt;p&gt;If you are looking for examples to learn how to make your own extension, make sure to check out the &lt;a href="https://github.com/jupyterlab/extension-examples"&gt;extension examples repository on GitHub.&lt;/a&gt; The examples have been updated to be compatible with JupyterLab 3.0 and provide a hands-on approach to developing 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 3.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://jupyterlab.readthedocs.io/en/stable/getting_started/changelog.html#v3-0"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="try-it-out-on-binder"&gt;Try it out on Binder&lt;/h2&gt;
&lt;p&gt;JupyterLab 3.0 can easily be tested on Binder using the following link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/008-1_fDQBE4twamqnpxvAevzGuw.webp" alt="https://mybinder.org/v2/gist/jtpio/8d392846c2f3ee6fab38cdfab5a364ec/master?urlpath=/lab" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&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 JupyterLab effort. We welcome contributions from all members of the Jupyter community:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jupyterlab.readthedocs.io/en/stable/extension/extension_dev.html"&gt;Make your own JupyterLab extensions&lt;/a&gt;. Please add the &lt;a href="http://github.com/topics/jupyterlab-extension"&gt;jupyterlab-extension&lt;/a&gt; topic if your extension is hosted on GitHub. You can also help existing extensions update to JupyterLab 3.0. The &lt;a href="https://jupyterlab.readthedocs.io/en/stable/getting_started/changelog.html#for-developers"&gt;changelog&lt;/a&gt; gives an overview of changes that may affect extension maintainers.&lt;/li&gt;
&lt;li&gt;Contribute to the development, documentation, and design of JupyterLab on &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;GitHub&lt;/a&gt;. To get started with development, please see the &lt;a href="https://github.com/jupyterlab/jupyterlab/blob/master/CONTRIBUTING.md"&gt;Contributing Guide&lt;/a&gt; and &lt;a href="https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md"&gt;Code of Conduct&lt;/a&gt;. Many issues are ideal for new contributors and are tagged as “&lt;a href="https://github.com/jupyterlab/jupyterlab/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22"&gt;good first issue&lt;/a&gt;” or “&lt;a href="https://github.com/jupyterlab/jupyterlab/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22"&gt;help wanted&lt;/a&gt;”.&lt;/li&gt;
&lt;li&gt;Connect with the community on &lt;a href="https://github.com/jupyterlab/jupyterlab/issues"&gt;GitHub&lt;/a&gt; or on the &lt;a href="https://gitter.im/jupyterlab/jupyterlab"&gt;Gitter Channel&lt;/a&gt;. If you find a bug, have questions, or want to provide feedback, please join the conversation!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And don’t forget to participate in the &lt;a href="/posts/2020/survey-jupyterlab-and-beyond/"&gt;user survey&lt;/a&gt;: &lt;a href="https://www.surveymonkey.com/r/LCB7GBF"&gt;https://www.surveymonkey.com/r/LCB7GBF&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlab-3-0-is-out/images/009-1_iZTmCAefbExeTZNJKWy4cQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLab"/><category term="releases"/></entry><entry><title>BinderHub is out of Beta!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binderhub-is-out-of-beta/" rel="alternate"/><published>2019-04-26T16:49:00+00:00</published><updated>2019-04-26T18:41:00+00:00</updated><author><name>Tim Head</name></author><id>tag:jasongrout.github.io,2019-04-26:/medium-archive/pelican/posts/2019/binderhub-is-out-of-beta/</id><summary type="html">&lt;p&gt;Today we are proud to announce that we now consider BinderHub a stable tool with a track record of operating in production.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Nearly two years ago, the Binder Project &lt;a href="/posts/2017/binder-2-0-a-tech-guide-2017/"&gt;released the beta version&lt;/a&gt;&lt;br&gt;
of &lt;a href="https://binderhub.readthedocs.io/"&gt;BinderHub&lt;/a&gt;, the technology behind &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;. Since then, mybinder.org has grown to serve nearly 90,000 launches each week and hit the &lt;a href="/posts/2018/mybinder-org-serves-two-million-launches/"&gt;two million launches in a year milestone last year&lt;/a&gt;. Over these two years BinderHub has matured as technology and community. Several new organizations now run their own BinderHubs and have joined the community of maintainers.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A year of Binder sessions served from mybinder.org. Darker colors show users in countries that have launched more Binder sessions. The pins show the approximate locations of public BinderHubs that we know of. Where is mybinder.org? It is a global effort so there is no one location associated with it or the team that runs it." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binderhub-is-out-of-beta/images/001-1_zGQcuph2mrh7ry_tH_QJYQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A year of Binder sessions served from mybinder.org. Darker colors show users in countries that have launched more Binder sessions. The pins show the approximate locations of public BinderHubs that we know of. Where is mybinder.org? It is a global effort so there is no one location associated with it or the team that runs it.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Today we are proud to announce that we’ve removed the “beta” label from all pages served by BinderHub. BinderHub is now a tool with a track record of working well in production (both at mybinder.org and in other deployments), its general features and API have stabilized, and &lt;a href="https://jupyterhub.readthedocs.io/en/stable/"&gt;JupyterHub&lt;/a&gt;, the underlying technology that BinderHub uses, is close to its 1.0 release.&lt;/p&gt;
&lt;p&gt;A big thank you to all those who have used, commented, advocated, advertised, contributed, maintained and funded this journey. The deployment at mybinder.org is funded with grants from the &lt;a href="https://www.moore.org/grant-detail?grantId=GBMF6865"&gt;Moore Foundation&lt;/a&gt; and the Google Cloud Platform.&lt;/p&gt;
&lt;h3 id="who-else-has-deployed-a-binderhub"&gt;Who else has deployed a BinderHub?&lt;/h3&gt;
&lt;p&gt;A goal of Project Binder is to build modular, open-source tools that&lt;br&gt;
others can deploy for their own communities. BinderHub, the core technology behind mybinder.org, runs on Kubernetes this means it can be deployed on many cloud providers or even on your own hardware. Over the years, we have seen many new organizations deploy their own BinderHubs. Here are our highlights of other organizations who have joined the BinderHub community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GESIS&lt;/strong&gt; were the first to deploy a public BinderHub that is operated independently of mybinder.org. The &lt;a href="https://notebooks.gesis.org/binder/"&gt;GESIS BinderHub instance&lt;/a&gt; went live&lt;br&gt;
in December 2017 and has been running ever since. They are frequent&lt;br&gt;
contributors to the upstream project. Their BinderHub runs on a bare metal&lt;br&gt;
Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Pangeo Project&lt;/strong&gt; instance was the next to come online, launching &lt;a href="https://binder.pangeo.org"&gt;their&lt;br&gt;
public BinderHub instance&lt;/a&gt; in September 2018 (more details in their &lt;a href="https://medium.com/pangeo/pangeo-meets-binder-2ea923feb34f"&gt;blog post&lt;/a&gt;). They provide additional compute resources and have customized their setup to provide on-demand &lt;a href="https://dask.org/"&gt;dask&lt;/a&gt; clusters to users. Try out &lt;a href="http://binder.pangeo.io/v2/gh/pangeo-data/pangeo_ocean_examples/master"&gt;one&lt;br&gt;
of their examples using ocean data&lt;/a&gt;. The Pangeo cluster is hosted on Google Kubernetes Engine.&lt;/p&gt;
&lt;p&gt;Recently, the &lt;a href="https://www.turing.ac.uk/research/research-projects/turing-way-handbook-reproducible-data-science"&gt;&lt;strong&gt;Turing Way project&lt;/strong&gt;&lt;/a&gt; has been working on deploying a BinderHub at the &lt;a href="https://www.turing.ac.uk/"&gt;Turing Institute&lt;/a&gt; in the UK. This BinderHub will serve both internal and external users with the goal of making it easier to share data science projects. They have run several workshops including one that teaches scientists and research software engineers how to deploy their own BinderHub instance. Recently they led a workshop in which ten academics and IT staff deployed their own BinderHub on the Microsoft Azure cloud! Sarah Gibson from their team has recently joined the team that operates mybinder.org.&lt;/p&gt;
&lt;p&gt;Finally, the &lt;a href="https://www.pims.math.ca/"&gt;&lt;strong&gt;Pacific Institute for the Mathematical Sciences&lt;/strong&gt;&lt;/a&gt; (PIMS) runs a service &lt;a href="https://intro.syzygy.ca/"&gt;called Syzygy&lt;/a&gt;. It deploys several JupyterHubs and BinderHubs for scientific organizations around Canada. A Binder team recently held a tutorial on deploying Binder and JupyterHub at the PEARC (&lt;a href="https://docs.google.com/presentation/d/1ELYepgptS7LcpBwjrotPRcQENr_WlxX0eQaBvzZonxs/edit?usp=sharing"&gt;you can find slides for the talk here&lt;/a&gt;). They have also &lt;a href="https://github.com/etiennedub/terraform-binderhub"&gt;provided a script for deploying JupyterHub&lt;/a&gt; (and Binder) on Terraform.&lt;/p&gt;
&lt;h3 id="whats-next"&gt;What’s next?&lt;/h3&gt;
&lt;p&gt;Now that BinderHub is not in beta anymore, what is next? As Project Binder we will focus on adoption, training, and growing the Binder community. This means growing the creation of &lt;strong&gt;Binder-ready repositories&lt;/strong&gt; (repositories that have the necessary structure for Binder to create the environment needed to run the repository’s code). We will increase our outreach and marketing efforts to make sure a diverse audience everywhere around the world knows about Binder.&lt;/p&gt;
&lt;p&gt;We will also work on making it easier to setup and operate a public BinderHub no matter what cloud vendor you are using. We are excited to see more organizations deploy their own BinderHubs for their communities. In the coming months, our goal is to create a &lt;strong&gt;federation of public BinderHubs&lt;/strong&gt;&lt;br&gt;
that operate in unison to serve the global user base of mybinder.org.&lt;/p&gt;
&lt;p&gt;If this caught your attention consider joining the Binder community, or contributing to Project Binder! A good place to start is the &lt;a href="https://discourse.jupyter.org"&gt;Jupyter Community Forum&lt;/a&gt; or dive straight into &lt;a href="http://github.com/jupyterhub/"&gt;the code on GitHub&lt;/a&gt;.&lt;/p&gt;
</content><category term="Binder"/><category term="Kubernetes"/><category term="releases"/></entry><entry><title>IPython 7.0, Async REPL</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/" rel="alternate"/><published>2018-09-27T17:41:00+00:00</published><updated>2018-09-27T17:41:00+00:00</updated><author><name>M Bussonnier</name></author><id>tag:jasongrout.github.io,2018-09-27:/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/</id><summary type="html">&lt;p&gt;Today we are pleased to announce the release of IPython 7.0, the powerful Python interactive shell that goes above and beyond the default…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today we are pleased to announce the release of &lt;a href="https://ipython.readthedocs.io/"&gt;IPython 7.0, the powerful Python interactive shell&lt;/a&gt; that goes above and beyond the default Python REPL with advanced tab completion, syntactic coloration, and more. It’s the jupyter kernel for python used by millions of users, hopefully including you. This is the second major release of IPython since we stopped support for Python 2.&lt;/p&gt;
&lt;p&gt;Not having to support Python 2 allowed us to make full use of new Python 3 features and bring never before seen capability in a Python Console. We are still encouraging library authors and users to look at the &lt;a href="https://python3statement.org/"&gt;Python 3 Statement&lt;/a&gt; to learn about the end of life of Python 2 and how to stop support for Python 2 &lt;strong&gt;without breaking installation for Python 2 end users&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;As developers and maintainers of IPython, it was a large gain of time to be able to only develop for a single version of python. Avoiding the use of conditional imports, being able to rely on type annotations, and make use of the newly available Python APIs were some of the advantages that made us more productive. Especially as most of the work on IPython is done by volunteers who work on nights and weekends, with only a couple of minutes here and there, this often made the difference between a patch reaching completion, or the contributor moving on to other pastures.&lt;/p&gt;
&lt;p&gt;One of the core features we focused on for this release is the ability to (ab)use the &lt;em&gt;async&lt;/em&gt; and &lt;em&gt;await&lt;/em&gt; syntax available in Python 3.5+. There are of course many other improvements in this release you can read about in the &lt;a href="https://ipython.readthedocs.io/en/stable/whatsnew/index.html"&gt;what’s new&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Demo of awaiting coroutine in IPython 7.0" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/001-1_b4zaYTEIjve8x2-BlaPmNQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Demo of awaiting coroutine in IPython 7.0&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;TL;DR: You can now use &lt;em&gt;async&lt;/em&gt;/&lt;em&gt;await&lt;/em&gt; at the top level in the IPython terminal and in the notebook, it should — in most of the cases — “just work”. Update IPython to version 7+, IPykernel to version 5+, and you’re off to the races.&lt;/p&gt;
&lt;p&gt;See how to &lt;strong&gt;install IPython by reading the “&lt;/strong&gt;&lt;a href="https://ipython.readthedocs.io/en/stable/whatsnew/index.html"&gt;&lt;strong&gt;what’s new&lt;/strong&gt;&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;The recipes are currently building on conda-forge and should be available soon. For the time being you can install it via pip:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ pip install ipython ipykernel --upgrade&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="a-primer-on-concurrency"&gt;A Primer on concurrency&lt;/h3&gt;
&lt;p&gt;You may have heard about &lt;em&gt;async&lt;/em&gt;/&lt;em&gt;await&lt;/em&gt;, threads, concurrency, preemptive scheduling and cooperative scheduling without really understanding what all this is about. If you are not familiar will all the above terms, all the hype may be confusing so let’s talk about concurrency in a really high level way.&lt;/p&gt;
&lt;p&gt;Typically when your computer needs to execute many tasks, it will switch between them really fast, so from the human point of view it looks like everything is being processed at the same time. There are two main ways of doing so under the hood: &lt;em&gt;Preemptive&lt;/em&gt; Scheduling, and &lt;em&gt;Cooperative&lt;/em&gt; Scheduling.&lt;/p&gt;
&lt;p&gt;With preemptive scheduling changing tasks can happen &lt;strong&gt;at any time&lt;/strong&gt;. For example, while writing this blog post, I could stop in the middle of a word to start writing an email, which will itself be interrupted to check Gitter/Slack, before coming back, writing 5 words and stopping to get dinner.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="TL;DR: Concurrency (from Geek And Poke, 2009)" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/002-1_Ewlg0l4stoFZ_fQUtKffNg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;TL;DR: Concurrency (from &lt;a href="http://geek-and-poke.com/geekandpoke/2012/9/3/simply-explained.html"&gt;Geek And Poke&lt;/a&gt;, 2009)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;With &lt;em&gt;cooperative&lt;/em&gt; scheduling, the task switches can happen &lt;strong&gt;only at agreed spots&lt;/strong&gt;. The term co-operative comes from the fact that tasks need to co-operate for the whole process to function. If a task decides to never take a break to let you to do something else, the illusion of many tasks being completed at once disappears.&lt;/p&gt;
&lt;p&gt;Each approach has its own advantages and drawbacks, and we will not focus on these. Let’s just say that with co-operative scheduling &lt;em&gt;async&lt;/em&gt;/&lt;em&gt;await&lt;/em&gt; let you mark the areas where interruption is allowed to occur.&lt;/p&gt;
&lt;p&gt;Moreover, &lt;em&gt;async&lt;/em&gt;/&lt;em&gt;await&lt;/em&gt; syntax allows cooperative scheduling in Python in a way that lets you write code that &lt;em&gt;looks&lt;/em&gt; synchronous (without task switches), while actually being able to be interrupted, from the point of view of the computer. It also keeps the programmers from having to worry about global state changing under their feet, as this can occur &lt;em&gt;only&lt;/em&gt; at the proximity of &lt;code&gt;await&lt;/code&gt; keywords.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;When going to a restaurant, social conventions (and common sense) tell us when and how these interactions can or cannot be interrupted, but programming languages need markers when using cooperative scheduling. These are &lt;/code&gt;async&lt;code&gt;and&lt;/code&gt;await&lt;code&gt;keywords in Python.&lt;/code&gt;Async&lt;code&gt;marks a function that *may* be interrupted,&lt;/code&gt;await&lt;code&gt;is required to call async-functions (aka&lt;/code&gt;coroutine`) and marks a point were task can be switched.&lt;/p&gt;
&lt;p&gt;If you want to learn more we strongly recommend reading the &lt;a href="https://trio.readthedocs.io/en/latest/tutorial.html"&gt;Trio Tutorial Primer on async programming&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="async-in-the-python-world"&gt;&lt;strong&gt;Async in the Python world&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In the current Python ecosystem, packages tend to standardize around &lt;a href="https://docs.python.org/3/library/asyncio.html"&gt;AsyncIO&lt;/a&gt;, provided in the Python standard library. AsyncIO can sometimes be judged as &lt;a href="https://whatisjasongoldstein.com/writing/im-too-stupid-for-asyncio/"&gt;complex&lt;/a&gt; even by &lt;a href="http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/"&gt;well known developers&lt;/a&gt;; this is in part due to the necessity of supporting other older asynchronous projects like &lt;a href="https://twistedmatrix.com/trac/"&gt;twisted&lt;/a&gt; or &lt;a href="http://www.tornadoweb.org/en/stable/"&gt;tornado&lt;/a&gt;, but it’s also what makes a lots of its power: One event loop to rule them all.&lt;/p&gt;
&lt;p&gt;Running a single async task requires you to learn about AsyncIO, write a non negligible amount of boilerplate code in order to fetch a single result. This can be especially cumbersome when doing interactive exploration, and likely will keep users from experimenting with AsyncIO code.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="How to run a single async task in Python repl without async integration." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/003-1_9PXwxCxpLs4BGcR0koHOww.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;How to run a single async task in Python repl without async integration.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As Raymond Hettinger would says (slamming hand on podium): “There must be a better way”.&lt;/p&gt;
&lt;h2 id="ipython-asyncio-integration"&gt;IPython AsyncIO Integration&lt;/h2&gt;
&lt;p&gt;Thanks to a multiple month effort (actually this work started close to &lt;a href="https://github.com/ipython/ipython/pull/10390"&gt;2 years ago&lt;/a&gt;), and the work of many talented people, you can now directly await code in the REPL and IPython will do “the right thing”.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Awaiting AsyncIO code should now automagically work." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/004-1_I3tXhrFw1SJYMmm3nghj0Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Awaiting AsyncIO code should now automagically work.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;With the new integration, you don’t have to import or learn about asyncio, deal with the loop yourself, or wrap your task in its own function. You are now able to just focus on the business logic and move along.&lt;/p&gt;
&lt;p&gt;The only thing you need to remember is: &lt;em&gt;&lt;strong&gt;If it is an async function you need to await it.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We hope that this will free users to experiment and play with asynchronous programming. Of course this will not magically make your code faster, or run in parallel, simply easier to write and reason about.&lt;/p&gt;
&lt;h2 id="other-async-libraries-aka-curio-and-trio-integration"&gt;Other Async Libraries (aka: curio and trio integration)&lt;/h2&gt;
&lt;p&gt;The addition of &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; keyword in Python did not only simplify the use of asynchronous programing and the standardization around &lt;code&gt;asyncio&lt;/code&gt;; it also allowed experimentation with new paradigms for asynchronous libraries. David Beazley created &lt;a href="https://github.com/dabeaz/curio"&gt;Curio&lt;/a&gt;, and Nathaniel Smith &lt;a href="https://trio.readthedocs.io/en/latest/"&gt;Trio&lt;/a&gt;, which both explore new ways to write asynchronous programs and explore how &lt;code&gt;async&lt;/code&gt;, &lt;code&gt;await&lt;/code&gt; and &lt;em&gt;coroutines&lt;/em&gt; could be used when starting from a blank slate. The Trio &lt;a href="https://trio.readthedocs.io/en/latest/"&gt;documentation introduction&lt;/a&gt; and which problems it attempt to solve [&lt;a href="https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/"&gt;1&lt;/a&gt;, &lt;a href="https://vorpus.org/blog/announcing-trio/"&gt;2&lt;/a&gt;, &lt;a href="https://vorpus.org/blog/control-c-handling-in-python-and-trio/"&gt;3&lt;/a&gt;, &lt;a href="https://vorpus.org/blog/timeouts-and-cancellation-for-humans/"&gt;4&lt;/a&gt;, &lt;a href="https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/"&gt;5&lt;/a&gt;, &lt;a href="https://vorpus.org/blog/companion-post-for-my-pycon-2018-talk-on-async-concurrency-using-trio/"&gt;6&lt;/a&gt;] are highly recommended reading with varying level of technicality.&lt;/p&gt;
&lt;p&gt;Interactive uses of libraries is key to getting insight and intuition on how a system works, intuition is critical to rapid prototyping, development and creation of higher levels of abstraction. It was natural for us to build support for Curio, Trio, (and potentially new other async libraries) into IPython.&lt;/p&gt;
&lt;p&gt;You can setup IPython to run async code via Curio, or Trio and experiment or write production code using these libraries. To do so use the &lt;code&gt;%autoawait&lt;/code&gt; magic, and tell it which library to use.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Defining an asynchronous function and spawning multiple concurrent task in IPython using Trio." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/005-1_LBoQBdKymSQYv_k1Yb1jAg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Defining an asynchronous function and spawning multiple concurrent task in IPython using Trio.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As you can see code looks really natural, and it is easy to forget that the above snippet is usually a syntax error in Python or older version of IPython. The astute reader and IPython expert will have suggested to use the &lt;em&gt;%%time&lt;/em&gt; cell magic instead of doing it manually, though a couple of magics still need updates to properly handle async code. We look forward to your contribution on this front, and are excited to see what you can come up with.&lt;/p&gt;
&lt;h2 id="async-in-notebooks-and-other-jupyter-clients"&gt;Async in Notebooks (and other Jupyter Clients)&lt;/h2&gt;
&lt;p&gt;If you are a Jupyter user, you most likely use a Notebook interface, and interact with IPython via the ipykernel package.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using AsyncIO in nteract desktop works out of the box with newer IPython and IPykernel" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/ipython-7-0-async-repl/images/006-1_aJEDRVPyMtyaiDQGXsx6-w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using AsyncIO in &lt;a href="https://nteract.io/"&gt;nteract desktop&lt;/a&gt; works out of the box with newer IPython and IPykernel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We’ve been working hard on making &lt;em&gt;async&lt;/em&gt; code work in a notebook when using ipykernel. While most of the heavy lifting was done in IPython, the work in IPykernel was non-negligible, and required the accommodation of a number of use cases, which are not working. You now have to &lt;strong&gt;update&lt;/strong&gt; both &lt;strong&gt;IPython&lt;/strong&gt; to 7.0+ &lt;strong&gt;and ipykernel&lt;/strong&gt; to version 5.0+ for async to be available. If you are using pip: &lt;code&gt;$ pip install IPython ipykernel --update&lt;/code&gt;. As for conda, the packages should be available on &lt;a href="https://conda-forge.org/"&gt;conda-forge&lt;/a&gt; soon. With these new releases, &lt;code&gt;async&lt;/code&gt; will work with all the frontends that support the Jupyter Protocol, including the classic Notebook, JupyterLab, Hydrogen, nteract desktop, and &lt;a href="https://blog.nteract.io/nteract-on-jupyter-53cc2c38290d"&gt;nteract web&lt;/a&gt;. The default code will run in the existing asyncio/tornado loop that runs the kernel. Integration with Trio and Curio is still available, but tasks will not be interleaved with the asyncio one — at least not yet. We welcome work on this front.&lt;/p&gt;
&lt;p&gt;Submitting background tasks still requires you to access the asyncio event loop, and we are still be looking for contributions on this front as well, to make it even easier to run async code.&lt;/p&gt;
&lt;p&gt;There are still some question on how to handle nested asyncio eventloop. It is indeed usually impossible to run nested eventloop, in the case of &lt;code&gt;asyncio&lt;/code&gt;, trying to do so raises a &lt;code&gt;RuntimeError&lt;/code&gt; the kernel already ran in and asyncio eventloop, calling directly or indirectly &lt;code&gt;loop.run_until_complete&lt;/code&gt; and alike is not possible. There are discussions to use libraries like &lt;code&gt;nest_asyncio&lt;/code&gt; as pointed out on &lt;a href="https://github.com/jupyter/notebook/issues/3397#issuecomment-419386811"&gt;this comment&lt;/a&gt;, but until those are more battle tested we do not want to commit a default solution in the core of IPython and let the ecosystem develop.&lt;/p&gt;
&lt;h2 id="future-improvements"&gt;Future improvements&lt;/h2&gt;
&lt;p&gt;As far as we know, this is the first Async-aware Python REPL, and libraries like Trio/Curio are still young, thus there are still a number of use-cases we have not yet even thought about! We are encouraging you to come forward to talk about your use cases, what you tried and what did not work. There is also a number of new features to implement (making magics work with &lt;code&gt;async&lt;/code&gt;, tab completion, background tasks) on which we would welcome new contributors.&lt;/p&gt;
</content><category term="IPython"/><category term="releases"/></entry></feed>