<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Jeremy Tuloup</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-jeremy-tuloup.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>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>Report on the JupyterLite Community Workshop 💡</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/report-on-the-jupyterlite-community-workshop/" rel="alternate"/><published>2023-01-27T13:06:00+00:00</published><updated>2023-01-27T13:30:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2023-01-27:/medium-archive/pelican/posts/2023/report-on-the-jupyterlite-community-workshop/</id><summary type="html">&lt;p&gt;The JupyterLite Community Workshop, held at the OVHcloud headquarters in Paris, France from December 7th to December 9th, 2022, brought…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The JupyterLite Community Workshop, held at the &lt;a href="https://www.ovhcloud.com"&gt;OVHcloud&lt;/a&gt; headquarters in Paris, France from December 7th to December 9th, 2022, brought together a group of developers, educators, and data scientists to discuss the latest advancements in the Jupyter and Python in the browser ecosystems.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jupyter Community Workshops are a series of community-organized events that aim to tackle challenging development and design projects, grow the community of contributors, and strengthen collaborations.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/report-on-the-jupyterlite-community-workshop/images/001-1_KA7njvnlfwBrg6Pfg3_nQg.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;One of the main focuses of the workshop was the &lt;a href="https://jupyterlite.readthedocs.io/en/latest/"&gt;JupyterLite&lt;/a&gt; project, a Jupyter distribution built from the ground-up using JupyterLab components and extensions, allowing for very scalable deployments. It already powers inline consoles and notebooks on the websites of major projects of the PyData ecosystem, such as &lt;a href="https://numpy.org/"&gt;NumPy&lt;/a&gt;, &lt;a href="https://www.sympy.org/en/shell.html"&gt;SymPy&lt;/a&gt;, &lt;a href="https://www.pymc.io"&gt;PyMC&lt;/a&gt;, and many more.&lt;/p&gt;
&lt;p&gt;The workshop also gathered the main developers and contributors of the Pyodide, PyScript and Emscripten-Forge projects that enable using Python in the browser.&lt;/p&gt;
&lt;h2 id="highlights-of-the-week"&gt;Highlights of the week&lt;/h2&gt;
&lt;p&gt;During the workshop, attendees had the opportunity to participate in group discussions, and split into smaller group to work on specific topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pyodide.org/"&gt;Pyodide&lt;/a&gt;, &lt;a href="/posts/2022/mamba-meets-jupyterlite/"&gt;Emscripten Forge&lt;/a&gt;, &lt;a href="https://pyscript.net/"&gt;PyScript&lt;/a&gt;, and more generally Python in the browser. This lead to discussions about making WebAssembly a first-class platform for the Python ecosystem, as per &lt;a href="https://discuss.python.org/t/make-wasm-a-1st-class-platform-in-the-python-ecosystem/21798"&gt;https://discuss.python.org/t/make-wasm-a-1st-class-platform-in-the-python-ecosystem/21798&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A proof of concept for using the Language Server Protocol in JupyterLite was also presented, showcasing its potential for improving developer productivity: &lt;a href="https://github.com/jupyterlite/jupyterlite-lsp"&gt;https://github.com/jupyterlite/jupyterlite-lsp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://github.com/jupyterlite/jupyterlite/files/10202654/CAPYTALE_presentation.pdf"&gt;presentation about Capytale and Basthon&lt;/a&gt; and the use of Python in the browser in the French high school system, deployed for 5000+ schools and with more than 200,000 active users per month.&lt;/li&gt;
&lt;li&gt;Integrating JupyterLite and Pyodide in &lt;a href="https://github.com/executablebooks/thebe"&gt;thebe&lt;/a&gt;, for producing interactive documents in arbitrary websites.&lt;/li&gt;
&lt;li&gt;Another topic of work was about using the latest real-time collaboration (RTC) improvements developed upstream in JupyterLab. Enabling RTC on a static JupyterLite website will make it an even more powerful tool for remote teams and online education.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;You can find the detailed notes and relevant links taken during the workshop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLite GitHub discussion: &lt;a href="https://github.com/jupyterlite/jupyterlite/discussions/920"&gt;https://github.com/jupyterlite/jupyterlite/discussions/920&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jupyter Discourse topic: &lt;a href="https://discourse.jupyter.org/t/jupyterlite-community-workshop-2022-paris-report/17255"&gt;https://discourse.jupyter.org/t/jupyterlite-community-workshop-2022-paris-report/17255&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Overall, the JupyterLite Community Workshop provided a valuable opportunity for the community to come together and share their knowledge, ideas, and experiences.&lt;/p&gt;
&lt;p&gt;We are really grateful to Bloomberg and Amazon Web Services for their donations to the Jupyter Community Workshops program. This event would not have been possible without their generous support.&lt;/p&gt;
&lt;p&gt;We are also grateful to &lt;a href="https://twitter.com/OVHCloud"&gt;OVHcloud&lt;/a&gt; for hosting this workshop, and for their continued support to the Jupyter project and the NumFOCUS foundation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/report-on-the-jupyterlite-community-workshop/images/002-1_S2p3XarrcVRgEDcMnJseHg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/><category term="events"/><category term="JupyterLite"/><category term="workshops"/></entry><entry><title>Jupyter Everywhere</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/" rel="alternate"/><published>2022-03-15T15:22:00+00:00</published><updated>2022-03-15T15:38:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2022-03-15:/medium-archive/pelican/posts/2022/jupyter-everywhere/</id><summary type="html">&lt;p&gt;Easily embed a console, a notebook, or a fully-fledged IDE on any web page.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Easily embed a console, a notebook, or a fully-fledged IDE on any web page.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In a &lt;a href="/posts/2021/jupyterlite-jupyter-webassembly-python/"&gt;previous blog post&lt;/a&gt;, we announced JupyterLite, a JupyterLab distribution that runs entirely in the web browser, backed by in-browser language kernels.&lt;/p&gt;
&lt;p&gt;By default, JupyterLite ships with a Python kernel powered by &lt;a href="https://pyodide.org"&gt;Pyodide&lt;/a&gt; and &lt;a href="https://ipython.readthedocs.io/en/stable"&gt;IPython&lt;/a&gt;, bringing a wide variety of features from &lt;strong&gt;code completion&lt;/strong&gt; to &lt;strong&gt;interactive visualizations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The latest releases of JupyterLite now ship with a REPL application by default, that you can embed in any website.&lt;/p&gt;
&lt;h2 id="embed-a-live-python-console-on-your-website"&gt;Embed a live Python console on your website 🚀&lt;/h2&gt;
&lt;p&gt;Do you want to add an interactive code console to your website, so your visitors can run Python code directly in their browser without installing anything?&lt;/p&gt;
&lt;p&gt;Let’s say you already have a static website up and running. This could for example be a Jekyll blog. With the JupyterLite REPL, you can embed the interactive console in your website with something as simple as the following code snippet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://jupyterlite.github.io/demo/repl/index.html?kernel=python&amp;amp;toolbar=1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;500px&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And there you have it, a live Python REPL embedded in your blog! 🎉&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="An example of embedding a live Python console in a Jekyll blog." src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/001-1_6o4AQYSXu5D0FUEDuKN12g.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;An example of embedding a live Python console in a Jekyll blog.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This example relies on the publicly available &lt;a href="https://github.com/jupyterlite/demo"&gt;demo website&lt;/a&gt; deployed to GitHub Pages. However we recommend setting up your own JupyterLite deployment, so you can have full control and use custom configuration and extensions (see the &lt;em&gt;Deploying your JupyterLite website&lt;/em&gt; section below).&lt;/p&gt;
&lt;h2 id="powering-the-numpy-documentation"&gt;Powering the NumPy documentation 🐍&lt;/h2&gt;
&lt;p&gt;The NumPy project had already been using an interactive console on the &lt;a href="https://numpy.org"&gt;numpy.org&lt;/a&gt; documentation website. The previous console was powered by &lt;a href="https://github.com/executablebooks/thebe"&gt;Thebe&lt;/a&gt; and &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;. While this gave great flexibility and a way for users to try NumPy without installing anything on their machine, it required starting a new Jupyter Server on Binder for each user, and then waiting for a kernel to start before being able to type some code.&lt;/p&gt;
&lt;p&gt;This setup worked for a while but started to become more difficult to maintain and operate.&lt;/p&gt;
&lt;p&gt;With the JupyterLite-powered Python REPL, &lt;a href="https://numpy.org"&gt;numpy.org&lt;/a&gt; is now able to provide an interactive code console and let anyone try NumPy in their browsers. This considerably reduces the number of resources needed and allows for a smoother and snappier user experience.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The JupyterLite REPL on numpy.org" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/002-1_aBGC8_llGDnbWifezqJBHQ.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLite REPL on numpy.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The REPL is currently based on the JupyterLab Code Console, which gives a familiar “look and feel” to Jupyter users. Other user interfaces such as a &lt;a href="https://github.com/jupyterlite/jupyterlite/issues/148"&gt;Single Executable Cell&lt;/a&gt; are also being considered for the next version of the REPL.&lt;/p&gt;
&lt;h2 id="try-jupyter"&gt;Try Jupyter 🟠&lt;/h2&gt;
&lt;p&gt;Another recent adopter of the JupyterLite stack is the official Jupyter website.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://try.jupyter.org"&gt;try.jupyter.org&lt;/a&gt; has been using the public-facing &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt; deployment to let users try the different Jupyter subprojects, such as &lt;a href="/posts/2019/and-voila/"&gt;Voilà&lt;/a&gt; and the &lt;a href="/posts/2020/xeus-is-now-a-jupyter-subproject/"&gt;Xeus-based&lt;/a&gt; kernels.&lt;/p&gt;
&lt;p&gt;This setup has been working nicely for many years. However, the Binder project recently faced &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/issues/2138"&gt;funding issues&lt;/a&gt;, which drastically reduced the overall capacity of the Binder federation. This means fewer resources are available to users for their projects, and this also impacted the Try Jupyter website.&lt;/p&gt;
&lt;p&gt;To mitigate this, we decided to create a custom JupyterLite website and use it for some of the demos on Try Jupyter. Users can then continue to try some of the Jupyter interfaces in their browsers without installing anything on their machines. As a result, the JupyterLab and Jupyter Notebook demos now point to the new JupyterLite deployment.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Launching JupyterLite from try.jupyter.org" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/003-1_UZ42uWfkmSasuyGWFRI2ZQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Launching JupyterLite from try.jupyter.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The “Try Jupyter with JupyterLite” deployment also includes the &lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-tour"&gt;jupyterlab-tour&lt;/a&gt; extension, offering a user-friendly tour of the Jupyter interface to newcomers.&lt;/p&gt;
&lt;h2 id="deploying-your-jupyterlite-website"&gt;Deploying your JupyterLite website 💡&lt;/h2&gt;
&lt;p&gt;Contrary to a regular Jupyter deployment, JupyterLite can be served as a simple static website without running a Python server. This makes it &lt;strong&gt;simpler to deploy, and cheaper to operate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Below are some examples for deploying your own JupyterLite and Python REPL.&lt;/p&gt;
&lt;h3 id="deploy-to-github-pages"&gt;Deploy to GitHub Pages&lt;/h3&gt;
&lt;p&gt;GitHub Pages is one of the simplest ways to host a JupyterLite website.&lt;/p&gt;
&lt;p&gt;This is what the demo repository available at &lt;a href="https://github.com/jupyterlite/demo"&gt;https://github.com/jupyterlite/demo&lt;/a&gt; does by default. It lets you bootstrap your JupyterLite website with a few clicks, and deploy it to GitHub Pages within a couple of minutes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Creating a JupyterLite website with just a couple of clicks" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/004-1_fK9jSMoHgqBpnKN5aLXlIg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Creating a JupyterLite website with just a couple of clicks&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;After a few minutes, your website will be ready and you can then embed your live Python console with the following snippet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://yourhandle.github.io/my-custom-deployment/repl/index.html?kernel=python&amp;amp;toolbar=1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;500px&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="The JupyterLite REPL running on GitHub Pages" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/005-1_KkyYclq5t2YyyuUhFQfbEw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLite REPL running on GitHub Pages&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="deploy-to-vercel-or-netlify"&gt;Deploy to Vercel or Netlify&lt;/h3&gt;
&lt;p&gt;Hosted platforms like Vercel and Netlify are good options to deploy a static JupyterLite website.&lt;/p&gt;
&lt;p&gt;The REPLite project is an example deployed to Vercel, based on the following repository with some custom configuration: &lt;a href="https://github.com/jtpio/replite"&gt;https://github.com/jtpio/replite&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Python REPL can be embedded with an IFrame:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://replite.vercel.app/repl?kernel=python&amp;amp;toolbar=1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we use the &lt;code&gt;?kernel=python&lt;/code&gt; URL parameter to automatically choose the Python kernel on startup.&lt;/p&gt;
&lt;h3 id="deploying-to-readthedocs-using-the-sphinx-extension"&gt;Deploying to ReadTheDocs using the Sphinx extension&lt;/h3&gt;
&lt;p&gt;Going the extra mile, &lt;a href="https://github.com/jupyterlite/jupyterlite-sphinx"&gt;jupyterlite-sphinx&lt;/a&gt; brings the power of JupyterLite to your Sphinx documentation. It automatically creates a JupyterLite deployment in your documentation website and provides some utilities for using that deployment easily.&lt;/p&gt;
&lt;p&gt;If you are developing software, it’s a very convenient tool to let your users test your library directly on the documentation page!&lt;/p&gt;
&lt;p&gt;This is also really useful for Jupyter users who want to easily share their work on &lt;a href="http://readthedocs.org"&gt;readthedocs.org&lt;/a&gt;, GitHub Pages, or any other host that supports Sphinx documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can install &lt;code&gt;jupyterlite-sphinx&lt;/code&gt; with pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyterlite-sphinx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then add the extension to your &lt;code&gt;conf.py&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;extensions = [
    &amp;#39;jupyterlite_sphinx&amp;#39;,
    # And other sphinx extensions
    # ...
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that’s it! &lt;code&gt;jupyterlite-sphinx&lt;/code&gt; will automatically deploy a JupyterLite website when building your docs with Sphinx.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;jupyterlite-sphinx&lt;/code&gt; provides multiple Sphinx directives for embedding Python consoles and custom Notebooks in your documentation:&lt;/p&gt;
&lt;p&gt;To embed a Python REPL similar to the &lt;a href="http://NumPy.org"&gt;NumPy.org&lt;/a&gt; one:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;replite&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;
   &lt;span class="nc"&gt;:kernel:&lt;/span&gt; python
   &lt;span class="nc"&gt;:theme:&lt;/span&gt; JupyterLab Light
   &lt;span class="nc"&gt;:width:&lt;/span&gt; 100%
   &lt;span class="nc"&gt;:height:&lt;/span&gt; 600px
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    print(&amp;#39;Hello from a JupyterLite console!&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Embedding the JupyterLite REPL" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/006-0_DMYBurEcdHmylCDu.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Embedding the JupyterLite REPL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To embed a full Notebook:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;retrolite&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; my_notebook.ipynb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;a href="https://ipycanvas.readthedocs.io/en/master"&gt;&lt;img alt="An interactive Jupyter Notebook on the ipycanvas documentation" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/007-1_CCLLn1s1p9GEFwHB6WAH-w.jpg" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;An interactive Jupyter Notebook on the &lt;a href="https://ipycanvas.readthedocs.io/en/master"&gt;ipycanvas documentation&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Finally, you might also want to embed the full JupyterLite UI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;jupyterlite&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the notebooks are saved in the browser local storage, so any work done on those Notebooks can be retrieved later when coming back to the web page with the same browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can find the &lt;code&gt;jupyterlite-sphinx&lt;/code&gt; documentation with live examples following this link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterlite-sphinx.readthedocs.io"&gt;jupyterlite-sphinx — JupyterLite sphinx extension documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can find an example of &lt;code&gt;jupyterlite-sphinx&lt;/code&gt; being used on &lt;a href="https://readthedocs.org/"&gt;ReadTheDocs&lt;/a&gt; here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ipycanvas.readthedocs.io/en/master"&gt;ipycanvas: Interactive Canvas in Jupyter — ipycanvas documentation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="more-examples"&gt;More examples&lt;/h3&gt;
&lt;p&gt;JupyterLite can be deployed on more platforms than just the ones mentioned above. Pretty much anything that can serve static files should work!&lt;/p&gt;
&lt;p&gt;Feel free to check out the documentation to learn more about deploying your JupyterLite website on other platforms: &lt;a href="https://jupyterlite.readthedocs.io/en/latest/deploying.html#hosted"&gt;https://jupyterlite.readthedocs.io/en/latest/deploying.html#hosted&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="jupyter-everywhere"&gt;Jupyter Everywhere 🌐&lt;/h2&gt;
&lt;p&gt;With JupyterLite gaining rapid adoption on widely visited websites such as &lt;a href="https://numpy.org"&gt;numpy.org&lt;/a&gt; and &lt;a href="https://try.jupyter.org"&gt;try.jupyter.org&lt;/a&gt;, we envision Jupyter being adopted on more websites and documentation over the next months.&lt;/p&gt;
&lt;p&gt;We hope to bring interactive computing with Jupyter to even more people than before and make it more accessible by lowering the barrier of entry.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/008-0_TK59W6sOJHNg-Sgi.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Because JupyterLite can easily be extended with JupyterLab extensions, we also expect more Jupyter-based deployments and applications to flourish, making good reuse of the existing components that constitute the vibrant Jupyter ecosystem 🌸&lt;/p&gt;
&lt;p&gt;Jupyter is language agnostic and more kernels are now available in JupyterLite, for example for Lua and SQLite based on the &lt;a href="/posts/2021/xeus-lite/"&gt;Xeus framework&lt;/a&gt;. Soon Jupyter will also power the documentation and websites of other languages, not just Python.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/009-0_bIbm1NNbif5Dn1H8.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Scientific Software Engineer at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Martin works on a variety of projects, from &lt;a href="https://github.com/QuantStack/xtensor"&gt;xtensor&lt;/a&gt; and &lt;a href="https://github.com/QuantStack/xeus-python/"&gt;xeus-python&lt;/a&gt; in C++ to &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt;, &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt; in Python and TypeScript.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/010-1_rBRr_6uBceP-shArkLcXhQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; is a Scientific Software Engineer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Maintainer and contributor of JupyterLab, Jupyter Notebook, JupyterLite, Voilà, and projects within the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-everywhere/images/011-1_Ab9PIO4Zs-6MOYhzF4GXPA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLite"/></entry><entry><title>JupyterLite: Jupyter ❤️ WebAssembly ❤️ Python</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/" rel="alternate"/><published>2021-07-13T09:11:00+00:00</published><updated>2021-07-13T09:11:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2021-07-13:/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/</id><summary type="html">&lt;p&gt;JupyterLite is a JupyterLab distribution that runs entirely in the web browser, backed by in-browser language kernels powered by…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;JupyterLite is a JupyterLab distribution that runs entirely in the web browser, backed by in-browser language kernels.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/001-1_CMvcTaLSAD5A-WHCtnIFwA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;JupyterLite is a reboot of several attempts at making a full static Jupyter distribution that runs in the browser, without having to start the Python Jupyter Server on the host machine, usually done by running &lt;code&gt;jupyter lab&lt;/code&gt; or &lt;code&gt;jupyter notebook&lt;/code&gt; in a terminal.&lt;/p&gt;
&lt;p&gt;The goal of the project is to provide a lightweight computing environment accessible in a matter of seconds with a single click, in a web browser, and without having to install anything on the end-user device.&lt;/p&gt;
&lt;p&gt;With in-browser distributions, there is no need to provision the execution environment in the backend. Since the application is mostly a set of static files, it scales more easily, and it is also easier to deploy.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLite running in the browser as a static website on ReadTheDocs" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/002-1_bR--bXsuiMIDz-D_V4BfLw.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLite running in the browser as a static website on ReadTheDocs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-full-jupyterlab-distribution-running-in-the-browser"&gt;A full JupyterLab distribution running in the browser&lt;/h2&gt;
&lt;p&gt;JupyterLite is built from the ground up, reusing many JupyterLab plugins and components as is.&lt;/p&gt;
&lt;p&gt;In addition to JupyterLab, JupyterLite also includes the &lt;a href="https://github.com/jupyterlab/retrolab"&gt;RetroLab&lt;/a&gt; interface by default:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLite with the RetroLab interface" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/003-1_B1Se7Fe1JXBt2a1NjwRmxg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLite with the RetroLab interface&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;By reusing JupyterLab components, JupyterLite benefits from many of the upstream improvements such as new features, accessibility fixes, and upkeep improvements. The &lt;a href="/posts/2021/how-we-made-jupyter-notebooks-collaborative-with-yjs/"&gt;recent work on real time collaboration&lt;/a&gt; coming in JupyterLab 3.1 and championed by &lt;a href="https://twitter.com/kevin_jahns"&gt;Kevin Jahns&lt;/a&gt;, &lt;a href="https://twitter.com/carlosHerreroB/"&gt;Carlos Herrero&lt;/a&gt;, and &lt;a href="https://twitter.com/echarles"&gt;Eric Charles&lt;/a&gt; can be enabled in JupyterLite too!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Real Time Collaboration with JupyterLite on ReadTheDocs" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/004-1_HwMx3Fd6iICkWjjvUCtvwA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Real Time Collaboration with JupyterLite on ReadTheDocs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="pyolite-a-python-kernel-backed-by-pyodide"&gt;Pyolite, a Python kernel backed by Pyodide&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://pyodide.org"&gt;Pyodide&lt;/a&gt; consists of the CPython 3.8 interpreter compiled to WebAssembly which allows Python to run in the browser. Many popular scientific Python packages have also been compiled and made available. In addition, Pyodide can install any Python package with a pure Python wheel from the Python Package Index (PyPI). Pyodide also includes a comprehensive foreign function interface that exposes the ecosystem of Python packages to JavaScript and the browser user interface, including the DOM, to Python.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Pyodide: Python with the scientific stack, compiled to WebAssembly" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/005-1_usFUmvzRo6v8TuRFQhK0uw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Pyodide: Python with the scientific stack, compiled to WebAssembly&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Currently at version &lt;a href="https://hacks.mozilla.org/2021/04/pyodide-spin-out-and-0-17-release/"&gt;0.17&lt;/a&gt;, Pyodide has benefited from many improvements over the past years: smaller binary size, support for &lt;code&gt;asyncio&lt;/code&gt;, and better type translations between Python and JavaScript.&lt;/p&gt;
&lt;p&gt;JupyterLite ships by default with &lt;code&gt;Pyolite&lt;/code&gt;, a Python kernel backed by Pyodide. Pyolite runs in a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API"&gt;Web Worker&lt;/a&gt; and thus doesn’t block the main UI thread when intensive computations are executed.&lt;/p&gt;
&lt;h2 id="ipython-in-the-browser"&gt;IPython in the browser&lt;/h2&gt;
&lt;p&gt;Thanks to the work by Madhur Tandon in this &lt;a href="https://github.com/jupyterlite/jupyterlite/pull/171"&gt;pull request&lt;/a&gt;, Pyolite is now powered by IPython. This provides access to magics, code completion, rich display, interactive widgets, and many other features.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using IPython in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/006-1_2WBnuwRGkASGVNYUGjyPHg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using IPython in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="interactive-visualization"&gt;Interactive Visualization&lt;/h2&gt;
&lt;p&gt;Many visualizations libraries such as &lt;a href="https://altair-viz.github.io/"&gt;Altair&lt;/a&gt; and &lt;a href="https://plotly.com/"&gt;Plotly&lt;/a&gt; are also supported in JupyterLite, allowing for quick and convenient figures and plots right in the browser:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using Altair in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/007-1_SRr162bkckWsmoSMxVd2uQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using Altair in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Creating Plotly figures in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/008-1_w7Y4wRz9h2OFMgm5MfdD0A.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Creating Plotly figures in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="support-for-jupyter-widgets"&gt;Support for Jupyter Widgets&lt;/h2&gt;
&lt;p&gt;Jupyter Widgets rely on the &lt;a href="https://jupyter-client.readthedocs.io/en/latest/messaging.html#custom-messages"&gt;Custom Messages specification of the Jupyter Protocol&lt;/a&gt; to send messages back and forth between the kernel and the frontend. This &lt;a href="https://github.com/jupyterlite/jupyterlite/pull/145"&gt;pull request&lt;/a&gt; by Martin Renou added support for Comms in the Pyolite kernel, which enabled many of the existing core and third-party Jupyter Widgets to work out of the box in JupyterLite such as &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt;, &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; and &lt;a href="https://github.com/martinRenou/ipycanvas"&gt;ipycanvas&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLite comes with support for Jupyter Widgets" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/009-1_c1DIbxS6bZ7bHDcOTEIJfg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLite comes with support for Jupyter Widgets&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="more-than-just-python"&gt;More than just Python&lt;/h2&gt;
&lt;p&gt;JupyterLite makes it possible to have plenty of other kernels also running in the browser. For now, the default distribution includes a JavaScript and a &lt;a href="https://p5js.org/"&gt;p5&lt;/a&gt; kernel:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Multiple kernels are available in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/010-1_5XFdmBdQWeONbRD3nuQe0A.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Multiple kernels are available in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Both the JavaScript and the p5 kernels run in an IFrame as the code execution sandbox. With the Jupyter display protocol, users can easily render custom animations in the browser:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The p5.js kernel in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/011-1_kPYtSDP3aE5_M5AmDT-Uvw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The p5.js kernel in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="highly-customizable"&gt;Highly Customizable&lt;/h2&gt;
&lt;p&gt;Just like many existing Jupyter tools, JupyterLite can easily be configured for custom needs.&lt;/p&gt;
&lt;p&gt;It supports the new &lt;a href="https://jupyterlab.readthedocs.io/en/stable/extension/extension_dev.html#prebuilt-extensions"&gt;JupyterLab prebuilt extension system&lt;/a&gt; added to the 3.0 release. Existing JupyterLab extensions can then easily be reused in JupyterLite too!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The JupyterLab Drawio extension running in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/012-1_69CnccBrufVEEU0wqE_f7Q.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab Drawio extension running in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The in-browser server part of JupyterLite also follows a plugin-based approach. The server is a &lt;a href="https://github.com/jupyterlab/lumino"&gt;Lumino&lt;/a&gt; application without a shell and registers multiple plugins such as kernels, the contents manager or the sessions service. This plugin-based approach makes it very convenient for deployers and site administrators to swap a plugin for another one. For instance, they might want to swap the default contents manager that stores notebooks and files in the browser local storage with another plugin that would save them on AWS S3 instead.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Overview of the plugin-based architecture of JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/013-1_f7viaaS4SYTBpjA6DTPsDQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of the plugin-based architecture of JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The modularity and flexibility of JupyterLite make it possible to easily add new kernels. For example, the Basthon kernel uses a slightly different execution model than Pyolite. It runs in the main UI thread so users can manipulate the main window DOM from within Python directly, while Pyolite runs in a Web Worker as a background thread. Both approaches have pros and cons, and the JupyterLite plugin system lets extension authors have full control over their kernels.&lt;/p&gt;
&lt;p&gt;A prototype for running Basthon in JupyterLite is being developed in the following repository: &lt;a href="https://framagit.org/casatir/basthon-jupyterlab/"&gt;https://framagit.org/casatir/basthon-jupyterlab/&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Basthon in JupyterLite" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/014-1_mMmSo4GPx7rpxbMpyf-VAA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Basthon in JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="deploying-jupyterlite"&gt;Deploying JupyterLite&lt;/h2&gt;
&lt;p&gt;JupyterLite can easily be deployed as a static website. That’s it, no server, no complicated setup, no scalability issue. Just a plain HTTP server to serve static files to users.&lt;/p&gt;
&lt;p&gt;This simple approach makes it possible to use a variety of options: nginx, &lt;a href="https://mybinder.org"&gt;Binder,&lt;/a&gt; GitHub Pages or GitLab Pages, Vercel, Netlify, and more. It can even be deployed to ReadTheDocs, which is where the default JupyterLite demo site is hosted and continuously updated.&lt;/p&gt;
&lt;p&gt;Many of the deployment scenarios are already documented in &lt;a href="https://jupyterlite.readthedocs.io/en/latest/deploying.html"&gt;https://jupyterlite.readthedocs.io/en/latest/deploying.html&lt;/a&gt;. There is also a demo template to easily deploy a custom JupyterLite website on GitHub Pages with a single click: &lt;a href="https://github.com/jupyterlite/demo"&gt;https://github.com/jupyterlite/demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to the work by Nicholas Bollweg in this &lt;a href="https://github.com/jupyterlite/jupyterlite/pull/147"&gt;pull request&lt;/a&gt;, JupyterLite now offers a &lt;code&gt;jupyterlite&lt;/code&gt; &lt;a href="https://pypi.org/project/jupyterlite/"&gt;command line tool&lt;/a&gt; to make custom deployments much more convenient.&lt;/p&gt;
&lt;p&gt;One of the goals of JupyterLite is to let anyone build their custom distribution with the set of plugins and extensions they would like to use. For now, it requires using the &lt;code&gt;jupyterlite&lt;/code&gt; CLI, but we can imagine having a more user-friendly way of exporting a custom JupyterLite website.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A mock-up for the JupyterLite Exporter" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/015-1_LL_UkItjshAzsEEDB4cI2A.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A mock-up for the JupyterLite Exporter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-wide-range-of-use-cases"&gt;A wide range of use cases&lt;/h2&gt;
&lt;p&gt;With the ease of deployment and the low barrier to entry, JupyterLite is an excellent fit for a wide range of use cases.&lt;/p&gt;
&lt;p&gt;In the educational space, it simplifies access to teaching materials and computing environments. Teachers and students can focus on the content of their classes without worrying about server deployments and monitoring.&lt;/p&gt;
&lt;p&gt;With JupyterLite we also hope to enable the next wave of Jupyter users and make the whole ecosystem even more accessible to newcomers and the wider community.&lt;/p&gt;
&lt;p&gt;For simpler and smaller-scale projects, it could even help reduce the load on &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt; by having a &lt;a href="https://twitter.com/fperez_org/status/1385825172230262794"&gt;“binderlite” version of JupyterLite&lt;/a&gt; deployed on a CDN.&lt;/p&gt;
&lt;h2 id="try-it-online"&gt;Try it online&lt;/h2&gt;
&lt;p&gt;JupyterLite can easily be tested in a web browser using the following link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterlite.github.io/demo"&gt;https://jupyterlite.github.io/demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterlite.github.io/demo"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/001-1_CMvcTaLSAD5A-WHCtnIFwA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="try-it-locally"&gt;Try it locally&lt;/h2&gt;
&lt;p&gt;JupyterLite can also be used locally. First, install the CLI package with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install --pre jupyterlite
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, to build the JupyterLite website and serve it locally:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter lite init
jupyter lite build
jupyter lite serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check out the documentation for more information about the &lt;code&gt;jupyterlite&lt;/code&gt; command-line tool: &lt;a href="https://jupyterlite.readthedocs.io/en/latest/developer-guide.html"&gt;https://jupyterlite.readthedocs.io/en/latest/developer-guide.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="next-steps"&gt;Next steps&lt;/h2&gt;
&lt;p&gt;JupyterLite is still under active development, with a lot of improvements planned for the next iterations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improve tooling for authoring custom in-browser kernels, reusing the JupyterLab federated (prebuilt) extension system.&lt;/li&gt;
&lt;li&gt;Improve the package management story in Pyodide with &lt;a href="https://github.com/mamba-org/mamba"&gt;mamba&lt;/a&gt; and the &lt;a href="https://github.com/conda-forge/conda-forge.github.io/issues/1401"&gt;conda-forge infrastructure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reuse the JupyterLite packages in other lab-based applications such as &lt;a href="https://github.com/voila-dashboards/voila"&gt;Voilà&lt;/a&gt;, &lt;a href="https://github.com/mamba-org/gator"&gt;Gator&lt;/a&gt;, and the &lt;a href="https://github.com/mamba-org/quetz-frontend"&gt;Quetz Frontend&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Provide more user-friendly tools to easily export a custom JupyterLite distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="getting-involved"&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;JupyterLite is under active development happening in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the main repository: &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;https://github.com/jupyterlite/jupyterlite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;satellite repositories (kernels, demos) in the GitHub organization: &lt;a href="https://github.com/jupyterlite"&gt;https://github.com/jupyterlite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; is a Scientific Software Developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Maintainer and contributor of JupyterLab, Voilà, and many projects within the Jupyter ecosystem.&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;We would like to acknowledge the previous work and the contributors who have worked on exploring the idea of Python in the notebook before us: &lt;a href="https://github.com/deathbeds/jyve"&gt;Jyve&lt;/a&gt;, the &lt;a href="https://github.com/iodide-project/iodide"&gt;Iodide notebook&lt;/a&gt;, &lt;a href="https://basthon.fr/"&gt;Basthon&lt;/a&gt;, and the &lt;a href="https://github.com/jtpio/p5-notebook"&gt;p5 notebook&lt;/a&gt;. It is also worth mentioning that similar projects exist outside of the Jupyter ecosystem, such as &lt;a href="https://observablehq.com"&gt;Observable&lt;/a&gt; and the &lt;a href="https://starboard.gg"&gt;Starboard Notebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://github.com/bollwyvl"&gt;Nicholas Bollweg&lt;/a&gt;, &lt;a href="https://twitter.com/mad_tandon"&gt;Madhur Tandon&lt;/a&gt;, &lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; for their contributions to JupyterLite, to &lt;a href="https://twitter.com/RomanYurchak"&gt;Roman Yurchak&lt;/a&gt; and team for the work on Pyodide, Romain Casati for developing the Basthon kernel.&lt;/p&gt;
&lt;p&gt;The work on JupyterLite by Jeremy Tuloup, Madhur Tandon, and Martin Renou was funded by &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyterlite-jupyter-webassembly-python/images/016-1_UY4k_mgLml9uvyo_EKMdFA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLite"/><category term="WebAssembly"/></entry><entry><title>RetroLab — A JupyterLab distribution with a retro look and feel</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/" rel="alternate"/><published>2021-05-27T11:31:00+00:00</published><updated>2021-05-28T21:29:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2021-05-27:/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/</id><summary type="html">&lt;p&gt;RetroLab is an alternative JupyterLab distribution, built from the ground-up, providing a notebook interface with a retro look and feel.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;RetroLab is an alternative JupyterLab distribution, built from the ground-up, providing a notebook interface with a &lt;em&gt;retro&lt;/em&gt; look and feel.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="RetroLab in action" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/001-0_31HHZ6ZIsx8T9CMe.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;RetroLab in action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Currently at version 3.0, JupyterLab provides an advanced computational environment that can be compared to traditional IDEs and text editors like VS Code and PyCharm.&lt;/p&gt;
&lt;p&gt;However in some cases, having a leaner, simpler, and more focused interface to work on a notebook is really useful. For example when presenting an analysis to colleagues over a video call. Or teaching a topic and make sure the audience focuses on the content of the notebook.&lt;/p&gt;
&lt;p&gt;The goal of the RetroLab project is to offer an interface with a retro look and feel, similar to the Classic Notebook, while leveraging the efforts put in the development of JupyterLab itself and its extension system.&lt;/p&gt;
&lt;p&gt;Technically speaking RetroLab &lt;strong&gt;remixes&lt;/strong&gt; many of the existing plugins for JupyterLab (notebook, toolbar, terminals) and reassembles them in a different way. It also supports &lt;em&gt;prebuilt&lt;/em&gt; third-party extensions using the new distribution system added in JupyterLab 3.0. That way, many extensions built for JupyterLab will also be compatible with RetroLab.&lt;/p&gt;
&lt;p&gt;JupyterLab itself is also built as a set of extensions and plugins. The JupyterLab extension system makes it very convenient to create new distributions from a subset of plugins.&lt;/p&gt;
&lt;p&gt;Let’s have a look at some of features available in RetroLab.&lt;/p&gt;
&lt;h2 id="notebooks-files-and-terminal"&gt;Notebooks, Files and Terminal&lt;/h2&gt;
&lt;p&gt;RetroLab supports Notebooks, Files and Terminals.&lt;/p&gt;
&lt;p&gt;Notebooks can be created using the File Browser, the menu items and the command palette.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Working in a notebook with RetroLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/002-1_YNXP-hnVMyrpRjDwMyFBtA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Working in a notebook with RetroLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The File Browser provides convenient buttons to quickly create new notebooks, files and terminals.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Creating a new Terminal" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/003-1_BZPRD5veN5Fwm81rCD2ZNQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Creating a new Terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Long time users of the Classic Notebook will already have noticed that activities are opened in new browser tabs by default. This provides an alternative way to manage workflows. Users who prefer to manage everything within a single browser tab might want to stick to the JupyterLab default interface.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Open in a new Browser Tab by default" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/004-1_KejsZJ1Vq82_ncEGjN6zdA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Open in a new Browser Tab by default&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="zen-mode"&gt;Zen Mode&lt;/h2&gt;
&lt;p&gt;RetroLab also offers a zen mode to quickly switch to full screen and hide the top area. Very useful to focus on a single notebook, and also during presentations or screen sharing sessions!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Zen Mode" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/005-1_Q-cGj8z0kw7sbMl_D6y34Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Zen Mode&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="support-for-existing-jupyterlab-prebuilt-extensions"&gt;Support for existing JupyterLab prebuilt extensions&lt;/h2&gt;
&lt;p&gt;One of the main features in JupyterLab 3.0 is the new extension distribution system, which makes it possible to distribute extensions as &lt;em&gt;prebuilt extensions.&lt;/em&gt; Prebuilt extensions do not require users to rebuild JupyterLab or have &lt;a href="https://nodejs.org"&gt;Node.js&lt;/a&gt; installed.&lt;/p&gt;
&lt;p&gt;Since prebuilt extensions are loaded dynamically, they can also be leveraged in RetroLab without any extra step!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Installing a new JupyterLab extension and using it in RetroLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/006-1_Kdj9uNSXmZVOzDVM_qKjxQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Installing a new JupyterLab extension and using it in RetroLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Note to developers: most of the time your extension will be compatible with RetroLab without changing anything. However it is good practice to think about the different types of JupyterLab distributions when developing the extension. For example some services and shell areas are not available in RetroLab: no left, right and bottom area, the main area supports adding only one widget…&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="command-palette"&gt;Command Palette&lt;/h2&gt;
&lt;p&gt;RetroLab includes a command palette, just like in JupyterLab.&lt;/p&gt;
&lt;p&gt;Hit &lt;code&gt;Ctrl-Shift-C&lt;/code&gt; or &lt;code&gt;Accel-Shift-C&lt;/code&gt; to activate it. Or via the menu with &lt;code&gt;View &amp;gt; Activate Command Palette.&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using the command palette to restart the kernel" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/007-1_7k57aBOevLbtRDvCBWEWkw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the command palette to restart the kernel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="themes"&gt;Themes&lt;/h2&gt;
&lt;p&gt;RetroLab also supports Dark Mode! 🕶️&lt;/p&gt;
&lt;p&gt;In fact, it supports any other themes distributed as prebuilt extensions for JupyterLab 3.0.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Switching between the light and dark built-in themes" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/008-1_RlEcR2gqeFdzM-0Vbrrm1g.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Switching between the light and dark built-in themes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For an even more retro look, you might want to start &lt;code&gt;retrolab&lt;/code&gt; with the &lt;code&gt;--retro-logo&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter retro --retro-logo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="The RetroLab logo with the JupyterLab Miami Nights Theme" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/009-0_GMPUEw-wPbSgc_3q.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The RetroLab logo with the JupyterLab Miami Nights Theme&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="compact-view-on-mobile-devices"&gt;Compact View on Mobile Devices&lt;/h2&gt;
&lt;p&gt;RetroLab automatically switches to a more compact layout on mobile devices, making it convenient to run code on the go.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Compact layout by default on mobile devices" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/010-1_w5BYbWktaFxHWKd-stlQGg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Compact layout by default on mobile devices&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="next-gen-jupyterlab-features"&gt;Next-gen JupyterLab features&lt;/h2&gt;
&lt;p&gt;Since RetroLab reuses many components from JupyterLab as-is, it automatically inherits many of the improvements and cool new features being developed upstream.&lt;/p&gt;
&lt;p&gt;With the latest &lt;a href="https://github.com/jupyterlab/retrolab/releases/tag/0.3.0a0"&gt;prerelease&lt;/a&gt; for RetroLab, folks can collaborate using RetroLab, JupyterLab or even JupyterLab in Simple Mode.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Real Time Collaboration with RetroLab and JupyterLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/011-1_jJQM60b76hELGDQxWcRbNA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Real Time Collaboration with RetroLab and JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install RetroLab 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 retrolab
&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 retrolab
&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 retrolab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To try the prerelease with support for real time collaboration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install --pre retrolab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Development is happening is the following repository: &lt;a href="https://github.com/jupyterlab/retrolab"&gt;https://github.com/jupyterlab/retrolab&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feedback, issues and pull requests are welcome!&lt;/p&gt;
&lt;h2 id="try-it-out-on-binder"&gt;Try it out on Binder&lt;/h2&gt;
&lt;p&gt;It is also possible to try RetroLab on &lt;a href="https://mybinder.org"&gt;Binder&lt;/a&gt; using the following link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/jtpio/77c82c512f6779a1a05ab59d915dfc36"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/012-0_4itEMxUk39fqVdJj.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="next-steps"&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;With RetroLab, we hope to inspire the development of distributions and applications built using JupyterLab components.&lt;/p&gt;
&lt;p&gt;A couple of other initiatives have already started:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gator: &lt;a href="https://github.com/mamba-org/gator"&gt;https://github.com/mamba-org/gator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quetz Frontend: &lt;a href="https://github.com/mamba-org/quetz-frontend"&gt;https://github.com/mamba-org/quetz-frontend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also plans to &lt;a href="https://github.com/jupyterlab/retrolab#133"&gt;create a cookiecutter&lt;/a&gt; that can serve as a template to quickly bootstrap new lab-based projects from scratch.&lt;/p&gt;
&lt;h2 id="prior-art"&gt;Prior Art&lt;/h2&gt;
&lt;p&gt;This project is mostly a reboot of the two previous attempts at making something similar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yuvipanda/simplest-notebook"&gt;The Simplest Notebook&lt;/a&gt; by &lt;a href="https://github.com/yuvipanda"&gt;Yuvi Panda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercalpoly/jupyterlab-clarity-mode"&gt;JupyterLab Clarity Mode&lt;/a&gt; by &lt;a href="https://github.com/jupytercalpoly"&gt;Jupyter Cal Poly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These projects really expressed the need for a stripped down, minimal version of the Jupyter Notebook UI, and were a huge source of inspiration for RetroLab. Many thanks to the contributors!&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; is a Scientific Software Developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; and a Jupyter Distinguished Contributor. Maintainer and contributor of JupyterLab, Voilà, and many projects within the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/013-0__yqb6gJ-JbnECfs7.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/retrolab-a-jupyterlab-distribution-with-a-retro-look/images/014-1_n9MydI9CDW9vlav1gMlo0Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/></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>Plasma: A learning platform powered by Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/" rel="alternate"/><published>2020-05-11T07:55:00+00:00</published><updated>2020-05-11T07:55:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2020-05-11:/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/</id><summary type="html">&lt;p&gt;Jupyter has been a great choice for education for many years. The Jupyter Notebook has become one of the most popular tools to conduct…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jupyter has been a &lt;a href="/posts/2019/teaching-and-learning-with-jupyter/"&gt;great choice&lt;/a&gt; for &lt;a href="https://jupyter4edu.github.io/jupyter-edu-book/"&gt;education&lt;/a&gt; for many years. The Jupyter Notebook has become one of the most popular tools to conduct workshops, tutorials, and teach online classes.&lt;/p&gt;
&lt;p&gt;Recently we have seen the emergence and adoption of JupyterHub distributions to facilitate the deployment of Jupyter-based platforms, both on private servers and in the cloud.&lt;/p&gt;
&lt;p&gt;We would like to share with you an open-source learning platform called &lt;a href="https://twitter.com/PlasmaBio"&gt;Plasma,&lt;/a&gt; built with Jupyter at its core.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/001-0_wWdglu7KBVC08Lcc.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="jupyterhub-distributions"&gt;JupyterHub Distributions&lt;/h2&gt;
&lt;p&gt;JupyterHub is a highly customizable and modular framework. To simplify its adoption, &lt;a href="https://jupyterhub.readthedocs.io/en/stable/#jupyterhub"&gt;JupyterHub distributions&lt;/a&gt; target specific deployment scenarios with opinionated defaults. They make it easier to deploy JupyterHub on a single server and in the cloud.&lt;/p&gt;
&lt;p&gt;There are currently two popular JupyterHub distributions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tljh.jupyter.org"&gt;The Littlest JupyterHub (TLJH)&lt;/a&gt;: for running JupyterHub on a single machine, targeting between 1 and 100 users&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zero-to-jupyterhub.readthedocs.io"&gt;Zero To JupyterHub on Kubernetes (ZTJH)&lt;/a&gt;: for running JupyterHub on top of &lt;a href="https://k8s.io/"&gt;Kubernetes,&lt;/a&gt; to scale to a large number of users and machines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although not an official distribution, &lt;a href="https://github.com/jupyterhub/jupyterhub-deploy-docker"&gt;jupyterhub-deploy-docker&lt;/a&gt; is also a good resource for a full Docker-based setup. It runs JupyterHub itself in a Docker container and orchestrates the stack with &lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-plasma-stack"&gt;The Plasma Stack&lt;/h2&gt;
&lt;p&gt;Plasma stands for &lt;em&gt;PLateforme d’e-Learning pour l’Analyse de données Scientifiques MAssives&lt;/em&gt;, which can be translated to “An e-learning platform for massive scientific data analysis”.&lt;/p&gt;
&lt;p&gt;The platform is typically meant to be deployed on high-end machines with multiple cores and GB of RAM.&lt;/p&gt;
&lt;p&gt;Some of the requirements for the Plasma project fall somewhere between the TLJH and ZTJH distributions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The deployment should be on a single server, and reproducible on other machines too (running on Ubuntu 18.04+)&lt;/li&gt;
&lt;li&gt;It should support multiple user environments with different sets of dependencies&lt;/li&gt;
&lt;li&gt;Users should authenticate as system users and their data should be persisted in their home directories on the host machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although TLJH doesn’t officially support container technology, its &lt;a href="http://tljh.jupyter.org/en/latest/contributing/plugins.html"&gt;plugin system&lt;/a&gt; opens the door to many other use cases.&lt;/p&gt;
&lt;p&gt;Because of this and to foster the TLJH plugin ecosystem, we decided to develop the Plasma stack as a plugin for TLJH and consolidate the deployment story with Ansible playbooks.&lt;/p&gt;
&lt;p&gt;Plasma is an opinionated JupyterHub stack powered by The Littlest JupyterHub, with the following defaults:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jupyterhub.readthedocs.io/en/stable/api/auth.html#pamauthenticator"&gt;PAMAuthenticator&lt;/a&gt; to authenticate JupyterHub as users existing on the host machine&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/dockerspawner#systemuserspawner"&gt;SystemUserSpawner&lt;/a&gt; to start single-user servers in Docker containers, using the system user home directories for data persistence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable extra functionalities, the Plasma stack relies on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;tljh-repo2docker&lt;/a&gt; plugin to create multiple user environments&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/plasmabio/plasma/tree/master/tljh-plasma"&gt;tljh-plasma&lt;/a&gt; plugin to define the JupyterHub config&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/plasmabio/plasma/tree/master/ansible"&gt;Ansible playbooks&lt;/a&gt; to automate the deployment and configuration of the server and add additional tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Plasma stack also contains tools to monitor the system, create and configure users, and add hub admins. It can be visualized with the diagram below:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The Plasma Overview Diagram" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/002-1_r-RSTILR7yfT7By30eaeTg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Plasma Overview Diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The stack is defined in the following repository: &lt;a href="https://github.com/plasmabio/plasmabio"&gt;https://github.com/plasmabio/plasma&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is also extensive documentation with detailed explanations on how to deploy the stack on a new server: &lt;a href="https://docs.plasmabio.org"&gt;https://docs.plasmabio.org&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="a-repo2docker-plugin-for-the-littlest-jupyterhub"&gt;A repo2docker plugin for The Littlest JupyterHub&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;tljh-repo2docker&lt;/a&gt; plugin lets JupyterHub admins create new user environments using &lt;a href="https://repo2docker.readthedocs.io"&gt;repo2docker&lt;/a&gt;. This plugin starts a &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/services.html"&gt;JupyterHub service&lt;/a&gt; to manage user environments from the JupyterHub UI.&lt;/p&gt;
&lt;p&gt;For those already using &lt;a href="https://mybinder.org"&gt;Binder&lt;/a&gt;, the idea will sound very familiar. Under the hood, the tljh-repo2docker plugin also uses &lt;a href="https://repo2docker.readthedocs.io/en/latest/"&gt;repo2docker&lt;/a&gt; to build the Docker images. It follows the same patterns and naming conventions as Binder, which makes it easier and more natural to test the environments on Binder before adding them to JupyterHub.&lt;/p&gt;
&lt;p&gt;New environments can be added by clicking on the &lt;em&gt;Add New&lt;/em&gt; button and providing a URL to the repository. Optional names, memory, and CPU limits can also be set for the environment:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Adding a new environment" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/003-1_KMOJ3287DPh6aG8Kg4EkEg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding a new environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;em&gt;Environments&lt;/em&gt; page shows the list of built environments, as well as the ones currently being built:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Building a new environment" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/004-1_VpXTXOEt4Owlf5O713ktLw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Building a new environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The status of the environment changes once the underlying Docker image has been built:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The list of available user environments" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/005-1_uHAYqgSCAfswFXvRHTO43w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The list of available user environments&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once ready, the environments can be selected from the JupyterHub spawn page:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Selecting an environment" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/006-0_nOCNtzHaQ_dj3-Jg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Selecting an environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Because it is separate from the Plasma stack, this plugin can also be used for other temporary TLJH deployments on a virtual machine. For example, the organizer of a workshop can prepare a list of environments before the event, just like they would with Binder.&lt;/p&gt;
&lt;h2 id="automating-deployments-with-ansible"&gt;Automating deployments with Ansible&lt;/h2&gt;
&lt;p&gt;To minimize the number of manual steps involved in the setup of the stack, Plasma also provides a list of &lt;a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks.html"&gt;Ansible playbooks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/latest/index.html"&gt;Ansible&lt;/a&gt; is an open-source tool to automate the provisioning of servers, configuration management, and application deployment.&lt;/p&gt;
&lt;p&gt;Playbooks define a list of tasks that should be executed and declare the desired state of the server.&lt;/p&gt;
&lt;p&gt;The list of playbooks and instructions on how to use them are provided in the &lt;a href="https://docs.plasmabio.org/en/latest/install/index.html"&gt;Installation section of the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall, the playbooks make it easier to perform upgrades, to automate the deployment process, and to replicate the setup at other institutions and universities.&lt;/p&gt;
&lt;p&gt;Here is an example of what an upgrade looks like:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Upgrading the stack with an Ansible playbook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/007-1_0n1kaev7c81I45SZ0HoLxQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Upgrading the stack with an Ansible playbook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This playbook defines the tasks to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;download the TLJH installer&lt;/li&gt;
&lt;li&gt;execute the TLJH installer to perform the upgrade&lt;/li&gt;
&lt;li&gt;update the TLJH plugins&lt;/li&gt;
&lt;li&gt;set the idle culler timeout&lt;/li&gt;
&lt;li&gt;set the default memory and CPU limits&lt;/li&gt;
&lt;li&gt;reload JupyterHub&lt;/li&gt;
&lt;li&gt;pulls the latest &lt;code&gt;jupyter/repo2docker&lt;/code&gt; Docker image&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="further-reading"&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Plasma documentation: &lt;a href="https://docs.plasmabio.org/"&gt;https://docs.plasmabio.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To use the tljh-repo2docker as a standalone plugin for TLJH: &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;https://github.com/plasmabio/tljh-repo2docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Also part of the Plasma project, the new &lt;a href="https://github.com/QuantStack/ipycytoscape"&gt;ipycytoscape&lt;/a&gt; package for interactive graph visualization in Jupyter: &lt;a href="/posts/2020/interactive-graph-visualization-in-jupyter-with/"&gt;https://blog.jupyter.org/interactive-graph-visualization-in-jupyter-with-ipycytoscape-a8828a54ab63&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The development of the Plasma stack at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded as part of the &lt;a href="https://twitter.com/PlasmaBio"&gt;Plasma&lt;/a&gt; project, led by &lt;a href="https://twitter.com/CVandiedonck"&gt;Claire Vandiedonck&lt;/a&gt;, &lt;a href="https://twitter.com/pierrepo"&gt;Pierre Poulain&lt;/a&gt;, and &lt;a href="https://twitter.com/SCaburet"&gt;Sandrine Caburet&lt;/a&gt;, associate professors at Université de Paris.&lt;/p&gt;
&lt;p&gt;Sponsors to the Plasma initiative include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/iledefrance"&gt;Région Île-de-France&lt;/a&gt;, via the “Trophées franciliens de l’innovation numérique dans le supérieur” (&lt;a href="https://www.iledefrance.fr/trophees-franciliens-de-linnovation-numerique-dans-le-superieur-les-laureats-2018"&gt;EdTech 2018&lt;/a&gt;) grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Univ_Paris"&gt;Université de Paris&lt;/a&gt;, via the &lt;a href="https://u-paris.fr/en/the-initiative-of-excellence-idex-label/"&gt;Initiative of Excellence (IdEx) Label&lt;/a&gt; and its “inovating teaching” grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EURGENEPARIS"&gt;EUR G.E.N.E.&lt;/a&gt;, the graduate school on Genetics and Epigenetics,&lt;/li&gt;
&lt;li&gt;the university training “Création, analyse et valorisation de données biologiques omiques” (&lt;a href="https://omics-school.net/"&gt;DU Omiques&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/008-1_-mk2TL1LTFBzkfW4JX30Pw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="education"/><category term="JupyterHub"/></entry><entry><title>A Gallery of Voilà Examples</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/" rel="alternate"/><published>2019-07-09T10:53:00+00:00</published><updated>2020-01-21T14:00:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:jasongrout.github.io,2019-07-09:/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/</id><summary type="html">&lt;p&gt;Voilà is one of the latest addition to the Jupyter ecosystem, and can be used to turn notebooks into standalone applications and…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Voilà&lt;/strong&gt; is one of the &lt;a href="/posts/2019/and-voila/"&gt;latest addition to the Jupyter ecosystem&lt;/a&gt; and can be used to turn notebooks into standalone applications and dashboards.&lt;/p&gt;
&lt;p&gt;Today we are pleased to introduce the Voilà Gallery, a collection of examples built with Voilà.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/images/001-1_w-xt2hmqBRHfjZl6ljZyxQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="the-voila-gallery"&gt;The Voilà Gallery&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://voila-gallery.org"&gt;Voilà Gallery&lt;/a&gt; is a &lt;strong&gt;collection of live dashboards built with Voilà and Jupyter widgets&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The goal of the gallery is to provide &lt;strong&gt;inspiration&lt;/strong&gt; to Jupyter users who want to convert their notebooks into web applications. Most of the examples rely on widget libraries such as &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt;, &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt;, &lt;a href="https://github.com/maartenbreddels/ipyvolume"&gt;ipyvolume&lt;/a&gt;, &lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; and &lt;a href="https://github.com/matplotlib/jupyter-matplotlib"&gt;ipympl&lt;/a&gt;, and showcase how to build complex web applications entirely based on notebooks.&lt;/p&gt;
&lt;p&gt;The landing page of the gallery lists all the available examples. Each entry contains can be used to launch the example and includes a button to view the source.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The Voilà Gallery landing page" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/images/002-1_8uW288G8hxihn-PkSJMCrQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Voilà Gallery landing page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Launch Example&lt;/em&gt; will bring you to the &lt;strong&gt;interactive application&lt;/strong&gt;. Under the hood, a notebook server running &lt;code&gt;voila&lt;/code&gt; and a live kernel are started.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="GPX Viewer is an application built with Voilà" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/images/003-1_6WMGnuNAAToGvOooOvvmLg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;GPX Viewer is an application built with Voilà&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;View Source&lt;/em&gt; will let you have a look at the source notebook used to create the example. This is useful to learn more about the inner workings of each dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="adding-your-own-example"&gt;Adding your own example&lt;/h2&gt;
&lt;p&gt;The source for the public gallery is available on GitHub: &lt;a href="https://github.com/voila-gallery/voila-gallery.github.io"&gt;https://github.com/voila-gallery/voila-gallery.github.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All the examples shown in the gallery come from the &lt;a href="https://github.com/voila-gallery/voila-gallery.github.io/blob/master/_data/gallery.yaml"&gt;gallery.yaml&lt;/a&gt; file, which is automatically rendered on the landing page at &lt;a href="https://voila-gallery.org/"&gt;voila-gallery.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can contribute a new example to the gallery by following &lt;a href="https://github.com/voila-gallery/voila-gallery.github.io#contributing-new-examples"&gt;these steps&lt;/a&gt;, which consist in adding a new entry to the &lt;code&gt;gallery.yaml&lt;/code&gt; file and opening a new pull request. The gallery will pick up the new example shortly after it has been added.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/images/004-1_ZBnVhXXLOglYNLCyvf_Wdw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/voila-gallery"&gt;voila-gallery&lt;/a&gt; organization on GitHub already contains a few examples that you can use as a starting point.&lt;/p&gt;
&lt;h2 id="deploying-your-own-gallery"&gt;Deploying your own gallery&lt;/h2&gt;
&lt;p&gt;The gallery can also be deployed as a plugin for &lt;a href="https://tljh.jupyter.org/"&gt;The Littlest JupyterHub (TLJH),&lt;/a&gt; which is a JupyterHub distribution meant to be used on a single server.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/voila-dashboards/tljh-voila-gallery"&gt;plugin&lt;/a&gt; makes use of the &lt;a href="https://jupyterhub.readthedocs.io/en/stable/_static/rest-api/index.html"&gt;JupyterHub REST API&lt;/a&gt; to create a new JupyterHub service and to launch the examples.&lt;/p&gt;
&lt;p&gt;You can actually deploy your own gallery by following &lt;a href="https://github.com/voila-dashboards/tljh-voila-gallery#install"&gt;the instructions in the README&lt;/a&gt;. Within a few minutes, you will have a Voilà gallery running on your own server. You could even run it on a private instance.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We are still iterating on the content of the gallery to add some variety to the types of application that can be created using widgets, Jupyter notebooks and Voilà.&lt;/p&gt;
&lt;p&gt;If you have authored an interesting dashboard and would like to share it with the rest of the world, feel free to open a pull request to add it to the list of examples!&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;We are very grateful to &lt;a href="https://ovh.com/"&gt;OVH&lt;/a&gt; for hosting the Voilà Gallery on their servers.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://twitter.com/yuvipanda"&gt;Yuvi Panda&lt;/a&gt; and &lt;a href="https://twitter.com/pascalbugnion"&gt;Pascal Bugnion&lt;/a&gt; for initially starting the Voilà Gallery project, and &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; for kindly sponsoring the development.&lt;/p&gt;
&lt;p&gt;The development of Voilà at QuantStack is funded by &lt;a href="https://twitter.com/techatbloomberg"&gt;Bloomberg&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/a-gallery-of-voila-examples/images/005-1_F0IS2B1XS6NCxp0Eh7linQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="Voilà"/></entry></feed>