<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/all.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-09-11T08:54:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>JupyterHub 6.0</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterhub-6-0/" rel="alternate"/><published>2026-09-11T08:54:00+00:00</published><updated>2026-09-11T08:54:00+00:00</updated><author><name>Serena Bonaretti</name></author><id>tag:jasongrout.github.io,2026-09-11:/medium-archive/pelican/posts/2026/jupyterhub-6-0/</id><summary type="html">&lt;p&gt;By Serena Bonaretti and Min Ragan-Kelley&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;By Serena Bonaretti and Min Ragan-Kelley&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterhub-6-0/images/001-1_l3xTI5FmlszK3So0jg0-YA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterhub.readthedocs.io"&gt;JupyterHub&lt;/a&gt; is a collection of tools that provides standardized, user-friendly computing environments for education and research. Today, we’re pleased to announce the release of &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html#id2"&gt;&lt;strong&gt;JupyterHub 6.0&lt;/strong&gt;&lt;/a&gt;. This is a substantial release with several new features. The breaking changes ought to be minimal, and should affect very few deployments. There is a small database schema upgrade, so make sure to backup your database prior to upgrading, as usual.&lt;/p&gt;
&lt;p&gt;Some changes to highlight:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stricter named server rules&lt;/strong&gt;: Named servers now have stricter rules on their names, and a new less-restricted “display name” field. This might be the &lt;strong&gt;most significant change&lt;/strong&gt; affecting you! See the &lt;a href="https://jupyterhub.readthedocs.io/en/6.0.0/howto/upgrading-v6.html#named-server-restrictions"&gt;documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Python 3.10 and database upgrade&lt;/strong&gt;: JupyterHub 6.0 now requires Python 3.10 and includes a database schema upgrade. Make sure to &lt;strong&gt;back up your database&lt;/strong&gt; before upgrading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Updates to metrics&lt;/strong&gt;: The old StatsD metrics have been removed, in favor of the Prometheus metrics that most people are already using. For Spawner (and spawn hook) authors, JupyterHub 6.0 also introduces &lt;a href="https://jupyterhub.readthedocs.io/en/6.0.0/reference/spawners.html#exception-handling"&gt;SpawnException&lt;/a&gt;, which provides more granular information for classifying spawn failures in metrics, to help deployments separate &lt;em&gt;errors&lt;/em&gt; from &lt;em&gt;rejections&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Internal communication changes&lt;/strong&gt;: JupyterHub now uses &lt;em&gt;aiohttp&lt;/em&gt; for internal HTTP requests, which may require tuning for large deployments since internal HTTP requests. This update has facilitated using unix sockets for internal communication on single-node deployments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved granularity in API access&lt;/strong&gt;: JupyterHub provides new API endpoints for working with single servers, along with more flexible ways to define permissions, such as &lt;em&gt;start:servers&lt;/em&gt; scope and &lt;em&gt;extra_user_scopes&lt;/em&gt;.&lt;br&gt;
See the &lt;a href="https://jupyterhub.readthedocs.io/en/stable/rbac/roles.html#overriding-default-roles"&gt;documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond these main changes, there have been lots of other improvements and bugfixes. You can find more details in the &lt;a href="https://jupyterhub.readthedocs.io/en/stable/howto/upgrading-v6.html"&gt;upgrading documentation&lt;/a&gt; and &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/changelog.html#changelog"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="thank-you-to-our-contributors"&gt;Thank you to our contributors&lt;/h2&gt;
&lt;p&gt;The following people contributed discussions, new ideas, code and documentation contributions, and review: &lt;a href="https://github.com/agoose77"&gt;agoose77&lt;/a&gt;, &lt;a href="https://github.com/anny0811"&gt;anny0811&lt;/a&gt;, &lt;a href="https://github.com/ateucher"&gt;ateucher&lt;/a&gt;, &lt;a href="https://github.com/betatim"&gt;betatim&lt;/a&gt;, &lt;a href="https://github.com/bl-aire"&gt;bl-aire&lt;/a&gt;, &lt;a href="https://github.com/clhedrick"&gt;clhedrick&lt;/a&gt;, &lt;a href="https://github.com/consideRatio"&gt;consideRatio&lt;/a&gt;, &lt;a href="https://github.com/dometto"&gt;dometto&lt;/a&gt;, &lt;a href="https://github.com/dragz"&gt;dragz&lt;/a&gt;, &lt;a href="https://github.com/erawn"&gt;erawn&lt;/a&gt;, &lt;a href="https://github.com/ericvd-ucb"&gt;ericvd-ucb&lt;/a&gt;, &lt;a href="https://github.com/jezwilkinson"&gt;jezwilkinson&lt;/a&gt;, &lt;a href="https://github.com/jnywong"&gt;jnywong&lt;/a&gt;, &lt;a href="https://github.com/jrdnbradford"&gt;jrdnbradford&lt;/a&gt;, &lt;a href="https://github.com/kellyrowland"&gt;kellyrowland&lt;/a&gt;, &lt;a href="https://github.com/kreuzert"&gt;kreuzert&lt;/a&gt;, &lt;a href="https://github.com/LUC4R4T0R"&gt;LUC4R4T0R&lt;/a&gt;, &lt;a href="https://github.com/manics"&gt;manics&lt;/a&gt;, &lt;a href="https://github.com/mayli"&gt;mayli&lt;/a&gt;, &lt;a href="https://github.com/milliams"&gt;milliams&lt;/a&gt;, &lt;a href="https://github.com/minrk"&gt;minrk&lt;/a&gt;, &lt;a href="https://github.com/mynkyu"&gt;mynkyu&lt;/a&gt;, &lt;a href="https://github.com/nsychev"&gt;nsychev&lt;/a&gt;, &lt;a href="https://github.com/Paul2708"&gt;Paul2708&lt;/a&gt;, &lt;a href="https://github.com/Rameshkumar31595"&gt;Rameshkumar31595&lt;/a&gt;, &lt;a href="https://github.com/rgaiacs"&gt;rgaiacs&lt;/a&gt;, &lt;a href="https://github.com/shaneknapp"&gt;shaneknapp&lt;/a&gt;, &lt;a href="https://github.com/sixonenines"&gt;sixonenines&lt;/a&gt;, &lt;a href="https://github.com/tbizouerne"&gt;tbizouerne&lt;/a&gt;, &lt;a href="https://github.com/Tech-Abhang"&gt;Tech-Abhang&lt;/a&gt;, &lt;a href="https://github.com/wilkinvr"&gt;wilkinvr&lt;/a&gt;, &lt;a href="https://github.com/willingc"&gt;willingc&lt;/a&gt;, &lt;a href="https://github.com/yuvipanda"&gt;yuvipanda&lt;/a&gt;&lt;/p&gt;
</content><category term="JupyterHub"/></entry><entry><title>Mark Your Calendars: Jupyter Day 2026 is Coming to San Jose!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/mark-your-calendars-jupyter-day-2026-is-coming-to-san/" rel="alternate"/><published>2026-09-04T10:01:00+00:00</published><updated>2026-09-04T10:01:00+00:00</updated><author><name>Jupyter Foundation</name></author><id>tag:jasongrout.github.io,2026-09-04:/medium-archive/pelican/posts/2026/mark-your-calendars-jupyter-day-2026-is-coming-to-san/</id><summary type="html">&lt;p&gt;Join us on October 19 for a full day of talks, posters, and community discussion on the future of interactive computing. Submit a talk by September 13 or sponsor the event!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Project Jupyter has always grown around its community. From early notebook hacks to large-scale deployments across research labs and universities, what makes this ecosystem work is the people building tools, running infrastructure, and sharing workflows.&lt;/p&gt;
&lt;p&gt;That is why we are excited to announce &lt;a href="https://events.linuxfoundation.org/jupyter-day/"&gt;Jupyter Day 2026&lt;/a&gt;, happening on Monday, October 19, 2026, at the San Jose Convention Center in California!&lt;/p&gt;
&lt;p&gt;This year, we are co-locating with PyTorch Conference North America. If you are already planning to be in town for PyTorch, you can easily add Jupyter Day to your week — or you can simply &lt;a href="https://events.linuxfoundation.org/jupyter-day/register/"&gt;register to attend Jupyter Day&lt;/a&gt; on its own!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/mark-your-calendars-jupyter-day-2026-is-coming-to-san/images/001-1_6labwo1Ihj7MNXTJdqSg4A.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="what-we-are-covering"&gt;What We Are Covering&lt;/h2&gt;
&lt;p&gt;Jupyter Day is a focused event for developers, maintainers, data scientists, educators, and system admins to talk about real-world setups and future project architecture.&lt;/p&gt;
&lt;p&gt;Here are the main tracks and suggested topics for the event:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Science:&lt;/strong&gt; How Jupyter is used by data science practitioners across industry, government, research, and beyond.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community &amp;amp; Ecosystem:&lt;/strong&gt; Insights into the Jupyter community, frontends, kernels, custom extensions, and essential ecosystem tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Research and Scientific Discovery:&lt;/strong&gt; Practical applications in specific scientific fields, including medical research, astronomy, physics, climate science, meteorology, social sciences, and the humanities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Education:&lt;/strong&gt; Practical methods and strategies for teaching and learning with Jupyter across diverse educational settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jupyter Infrastructure:&lt;/strong&gt; Deploying Jupyter and JupyterHub at scale across high-performance computing, cloud environments, enterprise, and academia — covering DevOps, scaling, security, and compliance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI &amp;amp; Machine Learning:&lt;/strong&gt; Leveraging AI and machine learning inside Jupyter and using Jupyter environments to drive ML development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether you want to showcase a JupyterLab extension you built, explain a tricky deployment setup, or discuss new open standards, we want to hear from you.&lt;/p&gt;
&lt;h2 id="call-for-proposals-is-open"&gt;Call for Proposals is Open!&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://events.linuxfoundation.org/jupyter-day/program/cfp/"&gt;Call for Proposals (CFP) is live right now&lt;/a&gt;. We are looking for technical talks, panel ideas, and poster presentations from every part of the community.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CFP Deadline:&lt;/strong&gt; Sunday, September 13, 2026 at 11:59 PM PDT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Submit your proposal:&lt;/strong&gt; &lt;a href="https://events.linuxfoundation.org/jupyter-day/program/cfp/"&gt;Jupyter Day CFP Portal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor-jupyter-day-2026"&gt;Sponsor Jupyter Day 2026&lt;/h2&gt;
&lt;p&gt;Put your organization front and center at Jupyter Day 2026! Sponsoring this event connects your brand directly with core developers, researchers, and AI leaders building the future of open-source interactive computing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;View opportunities:&lt;/strong&gt; Download the &lt;a href="https://events.linuxfoundation.org/sponsor-jupyterday26"&gt;Jupyter Day 2026 Sponsorship Prospectus&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get in touch:&lt;/strong&gt; Reach out to &lt;a href="https://www.google.com/search?q=mailto%3Ajupyterevents%40linuxfoundation.org"&gt;jupyterevents@linuxfoundation.org&lt;/a&gt; to reserve your sponsorship or ask questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find full event details, hotel info, and registration links directly on the Linux Foundation event page.&lt;/p&gt;
&lt;p&gt;We hope to see you in San Jose this October!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/mark-your-calendars-jupyter-day-2026-is-coming-to-san/images/002-1_eA27lps_Wenzgjp-euT5ag.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="events"/></entry><entry><title>A Robotics Workbench for JupyterCAD</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/" rel="alternate"/><published>2026-09-02T18:22:00+00:00</published><updated>2026-09-02T18:22:00+00:00</updated><author><name>Yahia Heni</name></author><id>tag:jasongrout.github.io,2026-09-02:/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/</id><summary type="html">&lt;p&gt;A unified in-browser workflow from CAD to URDF kinematics&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Robotics education often hits a wall before the fun even begins. Students and engineers must first navigate a labyrinth of installations: ROS, environment configurations, dependency management, and a patchwork of software, just to visualize a simple robot. It doesn’t have to be this way.&lt;/p&gt;
&lt;p&gt;Thanks to Jupyter and its extensions, the entire process, from designing a robot to simulating its kinematics, can now happen entirely in the browser, in a single workspace with zero local installation.&lt;/p&gt;
&lt;h2 id="the-problem-the-fragmented-robotics-pipeline"&gt;The Problem: The Fragmented Robotics Pipeline&lt;/h2&gt;
&lt;p&gt;Traditionally, creating a robot model involves dealing with three distinct, often incompatible worlds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parametric Design:&lt;/strong&gt; Creating the shapes in dedicated CAD software (FreeCAD, SolidWorks, and the like).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesh Generation:&lt;/strong&gt; Exporting those solid bodies into triangular meshes (STL) while manually managing the coordinates and file paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinematic Description:&lt;/strong&gt; Writing URDF (Unified Robot Description Format) XML that ties the meshes together using joints and other parameters.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Getting this pipeline working locally typically requires a complete ROS installation, a source of friction for students and educators.&lt;/p&gt;
&lt;h2 id="the-solution-a-unified-browser-workflow"&gt;The Solution: A Unified Browser Workflow&lt;/h2&gt;
&lt;p&gt;By leveraging the JupyterCAD and JupyterLite, this entire toolchain is delivered as an instant, zero-install workspace in the browser. It is made available on the &lt;a href="https://notebook.link/"&gt;&lt;strong&gt;notebook.link&lt;/strong&gt;&lt;/a&gt; service.&lt;/p&gt;
&lt;h2 id="1-jupytercad-the-design-hub"&gt;1. JupyterCAD: The Design Hub&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://medium.com/@yahia.heni/github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt; is a JupyterLab extension for collaborative 3D modeling. It also supports FreeCAD files and offers a full set of tools for creating, transforming, and combining 3D shapes.&lt;/p&gt;
&lt;p&gt;It can also export to various formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;STL/BREP:&lt;/strong&gt; Users can simply right-click any shape and generate meshes directly in their browser.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/001-1_pZAalrX9FpY6Bbv0aSJAWg.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FreeCAD:&lt;/strong&gt; Through the &lt;a href="https://github.com/jupytercad/JupyterCAD-FreeCAD"&gt;&lt;strong&gt;JupyterCAD-FreeCAD&lt;/strong&gt;&lt;/a&gt; plugin, designs can move freely between the browser and desktop CAD (FreeCAD) without losing the feature tree, exporting back and forth between the .jcad and .FCStd formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-jupytercad-urdf-the-urdf-workbench-for-jupytercad"&gt;2. JupyterCAD-URDF: The URDF Workbench for JupyterCAD&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt; is a JupyterCAD plugin for exporting CAD designs to the URDF format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It generates STL meshes automatically for complex shapes. For simple primitives (boxes, spheres, and cylinders), it emits XML tags instead of producing external mesh files.&lt;/li&gt;
&lt;li&gt;It produces a &lt;strong&gt;URDF XML&lt;/strong&gt; document that references those meshes while preserving hierarchies, names, colors and placements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/002-1_eWCCAx2Uyw7pf3DXCmbVyQ.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="3-jupyterlab-urdf-interactive-kinematics"&gt;3. JupyterLab-URDF: Interactive Kinematics&lt;/h2&gt;
&lt;p&gt;Once the model is exported, the &lt;strong&gt;JupyterLab-URDF&lt;/strong&gt; extension, which can be used in JupyterLab independently of JupyterCAD, allows for inspection of the XML content as well as interactive 3D visualization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Kinematic Articulation&lt;/strong&gt;: Drag joint sliders to test degrees of freedom, joint limits, and coordinate hierarchies in real time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D Scene Controls&lt;/strong&gt;: The control panel has several settings to customize the scene, such as coordinate frame helpers, lighting controls, mesh visibility, and other options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joints Editor:&lt;/strong&gt; An interface to define kinematic relationships (joints) between parts by selecting them directly in the 3D scene. This allows for creating new joints or editing existing ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/003-1_hG86LjJfW9V_AVmjbAd_Pw.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="walkthrough-zero-to-robot-workflow"&gt;Walkthrough: Zero-to-Robot Workflow&lt;/h2&gt;
&lt;p&gt;This new pipeline allows a student to go from a blank page to a moving robot:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1: CAD Modeling &amp;amp; Export (JupyterCAD + JupyterCAD-URDF)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Design&lt;/strong&gt; parametric parts in JupyterCAD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; to URDF using JupyterCAD-URDF.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Assembly &amp;amp; Simulation (jupyterlab-urdf)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assemble&lt;/strong&gt; the generated URDF in jupyterlab-urdf and use the &lt;strong&gt;Joints Editor&lt;/strong&gt; to connect links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simulate&lt;/strong&gt; the robot movement using the joint sliders.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can try it right now without any local installation thanks to the deployment on notebook.link, by following the link below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notebook.link/@Yahiewi/urdf-demo"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/004-0_Zir-X_cL1PYlmmnW.svg" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="repos"&gt;Repos&lt;/h2&gt;
&lt;p&gt;All tools in this pipeline are free, open source, and available on GitHub, PyPI, npm, and Conda-forge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-robotics/jupyterlab-urdf"&gt;&lt;strong&gt;JupyterLab-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work was conducted at &lt;strong&gt;QuantStack&lt;/strong&gt; as part of an effort to make 3D modeling and robotics accessible directly in web-native environments.&lt;/p&gt;
&lt;p&gt;Special thanks go to everyone in the open-source community who made this possible, to &lt;a href="https://github.com/IsabelParedes"&gt;Isabel Paredes&lt;/a&gt;, the creator and maintainer of the jupyterlab-urdf extension, to &lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; and &lt;a href="https://github.com/martinRenou"&gt;Martin Renou&lt;/a&gt;, the main contributors to JupyterCAD, and to everyone else at QuantStack who helped with this project.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Yahiewi"&gt;&lt;strong&gt;Yahia Heni&lt;/strong&gt;&lt;/a&gt; is a software engineer at QuantStack, focusing on the Jupyter Ecosystem, by contributing to Jupyter and several of its extensions, as well as notebook.link and other related open-source projects.&lt;/p&gt;
</content><category term="JupyterCAD"/><category term="robotics"/><category term="urdu"/></entry><entry><title>What you told us: results from the 2026 Jupyter User Experience and Product Enhancement Survey</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/" rel="alternate"/><published>2026-08-25T13:42:00+00:00</published><updated>2026-08-25T21:08:00+00:00</updated><author><name>Jupyter Foundation</name></author><id>tag:jasongrout.github.io,2026-08-25:/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/</id><summary type="html">&lt;p&gt;From time to time, Jupyter runs user surveys to understand how our communities use Jupyter technology (or alternatives) and how they feel…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;From time to time, Jupyter runs &lt;a href="https://github.com/jupyter/surveys/"&gt;user surveys&lt;/a&gt; to understand how our communities use Jupyter technology (or alternatives) and how they feel about it. The Jupyter Foundation recently completed a user experience survey for 2026. It was open between 29 May and 29 June 2026, with 542 people providing answers. This post covers what we found, what you can do today about the most common problems, and where we are looking for proposals.&lt;/p&gt;
&lt;p&gt;Each of the areas below rose to the top of pain points that users consistently felt. &lt;strong&gt;We would love to see applications in the&lt;/strong&gt; &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;&lt;strong&gt;2026 Call for Proposals&lt;/strong&gt;&lt;/a&gt; that address any of these areas by improving Jupyter technology. In some areas, there are already Jupyter or third-party open-source tools that address some of the issues, and we list them as a guide to readers who want to learn more.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;About the responses&lt;/strong&gt;&lt;/em&gt;*: Three of the six questions were free text, and 246 people wrote something in at least one of them, some at considerable length. Writing several paragraphs about environment setup or version control at the end of a survey takes real time, and that detail shaped most of what follows. We want to extend our heartfelt appreciation to everyone who answered this survey, high-quality experience stories like this are crucial at shaping Jupyter’s priorities and technical direction.*&lt;/p&gt;
&lt;h2 id="who-answered"&gt;Who answered&lt;/h2&gt;
&lt;p&gt;Two thirds of respondents (65%) use Jupyter for data science and analysis, and 55% use it in education. Smaller groups deploy Jupyter for others (14%), develop extensions (14%), or contribute to the open-source project (12%). These add to more than 100% because the question accepted multiple answers. See the Appendix below for a deeper dive into the respondents and the tools they reported using. Below we’ll focus on the pain-points and themes that were commonly reported, since those are the most actionable for our community to improve upon and learn from.&lt;/p&gt;
&lt;h2 id="common-themes-that-people-raised"&gt;Common themes that people raised&lt;/h2&gt;
&lt;p&gt;We reviewed all 677 free-text responses and coded the recurring themes, cross-checking the coding against the source responses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/001-1_EcfaS7-4u-hlCUlTaEBitQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Environment and dependency management, and version control and collaboration, are the two largest friction themes, and between them account for 51 of the 246 people who wrote to us, with 7 raising both. Other themes follow closely: interface and editor parity (17 people), handling large data sets and performance (15), documentation and discoverability (14), respondents who use a different tool instead (13), deployment and multi-user operations (12), and security, authentication and compliance (6).&lt;/p&gt;
&lt;p&gt;When we asked what is blocking people from using Jupyter more, 130 of 239 answers named something concrete, while 53 said that nothing is blocking them, either in a sentence or as a one-word “no”. Limited time and competing priorities appear throughout those 53 responses.&lt;/p&gt;
&lt;p&gt;The Foundation is committed to finding ways to address these pain points across our community, and we’ll be exploring other ways to make progress in these areas in the coming months.&lt;/p&gt;
&lt;h2 id="environment-and-dependency-management"&gt;Environment and dependency management&lt;/h2&gt;
&lt;p&gt;This was the largest friction theme, raised by 32 people across 51 responses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/002-1_1Q3i-K3MyiXphDKM3T6HPw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The responses concentrate in three sub-problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installation and first run, and package and dependency management, account for 17 responses each.&lt;/li&gt;
&lt;li&gt;Environment and kernel registration accounts for 13&lt;/li&gt;
&lt;li&gt;Reproducing an environment on a second machine for 4.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What connects them is that the failures arrive early and are hard to diagnose from the error message alone. For example: an installation completes but the &lt;code&gt;jupyter&lt;/code&gt; command cannot be found; packages install into one environment while the notebook runs a kernel from another; a course needs the same environment on thirty machines that nobody administers centrally. Each of these has a known cause, and in many cases, a known fix, but users struggle to find the right solution to these problems.&lt;/p&gt;
&lt;p&gt;We welcome submissions in our &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;Call for Proposals&lt;/a&gt; to improve upon these pain points! We’ve also listed a few open-source tools from Project Jupyter and the third-party ecosystem that partially address these challenges.&lt;/p&gt;
&lt;p&gt;Open-source tools that partially address this problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Project Jupyter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab-desktop"&gt;&lt;strong&gt;JupyterLab Desktop&lt;/strong&gt;&lt;/a&gt; bundles Python and JupyterLab in a single installer and removes most first-run failures. &lt;a href="https://github.com/jupyterlab/jupyterlab-desktop/releases/tag/v4.6.2-1"&gt;v4.6.2&lt;/a&gt; was released recently.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jupyterlite.readthedocs.io/"&gt;&lt;strong&gt;JupyterLite&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://mybinder.org/"&gt;&lt;strong&gt;Binder&lt;/strong&gt;&lt;/a&gt; avoid per-machine installation entirely, which is often the right answer for teaching.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python -m jupyter lab&lt;/code&gt; works when a &lt;code&gt;pip install&lt;/code&gt; succeeds but the entry point is not on your &lt;code&gt;PATH&lt;/code&gt;. This is a common cause of “command not found” straight after a successful install.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/repo2docker"&gt;&lt;strong&gt;repo2docker&lt;/strong&gt;&lt;/a&gt; fetches a git repository and builds a container image based on the configuration — useful for creating reproducible images for use with Binder or JupyterHub&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%pip install&lt;/code&gt; and &lt;code&gt;%conda&lt;/code&gt; install run inside a notebook and install into the environment the running kernel is actually using, which is usually what goes wrong when installing from a terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;From third-parties:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;better package installation from UI
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mamba-org/gator"&gt;&lt;strong&gt;gator&lt;/strong&gt;&lt;/a&gt; creates and manages conda environments from the JupyterLab interface&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mljar/package-manager"&gt;&lt;strong&gt;package-manager&lt;/strong&gt;&lt;/a&gt; browses and installs Python packages without leaving the interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;kernel per environment which encodes “lockfile”
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bluss/pyproject-local-kernel"&gt;&lt;strong&gt;pyproject-local-kernel&lt;/strong&gt;&lt;/a&gt; provisions kernels per environment for the project the notebook file resides in&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/renan-r-santos/pixi-kernel"&gt;&lt;strong&gt;pixi-kernel&lt;/strong&gt;&lt;/a&gt; Per-directory Pixi environments with multi-language Jupyter kernels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;notebook itself can include requirements
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/manzt/juv"&gt;&lt;strong&gt;juv&lt;/strong&gt;&lt;/a&gt; is CLI tool that encodes dependencies in the notebook using PEP 723 (inline script metadata) and creates ephemeral virtual environments for kernel execution&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/OKUA1/juvio"&gt;&lt;strong&gt;juvio&lt;/strong&gt;&lt;/a&gt; also encodes dependencies in the notebook using PEP 723 but also includes bespoke integration with jupyter kernel spec manager and a JupyterLab extension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;better integration with other environment management tools
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anaconda/nb_conda_kernels"&gt;&lt;strong&gt;nb-conda-kernels&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/nebari-dev/nb-nebi-kernels"&gt;&lt;strong&gt;nb-nebi-kernels&lt;/strong&gt;&lt;/a&gt; provision kernel specs auto-discovered from all conda and nebi-tracked pixi environments respectively&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nebari-dev/jupyterlab-launchpad"&gt;&lt;strong&gt;jupyterlab-launchpad&lt;/strong&gt;&lt;/a&gt; replaces the launcher with one that has first-class support for kernels discovered from conda and nebi-tracked pixi environments&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/2i2c-org/jupyterhub-fancy-profiles"&gt;&lt;strong&gt;jupyterhub-fancy-profiles&lt;/strong&gt;&lt;/a&gt; allows JupyterHub users to select a Binder-like environment and build it at hub launch time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several respondents asked for closer integration between Jupyter and environment managers, including a graphical option for people who do not work at a command line, which is part of what those extensions provide. A consistent environment and kernel story across package managers and operating systems still requires sustained work across several projects, and we would welcome proposals in this area. Another area where future work is needed is preventing the drift between server and kernel environments (join the &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/19249"&gt;discussion&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="version-control-and-collaboration"&gt;Version control and collaboration&lt;/h2&gt;
&lt;p&gt;This theme was raised by 26 people across 33 responses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/003-1_L0ijL6NDSBdIacvf-dZEZg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Git diffing and merging accounts for 13 responses, real-time collaboration for 9, sharing and publishing for 8, and review and commenting for 3.&lt;/p&gt;
&lt;p&gt;The underlying cause is that the notebook format stores code, outputs and execution metadata in a single JSON document. Tools built to compare source line by line report changes that are technically accurate and hard to read: re-executing a cell without editing it can produce a large diff, and merges conflict on execution counts and output data rather than on anything a person wrote (which can be desirable when reproducibility is the primary goal, but less so when prioritizing iterative development). Reviewing a colleague’s notebook therefore costs more than reviewing an equivalent script, which pushes teams either toward exporting notebooks to scripts before review, or toward skipping review.&lt;/p&gt;
&lt;p&gt;We welcome submissions in our &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;Call for Proposals&lt;/a&gt; to improve upon these pain points! We’ve also sourced a few recommended tools within Jupyter and from third-parties that partially address these challenges, and list them below for readers that want to learn more.&lt;/p&gt;
&lt;p&gt;Open-source tools that partially address this problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Project Jupyter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nbdime.readthedocs.io/"&gt;&lt;strong&gt;nbdime&lt;/strong&gt;&lt;/a&gt; provides content-aware diff and merge that understands cells and outputs. Running &lt;code&gt;nbdime config-git --enable --global&lt;/code&gt; once makes &lt;code&gt;git diff&lt;/code&gt; on a notebook readable.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab-git"&gt;&lt;strong&gt;jupyterlab-git&lt;/strong&gt;&lt;/a&gt; brings Git operations into the JupyterLab interface and uses nbdime for diffs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab/jupyter-collaboration/"&gt;&lt;strong&gt;jupyter-collaboration&lt;/strong&gt;&lt;/a&gt; brings real time collaboration; it allows several people to edit the same notebook simultaneously and time-travel to older versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Third-party:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jupytext.readthedocs.io/"&gt;&lt;strong&gt;Jupytext&lt;/strong&gt;&lt;/a&gt; pairs a notebook with a &lt;code&gt;.py&lt;/code&gt; or &lt;code&gt;.md&lt;/code&gt; file that diffs and merges like an ordinary source, which makes notebook changes reviewable in a normal pull request.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nbstripout&lt;/strong&gt; tools remove most merge conflicts for teams that do not need outputs in version control. The community has produced at least three variants: &lt;a href="https://github.com/kynan/nbstripout"&gt;nbstripout&lt;/a&gt;, the original; &lt;a href="https://github.com/deshaw/nbstripout-fast"&gt;nbstripout-fast&lt;/a&gt;, a faster alternative; and &lt;a href="https://github.com/fastai/fastai-nbstripout"&gt;fastai-nbstripout&lt;/a&gt; (no longer maintained). They differ in behaviour and performance, so pin whichever you adopt. We read this fragmentation as a consequence of the gap, and a single well-supported answer would be a reasonable thing to propose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of the tools above ship separately from JupyterLab and have to be installed and configured before they help, which limits how many people find them. We are considering both closer integration of these tools into the default experience and approaches that reduce the underlying problem, and we would welcome proposals for either.&lt;/p&gt;
&lt;p&gt;Review and commenting on notebooks remains the clearest gap. Nothing in the current open-source stack provides a way to leave a comment on a cell and resolve it later; that also works for colleagues who do not use GitHub.&lt;/p&gt;
&lt;h2 id="the-interface-and-parity-with-editors"&gt;The interface, and parity with editors&lt;/h2&gt;
&lt;p&gt;Seventeen people wrote about the interface, and their requests are concrete rather than architectural: completion as you type, a variable explorer, working drag and drop, faster scrolling in long notebooks, and a more modern appearance.&lt;/p&gt;
&lt;p&gt;We welcome submissions in our &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;Call for Proposals&lt;/a&gt; to improve upon these pain points! We’ve also sourced a few recommended tools within Jupyter and from third-parties that partially address these challenges (including a few JupyterLab plugins that directly solve the problem), and list them below for readers that want to learn more.&lt;/p&gt;
&lt;p&gt;Open-source tools that partially address this problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Project Jupyter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab/jupyterlab-desktop"&gt;&lt;strong&gt;JupyterLab Desktop&lt;/strong&gt;&lt;/a&gt;. The project went through a period with little activity, which some respondents referred to. It now has active maintainers and regular releases, and &lt;a href="https://github.com/jupyterlab/jupyterlab-desktop/releases/tag/v4.6.2-1"&gt;v4.6.2&lt;/a&gt; was published after the survey closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jupyter Notebook v7&lt;/strong&gt; now includes multiple improvements covering features requested by respondents, inheriting them from JupyterLab; after reviewing the survey answers we improved the documentation to mention the variable explorer available in the &lt;a href="https://jupyterlab.readthedocs.io/en/stable/user/debugger.html#usage"&gt;debugger&lt;/a&gt; (which has basic support, while the plugin below has more in-depth support) and the opt-in as-you-type &lt;a href="https://jupyterlab.readthedocs.io/en/stable/user/completer.html"&gt;autocompletion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-lsp/jupyterlab-lsp"&gt;&lt;strong&gt;jupyterlab-lsp&lt;/strong&gt;&lt;/a&gt; adds better completion, jump-to-definition, signature help and diagnostics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Third-party:&lt;/strong&gt; the variable explorer people asked for, plus several conveniences carried over from mainstream editors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-variableInspector"&gt;&lt;strong&gt;jupyterlab-variableInspector&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/mljar/variable-inspector"&gt;&lt;strong&gt;variable-inspector&lt;/strong&gt;&lt;/a&gt; both provide the variable explorer that came up more than once&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-quickopen"&gt;&lt;strong&gt;jupyterlab-quickopen&lt;/strong&gt;&lt;/a&gt; jumps to a file by name.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-unfold"&gt;&lt;strong&gt;jupyterlab-unfold&lt;/strong&gt;&lt;/a&gt; gives a tree-style file browser.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab_code_formatter"&gt;&lt;strong&gt;jupyterlab-code-formatter&lt;/strong&gt;&lt;/a&gt; formats code cells.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-favorites"&gt;&lt;strong&gt;jupyterlab-favorites&lt;/strong&gt;&lt;/a&gt; pins frequently used directories.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-vim"&gt;&lt;strong&gt;jupyterlab-vim&lt;/strong&gt;&lt;/a&gt; for vim users&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterlab-contrib/search-replace"&gt;&lt;strong&gt;jupyterlab-search-replace&lt;/strong&gt;&lt;/a&gt; for search and replace &lt;em&gt;across&lt;/em&gt; file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thirteen respondents told us they use another tool instead: VS Code, Google Colab, Spyder or Positron, marimo, or plain Python scripts. We are glad that support for Jupyter notebooks and kernels has landed in many editors and has inspired other notebook-based applications. Maintaining an open ecosystem where people can move between the tools that suit their workflow matters to us. For reactive execution in particular, &lt;a href="https://github.com/ipyflow/ipyflow"&gt;&lt;strong&gt;ipyflow&lt;/strong&gt;&lt;/a&gt; brings dataflow-aware execution inside the JupyterLab interface.&lt;/p&gt;
&lt;h2 id="artificial-intelligence"&gt;Artificial Intelligence&lt;/h2&gt;
&lt;p&gt;Twenty-four of the 246 people who wrote free text mentioned AI. Of those, 14 asked for more AI capability in Jupyter, 1 asked for it with explicit caveats, 3 objected to AI being a priority, and 5 mentioned AI (e.g. as a use case) but did not take a stance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/004-1__kmIHa7KfW5V6GCVnRyOzg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Three requests recur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explanation at the point of failure.&lt;/strong&gt; Clearer error messages and guidance for people who are learning, including one request for a “fix code” action placed directly below an error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Working with self-hosted and third-party models.&lt;/strong&gt; Support for running against “own LLM-servers”, compatibility with proxy layers, and simpler installation of Jupyter AI, which one respondent described as too complicated to set up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Help with libraries, and checking generated code.&lt;/strong&gt; Finding relevant packages within a research field, and being able to validate generated code before running it against real data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The objections are about prioritisation, and specifically that AI work displaces maintenance and work on features aimed at human users.&lt;/p&gt;
&lt;p&gt;Over the past twelve months the Foundation has facilitated several rounds of &lt;a href="https://events.linuxfoundation.org/archive/2026/jupyter-workshops/"&gt;AI workshops and summits&lt;/a&gt;, and more are planned. Anyone is welcome regardless of their stance. Working out how the project should respond to increasing AI usage in data analysis and teaching needs both positions in the room. Proposals through the funding process are welcome here too.&lt;/p&gt;
&lt;h2 id="other-themes"&gt;Other themes&lt;/h2&gt;
&lt;p&gt;Here we list a few more themes that showed up in the survey responses along with some open-source tools that can help as of August 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;People&lt;/th&gt;
&lt;th&gt;What might help today&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance with large data&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Recent versions of JupyterLab/Notebook improve UI performance. Large outputs freezing the browser can be prevented by using visualisation and tabulation libraries that make use of rasterization and canvas renderers (e.g. plotly, &lt;a href="https://github.com/jupyter-widgets/ipydatagrid"&gt;ipydatagrid&lt;/a&gt; or newcomers like &lt;a href="https://github.com/reflex-dev/xy"&gt;xy&lt;/a&gt;). Third-party extensions streamline work with large dataset in dedicated big data formats (e.g. &lt;a href="https://github.com/silx-kit/jupyterlab-h5web"&gt;jupyterlab-h5web&lt;/a&gt; for HDF5, NeXus, ANNData, etc; &lt;a href="https://github.com/QuantStack/Arbalister"&gt;Arbalister&lt;/a&gt; for Parquet, CSV, Avro, ORC, SQLite, Arrow IPC).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation and discoverability&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.jupyter.org/"&gt;Jupyter documentation&lt;/a&gt; and &lt;a href="https://discourse.jupyter.org/"&gt;Discourse&lt;/a&gt;. We are aware that changelogs and breaking-change notes are missing or inconsistent across subprojects, and this needs addressing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment and multi-user operations&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tljh.jupyter.org/"&gt;The Littlest JupyterHub&lt;/a&gt; for single-server teaching and &lt;a href="https://z2jh.jupyter.org/"&gt;Zero to JupyterHub&lt;/a&gt; on Kubernetes. &lt;a href="https://github.com/jupyterhub/batchspawner"&gt;batchspawner&lt;/a&gt; for Slurm and HPC, &lt;a href="https://github.com/jupyterhub/systemdspawner"&gt;systemdspawner&lt;/a&gt; for resource limits and sandboxing. Third-party: &lt;a href="https://github.com/2i2c-org/jupyterhub-usage-quotas"&gt;jupyterhub-usage-quotas&lt;/a&gt; and &lt;a href="https://github.com/2i2c-org/jupyterhub-cost-monitoring"&gt;jupyterhub-cost-monitoring&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security, authentication and compliance (including accessibility)&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/authenticators.html"&gt;JupyterHub authenticators&lt;/a&gt; cover most institutional identity providers, and Zero to JupyterHub documents TLS and network configuration. &lt;a href="https://github.com/berkeley-cdss/jupyterlab-a11y-checker"&gt;jupyterlab-a11y-checker&lt;/a&gt; is a UC Berkeley CDSS extension for assisting authors of extensions. New versions of Jupyter software include notable accessibility improvements: &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#keyboard-navigation-and-accessibility"&gt;JupyterLab&lt;/a&gt;, &lt;a href="https://jupyterbook.org/blog/posts/2026/accessibility-improvements"&gt;myst-theme&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teaching and grading&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nbgrader.readthedocs.io/"&gt;nbgrader&lt;/a&gt; for assignment distribution and autograding, usually alongside JupyterHub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution model and cell state&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;In IPython &lt;code&gt;%load_ext autoreload&lt;/code&gt; followed by &lt;code&gt;%autoreload 2&lt;/code&gt; gives hot reload while developing a package against a live kernel. Third-party &lt;a href="https://github.com/ipyflow/ipyflow"&gt;ipyflow&lt;/a&gt; brings reactive execution to Jupyter interfaces.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publishing and export&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jupyter nbconvert --to webpdf&lt;/code&gt; produces PDFs without a LaTeX installation. &lt;a href="https://jupyterbook.org/"&gt;Jupyter Book&lt;/a&gt; for longer documents and &lt;a href="https://voila.readthedocs.io/"&gt;Voilà&lt;/a&gt; for dashboards. Third-party: &lt;a href="https://quarto.org/"&gt;Quarto&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile and tablet access&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;No good answer today. Recent work on lumino is addressing certain limitations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Python kernels&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Maturity varies by language. Specific bugs are best filed on the relevant kernel’s issue tracker, where they can be followed up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excel and spreadsheet interop&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;JupyterLab opens CSV and TSV files in a data grid without any extension. Third-party: &lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-spreadsheet-editor"&gt;jupyterlab-spreadsheet-editor&lt;/a&gt; makes CSV and TSV files editable in place, and &lt;a href="https://github.com/quigleyj97/jupyterlab-spreadsheet"&gt;jupyterlab-spreadsheet&lt;/a&gt; opens Excel workbooks read-only.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="submit-a-proposal"&gt;Submit a proposal&lt;/h2&gt;
&lt;p&gt;Most of what people asked for needs sustained work rather than a configuration change. The Jupyter Foundation’s &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;Community Funding Proposals&lt;/a&gt; process is &lt;strong&gt;open through the 9th of September, 2026&lt;/strong&gt;. Proposals do not need to come from existing maintainers, and you can propose work without intending to be the person who carries it out.&lt;/p&gt;
&lt;p&gt;Larger changes may warrant a new &lt;a href="https://jupyter.org/enhancement-proposals/"&gt;Jupyter Enhancement Proposal&lt;/a&gt;, or completing work on an existing one. Both are in scope for community funding, and are expected to involve support and consensus building in the community.&lt;/p&gt;
&lt;h2 id="thank-you"&gt;Thank you&lt;/h2&gt;
&lt;p&gt;Once again, thank you to the 542 people that offered their time and expertise to provide responses to our user survey. For those interested in the &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;2026 Call for Proposals&lt;/a&gt;, we’d love to see submissions that address these pain points. Keep an eye open for future surveys, as they have a big impact on where Jupyter improves its technology moving forward.&lt;/p&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Here is some more information about the survey respondents and the kinds of tools they used in general. We share it below in case it helps provide context for the analysis above.&lt;/p&gt;
&lt;h3 id="the-data-and-how-to-read-it"&gt;The data, and how to read it&lt;/h3&gt;
&lt;p&gt;An anonymized version of the dataset is available at &lt;a href="https://jupyter.org/surveys"&gt;jupyter.org/surveys&lt;/a&gt; (repo here: &lt;a href="https://github.com/jupyter/surveys"&gt;github.com/jupyter/surveys&lt;/a&gt;), together with the analysis notebook that produced every figure in this post, including its caveats and the checks that did not work.&lt;/p&gt;
&lt;p&gt;Analysing the questionnaire turned up several problems worth fixing before reusing the questions, and worth taking into account when re-analysing the data: a question that asked for a single primary answer while accepting several, a list that mixed applications with libraries and server components, and a question that asked two things at once.&lt;/p&gt;
&lt;p&gt;Around 6% of this dataset shows clear quality problems, rising to roughly 11% under a stricter definition that also counts respondents who selected every available option. We even had two self-identified AI assistants fill in the survey. We re-ran the headline figures with those responses removed and none of the percentages moved by more than a point.&lt;/p&gt;
&lt;h3 id="product-use-numbers"&gt;Product-use numbers&lt;/h3&gt;
&lt;p&gt;We asked participants to note the Jupyter tools that they use, and share the results below. A caveat for this data: we learned that many Jupyter users do not easily distinguish between the many different tools in the “Jupyter Stack”, and respondents often only chose one tool while many were likely in-use (e.g. only choosing “IPython” but not choosing “Jupyter Server”, which is almost always used alongside IPython). We’ll try to improve our methodology to tease this out more effectively in the future, but share the data below for others.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/005-1_T7HFyQuaysQbyU7YqdcAgA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;To understand whether the above question was skewed by the effect of mistakenly only responding with one selection, while many selections were more appropriate, we broke down the answers to the above question by whether the respondent also selected at least one other option. Of 542 respondents, 303 ticked exactly one box.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/006-1_EqKzmO74B8Rk9uteMOxlWA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Nearly half of all IPython/ipykernel selections came from people who ticked nothing else, which suggests that some respondents ticked the single item they recognised rather than enumerating everything they use. For example, jupyter-server usage should be equal or greater to that of JupyterLab and Notebook (while alternative servers such as jupyverse exist, adoption of these would not explain the gap). We would treat these percentages as reflecting name recognition at least as much as adoption. Which products are used &lt;em&gt;together&lt;/em&gt; holds up better: among the 239 people who ticked more than one, Binder, JupyterHub, Jupyter Server, Jupyter Book and ipywidgets form a clear cluster.&lt;/p&gt;
&lt;h3 id="usage-patterns"&gt;Usage patterns&lt;/h3&gt;
&lt;p&gt;Just over half (53%) use Jupyter daily for more than thirty minutes, 15% once a day for shorter sessions, 17% weekly, and 16% monthly or less. The sample leans heavily toward regular users. The survey was open for a month, with almost all responses arriving in the final nineteen days.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/what-you-told-us-results-from-the-2026-jupyter-user/images/007-1_OuWj_WKQ2Oxl7rO6bV8NLA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/><category term="Jupyter Foundation"/></entry><entry><title>JupyterGIS 0.16: New visualization capabilities, collaborative Story Maps, and more</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/" rel="alternate"/><published>2026-08-24T16:09:00+00:00</published><updated>2026-08-24T16:09:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:jasongrout.github.io,2026-08-24:/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/</id><summary type="html">&lt;p&gt;Read this article in Notebook.link, as a live story-map! https://notebook.link/@martinRenou/jupytergis-announcement&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/"&gt;Earlier this year, we introduced STAC browsing and Story Maps in JupyterGIS&lt;/a&gt;, making it easier to discover geospatial datasets and communicate results without leaving Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geojupyter/jupytergis/releases/tag/v0.16.0"&gt;JupyterGIS 0.16&lt;/a&gt; continues in the same direction. This release adds support for new geospatial formats, tighter integration with the scientific Python ecosystem, a redesigned Story Map editor, and a more expressive way to style geographic data.&lt;/p&gt;
&lt;h2 id="story-maps-are-getting-a-new-look"&gt;Story Maps are getting a new look!&lt;/h2&gt;
&lt;p&gt;Story Maps in JupyterGIS let you build a scrollable presentation around your map. A Story Map is made up of a sequence of segments that can combine Markdown content with map views, so you can guide the reader through a geographic story as they scroll.&lt;/p&gt;
&lt;p&gt;Each segment can define its own map state, including the current map location, visible layers, and layer styling. This means that the map can change as the reader moves through the story: layers can appear or disappear, the view can move to a new location, and symbology can change to highlight different aspects of the data.&lt;/p&gt;
&lt;h3 id="story-maps-have-received-a-significant-update-in-this-release"&gt;Story Maps have received a significant update in this release.&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/001-1_gyuKfOzFSbmRhH9LVBTJiA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-better-story-maps-editing-experience"&gt;A better Story Maps editing experience&lt;/h2&gt;
&lt;p&gt;We’ve also made substantial improvements to the Story Map editing experience.&lt;/p&gt;
&lt;p&gt;The editor has been redesigned around Jupyter’s &lt;strong&gt;real-time collaboration infrastructure, allowing multiple people to edit the same Story Map simultaneously&lt;/strong&gt;. Changes appear immediately for everyone, making it much easier to prepare presentations, reports, or educational material as a team.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Collaboratively edit the Story Map markdown." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/002-1_yLMypnIGkeKXrR1BfXgvHg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Collaboratively edit the Story Map markdown.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The editor now gives you a much better sense of what the final story will look like while you are working on it. Markdown sections can be previewed directly in the editor, and a new Story Map preview makes it possible to see the complete presentation without leaving the editing workflow. This makes it easier to write, arrange, and refine a story while keeping an eye on the final result. We’ve also introduced a new layout that is better suited for long-form content. In addition to guided geographic narratives, Story Maps can now be used to create richer articles combining text, maps, images, and other interactive content.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/003-1_1eO0MShCVn71uIhAkC61ZA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="openeo-layers"&gt;OpenEO layers&lt;/h2&gt;
&lt;p&gt;More and more geospatial workflows rely on remote processing instead of downloading datasets locally. openEO provides a common API to describe these processing pipelines as process graphs that are executed by a backend.&lt;/p&gt;
&lt;p&gt;JupyterGIS can now display &lt;strong&gt;openEO&lt;/strong&gt; process graphs directly as map layers. Instead of exporting intermediate results before visualizing them, you can connect an openEO backend and inspect the output of your processing pipeline directly in the map.&lt;/p&gt;
&lt;p&gt;The visualization is tile-based and lazy: JupyterGIS only requests the data needed for the current map view and zoom level. This makes it possible to explore large remote sensing workflows interactively, without materializing the full result locally.&lt;/p&gt;
&lt;p&gt;JupyterGIS can make use of any openEO server that supports tiling, such as &lt;a href="https://sentinel-hub.github.io/titiler-openeo"&gt;titiler-openeo&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupytergis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo.processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;

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

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

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

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

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

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

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

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

&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;40.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;73.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_openeo_tile_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/004-1_L5MrEnxXuvIkT5rVl0dahw.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to defining openEO process graphs from the scripting Python API, JupyterGIS provides an advanced openEO process graph editor, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connect to an openEO tile server&lt;/li&gt;
&lt;li&gt;define the graph graphically, with boxes and arrows&lt;/li&gt;
&lt;li&gt;load data collections and define processes with a drag-and-drop UI&lt;/li&gt;
&lt;li&gt;directly edit the JSON content&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Editing an openEO process graph from the JupyterGIS front-end" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/005-1_3AGsNcwe384V1P4-ZkzcYw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Editing an openEO process graph from the JupyterGIS front-end&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another interesting aspect of openEO is that process graphs have a well-defined, declarative JSON representation. Because of this structured format, &lt;strong&gt;they are a natural target for LLM-assisted workflows&lt;/strong&gt;. Users can describe the analysis they want in natural language, have an LLM generate or refine the corresponding process graph (e.g. using jupyterlite-ai), and immediately visualize the result in JupyterGIS. Combined with the lazy, tile-based rendering, this makes it possible to quickly iterate on processing pipelines without waiting for complete datasets to be exported or downloaded.&lt;/p&gt;
&lt;h2 id="lazy-visualization-of-xarray-datasets-with-jupyter-tiler"&gt;Lazy visualization of Xarray datasets with jupyter-tiler&lt;/h2&gt;
&lt;p&gt;JupyterGIS now integrates with the new &lt;a href="https://jupyter-tiler.readthedocs.io"&gt;jupyter-tiler&lt;/a&gt; package, making it straightforward to visualize Xarray datasets from Python.&lt;/p&gt;
&lt;p&gt;Datasets can come from anywhere: they may already exist in your notebook, or they can be loaded on demand from a STAC catalog using stackstac. Once you have an Xarray object, JupyterGIS can display it in the map without requiring an export to another format.&lt;/p&gt;
&lt;p&gt;Rendering happens lazily, generating only the tiles needed for the current view. This makes it possible to explore datasets that are much larger than memory while keeping navigation responsive.&lt;/p&gt;
&lt;p&gt;The result is a smoother workflow from data loading, to analysis, to visualization, all within the same notebook.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_data_array_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NDSI Layer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_array&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ndsi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;viridis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Visualizing an Xarray dataset in JupyterGIS." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/006-1_GsxLjpQu33wvCx8KZxBUWA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Visualizing an Xarray dataset in JupyterGIS.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This feature requires the optional dependency jupyter-tiler to be installed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyter-tiler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="a-more-expressive-symbology-model"&gt;A more expressive symbology model&lt;/h2&gt;
&lt;p&gt;Styling geographic data often requires combining multiple visual properties to communicate patterns effectively.&lt;/p&gt;
&lt;p&gt;JupyterGIS 0.16 introduces a &lt;strong&gt;new symbology model inspired by the Grammar of Graphics.&lt;/strong&gt; Instead of relying on a fixed set of styling options, visual properties such as color, size, and opacity can be defined in a more flexible and composable way.&lt;/p&gt;
&lt;p&gt;This makes it easier to build everything from simple thematic maps to more advanced visualizations while keeping styling definitions consistent and reproducible.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/007-1_SU9Ll713eVozkjVQNQNmMA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color.&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="geozarr-and-geopackage-support"&gt;GeoZarr and GeoPackage support&lt;/h2&gt;
&lt;p&gt;This release also expands the range of formats that JupyterGIS can open directly.&lt;/p&gt;
&lt;p&gt;Support for GeoZarr makes it possible to work with cloud-native multidimensional geospatial datasets, while GeoPackage support improves interoperability with existing GIS software and common data exchange workflows.&lt;/p&gt;
&lt;h2 id="new-collaborative-editing-capabilities"&gt;New Collaborative Editing Capabilities&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also brings collaborative editing to vector layers. When working on a shared JupyterGIS document, multiple users can now edit the same vector data at the same time.&lt;/p&gt;
&lt;p&gt;Features can be created, moved, and edited collaboratively, with changes synchronized in real time between users. This makes it possible to work together on tasks such as digitizing features, annotating a map, or refining a dataset without having to exchange files or manually merge changes.&lt;/p&gt;
&lt;p&gt;Combined with the collaborative Story Map editor, this makes collaboration a more integral part of JupyterGIS: users can work together on the data itself, and then use the same shared document to explore and communicate their results.&lt;/p&gt;
&lt;h2 id="a-new-r-api"&gt;A new R API&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also introduces an R client, bringing JupyterGIS to R users through the new &lt;a href="https://github.com/geojupyter/r-jupytergis"&gt;&lt;code&gt;r-jupytergis&lt;/code&gt;&lt;/a&gt; package. The R client provides bindings for interacting with JupyterGIS widgets from an R notebook, using the same JavaScript front-end as the Python client.&lt;/p&gt;
&lt;p&gt;The main interface is the &lt;code&gt;GISDocument&lt;/code&gt; widget, which can be used to create and manipulate JupyterGIS documents directly from R. This makes it possible to build geospatial workflows in R while using the same interactive map interface available to Python users.&lt;/p&gt;
&lt;p&gt;The R client also uses the same underlying collaborative infrastructure as the Python client, including the Yrs CRDT library. This means that R users can participate in the same collaborative JupyterGIS workflows rather than working in a separate environment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;france_hiking.jGIS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;add_raster_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://mt1.google.com/vt/lyrs=y&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google Satellite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;attribution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.6&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="bug-fixes-and-performance-improvements"&gt;Bug fixes and performance improvements&lt;/h2&gt;
&lt;p&gt;As usual, this release also includes many smaller improvements throughout the project.&lt;/p&gt;
&lt;p&gt;We’ve fixed a number of bugs, improved performance in several parts of the application, and continued polishing both the user interface and the Python API.&lt;/p&gt;
&lt;p&gt;JupyterGIS continues to evolve as a collaborative GIS environment that fits naturally within the Jupyter ecosystem. Whether your workflow starts from a notebook, a STAC catalog, an openEO backend, or a local dataset, the goal remains the same: make it easier to move between analysis, visualization, and communication without switching tools.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work on JupyterGIS by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by &lt;a href="https://www.esa.int/"&gt;the European Space Agency (ESA)&lt;/a&gt; for the Story-maps development, the R API, openEO layers support and the collaborative labelling. Additionally, QuantStack was funded by &lt;a href="https://cnes.fr/"&gt;the French National Centre for Space Studies (CNES)&lt;/a&gt; for the lazy visualization of xarray datasets.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="contributors-to-this-release"&gt;Contributors to this release&lt;/h2&gt;
&lt;p&gt;By order of &lt;a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports"&gt;number of contributions&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;&lt;strong&gt;Arjun Verma&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He worked on the server-side geoprocessing infrastructure and on the openEO editor in the JupyterGIS front-end.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/martinRenou"&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt;&lt;/a&gt; is a Technical Director at QuantStack and a maintainer of JupyterGIS. For this release, Martin coordinated and guided much of the development, and worked on the integration of openEO layers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gjmooney"&gt;&lt;strong&gt;Gregory Mooney&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack and a long-time contributor to JupyterGIS. He led much of the work on the new Story Map editor and its collaborative editing capabilities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/MMesch"&gt;&lt;strong&gt;Matthias Meschede&lt;/strong&gt;&lt;/a&gt; is Chief Operating Officer at QuantStack. He introduced the new Grammar of Graphics-inspired symbology model, bringing a more expressive and composable approach to styling geographic data.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mfisher87"&gt;&lt;strong&gt;Matt Fisher&lt;/strong&gt;&lt;/a&gt; is the Community Manager of &lt;a href="https://github.com/geojupyter"&gt;GeoJupyter&lt;/a&gt;. He contributed to many of the discussions around the release and helped shape several of the design decisions across the project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nakul-py"&gt;&lt;strong&gt;Nakul Verma&lt;/strong&gt;&lt;/a&gt; is an open-source contributor to JupyterGIS. He contributed numerous bug fixes and improvements throughout the release, and introduced support for Vega expressions in the new symbology system.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/AntoinePrv"&gt;&lt;strong&gt;Antoine Prouvost&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He led the initial work on the R API for JupyterGIS, building its first skeleton and establishing the foundations for the &lt;code&gt;r-jupytergis&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/SandrineP"&gt;&lt;strong&gt;Sandrine Pataut&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. She worked on bringing many of JupyterGIS’s features to the R API, helping make the new client more complete and useful for R users.&lt;/p&gt;
&lt;p&gt;We are grateful to everyone who contributed code, reviews, ideas, discussions, and feedback to this release. JupyterGIS continues to benefit from an increasingly diverse community of contributors, and we look forward to seeing what comes next!&lt;/p&gt;
</content><category term="geoscience"/><category term="JupyterGIS"/><category term="science"/></entry><entry><title>Positron Server available for academic use via JupyterHub</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/positron-server-available-for-academic-use-via/" rel="alternate"/><published>2026-07-29T18:19:00+00:00</published><updated>2026-07-31T12:28:00+00:00</updated><author><name>Jupyter Foundation</name></author><id>tag:jasongrout.github.io,2026-07-29:/medium-archive/pelican/posts/2026/positron-server-available-for-academic-use-via/</id><summary type="html">&lt;p&gt;Editor’s note: This is a guest blog post from Posit, a Jupyter Foundation member&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Editor’s note: This is a guest blog post from Posit, a&lt;/em&gt; &lt;a href="https://jupyterfoundation.org/"&gt;&lt;em&gt;Jupyter Foundation&lt;/em&gt;&lt;/a&gt; &lt;em&gt;member&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/positron-server-available-for-academic-use-via/images/001-1_1jHlCkiGYDfmAd0mWDhf1A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Academic institutions can now offer &lt;a href="https://positron.posit.co/"&gt;Positron&lt;/a&gt; directly within their existing JupyterHub environments, giving students access to a modern, full-featured data science IDE without requiring local installation or additional infrastructure. Licensed under the permissive, source-available &lt;a href="https://positron.posit.co/licensing.html"&gt;Elastic License 2.0&lt;/a&gt;, Positron as a desktop app is free for everyone to use, build on, and extend across personal, academic, and commercial projects. Through a free educational license, universities and other academic organizations can additionally make &lt;a href="https://positron.posit.co/education.html"&gt;Positron Server&lt;/a&gt; available to currently enrolled students for coursework, helping create a consistent learning experience across classrooms, labs, and remote environments.&lt;/p&gt;
&lt;p&gt;By integrating Positron into JupyterHub, educators can provide students with a powerful development environment alongside the tools they already use. Students simply launch Positron from the JupyterHub interface, just as they would open JupyterLab or a different environment, and can begin working immediately.&lt;/p&gt;
&lt;h2 id="bringing-a-modern-data-science-ide-to-the-classroom"&gt;Bringing a Modern Data Science IDE to the Classroom&lt;/h2&gt;
&lt;p&gt;Positron combines the familiarity of notebook-based workflows with the capabilities of a professional integrated development environment (IDE). Once launched through JupyterHub, students have access to the complete Positron experience, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprehensive support for both Python and R&lt;/li&gt;
&lt;li&gt;Access to the OpenVSX extension marketplace&lt;/li&gt;
&lt;li&gt;Built-in data viewer and variables explorer&lt;/li&gt;
&lt;li&gt;Integrated help pane, debugging tools, and version control&lt;/li&gt;
&lt;li&gt;Advanced development features that help students grow their data science skills over time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach allows instructors to standardize course environments while reducing the technical barriers often associated with software installation and configuration.&lt;/p&gt;
&lt;h2 id="designed-to-work-with-existing-jupyterhub-deployments"&gt;Designed to Work with Existing JupyterHub Deployments&lt;/h2&gt;
&lt;p&gt;Positron Server is built to integrate directly into existing JupyterHub environments, making adoption straightforward for administrators already managing Jupyter-based infrastructure.&lt;/p&gt;
&lt;p&gt;The solution is compatible with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterHub deployments running JupyterLab 4&lt;/li&gt;
&lt;li&gt;Python 3.9 and later environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Installation is provided through the &lt;a href="https://posit-dev.github.io/jupyter-positron-server/"&gt;jupyter-positron-server&lt;/a&gt; Python package, which is built on &lt;a href="https://jupyter-server-proxy.readthedocs.io/"&gt;Jupyter Server Proxy&lt;/a&gt;. For administrators who have previously configured services within JupyterHub, the setup process will feel familiar.&lt;/p&gt;
&lt;p&gt;Rather than functioning as a standalone desktop application, Positron Server extends existing JupyterHub deployments by making the Positron IDE available as another launch option within the environment.&lt;/p&gt;
&lt;h2 id="free-educational-licensing-for-teaching"&gt;Free Educational Licensing for Teaching&lt;/h2&gt;
&lt;p&gt;Academic institutions using Positron for instructional purposes are eligible for a free teaching license. Under this license, access can be provided to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently enrolled students&lt;/li&gt;
&lt;li&gt;Course participants&lt;/li&gt;
&lt;li&gt;Faculty and staff involved in delivering educational programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This licensing model enables institutions to incorporate Positron into coursework without additional software costs, helping educators provide professional-grade tools to learners.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Institutions interested in offering Positron through JupyterHub can get started in three simple steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Review the eligibility requirements outlined in the &lt;a href="https://positron.posit.co/licensing.html#positron-education-license-rider"&gt;Positron Education License Rider&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://positron.posit.co/education.html#applying-for-a-teaching-license"&gt;Contact Posit&lt;/a&gt; to request a free teaching license.&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href="https://posit-dev.github.io/jupyter-positron-server/"&gt;jupyter-positron-server&lt;/a&gt; installation and configuration documentation to deploy Positron within your JupyterHub environment.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="supporting-the-next-generation-of-data-scientists"&gt;Supporting the Next Generation of Data Scientists&lt;/h2&gt;
&lt;p&gt;As data science and computational research continue to grow across disciplines, educational institutions are looking for ways to provide students with professional tools that are easy to access and manage. By bringing Positron directly into JupyterHub, universities can deliver a modern, scalable development environment that supports both teaching and learning while minimizing setup complexity.&lt;/p&gt;
&lt;p&gt;Whether students are writing Python code, analyzing data in R, or exploring advanced development workflows, Positron Server helps create a seamless experience from the first day of class through more advanced coursework and research projects.&lt;/p&gt;
</content><category term="JupyterHub"/></entry><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>Navigating the Post-Workshop Fog: a Path to Myst</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/" rel="alternate"/><published>2026-07-09T15:15:00+00:00</published><updated>2026-07-09T15:15:00+00:00</updated><author><name>Chiara Marmo</name></author><id>tag:jasongrout.github.io,2026-07-09:/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/</id><summary type="html">&lt;p&gt;by Chiara Marmo and Serena Bonaretti&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;by Chiara Marmo and Serena Bonaretti&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/001-1_rxDzW-V0Ey6pg-hkg2bPag.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;From June 15th to 17th 2026 a &lt;a href="https://events.linuxfoundation.org/jupyter-workshops/"&gt;Jupyter Workshop&lt;/a&gt; took place at Paris-Saclay University : “&lt;a href="/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/"&gt;Demystifying MyST Markdown in education&lt;/a&gt;”. The workshop combined presentations in the mornings with collaborative sprints during the afternoons. It has been funded by the &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; and &lt;a href="https://www.dataia.eu/formations"&gt;SaclAI-School&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="milestones"&gt;Milestones&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improving documentation and tools for easier deployment even for non-specialists.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Freek Pols from Delft University and Brigitta Sipočz form CalTech presented some examples and challenges in publishing courses and documentation at large scales. Angus Hollands, MyST maintainer, made an in depth presentation of Myst and JupyterBook2. Guided tutorials introduced participants to complete a Jupyter Book workflow. The participants learned how to create their first Jupyter Book, and how to publish it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Text notebooks as first citizens.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Marc Wouts and Yahya Heni discussed the path from &lt;a href="https://jupytext.org/"&gt;jupytext&lt;/a&gt; to &lt;a href="https://github.com/notebook-link/jupyter-plainb"&gt;jupyter-plainb&lt;/a&gt; to open and execute plain markdown text notebooks directly in Jupyter Lab. Two Jupyter Enhancement Proposals (JEP) has been discussed together with Jupyter Lab and MyST maintainers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/103"&gt;Markdown based notebooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/138"&gt;Specify the markup language and flavor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="one-step-at-a-time"&gt;One step at a time&lt;/h2&gt;
&lt;p&gt;Over 30 &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=issues"&gt;issues&lt;/a&gt; and &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=pullrequests"&gt;pull requests&lt;/a&gt; have been opened in the whole Jupyter ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation items: for example, about &lt;a href="https://github.com/jupytext/jupytext/issues/1548"&gt;text notebooks in jupyterlite&lt;/a&gt; or publishing on &lt;a href="https://github.com/jupyter-book/jupyter-book/pull/2635"&gt;different hosting solutions&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;feature requests: for example, &lt;a href="https://github.com/jupyter-book/jupyter-book/issues/2634"&gt;single document feature in JupyterBook2&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/19093"&gt;non-default application to open files in Jupyter Lab&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;adopt JupyterBook2 for software documentation: for instance &lt;a href="https://github.com/mwouts/itables/pull/570"&gt;itables&lt;/a&gt; and &lt;a href="https://gitlab.com/travo-cr/travo/-/merge_requests/240"&gt;travo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sidewalks"&gt;Sidewalks&lt;/h2&gt;
&lt;p&gt;The workshop provided the opportunity to continue previous discussions about AI in education: some participants attended the workshop “&lt;a href="https://events.linuxfoundation.org/ai-in-jupyter/"&gt;AI in Jupyter&lt;/a&gt;” and were able to pick up the conversation from there.&lt;/p&gt;
&lt;p&gt;Relationships between Academia and Open Source Software communities were also topic of conversation: about Open Source Program Offices (OSPOs) and how their action can be connected to education strategies.&lt;/p&gt;
&lt;h2 id="wandering"&gt;Wandering&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/002-1_aWttEDS_jHdMWa1ZwvimPg.jpeg" alt="Participant group photo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Collaboration is a matter of trust. That’s why it is still important for people to meet in person and to know each other. It is about exchanging details, like keys to decrypt characters and aspirations. One might discover a shared passion for shoes. Another may finally enjoy long French-style lunch breaks.&lt;/p&gt;
&lt;p&gt;When the time comes to resume the path, important steps have already been taken in the right direction.&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Book"/><category term="MyST"/><category term="workshops"/></entry><entry><title>2026 Jupyter Community Call For Funding Proposals</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/2026-jupyter-community-call-for-funding-proposals/" rel="alternate"/><published>2026-07-06T19:32:00+00:00</published><updated>2026-07-09T09:54:00+00:00</updated><author><name>Project Jupyter</name></author><id>tag:jasongrout.github.io,2026-07-06:/medium-archive/pelican/posts/2026/2026-jupyter-community-call-for-funding-proposals/</id><summary type="html">&lt;p&gt;The Jupyter Executive Council and Jupyter Foundation are pleased to announce a new Call for Proposals (CFP) for funding the Jupyter…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/2026-jupyter-community-call-for-funding-proposals/images/001-0_jwHtZqyuA711MXw9.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://jupyter.org/about#executive-council-members"&gt;Jupyter Executive Council&lt;/a&gt; and &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; are pleased to announce a new Call for Proposals (CFP) for funding the Jupyter community to improve Jupyter. Visit the &lt;a href="https://jupyterfoundation.org/community-funding-proposals/submit-a-proposal/"&gt;Jupyter Foundation Community Proposals webpage&lt;/a&gt; to learn more about the process and how to submit proposals. &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;&lt;strong&gt;Submit a proposal&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;by Wednesday, September 9, 2026.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Jupyter Foundation began its operations in early 2025 with a mission to use its resources to support the Jupyter community. As part of this mission, we funded a round of &lt;a href="/posts/2025/announcing-our-first-jupyter-community-funded-proposals/"&gt;community proposals in 2025&lt;/a&gt;. This funded work continues to bring many benefits to the Jupyter ecosystem (see the progress reports &lt;a href="https://github.com/jupyter-governance/funding-proposals/tree/main/Reports"&gt;here&lt;/a&gt;). In this next call for proposals, we are iterating on this success.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;Community Proposals webpage&lt;/a&gt; to learn more about past funded proposals and the &lt;a href="https://jupyter-governance.github.io/jupyter-foundation-governing-board/funding/process/"&gt;Jupyter Foundation team compass&lt;/a&gt; for more detailed background about this funding call. In this second round, our goal is to continue learning how to best manage a community funding program. Based on feedback, we are updating the proposal process in several ways, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new section of the proposal template has been added for Jupyter council or committee endorsements. We strongly encourage authors to seek and include endorsements from Jupyter councils or committees affected by the proposal. Each endorsement should be a brief paragraph about the impact of the proposed work from the council or committee’s perspective, and express support for the work and a willingness to receive it. We encourage authors to communicate early with relevant Jupyter councils and committees to make this endorsement process easier.&lt;/li&gt;
&lt;li&gt;The de-risk section of the proposal is now optional for smaller funding requests.&lt;/li&gt;
&lt;li&gt;The CFP is open for several weeks longer than the previous round. We do not anticipate extending the CFP deadline this time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;&lt;strong&gt;Submit a proposal&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;by Wednesday, September 9, 2026.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As with the previous round, to help inspire proposals we are particularly excited to fund, we’ve defined &lt;a href="https://jupyter-governance.github.io/jupyter-foundation-governing-board/funding/priorities/"&gt;funding priorities for the Jupyter Foundation&lt;/a&gt;. These are key outcomes that we must improve in order to grow the overall health and impact of the ecosystem. Briefly summarizing, these priorities are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grow the contributor capacity of Jupyter&lt;/strong&gt;. We would like to grow the number of contributors, improve the efficiency of existing contributors, and facilitate learning across Jupyter subprojects. We’d love to see proposals that help us mobilize and support the total pool of energy available to contribute to Jupyter. Examples of recent activities in this area include hiring a community manager and hosting community workshops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improve the reliability, security, and consistency of Jupyter’s software and team practices.&lt;/strong&gt; We believe that our technology will be more impactful and easier to contribute to and deploy if we improve our development infrastructure and team practices in ways that contribute to reliability, security, and consistency. Examples of recent activities in this area include investing in better testing infrastructure and linting rules, refactoring build systems, improving accessibility, funding security issue triage, and hosting a subproject roadmap alignment workshop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While we’re particularly excited about these two outcomes and aim to focus funding on proposals that clearly feed into one or both of these priorities, we also encourage people to get creative and submit proposals for outcomes that have high impact and strategic value for the Jupyter community. We’re excited to see what others come up with, and are eager to work with you in unlocking critical funding in support of Jupyter’s community.&lt;/p&gt;
</content><category term="funding"/><category term="Jupyter Foundation"/></entry><entry><title>JupyterLab 4.6 and Notebook 7.6 are out!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/" rel="alternate"/><published>2026-07-02T16:13:00+00:00</published><updated>2026-07-02T16:15:00+00:00</updated><author><name>Michał Krassowski</name></author><id>tag:jasongrout.github.io,2026-07-02:/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/</id><summary type="html">&lt;p&gt;JupyterLab 4.6 features new interface customization options, improved file browser and debugger, an easy way to jump between recently…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-6"&gt;JupyterLab 4.6&lt;/a&gt; features new interface customization options, improved file browser and debugger, an easy way to jump between recently edited cells, and numerous other notebook experience improvements. Keyboard shortcuts, navigation and accessibility is another focus area in this release. &lt;a href="https://jupyter-notebook.readthedocs.io/en/stable/changelog.html#id1"&gt;Jupyter Notebook 7.6&lt;/a&gt; has also been released, including the fixes and enhancements of JupyterLab along with a new Scratchpad console and other Notebook-specific improvements. This article highlights notable changes in both applications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can try out the changes in your browser: &lt;a href="https://jupyter.org/try-jupyter/lab/index.html"&gt;JupyterLab 4.6&lt;/a&gt;, &lt;a href="https://jupyter.org/try-jupyter/notebooks/?path=notebooks/Intro.ipynb"&gt;Notebook 7.6&lt;/a&gt;&lt;br&gt;
At the time of publication, the preview runs on &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;JupyterLite&lt;/a&gt; 0.8.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="Overview of some user interface enhancements visible in JupyterLab UI" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/001-1_zni6m_lgsXqu-zsGH77zBw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of some user interface enhancements visible in JupyterLab UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="enhancements-shared-by-jupyterlab-and-notebook"&gt;Enhancements shared by JupyterLab and Notebook&lt;/h2&gt;
&lt;h3 id="notebook-improvements"&gt;Notebook improvements&lt;/h3&gt;
&lt;p&gt;Two new navigation commands, “Select previous last modified cell” and “Select next last modified cell”, allow jumping back and forward through recently edited cells. The commands are accessible from the Command Palette and as buttons in the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/toc.html"&gt;Table Of Contents&lt;/a&gt; toolbar when a notebook is active.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Clicking the highlighted button will jump to a previously edited cell" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/002-0_3gi9bAn6k4-yH8MP.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Clicking the highlighted button will jump to a previously edited cell&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Copy, cut, and paste text commands have been added to the notebook context menu. This feature requires permission to access clipboard to work reliably and may not work in Firefox depending on version and additional restrictions.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Copy/Cut/Paste Selected cells expose clipboard actions on cell source" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/003-0_fuYCAQUXQwuqp6cG.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Copy/Cut/Paste Selected cells expose clipboard actions on cell source&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The cell toolbar delete button now shows a confirmation dialog to prevent accidental deletion. The “Do not ask me again” checkbox is available and the preference is persisted in &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/notebook.html#cell-toolbar"&gt;Cell Toolbar&lt;/a&gt; settings. The standard keyboard shortcut (D, D) is unaffected.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Dialog shown when deleting a cell from cell tollbar" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/004-0_vITL_K8lFE_UIsHj.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Dialog shown when deleting a cell from cell tollbar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Pressing Ctrl + B (Cmd + B on macOS) in a markdown cell wraps the selected text in bold formatting.&lt;/p&gt;
&lt;p&gt;When exporting a notebook as HTML via &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/export.html"&gt;File → Save and Export Notebook As → HTML&lt;/a&gt;, a dialog now asks whether to sanitize the HTML output before download.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="file-browser-new-column-editable-breadcrumbs-open-in-terminal"&gt;File browser: new column, editable breadcrumbs, open in terminal&lt;/h3&gt;
&lt;p&gt;A new “Date Created” column has been added to the file browser, showing when files were created. The column can be toggled via Settings → File Browser → “Show date created column” or by right-clicking the column header. The latest &lt;code&gt;jupyter-server&lt;/code&gt; (&lt;code&gt;v2.18&lt;/code&gt;+) is required for accurate values across operating systems.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New date created column in file browser" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/005-0_epZrkZYQDIzropSt.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New date created column in file browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The breadcrumb bar now supports &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/files.html#editable-breadcrumbs"&gt;direct path editing&lt;/a&gt; with tab-completion. Clicking the area behind breadcrumbs (highlighted on hover), or using the Command Palette, opens an editable text field where pressing Tab completes the longest common prefix of matching subdirectories.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Editable breadcrumbs" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/006-0_grxuAxyEQqLFVn6d.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Editable breadcrumbs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A new “Open in Terminal” option in the file browser context menu opens a terminal navigated to the selected directory. When multiple directories are selected, one terminal is opened per directory.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Opening terminal for a specific directory is now easier." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/007-0_aespdpw35miy6vmr.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Opening terminal for a specific directory is now easier.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Additional file browser improvements include: a configurable &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/files.html#file-name-sort-order"&gt;file name sort order&lt;/a&gt;, persistence of the sort state across sessions, automatic clearing of the file filter when changing directories, and a loading animation during file browser refresh.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="debugger-kernel-sources-filter-floating-overlay"&gt;Debugger: kernel sources filter, floating overlay&lt;/h3&gt;
&lt;p&gt;The debugger Sources panel has been moved out of the debugger sidebar; the Sources now open as read-only editors in the main area, keeping the sidebar uncluttered while you &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/debugger.html#explore-the-code-state"&gt;explore the code state&lt;/a&gt;. The previous behavior can be restored by disabling the “Show Sources in Main Area” setting in the Debugger settings.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/008-0_l0V_AJYDsYfEOA54.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;An overlay with continue/step in/stop buttons has been added easing the control of the debugger steps:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/009-0_-kwAopUu6uow4ERY.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The Kernel Sources filter bar has been moved to the toolbar and now supports live filtering, making it easier to search through kernel source files while debugging.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/010-0_lXUep59E1svw80P6.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The refresh button for sources list was removed — the sources will now update automatically after each code execution.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="keyboard-navigation-and-accessibility"&gt;Keyboard navigation and accessibility&lt;/h3&gt;
&lt;p&gt;Keyboard navigation has been improved across several components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The terminal no longer traps keyboard focus, allowing users to move focus away with the keyboard.&lt;/li&gt;
&lt;li&gt;The console and file browser breadcrumbs both received keyboard navigation fixes.&lt;/li&gt;
&lt;li&gt;Focus is now correctly restored after closing the command palette, and input elements in dialogs opened from the command palette receive focus immediately.&lt;/li&gt;
&lt;li&gt;The find-and-replace button focus in the document search box has been corrected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Screen reader behavior has been improved in the launcher and notebook. Toolbar buttons now correctly reflect their pressed state via the &lt;code&gt;aria-pressed&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;The Keyboard Shortcuts settings panel has been updated to improve accessibility, including better keyboard interaction and screen reader announcements within the shortcuts editor dialog.&lt;/p&gt;
&lt;p&gt;Focus indicators have been improved across the interface, including the status bar and other interactive components.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="keyboard-shortcuts"&gt;Keyboard shortcuts&lt;/h3&gt;
&lt;p&gt;Shortcuts can now be added from the UI shortcut editor for any command (previously this required writing JSON in Advanced Settings Editor).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/011-0_JYHGSldDZ4bsNCVk.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;“Find and Replace” has been added to the Edit menu with the keyboard shortcut Ctrl + H (Cmd + H on macOS).&lt;/p&gt;
&lt;p&gt;Ctrl + Y has been added as a redo shortcut on Windows and Linux.&lt;/p&gt;
&lt;p&gt;Pressing 1, 2, 3, 4, 5 and 6 will no longer convert a focused code or raw cell to Markdown to avoid accidental conversions. These shortcuts continue working on markdown cells, switching the heading level, as they did before.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="internationalization"&gt;Internationalization&lt;/h3&gt;
&lt;p&gt;Language packs can now be installed directly from within JupyterLab by selecting “Install more languages…” at the bottom of the Settings → Language menu. This opens the Extension Manager pre-filled with a search for available language pack extensions.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/012-0_IAY1NHv2eUZlhsoQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="terminal-enhancements"&gt;Terminal enhancements&lt;/h3&gt;
&lt;p&gt;Pressing Shift+Enter in the terminal now inserts a newline without executing the current line. This matches the behavior expected by certain terminal applications.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="inline-completion-enhancements"&gt;Inline completion enhancements&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/completer.html#inline-completer"&gt;Inline completion suggestions&lt;/a&gt; can now be rendered with syntax highlighting that matches the active editor language. This can be enabled in Settings → Inline Completer → “Ghost text syntax highlighting”.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/013-0_eUvIfOASnsZ0RTSH.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Ghost text is now also shown for all active cursors in a multi-cursor editing session.&lt;/p&gt;
&lt;h2 id="jupyterlab-specific-enhancements"&gt;JupyterLab-specific enhancements&lt;/h2&gt;
&lt;h3 id="layout-and-interface-customization"&gt;Layout and interface customization&lt;/h3&gt;
&lt;p&gt;The activity bar can now be positioned at the top or bottom of the interface, in addition to the default left and right placement. The setting is available under Settings → Interface → &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#activity-bar-position"&gt;Activity Bar Position&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/014-0_FZnWSzWq9TsSfnYH.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Sections of accordion sidebars can now be &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#move-accordion-sections-between-panels"&gt;moved between panels&lt;/a&gt; via a context menu. Right-clicking a section header shows a “Move To” menu. The placement and collapsed state of moved sections are persisted across sessions.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/015-0_EaVBoUQh5fMYTOCs.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/016-0_cGeR3SdD_1GL4pcS.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The sidebar panels themselves can be &lt;a href="https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#move-open-widgets"&gt;moved between areas&lt;/a&gt;. Right-clicking a sidebar shows submenu with options to move it to the main area, a different sidebar, or the down area.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/017-0_vZPh7LgFw5VKY96R.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/018-0_tqASYUG9UE6LoV2y.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Tabs can now be split in four directions using the “Split Tab” context menu item (or the command palette), which adds split left, right, up, and down options.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/019-0_7qxAk2wzTtYyiR7c.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Individual panels can be zoomed in or out using Ctrl + mouse wheel (when “Enable Ctrl+ Scroll Zoom” is turned on in Settings → Interface) or via the command palette, without affecting other panels.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/020-0_COyiDcTCqgm8mJcD.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="performance"&gt;Performance&lt;/h3&gt;
&lt;p&gt;Panel resizing is now more responsive; the width of individual widgets inside resized panels is frozen during the drag. This behaviour can be disabled by toggling “Optimize panel resize” in Settings → Application Shell.&lt;/p&gt;
&lt;h2 id="notebook-specific-enhancements"&gt;Notebook-specific enhancements&lt;/h2&gt;
&lt;h3 id="scratchpad-console"&gt;Scratchpad console&lt;/h3&gt;
&lt;p&gt;A scratchpad console can now be opened next to a notebook, sharing the same kernel. This makes it easy to run quick experiments or inspect variables without modifying the notebook itself.&lt;/p&gt;
&lt;p&gt;The scratchpad console can be opened from the &lt;code&gt;File&lt;/code&gt; -&amp;gt; &lt;code&gt;New&lt;/code&gt; -&amp;gt; &lt;code&gt;Scratchpad console&lt;/code&gt; menu, from the command palette, or with the Ctrl + B (or Cmd + B on macOS) keyboard shortcut, which toggles the console panel.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/021-1_cxBr835uxAtjpO9Tlqg7bw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="confirmation-dialog-when-closing-and-shutting-down-a-notebook"&gt;Confirmation dialog when closing and shutting down a notebook&lt;/h3&gt;
&lt;p&gt;The “Close and Shut Down Notebook” command now asks for confirmation before closing the browser tab and shutting down the kernel. The confirmation prompt can be disabled in the Settings Editor with the “Prompt for confirmation before closing and shutting down” setting.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyterlab-4-6-and-notebook-7-6-are-out/images/022-1_hWEaY7HfHBjzbajj9OIKtQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="miscellaneous"&gt;Miscellaneous&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tab widths in JupyterLab are kept frozen while the mouse pointer hovers over them, making it easier to close multiple tabs with the mouse&lt;/li&gt;
&lt;li&gt;Autocompletion heuristics were improved; the autocompletion (which remains opt-in) should no longer trigger in unexpected scenarios&lt;/li&gt;
&lt;li&gt;The output scroll overlay collapse icon is now visible regardless of the output size and scroll state&lt;/li&gt;
&lt;li&gt;The fonts used across components were standardized and fonts specified by themes or overrides are respected in every component of the application&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-extension-authors"&gt;&lt;strong&gt;For extension authors&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Building extensions (and JupyterLab/Notebook themselves) is now ~5 times faster thanks to migration from webpack to Rspack. Building extensions no longer requires a full JupyterLab installation as the relevant machinery was extracted to &lt;a href="https://github.com/jupyterlab/jupyter-builder"&gt;jupyter-builder&lt;/a&gt; (see this &lt;a href="/posts/2026/announcing-jupyter-builder-a-standalone-build-system/"&gt;blog post&lt;/a&gt; for more details). This (among others) enables faster build environment setup on CI. Future improvements to the build system can now be released independently of the JupyterLab release cadence.&lt;/p&gt;
&lt;p&gt;Please refer to the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-5-to-4-6"&gt;Extension Migration Guide&lt;/a&gt; for more details on API changes and up-to-date advice.&lt;/p&gt;
&lt;h2 id="as-large-as-minor-releases-go"&gt;As large as minor releases go&lt;/h2&gt;
&lt;p&gt;This JupyterLab release includes 68 new features and enhancements, 97 bug fixes, and 38 documentation improvements. 95 people contributed to this release. Across record-breaking 171 maintenance tasks we kept the dependencies up-to-date, improved quality of code and reduced the time to PRs getting merged by improving the CI performance and robustness. These efforts were in part funded by &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;Community Proposals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While the size of minor releases fluctuated across years, this one is on the higher side, with only v3.1 featuring slightly more merged PRs. The reviewers worked hard to ensure no regressions are introduced, but if any slipped through, please open an issue in respective repository (&lt;a href="https://github.com/jupyterlab/jupyterlab/issues/new/choose"&gt;JupyterLab&lt;/a&gt; or &lt;a href="https://github.com/jupyter/notebook/issues/new/choose"&gt;Notebook&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Thank you to all the new contributors, we hope to see you back!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab (39): @aarondr77, @Akshitguptaa, @altis0725, @amanparganiha, @anafontan, @autodots-AHassan, @aviu16, @bittoby, @boskodev790, @chenjiahan, @cursoragent, @dhgoal, @DTiming24, @github29tani, @GlassOfWhiskey, @harshaagrawal20, @hroncok, @jayaprajapatii, @JaYRaNa213, @jianyexi, @ktaletsk, @lin9long, @mfisher87, @MMesch, @moktamd, @nightcityblade, @nthiery, @raffaelemancuso, @RamiNoodle733, @reteps, @rodrigosf672, @Siddhazntx, @statxc, @TheChyeahhh, @tsharma-dev, @tubaman, @u-wlkjyy, @Yahiewi, @ZhYGuoL&lt;/li&gt;
&lt;li&gt;Notebook (9): @bodhisilberling, @Darshan808, @goelakash, @joaovml, @KH-Coder865, @Mirochill, @xlumzee, @yangsong97, @Yann-P&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to returning contributors for their continued work!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab (56): @aaron-seq, @afshin, @agriyakhetarpal, @AliMahmoudDev, @andrii-i, @apoorvdarshan, @arjxn-py, @arun-357, @bollwyvl, @brichet, @Carreau, @ceasermikes002, @cmarmo, @CrafterKolyan, @Darshan808, @davidbrochart, @DeborahOlaboye, @doshi-kevin, @erkin98, @fcollonval, @filipeoliveira05, @flaviomartins, @fleming79, @FoSuCloud, @frenzymadness, @HaudinFlorence, @i-aki-y, @ianhi, @ianthomas23, @IsabelParedes, @itsmejay80, @itsmevichu, @JamesWrigley, @jasongrout, @JasonWeill, @jimangel, @jtpio, @krassowski, @Krish-876, @linlol, @martinRenou, @Meriem-BenIsmail, @MUFFANUJ, @peytondmurray, @prajyot-porje, @pranshugupta01, @RRosio, @schmidi314, @soniya-malviy, @superlevure, @SylvainCorlay, @tmetzl, @utsav-develops, @xc2, @Yann-P, @Zsailer&lt;/li&gt;
&lt;li&gt;Notebook (9): @andrii-i, @brichet, @Carreau, @jtpio, @krassowski, @martinRenou, @minrk, @RamiNoodle733, @takluyver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all the people who tested and provided feedback for the pre-releases! Lastly, thank you to the weekly triage group for triaging JupyterLab and Notebook issues: @RRosio, @krassowski, @andrii-i, @rodrigosf672, @ktaletsk among others who attend.&lt;/p&gt;
&lt;h2 id="further-reading"&gt;Further reading&lt;/h2&gt;
&lt;p&gt;For more details, see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full Release Notes for &lt;a href="https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-6"&gt;JupyterLab 4.6&lt;/a&gt; and &lt;a href="https://jupyter-notebook.readthedocs.io/en/stable/changelog.html#id1"&gt;Notebook 7.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Full changelog on GitHub: &lt;a href="https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.0"&gt;JupyterLab&lt;/a&gt; and &lt;a href="https://github.com/jupyter/notebook/releases/tag/v7.6.0"&gt;Notebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Jupyter Notebook"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jasongrout.github.io,2026-06-24:/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/congratulations-distinguished-contributors/images/005-1_PfvfmCFMF7KRqzqrWrAPZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Announcing jupyter-builder: A Standalone Build System for JupyterLab Extensions</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/announcing-jupyter-builder-a-standalone-build-system/" rel="alternate"/><published>2026-06-19T13:11:00+00:00</published><updated>2026-06-19T13:11:00+00:00</updated><author><name>Darshan Kr. Paudyal</name></author><id>tag:jasongrout.github.io,2026-06-19:/medium-archive/pelican/posts/2026/announcing-jupyter-builder-a-standalone-build-system/</id><summary type="html">&lt;p&gt;We’re excited to announce the first stable release of jupyter-builder on PyPI and @jupyter/builder on npm. A standalone, configurable build…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/announcing-jupyter-builder-a-standalone-build-system/images/001-1_3UBtK-sh01N6OXIbGFNrpQ.webp" alt="Jupyter Builder logo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We’re excited to announce the first stable release of &lt;a href="https://pypi.org/project/jupyter-builder/"&gt;&lt;code&gt;jupyter-builder&lt;/code&gt;&lt;/a&gt; on PyPI and &lt;a href="https://www.npmjs.com/package/@jupyter/builder"&gt;&lt;code&gt;@jupyter/builder&lt;/code&gt;&lt;/a&gt; on npm. A standalone, configurable build system for JupyterLab and its extensions.&lt;/p&gt;
&lt;p&gt;If you build or maintain a JupyterLab extension, this release is for you.&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;For a long time, building a JupyterLab extension has meant installing all of JupyterLab. Take a look at any extension’s build dependencies and you’ll see &lt;code&gt;jupyterlab&lt;/code&gt; listed there, not because the extension needs JupyterLab at runtime to be built, but because the build tooling lives &lt;em&gt;inside&lt;/em&gt; the JupyterLab repository. The &lt;code&gt;builder/&lt;/code&gt; folder, the &lt;code&gt;jlpm&lt;/code&gt; command, the helper scripts, they’re all coupled to the JupyterLab core.&lt;/p&gt;
&lt;p&gt;This setup has caused real friction over the years:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux packagers&lt;/strong&gt; have repeatedly raised concerns about the circular dependency where extensions like &lt;code&gt;jupyterlab_pygments&lt;/code&gt; need &lt;code&gt;jupyterlab&lt;/code&gt; to build, but &lt;code&gt;jupyterlab&lt;/code&gt; ships with those extensions. It’s a chicken-and-egg problem that makes packaging painful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension authors&lt;/strong&gt; have to update their build system every time they update to a new JupyterLab version, which sometimes introduces breakages that have nothing to do with their extension’s actual code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Users&lt;/strong&gt; still occasionally run into installation issues that trace back to the incomplete migration from “source” extensions to prebuilt ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The need to separate the build system was identified back in &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/13456"&gt;jupyterlab#13456&lt;/a&gt;, and initial work began during GSoC 2024. With the support of the Jupyter Foundation’s first community-funded proposal, we’ve now brought that work to a stable release.&lt;/p&gt;
&lt;h2 id="what-jupyter-builder-does"&gt;What &lt;code&gt;jupyter-builder&lt;/code&gt; does&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;jupyter-builder&lt;/code&gt; extracts all the Node.js-based build tooling out of JupyterLab into a dedicated package. You install it on its own, and it builds your extension, no full JupyterLab installation required.&lt;/p&gt;
&lt;p&gt;It ships in two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/jupyter-builder/"&gt;&lt;strong&gt;&lt;code&gt;jupyter-builder&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; (PyPI) — the Python package that provides the &lt;code&gt;jupyter-builder&lt;/code&gt; CLI.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@jupyter/builder"&gt;&lt;strong&gt;&lt;code&gt;@jupyter/builder&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; (npm) — the underlying JavaScript package containing the build scripts. The Python CLI invokes &lt;code&gt;build-labextension.js&lt;/code&gt; from this package, which then runs the &lt;a href="https://rspack.dev/"&gt;rspack&lt;/a&gt; compiler with all the configuration needed to produce a JupyterLab extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of &lt;code&gt;jupyter labextension build .&lt;/code&gt;, you now run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-builder&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="build-compatibility-without-jupyterlab-installed"&gt;Build compatibility without JupyterLab installed&lt;/h2&gt;
&lt;p&gt;One interesting problem we had to solve: if JupyterLab isn’t installed, how does the builder verify that an extension is compatible with a given JupyterLab version?&lt;/p&gt;
&lt;p&gt;The answer is &lt;a href="https://www.npmjs.com/package/@jupyterlab/core-meta"&gt;&lt;code&gt;@jupyterlab/core-meta&lt;/code&gt;&lt;/a&gt;, a small npm package that publishes JupyterLab’s core metadata on its own. &lt;code&gt;@jupyter/builder&lt;/code&gt; declares a dependency on a specific &lt;code&gt;@jupyterlab/core-meta&lt;/code&gt; version, so by default your extension is checked for compatibility against whatever JupyterLab version that pin corresponds to. In general, the latest &lt;code&gt;@jupyter/builder&lt;/code&gt; will track the latest JupyterLab.&lt;/p&gt;
&lt;p&gt;If you want to build against a different JupyterLab version, pass &lt;code&gt;--core-version&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-builder&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;--core-version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.4.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We’ll download that version’s metadata from &lt;code&gt;@jupyterlab/core-meta&lt;/code&gt; on npm and check compatibility against it.&lt;/p&gt;
&lt;h2 id="migrating-an-existing-extension"&gt;Migrating an existing extension&lt;/h2&gt;
&lt;p&gt;If you’re starting a new extension with the &lt;a href="https://github.com/jupyterlab/extension-template"&gt;extension template&lt;/a&gt;, you’ll get all of this set up automatically. For existing extensions, there are two changes to make.&lt;/p&gt;
&lt;h2 id="1-update-the-python-build-dependencies"&gt;1. Update the Python build dependencies&lt;/h2&gt;
&lt;p&gt;In your &lt;code&gt;pyproject.toml&lt;/code&gt;, swap &lt;code&gt;jupyterlab&lt;/code&gt; for &lt;code&gt;jupyter-builder&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before&lt;/span&gt;
&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;hatchling&amp;gt;=1.5.0&amp;quot;, &amp;quot;jupyterlab&amp;gt;=4.0.0,&amp;lt;5&amp;quot;, &amp;quot;hatch-nodejs-version&amp;gt;=0.3.2&amp;quot;]&lt;/span&gt;
&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;&lt;span class="c1"&gt;# After&lt;/span&gt;
&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;hatchling&amp;gt;=1.5.0&amp;quot;, &amp;quot;jupyter-builder&amp;gt;=1.0.0&amp;quot;, &amp;quot;hatch-nodejs-version&amp;gt;=0.3.2&amp;quot;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then update the &lt;code&gt;scripts&lt;/code&gt; section of your &lt;code&gt;package.json&lt;/code&gt; to use the new CLI:&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;quot;build:labextension&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;jupyter-builder build .&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;build:labextension:dev&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;jupyter-builder build --development True .&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;watch:labextension&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;jupyter-builder watch .&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your build no longer pulls in all of JupyterLab.&lt;/p&gt;
&lt;h2 id="2-update-the-npm-builder-dependency"&gt;2. Update the npm builder dependency&lt;/h2&gt;
&lt;p&gt;Replace &lt;a href="https://www.npmjs.com/package/@jupyterlab/builder"&gt;&lt;code&gt;@jupyterlab/builder&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;@jupyter/builder&lt;/code&gt; in your &lt;code&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;quot;@jupyter/builder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^1.0.0&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;jupyter-builder&lt;/code&gt; is backwards-compatible with &lt;a href="https://www.npmjs.com/package/@jupyterlab/builder"&gt;&lt;code&gt;@jupyterlab/builder&lt;/code&gt;&lt;/a&gt;, so things will keep working if you don’t migrate immediately. That said, we strongly recommend switching: &lt;a href="https://www.npmjs.com/package/@jupyterlab/builder"&gt;&lt;code&gt;@jupyterlab/builder&lt;/code&gt;&lt;/a&gt; is no longer being actively developed, and all new work is happening in &lt;a href="https://www.npmjs.com/package/@jupyter/builder"&gt;&lt;code&gt;@jupyter/builder&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that as part of this transition JupyterLab has also moved from Webpack to &lt;a href="https://rspack.rs/"&gt;Rspack&lt;/a&gt;. Most extensions won’t need any changes, but if yours uses a custom &lt;code&gt;webpackConfig&lt;/code&gt; see the &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#building-extensions-with-rspack"&gt;Rspack migration notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next&lt;/h2&gt;
&lt;p&gt;This release is the first stable foundation. We’re continuing to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migrate more packages across the &lt;a href="https://github.com/jupyterlab/"&gt;Jupyter organization&lt;/a&gt; to use &lt;code&gt;jupyter-builder&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make the builder more configurable, so it can eventually be used for projects beyond JupyterLab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you maintain an extension, please try the migration and &lt;a href="https://github.com/jupyterlab/jupyter-builder/issues"&gt;let us know how it goes&lt;/a&gt;. Feedback from real extensions is the best way to make sure the migration path stays smooth.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work was funded under the &lt;a href="/posts/2025/announcing-our-first-jupyter-community-funded-proposals/"&gt;first round of Jupyter Community Funded Proposals&lt;/a&gt;. We want to thank the &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; and everyone involved in setting up this funding mechanism.&lt;/p&gt;
&lt;p&gt;A huge thank you to &lt;a href="https://github.com/bollwyvl"&gt;Nicholas Bollweg&lt;/a&gt; for many thoughtful discussions on the design and packaging of &lt;code&gt;jupyter-builder&lt;/code&gt;, and to &lt;a href="https://github.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; for helping us resolve issues and for guiding the adoption of &lt;code&gt;jupyter-builder&lt;/code&gt; in Jupyter Notebook.&lt;/p&gt;
&lt;p&gt;This package was initially created during &lt;a href="https://summerofcode.withgoogle.com/archive/2024/projects/YMB3Rc53"&gt;GSoC 2024&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/ronan-coutinho/"&gt;Ronan Coutinho&lt;/a&gt;, mentored by &lt;a href="https://www.linkedin.com/in/fcollonval/"&gt;Frédéric Collonval&lt;/a&gt;. Their work laid the foundation that made this release possible.&lt;/p&gt;
&lt;h2 id="about-the-developers"&gt;About the developers&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/darshan-poudel8/"&gt;&lt;strong&gt;Darshan Paudyal&lt;/strong&gt;&lt;/a&gt; is an intern at &lt;a href="https://openteams.com/"&gt;OpenTeams&lt;/a&gt; and a member of the &lt;a href="https://jupyterlab-team-compass.readthedocs.io/en/latest/team.html"&gt;Jupyter Frontend Council&lt;/a&gt;. Darshan led the work to bring &lt;code&gt;jupyter-builder&lt;/code&gt; to a stable release, completing the separation from JupyterLab core and shepherding the package through to its first published version.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/michal-krassowski/"&gt;&lt;strong&gt;Michał Krassowski&lt;/strong&gt;&lt;/a&gt; is a Senior Software Engineer at &lt;a href="https://openteams.com/"&gt;OpenTeams&lt;/a&gt;. Mike provided guidance and technical direction throughout the development of &lt;code&gt;jupyter-builder&lt;/code&gt;, helping shape its architecture and roadmap.&lt;/p&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;📦 PyPI: &lt;a href="https://pypi.org/project/jupyter-builder/"&gt;&lt;code&gt;jupyter-builder&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/@jupyter/builder"&gt;&lt;code&gt;@jupyter/builder&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💻 Source: &lt;a href="https://github.com/jupyterlab/jupyter-builder"&gt;github.com/jupyterlab/jupyter-builder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📖 Migration guide: &lt;a href="https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#migrating-to-jupyter-builder"&gt;&lt;code&gt;jupyter-builder&lt;/code&gt; migration section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 Issues &amp;amp; feedback: &lt;a href="https://github.com/jupyterlab/jupyter-builder/issues"&gt;GitHub issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><category term="extensions"/><category term="JupyterLab"/></entry><entry><title>Jupyter User Survey</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupyter-user-survey/" rel="alternate"/><published>2026-06-18T15:04:00+00:00</published><updated>2026-06-18T15:04:00+00:00</updated><author><name>Jason Grout</name></author><id>tag:jasongrout.github.io,2026-06-18:/medium-archive/pelican/posts/2026/jupyter-user-survey/</id><summary type="html">&lt;p&gt;The Jupyter Foundation is excited to gather your feedback on the Jupyter user experience through a brief survey. If you had a magic wand…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; is excited to gather your feedback on the Jupyter user experience through a brief &lt;a href="https://linuxfoundation.surveymonkey.com/r/jupyter-user-survey"&gt;survey&lt;/a&gt;. If you had a magic wand, what would you change or add to Jupyter? Your insights are incredibly important as we continue to invest in making Jupyter better for everyone.&lt;/p&gt;
&lt;p&gt;The survey takes only about &lt;strong&gt;3 minutes&lt;/strong&gt; to complete, and we highly encourage you to participate. The survey will &lt;strong&gt;close on Sunday, June 28th&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://linuxfoundation.surveymonkey.com/r/jupyter-user-survey"&gt;&lt;strong&gt;TAKE THE SURVEY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you for your time, your input, and your continued support of the Jupyter ecosystem!&lt;/p&gt;
</content><category term="community"/><category term="Jupyter Foundation"/></entry><entry><title>Becoming the new JupyterHub and Jupyter Book community manager</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/becoming-the-new-jupyterhub-and-jupyter-book-community/" rel="alternate"/><published>2026-06-15T07:01:00+00:00</published><updated>2026-06-15T07:01:00+00:00</updated><author><name>Serena Bonaretti</name></author><id>tag:jasongrout.github.io,2026-06-15:/medium-archive/pelican/posts/2026/becoming-the-new-jupyterhub-and-jupyter-book-community/</id><summary type="html">&lt;p&gt;There are moments in life when things, simply, converge. You work and study, study and work, and then, simply, it happens. It starts one…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/becoming-the-new-jupyterhub-and-jupyter-book-community/images/001-1_FO2axICPqqSETF34ZMoaBw.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;There are moments in life when things, simply, converge. You work and study, study and work, and then, simply, it happens. It starts one day when somebody tells you “there is this new thing called Jupyter Notebook, you should give it a try!”. So you install it, play around with it. It works like a charm. It’s easy, fast, nearly playful. It’s beautiful–and if you grow up in Italy, beauty always matters. Then, you have the urge to tell others about it. You organize a workshop at a conference in musculoskeletal image analysis and introduce marvelous novel tools for computational research: “You know? Nowadays we can do open science easily because somebody has created Jupyter Notebook, Binder, new Python libraries!” And then, together with some friends, you write a proposal for a &lt;a href="/posts/2022/report-on-the-jupyter-community-workshop/"&gt;Jupyter Community Workshop&lt;/a&gt;, and–unbelievable!–you get it. Initially, you think you are just organizing a workshop. But somehow, the number of people interested becomes larger and larger, and you find yourself co-founding and coordinating what is now the Open and Reproducible Musculoskeletal Imaging Research (&lt;a href="https://www.ormir.org"&gt;ORMIR&lt;/a&gt;) Community. In ORMIR’s Python packages, the examples are in Jupyter Notebook, the documentation is in Jupyter Book. Sooner or later, we will have our JupyterHubs too; it’s just a matter of time. In parallel, life gives you some professional challenges. So you start teaching Python online, one-to-one. You look for material that fits your style, but you cannot find any. So you start teaching it your way, using Jupyter Notebook in JupyterLab and it works. Students find it easy, independent of their background. The teaching material seems to work, so you transcribe it into a book entitled &lt;a href="http://www.learnpythonwithjupyter.com"&gt;Learn Python with Jupyter&lt;/a&gt;, and you make it open. At the same time, you are obsessed with keeping up to date. You go to JupyterCon, meet the people, watch their YouTube videos, participate in online meetings. And then, there is a &lt;a href="/posts/2026/call-for-applications-community-manager-for-jupyterhub/"&gt;job posting&lt;/a&gt; for a community manager. And you are like: “Nah, they will never hire me”, so you set it aside. But then somebody out of the blue tells you to apply because “100% of lottery winners played!”. So you give it a chance, and here I am: my name is &lt;a href="https://sbonaretti.github.io/"&gt;Serena Bonaretti&lt;/a&gt; and I am the new JupyterHub and Jupyter Book community manager!&lt;/p&gt;
&lt;p&gt;In this new role, I am very much looking forward to working with the JupyterHub and Jupyter Book communities! I will collaborate with maintainers to understand and document projects’ priorities and define the best processes to achieve their vision. I will support contributors in finding their way into the projects and make the real-world impact that they hope to achieve. I will dialogue with users to make sure that the tools we create are useful for their work. And I will share our activities monthly and what we learn with anybody interested, so that we can all benefit from this journey!&lt;/p&gt;
&lt;p&gt;And you? How did you start using the tools of the Jupyter ecosystem? Do you work in JupyterHub? Have you ever written a Jupyter Book? Would you like to be a contributor? Are you an enthusiastic user? Write me on &lt;a href="https://discord.mystmd.org/"&gt;Discord&lt;/a&gt; (Jupyter Book/MyST) or &lt;a href="https://jupyter.zulipchat.com/#narrow/channel/469744-jupyterhub"&gt;Zulip&lt;/a&gt; (JupyterHub). The JupyterHub and Jupyter Book communities and I are looking forward to getting to know you!&lt;/p&gt;
</content><category term="community"/><category term="Jupyter Book"/><category term="JupyterHub"/></entry><entry><title>Catching Jupyter-specific bugs before CI does: announcing jupyter eslint plugin</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/catching-jupyter-specific-bugs-before-ci-does/" rel="alternate"/><published>2026-06-11T15:13:00+00:00</published><updated>2026-06-11T15:13:00+00:00</updated><author><name>Darshan Kr. Paudyal</name></author><id>tag:jasongrout.github.io,2026-06-11:/medium-archive/pelican/posts/2026/catching-jupyter-specific-bugs-before-ci-does/</id><summary type="html">&lt;p&gt;We’re excited to announce the release of the first version of the Jupyter ESLint plugin @jupyter/eslint-plugin, now available on npm. It’s…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/catching-jupyter-specific-bugs-before-ci-does/images/001-1_CXmGuOa5O6Z60l4KZSEo3g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We’re excited to announce the release of the first version of the Jupyter ESLint plugin &lt;a href="https://www.npmjs.com/package/@jupyter/eslint-plugin"&gt;&lt;code&gt;@jupyter/eslint-plugin&lt;/code&gt;&lt;/a&gt;, now available on npm. It’s a custom ESLint plugin designed specifically for the official Jupyter frontends (JupyterLab, Notebook, JupyterLite) and TypeScript extensions built around them.&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;If you’ve ever written a JupyterLab extension, you’ve probably hit something like this:&lt;/p&gt;
&lt;p&gt;You wire up a new plugin, push a PR, walk away to make coffee, and 30 minutes later CI fails on a test you didn’t expect to be related. You scroll through logs, eventually trace it back, and realize the problem was a single misaligned argument in your &lt;code&gt;activate&lt;/code&gt; function. TypeScript was happy. The editor showed no red squiggles. Nothing in your local toolchain said a word.&lt;/p&gt;
&lt;p&gt;And the slow CI feedback loop is only half the story. Some of these mistakes don’t fail CI at all, a hardcoded English &lt;code&gt;label&lt;/code&gt;, an &lt;code&gt;enum&lt;/code&gt; in a settings schema, a malformed token id. They pass tests, ship to users, and only surface at runtime. They’re the kind of bugs you hear about from users months later, if at all.&lt;/p&gt;
&lt;p&gt;JupyterLab, Jupyter Notebook, and the wider extension ecosystem follow a lot of project-specific patterns around plugins, commands, tokens, settings schemas, translations, and visual tests. These patterns aren’t enforced by TypeScript, because they live one level above the type system. They’re contracts about &lt;em&gt;how&lt;/em&gt; the framework expects code to be written, not about whether the code type-checks.&lt;/p&gt;
&lt;p&gt;A few examples of what generic linters and TypeScript can’t catch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;JupyterFrontEndPlugin&lt;/code&gt; that requires &lt;code&gt;[TokenA, TokenB]&lt;/code&gt; but whose &lt;code&gt;activate&lt;/code&gt; function takes those arguments in the wrong order. Both are tokens, both type-check but the plugin fails at activation.&lt;/li&gt;
&lt;li&gt;A command added with &lt;code&gt;commands.addCommand(...)&lt;/code&gt; whose &lt;code&gt;label&lt;/code&gt; is a hardcoded English string. The extension ships, gets translated by the community, and that one button silently stays in English.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are real, recurring issues. They cost contributor time, they frustrate first-time contributors, and they pile onto reviewer load. They’re exactly the kind of knowledge that lives in the heads of long-time maintainers and exactly the kind of knowledge that a linter is great at encoding. So we built one.&lt;/p&gt;
&lt;h2 id="what-v1-catches"&gt;What v1 catches&lt;/h2&gt;
&lt;p&gt;The plugin currently ships eight rules, grouped by what they protect:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plugin structure&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/plugin-activation-args/"&gt;&lt;code&gt;plugin-activation-args&lt;/code&gt;&lt;/a&gt; — Keeps &lt;code&gt;activate&lt;/code&gt; function arguments aligned with &lt;code&gt;requires&lt;/code&gt; and &lt;code&gt;optional&lt;/code&gt; tokens.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/plugin-description/"&gt;&lt;code&gt;plugin-description&lt;/code&gt;&lt;/a&gt; — Requires a non-empty &lt;code&gt;description&lt;/code&gt; on every &lt;code&gt;JupyterFrontEndPlugin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/token-format/"&gt;&lt;code&gt;token-format&lt;/code&gt;&lt;/a&gt; — Enforces the &lt;code&gt;&amp;lt;package&amp;gt;:&amp;lt;TokenSymbol&amp;gt;&lt;/code&gt; convention for &lt;code&gt;new Token(...)&lt;/code&gt; ids.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Commands and settings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/command-described-by/"&gt;&lt;code&gt;command-described-by&lt;/code&gt;&lt;/a&gt; — Requires a &lt;code&gt;describedBy&lt;/code&gt; schema on commands that accept &lt;code&gt;args&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/no-schema-enum/"&gt;&lt;code&gt;no-schema-enum&lt;/code&gt;&lt;/a&gt; — Disallows &lt;code&gt;enum&lt;/code&gt; in settings JSON schemas in favor of translatable &lt;code&gt;oneOf&lt;/code&gt; with &lt;code&gt;const&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/no-untranslated-string/"&gt;&lt;code&gt;no-untranslated-string&lt;/code&gt;&lt;/a&gt; — Flags hardcoded user-facing strings in command labels, dialogs, accessibility attributes, JSX, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/no-translation-concatenation/"&gt;&lt;code&gt;no-translation-concatenation&lt;/code&gt;&lt;/a&gt; — Forbids dynamic concatenation inside &lt;code&gt;trans.__()&lt;/code&gt; calls that translation extractors can’t pick up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eslint-plugin.readthedocs.io/en/latest/rules/require-soft-assertions-before-snapshots/"&gt;&lt;code&gt;require-soft-assertions-before-snapshots&lt;/code&gt;&lt;/a&gt; — Requires &lt;code&gt;expect.soft(...)&lt;/code&gt; for all but the last snapshot in a Playwright test, so a single failure doesn’t block the rest from updating.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each rule has incorrect/correct examples, options, and rationale in the &lt;a href="https://eslint-plugin.readthedocs.io/en/latest/category/rules/"&gt;rules reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="getting-started-in-60-seconds"&gt;Getting started in 60 seconds&lt;/h2&gt;
&lt;p&gt;Install the plugin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--save-dev&lt;span class="w"&gt; &lt;/span&gt;@jupyter/eslint-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add it to your ESLint fconfig and turn on the recommended ruleset:&lt;/p&gt;
&lt;p&gt;javascript&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jupyterPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@jupyter/eslint-plugin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&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;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jupyterPlugin&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;jupyterPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That’s it. Run &lt;code&gt;jlpm eslint&lt;/code&gt; and you’ll start seeing Jupyter-specific issues alongside your existing lint output. If you’re still on legacy &lt;code&gt;.eslintrc&lt;/code&gt; configs, there’s a &lt;a href="https://eslint-plugin.readthedocs.io/en/latest/user-guide/#for-legacy-eslintrc-configs"&gt;&lt;code&gt;recommended-legacy&lt;/code&gt;&lt;/a&gt; config too. However, we strongly recommend upgrading to &lt;a href="https://eslint.org/docs/latest/use/migrate-to-9.0.0"&gt;ESLint v9&lt;/a&gt; and using the new &lt;a href="https://eslint.org/blog/2022/08/new-config-system-part-2/"&gt;flat config&lt;/a&gt; format.&lt;/p&gt;
&lt;p&gt;Full setup details, including type-aware configuration for &lt;code&gt;plugin-activation-args&lt;/code&gt; and the JSON parser setup for &lt;code&gt;no-schema-enum&lt;/code&gt;, are in the &lt;a href="https://eslint-plugin.readthedocs.io/en/latest/user-guide/"&gt;user guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you maintain an extension, &lt;strong&gt;the most useful thing you can do today is install it and run it once on your codebase.&lt;/strong&gt; Even if you don’t adopt it permanently, the first run is often informative most extensions surface a handful of issues they didn’t know they had.&lt;/p&gt;
&lt;h2 id="help-us-encode-more-knowledge"&gt;Help us encode more knowledge&lt;/h2&gt;
&lt;p&gt;Eight rules is a starting point. The plugin is most valuable when it captures the recurring mistakes that maintainers across the ecosystem keep running into and a lot of that knowledge isn’t written down anywhere.&lt;/p&gt;
&lt;p&gt;If you’ve ever been bitten by a Jupyter-specific issue that &lt;em&gt;could&lt;/em&gt; have been a lint rule, something where you found yourself thinking “I wish my editor had warned me about this” please &lt;a href="https://github.com/jupyterlab/eslint-plugin/issues"&gt;open an issue on the repository&lt;/a&gt;. Even a short description of the bug and a minimal example helps. We’d much rather encode that knowledge into an automated check once than have every new contributor learn it the hard way.&lt;/p&gt;
&lt;h2 id="acknowledgement"&gt;Acknowledgement&lt;/h2&gt;
&lt;p&gt;This work was funded under the &lt;a href="/posts/2025/announcing-our-first-jupyter-community-funded-proposals/"&gt;first round of Jupyter Community Funded Proposals&lt;/a&gt;. We want to thank the &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; and everyone involved in setting up this funding mechanism.&lt;/p&gt;
&lt;p&gt;We’re also grateful to &lt;a href="https://github.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; and &lt;a href="https://github.com/brichet"&gt;Nicolas Brichet&lt;/a&gt; for their help in adopting the plugin.&lt;/p&gt;
&lt;h2 id="about-the-developers"&gt;About the developers&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/darshan-poudel8/"&gt;&lt;strong&gt;Darshan Paudyal&lt;/strong&gt;&lt;/a&gt; is an intern at &lt;a href="https://openteams.com/"&gt;OpenTeams&lt;/a&gt; and a member of the &lt;a href="https://jupyterlab-team-compass.readthedocs.io/en/latest/team.html"&gt;Jupyter Frontend Council&lt;/a&gt;. Darshan led the development of v1 of &lt;code&gt;@jupyter/eslint-plugin&lt;/code&gt;, designing and implementing the rule set, the documentation, and the release.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/michal-krassowski/"&gt;&lt;strong&gt;Michał Krassowski&lt;/strong&gt;&lt;/a&gt; is a Senior Software Engineer at &lt;a href="https://openteams.com/"&gt;OpenTeams&lt;/a&gt;. Mike provided guidance and direction for the development of the plugin.&lt;/p&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/@jupyter/eslint-plugin"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://eslint-plugin.readthedocs.io/en/latest/"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/jupyterlab/eslint-plugin"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://github.com/jupyterlab/eslint-plugin/issues"&gt;Open an issue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><category term="JavaScript"/></entry></feed>