<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Frédéric Collonval</title><link href="https://jupyter.org/blog/" rel="alternate"/><link href="https://jupyter.org/blog/feeds/author-frederic-collonval.atom.xml" rel="self"/><id>https://jupyter.org/blog/</id><updated>2023-06-19T08:11:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>A theme editor for JupyterLab</title><link href="https://jupyter.org/blog/posts/2023/a-theme-editor-for-jupyterlab/" rel="alternate"/><published>2023-06-19T08:11:00+00:00</published><updated>2023-06-19T08:11:00+00:00</updated><author><name>Florence Haudin</name></author><id>tag:jupyter.org,2023-06-19:/blog/posts/2023/a-theme-editor-for-jupyterlab/</id><summary type="html">&lt;p&gt;JupyterLab is a comprehensive web user interface for scientific and technical computing providing tools such as notebooks, text editors, consoles, and terminals. Like many similar tools, it allows users to choose from light or dark color themes.&lt;/p&gt;</summary><content type="html">&lt;p&gt;JupyterLab is a comprehensive web user interface for scientific and technical computing providing tools such as &lt;a href="https://jupyterlab.readthedocs.io/en/stable/user/notebook.html#notebook"&gt;notebooks&lt;/a&gt;, text editors, consoles, and terminals. Like many similar tools, it allows users to choose from light or dark color themes. However, users may want to further adjust the looks of the interface, just for fun or for specific personal preferences or needs.&lt;/p&gt;
&lt;p&gt;The ability to fine-tune contrast, color palettes, and fonts can be very useful for accessibility, an essential requirement for software to be usable by the whole community. There is an ongoing &lt;a href="https://jupyter-accessibility.readthedocs.io/"&gt;project-wide effort&lt;/a&gt; to improve accessibility in Jupyter. Choices of color palettes impact color-blind users while font choices can have a significant impact on people affected by dyslexia, or who suffer from migraines.&lt;/p&gt;
&lt;p&gt;This diversity of requirements and preferences shows that end users should have the means to adjust parameters and tweak existing themes. Subtle differences can improve comfort significantly.&lt;/p&gt;
&lt;h2 id="jupyterlab-themes"&gt;JupyterLab themes&lt;/h2&gt;
&lt;p&gt;Theming in JupyterLab is enabled by the fact that most of the layout and colors of the UI are defined by a set of CSS variables. There is no need for a complete stylesheet: one can set values for the base parameters from which the appearance of the user interface is derived. This system ensures a consistent look and feel throughout the application.&lt;/p&gt;
&lt;p&gt;Custom themes provide a set of values for the base CSS variables and package the resulting CSS file in JupyterLab extensions. &lt;a href="https://github.com/search?q=jupyter+lab+theme"&gt;A search on GitHub&lt;/a&gt; returns 29 repositories defining such custom themes for JupyterLab.&lt;/p&gt;
&lt;p&gt;Creating a theme requires implementing values for &lt;em&gt;dozens&lt;/em&gt; of base CSS variables. This is often achieved by theme authors tweaking the values given in the default dark or light themes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generating a consistent palette, testing, and packaging the outcome in the form of a JupyterLab extension requires development skills and is neither direct nor trivial.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="a-new-tool-for-authoring-jupyterlab-themes"&gt;A new tool for authoring JupyterLab themes&lt;/h2&gt;
&lt;p&gt;To lower the bar for customizing JupyterLab we created a new tool providing a simple interface for tuning the JupyterLab appearance interactively, allowing theme authors to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;use the selected colors in their application and “pin down” the result in the configuration,&lt;/li&gt;
&lt;li&gt;export the outcome in a form amenable to packaging into a new JupyterLab theme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The theme editor extension is a theme prototyping tool, a sandbox to test changes in colors, font family and font size, and a configuration tool for end users. It displays a reduced set of parameters one can play with, allowing users to select:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;colors through color pickers,&lt;/li&gt;
&lt;li&gt;numerical values from sliders (for font size, border radius and width),&lt;/li&gt;
&lt;li&gt;font families from a predefined dropdown list.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A screenshot of JupyterLab with the theme editor panel is displayed in Figure 1, with a notebook opened in light theme. Figure 2 shows different screenshots with different custom themes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of JupyterLab interface with the theme editor on the left panel and a notebook opened. The theme chosen is the light default one." src="https://jupyter.org/blog/posts/2023/a-theme-editor-for-jupyterlab/images/001-0_vj7tjopuS2GvZg3N.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Figure 1: The theme editor extension in JupyterLab.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="4 screenshots of the JupyterLab interface are shown to illustrate the kinds of themes that can be generated by the theme editor, with gray, blue, orange and pink tones and different font families." src="https://jupyter.org/blog/posts/2023/a-theme-editor-for-jupyterlab/images/002-0_5OLBiA8tmTbD1Nan.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Figure 2: Examples of dynamically editing the color and fonts scheme of JupyterLab with the theme editor.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="color-palettes"&gt;Color palettes&lt;/h2&gt;
&lt;p&gt;For all the colors (accent, brand, border, error, info, layout, success, warn), the same logic is applied. The user picks a base color and a palette is automatically calculated using Microsoft’s &lt;a href="https://www.fast.design/docs/api/fast-colors.colorpalette"&gt;fast-colors&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;Let’s take the specific example of the layout colors impacting the background of most elements of the interface. They are defined using &lt;code&gt;--jp-layout-color[i]&lt;/code&gt; CSS variables from white to light grays (for the light theme).&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;--jp-layout-color0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;white&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--jp-layout-color1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;white&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--jp-layout-color2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--md-grey-200&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;--jp-layout-color3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--md-grey-400&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;--jp-layout-color4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--md-grey-600&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The number of colors in the palette fits the number of colors in the CSS set of variables (here the palette contains 5 colors). There are different ways to define colors (hexadecimal, RGBA, HSLA). The latter format has the advantage of giving direct access to luminance &lt;em&gt;L&lt;/em&gt;, a measure of the lightness of a given color.&lt;/p&gt;
&lt;p&gt;An inverse layout palette is computed for use with most text elements. The luminance of the inverse layout color &lt;em&gt;L’&lt;/em&gt; is calculated as &lt;em&gt;1-L&lt;/em&gt; plus a correction depending on how &lt;em&gt;1-L&lt;/em&gt; is close to 0.5. There isn’t a general CSS rule in JupyterLab concerning elements on top of a background but some PRs were proposed to reinforce the coupling between inverse layout elements and layout backgrounds with the same color index. The contrast still needs to be improved though, by using other palettes or better corrections when defining the inverse layout colors.&lt;/p&gt;
&lt;p&gt;The full process just described from picking a layout color to resulting palettes and the corresponding interface is illustrated in Figure 3.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The figure is divided into 3 parts. Part 1 is a screenshot with color picker with a green color selected. Part 2 is a capture showing the resulting palette calculated from this color choice. Finally, part 3 is a screenshot of JupyterLab interface with the different green tones calculated from the base color that has been picked." src="https://jupyter.org/blog/posts/2023/a-theme-editor-for-jupyterlab/images/003-0_vD9AcycD3qSCAJgu.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Figure 3: From a color to the layout, and inverse layout palettes with the resulting interface.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="font-size-and-font-family"&gt;Font size and font family&lt;/h2&gt;
&lt;p&gt;As mentioned previously, font size and font family can be tuned too. Let’s take the example of the &lt;code&gt;--jp-ui-font-size[i]&lt;/code&gt; CSS variables defining the text size of most of the text elements in the interface:&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;--jp-ui-font-scale-factor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--jp-ui-font-size0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8333em&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--jp-ui-font-size1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;13px&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;/* Base font size */&lt;/span&gt;
&lt;span class="nt"&gt;--jp-ui-font-size2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;2em&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--jp-ui-font-size3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;44em&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A slider lets the user control the base font size associated with &lt;code&gt;--jp-ui-font-size1&lt;/code&gt;. The other font sizes are then calculated by applying a scale factor to the base font.&lt;/p&gt;
&lt;p&gt;Concerning font families, a non-exhaustive list is proposed (i.e., default browser fonts or Google fonts). It includes both standard accessible fonts (Arial, Courier, Helvetica, Sans Serif, system-ui, Times New Roman, Verdana) and less usual ones to create artistic or special interfaces with cursive fonts ( for instance Dancing Script or Single Day). Only 2 fonts are proposed for code: Space Mono and monospace.&lt;/p&gt;
&lt;h2 id="storing-the-new-theme"&gt;Storing the new theme&lt;/h2&gt;
&lt;p&gt;Once satisfied with a new theme, users can export it using a button at the top of the theme editor panel. This creates a &lt;em&gt;variable.css&lt;/em&gt; file that can be packaged in a theme extension (see the &lt;a href="https://github.com/jupyterlab/extension-cookiecutter-ts/"&gt;extension template&lt;/a&gt;). The new parameters are also synchronously saved in the settings editor and can be restored for the next JupyterLab opening if the boolean &lt;em&gt;useSettings&lt;/em&gt; is set to true. If not, the interface will look like in Figure 1: with light theme default CSS values. Resetting &lt;em&gt;useSettings&lt;/em&gt; to true will restore the formerly tuned parameters.&lt;/p&gt;
&lt;h2 id="future-development"&gt;Future development&lt;/h2&gt;
&lt;p&gt;The look and feel of the theme editor UI still needs to be improved. We will work on unifying the styling of all interfaces making use of &lt;a href="https://github.com/rjsf-team/react-jsonschema-form"&gt;react-jsonschema-form&lt;/a&gt;. It is already used for the JupyterLab settings editor, the notebook metadata editor of JupyterLab 4.0, and several extensions.&lt;/p&gt;
&lt;p&gt;Moreover, the current implementation is bound to fast-colors palettes and we may want to use a different approach, like decoupling the layout and inverse layout palettes to reach better contrasts or give more freedom in the color choices.&lt;/p&gt;
&lt;p&gt;Any help (e.g., filling issues for bugs or enhancement requests, opening pull requests) to improve &lt;a href="https://github.com/jupyterlab-contrib/jupyterlab-theme-editor"&gt;the extension&lt;/a&gt; is welcome.&lt;/p&gt;
&lt;h2 id="try-it-out"&gt;Try it out&lt;/h2&gt;
&lt;p&gt;You can install the &lt;a href="https://pypi.org/project/jupyter-theme-editor"&gt;PyPI package&lt;/a&gt; by running:&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_theme_editor
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also try the theme editor on &lt;a href="https://mybinder.org/v2/gh/jupyterlab-contrib/jupyterlab-theme-editor/main?urlpath=lab"&gt;Binder&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="aknowledgement"&gt;Aknowledgement&lt;/h2&gt;
&lt;p&gt;Many thanks to &lt;a href="https://twitter.com/ihuicatls"&gt;Isabel Paredes&lt;/a&gt; for drawing the palette icon!&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;Florence Haudin is a scientific software developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;. She contributes to JupyterLab and to ipyleaflet.&lt;/p&gt;
&lt;p&gt;Frédéric Collonval supervised this work as a technical director at QuantStack. He is a member of the JupyterLab core team and authored several JupyterLab extensions.&lt;/p&gt;
</content><category term="accessibility"/><category term="extensions"/><category term="JupyterLab"/></entry><entry><title>Jupyter Notebook format workshop outcomes</title><link href="https://jupyter.org/blog/posts/2023/jupyter-notebook-format-workshop-outcomes/" rel="alternate"/><published>2023-04-12T17:40:00+00:00</published><updated>2023-04-12T17:40:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jupyter.org,2023-04-12:/blog/posts/2023/jupyter-notebook-format-workshop-outcomes/</id><summary type="html">&lt;p&gt;The Jupyter Community Workshop on the notebook file format took place at the Safran Campus near Paris from February 28th to March 2nd. It was a great opportunity to gather various Jupyter stakeholders from private and public affiliations to bootstrap new features for the Notebook file format.&lt;/p&gt;</summary><content type="html">&lt;figure&gt;
&lt;img alt="Workshop Social Event challenging our senses" src="https://jupyter.org/blog/posts/2023/jupyter-notebook-format-workshop-outcomes/images/001-1_OfVNHv8zp7Tn2I0hRIkN4Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Workshop Social Event challenging our senses&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Jupyter Community Workshop on the notebook file format took place at the Safran Campus near Paris from February 28th to March 2nd. It was a great opportunity to gather various Jupyter stakeholders from private and public affiliations to bootstrap new features for the &lt;a href="https://nbformat.readthedocs.io/en/latest"&gt;Notebook file format&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/blog/posts/2022/jupyter-community-workshops/"&gt;Jupyter Community Workshops&lt;/a&gt; are a series of events designed to bring together small groups of Jupyter community members and core contributors for high-impact strategic work and community engagement on focused topics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="community-discussions"&gt;Community discussions&lt;/h2&gt;
&lt;p&gt;The community has lots of &lt;a href="https://docs.google.com/document/d/1CZZ_EpMIeh3zDlqYEvUH4WLvjKrKGmDU6Afcz1NvMkg"&gt;ideas to improve the Notebook format&lt;/a&gt;. So we split in three smaller groups with the aim of drafting Jupyter Enhancement Proposal (JEP): the markdown group, the text-format group and the cell types group.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;markdown&lt;/strong&gt; group focused on backward compatible enhancement for the Markdown cells. The discussions focused on two subjects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The specification of the Markdown flavor (&lt;a href="https://github.com/jupyter/enhancement-proposals/issues/98"&gt;pre-proposal&lt;/a&gt;): the goals are to specify which Markdown flavor (e.g. GitHub, CommonMark, MyST,…) is used for the cell source, how to store rendered output for easier cross-compatibility and what is the default Markdown flavor.&lt;/li&gt;
&lt;li&gt;The persistence of user expression (&lt;a href="https://github.com/jupyter/enhancement-proposals/issues/94"&gt;pre-proposal&lt;/a&gt;): in order to display inline expressions within Markdown cells, the results obtained from the kernel should be stored in the notebook. This proposal aims to define the schema modification to store such information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;text-format&lt;/strong&gt; group lays out a specification for an official Jupyter notebook textual format. The discussion went on after the meeting to prepare that &lt;a href="https://github.com/jupyter/enhancement-proposals/issues/102"&gt;proposal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally the &lt;strong&gt;cell-types&lt;/strong&gt; group took the hypothesis of starting from the blank page to create the best Jupyter notebook format building on top of 10-years of experience. The discussion will take time to settle down on a new specification. So if you are interested, join the weekly discussion (see &lt;a href="https://hackmd.io/hHW8k7mKS5qFBhxnFtVTCw"&gt;the meeting notes&lt;/a&gt; for all the details). In addition to the fully new specification, two backward compatible enhancements have been proposed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding &lt;em&gt;$schema&lt;/em&gt; to the notebook format and deprecate the nbformat version keys (see &lt;a href="https://github.com/jupyter/enhancement-proposals/pull/97"&gt;proposal&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Adding &lt;em&gt;extraSchema&lt;/em&gt; to the notebook format to optionally extend the schema to specify in particular metadata (see &lt;a href="https://github.com/jupyter/enhancement-proposals/issues/96"&gt;pre-proposal&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="follow-up"&gt;Follow-up&lt;/h2&gt;
&lt;p&gt;Six JEP’s are foreseen from the workshop discussions. But as mentioned earlier, the community has lots of great other ideas (like SQL cells, low-/no-code cells for inputs or visualization). So we would like to encourage anyone interested by any Jupyter enhancement to open issue on the &lt;a href="https://github.com/jupyter/enhancement-proposals"&gt;Jupyter Enhancement Proposals&lt;/a&gt; repository (see the &lt;a href="https://jupyter.org/enhancement-proposals/jupyter-enhancement-proposal-guidelines/jupyter-enhancement-proposal-guidelines.html"&gt;guidelines&lt;/a&gt; for more information).&lt;/p&gt;
&lt;p&gt;With the new &lt;a href="https://jupyter.org/blog/posts/2023/announcing-a-new-jupyter-governance-model-and-our-first/"&gt;Jupyter governance&lt;/a&gt; in place, the new Software Steering Council is responsible for ensuring those proposals get reviewed and go through the approval process.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;I deeply want to thank all participants to the workshop that took the time (some of them despite time zone difference) to bring very constructive and thoughtful discussion.&lt;/p&gt;
&lt;p&gt;We are really grateful to Bloomberg and Amazon Web Services for their donations to the Jupyter Community Workshops program. This event would not have been possible without their generous support.&lt;/p&gt;
&lt;p&gt;We are also grateful to Safran Group for hosting this workshop and the NumFOCUS foundation for helping and mentoring this workshop organization.&lt;/p&gt;
</content><category term="community"/><category term="events"/><category term="Jupyter Notebook"/><category term="workshops"/></entry><entry><title>Improving the accessibility of Jupyter</title><link href="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/" rel="alternate"/><published>2023-02-24T11:11:00+00:00</published><updated>2023-02-24T11:11:00+00:00</updated><author><name>Nicolas Brichet</name></author><id>tag:jupyter.org,2023-02-24:/blog/posts/2023/improving-the-accessibility-of-jupyter/</id><summary type="html">&lt;p&gt;Towards a more accessible Jupyter notebook&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The adoption of Jupyter has grown significantly in the past few years — especially in education contexts. The project has become a foundational component of our digital experience, from the first lines of code written by high-school students to the most advanced research and engineering use cases.&lt;/p&gt;
&lt;p&gt;In this context of global adoption, it is even more important to ensure that as many people as possible can use the project. It is estimated that 15% of the population has a disability that may impair their ability to use online services. If we don’t want them to be excluded from learning sciences, technology, and engineering, we must improve the tools to make them usable by everyone…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;To address this issue, a Jupyter accessibility working group formed and has now become an &lt;a href="https://jupyter.org/governance/list_of_subprojects.html"&gt;official Jupyter Subproject&lt;/a&gt; and received &lt;a href="https://github.com/jupyter/accessibility/blob/main/docs/funding/czi-grant-roadmap.md"&gt;a grant from the Chan Zuckerberg Initiative&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Creating accessible user interfaces is a challenging task as it requires accommodating a broad range of disabilities, including vision, motor, and cognitive impairments. This article presents some of the recent accessibility improvements in the Jupyter Notebook codebase.&lt;/p&gt;
&lt;h2 id="codemirror-6-and-notebook-7"&gt;CodeMirror 6 and Notebook 7&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/79"&gt;Jupyter Notebook 7&lt;/a&gt;, which is the next major release of the Jupyter Notebook frontend, has been rebuilt with modern JupyterLab components and extensions while maintaining the classic Jupyter Notebook user experience. Notebook 7 will be released shortly after JupyterLab 4 and will take advantage of JupyterLab improvements.&lt;/p&gt;
&lt;p&gt;Improving the accessibility of Jupyter had long been impeded by significant obstacles. The primary obstacle was that the text editor underlying the Jupyter Notebook (CodeMirror 5) had major accessibility issues.&lt;/p&gt;
&lt;p&gt;Fortunately, this accessibility bottleneck has been unblocked as JupyterLab has been upgraded to use &lt;a href="https://codemirror.net/6/"&gt;CodeMirror 6&lt;/a&gt;, a complete rewrite of the text editor with a strong focus on accessibility. Although this upgrade required extensive codebase modifications, the changes landed a few months ago and will be available with JupyterLab 4. Jupyter Notebook 7 will benefit from the CodeMirror 6 upgrade.&lt;/p&gt;
&lt;h2 id="initial-accessibility-audits"&gt;Initial accessibility audits&lt;/h2&gt;
&lt;p&gt;Shortly after the &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/10370"&gt;CodeMirror 6 migration&lt;/a&gt; landed, we made an automated audit of the accessibility of Notebook 7 with these changes, and found that the number of warnings and errors reported by Axe Auditor went down from several hundreds to a few dozen, most of which seemed fixable. Encouraged by these results, we decided to work on bringing that count to zero!&lt;/p&gt;
&lt;p&gt;With a series of fixes ranging from simple changes to the DOM structure of components to fixing up base Lumino components (&lt;a href="https://github.com/jupyterlab/lumino"&gt;Lumino&lt;/a&gt; is a JavaScript framework that underlies a lot of the JupyterLab frontend architecture), we were able to make the Notebook 7 codebase pass the Axe Auditor tests with zero error or warning. While we have not reached that yet in JupyterLab, both JupyterLab and Jupyter Notebook benefit from these improvements made for Notebook 7 since they are built from the same components.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the output of the Axe accessibility audit tool on the classic Jupyter notebook user interface with a test notebook, showing a total of 242 errors, including 20 “critical” errors, 88 “serious” errors, and 134 errors of “moderate” severity." src="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/images/001-0_-v-lL8LJ8DIqlgXb.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Axe Auditor output with the “classic” Notebook UI (v6) with a &lt;a href="https://nbviewer.org/github/waltherg/notebooks/blob/master/2013-12-03-Crank_Nicolson.ipynb"&gt;test notebook&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the output of the Axe accessibility audit tool on the new Jupyter notebook user interface with a same test notebook, showing zero detected errors." src="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/images/002-0_7imwXY7uST5QSNfi.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Axe Auditor output with the “next” Notebook UI (v7 alpha 13) with the same &lt;a href="https://nbviewer.org/github/waltherg/notebooks/blob/master/2013-12-03-Crank_Nicolson.ipynb"&gt;test notebook&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Similar results were achieved with the file explorer and text editor tabs of the application.&lt;/p&gt;
&lt;h2 id="beyond-accessibility-audits"&gt;Beyond accessibility audits&lt;/h2&gt;
&lt;p&gt;Improving the accessibility of Jupyter requires more than just addressing issues flagged by automated audit tools and the &lt;a href="https://github.com/jupyter/accessibility"&gt;Jupyter Accessibility Subproject&lt;/a&gt; is working on improving accessibility across the board in Project Jupyter. These results with the Notebook 7 codebase are very encouraging, but working with end-users and getting their feedback will also be necessary to make the user interface truly accessible.&lt;/p&gt;
&lt;p&gt;To address the diversity of accessibility requirements, we will approach specific use cases separately (for example, users with screen readers, or users who can operate a keyboard but not a pointing device). While the resulting changes may improve usability for everyone, we need to learn from users who have specific needs to make meaningful improvements.&lt;/p&gt;
&lt;p&gt;Finally, many of the accessibility challenges in Jupyter stem from the &lt;em&gt;content&lt;/em&gt; of the notebooks, as notebook authors may not follow the best practices to make their content usable by everyone (such as adding alt text to images and figures, or properly using headings to communicate the organization of a notebook). To promote these best practices, Jupyter could provide linting tools that produce inline warnings and hints for notebooks that do not follow these guidelines.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The work by Johan Mabille at &lt;a href="https://twitter.com/QuantStack"&gt;&lt;strong&gt;QuantStack&lt;/strong&gt;&lt;/a&gt; on migrating JupyterLab to use CodeMirror 6 was funded by &lt;a href="https://www.twosigma.com/"&gt;&lt;strong&gt;Two Sigma&lt;/strong&gt;&lt;/a&gt;. This upgrade also enabled significant performance improvements in the rendering of Jupyter notebooks, as detailed in this &lt;a href="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/"&gt;earlier post&lt;/a&gt; by Frédéric Collonval.&lt;/p&gt;
&lt;p&gt;We are grateful to members of the Jupyter Accessibility Subproject who produced a thorough review of the Notebook 7 UI with a focus on keyboard navigation. This is an example of an issue that cannot be easily detected by auditing tools.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the Authors&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/NicolasBrichet_"&gt;&lt;strong&gt;Nicolas Brichet&lt;/strong&gt;&lt;/a&gt; is a scientific software developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; active in the Jupyter ecosystem. Among other things, Nicolas made significant contributions to the JupyterLab and Voilà projects, and worked on porting the &lt;a href="https://github.com/jupyter/nbgrader/"&gt;nbgrader&lt;/a&gt; package to JupyterLab. Nicolas worked on accessibility improvements in the JupyterLab and Lumino packages.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/JohanMabille"&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt;&lt;/a&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;. He was honored with the Distinguished Contributors award in 2020 for his contributions to the Jupyter project. Among other things, he is one of the main authors of the JupyterLab visual debugger, and the creator of Xeus, a C++ implementation of the Jupyter kernel protocol at the basis of many Jupyter kernels. Johan was responsible for the migration of JupyterLab to CodeMirror 6.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;&lt;strong&gt;Jeremy Tuloup&lt;/strong&gt;&lt;/a&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He is a core maintainer of JupyterLab and Voilà, and the creator of the JupyterLite project. Jeremy is the main initiator of the Notebook 7 project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frédéric Collonval&lt;/strong&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He is a core maintainer of the JupyterLab project. Frédéric contributed to the CodeMirror 6 migration and helped numerous new contributors to get their enhancements accepted.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;&lt;strong&gt;Sylvain Corlay&lt;/strong&gt;&lt;/a&gt; is the founder and CEO of &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He has worked on many areas of the Jupyter project, from interactive widgets to language kernels and other core components.&lt;/p&gt;
</content><category term="accessibility"/></entry><entry><title>Jupyter Community Workshop: The notebook file format</title><link href="https://jupyter.org/blog/posts/2022/jupyter-community-workshop-the-notebook-file-format/" rel="alternate"/><published>2022-12-08T16:09:00+00:00</published><updated>2022-12-08T16:09:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jupyter.org,2022-12-08:/blog/posts/2022/jupyter-community-workshop-the-notebook-file-format/</id><summary type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the Notebook file format.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the &lt;a href="https://nbformat.readthedocs.io/en/latest"&gt;Notebook file format&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/blog/posts/2022/jupyter-community-workshops/"&gt;Jupyter Community Workshops&lt;/a&gt; are a series of events designed to bring together small groups of Jupyter community members and core contributors for high-impact strategic work and community engagement on focused topics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Jupyter notebook file format has been around for 10 years. Its usage has grown in countless fields from teaching to data analysis in production pipelines. A great number of software applications and online services have added support for it.&lt;/p&gt;
&lt;p&gt;We want this workshop to be an opportunity for various stakeholders to push forward the format while preserving its reusability in as many applications as possible. We could for example prototype a syntax for injecting variable values in Markdown cells, specify an alternative more textual format like RMarkdown, define the Markdown variant we support,… the boundary is our imagination. By the end of the workshop, we will submit those new specifications as &lt;a href="https://jupyter.org/enhancement-proposals/README.html"&gt;Jupyter Enhancement Proposals&lt;/a&gt; to kick start the validation process for enhancing the official notebook format.&lt;/p&gt;
&lt;p&gt;The workshop will last three days, with hands-on discussions, hacking sessions, and technical presentations. The goal of this event is to foster collaboration and the sharing of knowledge between maintainers of various platforms supporting the file format, downstream library authors and power users.&lt;/p&gt;
&lt;p&gt;The workshop will be held at the Safran Campus in &lt;a href="https://www.safran-group.com/locations/france/safran-campus-2117707"&gt;Paris suburb, France&lt;/a&gt; from February 28th to March 2nd, 2023. Travel funding assistance is available for attendees from academia and those from groups which are not well-represented within the Jupyter and wider tech community!&lt;/p&gt;
&lt;p&gt;Application and all other details can be found in this &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfBQlor-UNtpGvyafefE9xEtBwd47q5ev5ju8wTYpP1Z9YRCA/viewform?usp=pp_url&amp;amp;entry.828738498=Tuesday,+February+28th&amp;amp;entry.828738498=Wednesday,+March+1st&amp;amp;entry.828738498=Thursday,+March+2nd&amp;amp;entry.541109147=No&amp;amp;entry.148929239=No"&gt;form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are grateful to Safran Group for sponsoring this event. We are also grateful to the sponsors of the Jupyter Community Workshop series, Bloomberg and Amazon Web Services.&lt;/em&gt;&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Notebook"/><category term="workshops"/></entry><entry><title>Accelerating JupyterLab</title><link href="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/" rel="alternate"/><published>2022-10-10T17:38:00+00:00</published><updated>2022-10-10T17:38:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jupyter.org,2022-10-10:/blog/posts/2022/accelerating-jupyterlab/</id><summary type="html">&lt;p&gt;How JupyterLab is switching to second gear for Version 4&lt;/p&gt;
</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/001-1_EZX55-XLmck_LfFfV3KeaA.webp" alt="Illustration of an astronaut flying in space with a jet pack." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The next major release of JupyterLab will be significantly faster than previous versions. This was achieved both through systematic tracking of performance bugs and through significant upgrades to the Jupyter communication protocol and rendering mechanism for documents.&lt;/p&gt;
&lt;h2 id="1-setting-up-rigorous-performance-measurements"&gt;1. Setting up rigorous performance measurements&lt;/h2&gt;
&lt;p&gt;The first step to any measurable improvement in performance is to set up systematic measurement of performance.&lt;/p&gt;
&lt;p&gt;The JupyterLab project now includes a UI performance benchmarking tool, in the form of a GitHub action that can be triggered on any pull request to check how performance is impacted by the change. The implementation of this new GitHub action is available in this repository: &lt;a href="https://github.com/jupyterlab/benchmarks"&gt;https://github.com/jupyterlab/benchmarks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This tool measures the time required for performing the following actions: opening a test notebook, switching from the test notebook to a copy of it opened in another tab, switching from the test notebook to a text editor, switching back, searching for a word in the test notebook and closing the test notebook. There are multiple example notebooks in the test suites. Benchmark results are posted as comments on the pull request. You can see such a benchmark report here: &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11494#issuecomment-976393815"&gt;#11494#issuecomment-976393815&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Example report from the new benchmarking tool" src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/002-0_pEgLswpTd_LWmMsi.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Example report from the new benchmarking tool — each execution time distribution is represented by a box-plot graph (the box spans from the 1st to the 3rd quartiles with the white line positioned at the median value).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The addition of this benchmarking tool immediately allowed for optimization on how notebooks are &lt;em&gt;hidden&lt;/em&gt; when switching tabs. Hiding can be done by adding a CSS class that enables some CSS rule, or forcibly setting display to “none”. Depending on the browser, picking one way or another of hiding content may trigger a reflow of the entire page, so we made this a settable with an option in the JupyterLab config.&lt;/p&gt;
&lt;p&gt;The benchmark GitHub action was developed by &lt;strong&gt;Frédéric Collonval&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="2-upgrading-to-codemirror-6"&gt;2. Upgrading to CodeMirror 6&lt;/h2&gt;
&lt;p&gt;The rendering of the text editor used in notebooks can be very expensive, especially in the case of large notebooks with many cells. Jupyter has historically relied on CodeMirror as its based text editor.&lt;/p&gt;
&lt;p&gt;JupyterLab 4 includes an upgrade from CodeMirror 5 to CodeMirror 6, which is a complete rewrite of the text editor. This work can be found in pull requests &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11638"&gt;#11638&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12877"&gt;#12877&lt;/a&gt;, and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12861"&gt;#12861&lt;/a&gt; — modifying over 150 files of the JupyterLab codebase. Benchmarks indicate a rendering speedup factor between 2 and 3 on the large notebooks used in the benchmarking suite.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Benchmark report on the CodeMirror 6 migration PR" src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/003-0_68j3WUTV1hUtR4wC.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Benchmark report on the CodeMirror 6 migration PR&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: CodeMirror 6 is also an important stepping stone towards making Jupyter notebooks &lt;em&gt;&lt;strong&gt;accessible&lt;/strong&gt;&lt;/em&gt; to people who need screen readers and other devices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The migration of JupyterLab to CodeMirror 6 was performed by &lt;strong&gt;Johan Mabille&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="3-virtual-rendering-of-notebooks"&gt;3. Virtual rendering of notebooks&lt;/h2&gt;
&lt;p&gt;In JupyterLab 4, the notebook will only render the parts of the documents that are visible in the viewport. It significantly improves the rendering speed of large notebooks. The main pull request implementing this feature is available here: &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12554"&gt;#12554&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Significant preparation work was required for this Pull Request, especially regarding the “search feature” and the “table of content” components that both made use of the notebook view instead of the document model. This was done in PRs &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11689"&gt;#11689&lt;/a&gt; and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12374"&gt;#12374&lt;/a&gt; respectively.&lt;/p&gt;
&lt;p&gt;The end results showed significant improvement in the rendering speed of large notebook files, with a speedup of 3 to 4, which come on top of the already improved performance from the CodeMirror 6 migration.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Benchmark report on the Virtual Rendering of notebooks" src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/004-0_y7zl2IRtKoeyYp5e.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Benchmark report on the Virtual Rendering of notebooks&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The virtual rendering of notebooks was developed by &lt;strong&gt;Frédéric Collonval&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="4-jupyter-protocol-alignment"&gt;4. Jupyter protocol alignment&lt;/h2&gt;
&lt;p&gt;The Jupyter server serves as a relay between the frontends such as JupyterLab or the notebook and kernels. The &lt;strong&gt;server ⇄ kernel&lt;/strong&gt; communication is done over ZeroMQ sockets, with the well-specified Jupyter kernel protocol. The &lt;strong&gt;server ⇄ client&lt;/strong&gt; communication is done over WebSockets.&lt;/p&gt;
&lt;p&gt;Unfortunately, up until recently, the &lt;strong&gt;server ⇄ kernel&lt;/strong&gt; (ZMQ), and the &lt;strong&gt;server ⇄ client&lt;/strong&gt; (WebSocket) protocols differed slightly so that the server had to parse each message and re-serialise it in both directions. This processing cost is small for short messages such as execution requests and replies which are typically very short, however, it can become very costly when dealing with larger datasets being sent or retrieved from the front-end, such as large tables, complex mime type rendering. This misalignment of the ZMQ and WebSocket protocol can then become a real bottleneck.&lt;/p&gt;
&lt;p&gt;In Jupyter Server 2, the WebSocket connection supports a new “aligned” protocol, in which messages can simply be copied over to and from ZeroMQ messages, which is supported by JupyterLab 4. (This work was done in PRs &lt;a href="https://github.com/jupyter-server/jupyter_server/pull/657"&gt;#657&lt;/a&gt; (jupyter-server), &lt;a href="https://github.com/jupyter-server/jupyverse/pull/154"&gt;#154&lt;/a&gt; (jupyverse), and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11841"&gt;#11841&lt;/a&gt; (JupyterLab)). This new aligned protocol is an opt-in, so that legacy Jupyter front-end are still expected to function with Jupyter Server 2.&lt;/p&gt;
&lt;p&gt;Benchmarks indicate a &lt;strong&gt;large speedup factor&lt;/strong&gt; (at least one order of magnitude, and more for larger messages) in the performance of the Jupyter server when displaying large data sets in Jupyter widgets. However, this is not captured by the JupyterLab benchmark tests which focus on the rendering performances.&lt;/p&gt;
&lt;p&gt;The procol alignment work was done by &lt;strong&gt;David Brochart&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="5-lumino-2"&gt;5. Lumino 2&lt;/h2&gt;
&lt;p&gt;The JupyterLab frontend is built upon the Lumino framework, which provides utilities for building in-browser desktop-like applications. It provides the foundations for such applications, including a uniform component wrapper that handles lifecycle management and efficient propagation of front-end events to an entire application, (e.g., resize events, drag-and-drop, layout calculation). Lumino also provides several high-performance components such as a drag-and-drop dock panel (used as the application shell for JupyterLab) and a best-in-class data grid component.&lt;/p&gt;
&lt;p&gt;JupyterLab 4 includes a major upgrade of the Lumino. The main changes in Lumino 2 include the migration to ES2018, which allowed for the removal of large parts of the codebase prodiving features that are now natively available in JavaScript, such as native iterators, removing polyfills for promises, and special-case logic for idiosyncrasies of legacy browsers like IE. This upgrade is also leading to across-the-board performance improvements in the front-end, although not for the rendering of large documents. Lumino 2 supports background processing of UI components when the application resides in a background browser tab (a feature that may be back-ported to Lumino 1.x as well).&lt;/p&gt;
&lt;p&gt;The Lumino 2 upgrade and integration in JupyterLab was done by &lt;strong&gt;Afshin Darian.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="6-a-faster-lumino-data-grid"&gt;6. A faster Lumino data grid&lt;/h2&gt;
&lt;p&gt;Optimizations to the Lumino data grid widget were also implemented, speeding up the rendering in the case of merged cells (cf. PR &lt;a href="https://github.com/jupyterlab/lumino/pull/394"&gt;#394&lt;/a&gt;). The Lumino datagrid is used in various parts of the JupyterLab UI, such as the table view for CSV files. It is also used extensively in third-party extensions such as the &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt; Jupyter widget and the &lt;a href="https://github.com/twosigma/beakerx_tabledisplay"&gt;BeakerX table display&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Lumino data grid optimization was done by &lt;strong&gt;Martin Renou&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="acknowledgement"&gt;Acknowledgement&lt;/h2&gt;
&lt;p&gt;The work by the &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; team on JupyterLab performance improvements was done in collaboration with &lt;a href="https://www.twosigma.com/"&gt;&lt;strong&gt;Two Sigma&lt;/strong&gt;&lt;/a&gt;. Several of these pull requests required major changes across the JupyterLab codebase. We are very grateful to Two Sigma for supporting the development of the Jupyter project at such a deep level.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/005-0_P3blJAk0ZNg4obBV.webp" alt="Two-sigma logo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://twitter.com/juliettetaka?lang=en"&gt;&lt;strong&gt;Juliette Taka&lt;/strong&gt;&lt;/a&gt; for the illustrations.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Frédéric Collonval&lt;/strong&gt;, who led the charge on JupyterLab performance improvements, is a technical director at QuantStack. He is a member of the core JupyterLab core team and authored several JupyterLab extensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt; is a technical director at QuantStack, very active in the Jupyter ecosystem. He regularly contributes to JupyterLab, and developed the Xeus framework for creating Jupyter kernels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;David Brochart&lt;/strong&gt; is a scientific software developer at QuantStack, very active in the Jupyter ecosystem. He is a maintainer of the Jupyter-server project, and the main author of Jupyverse. David also contributes to the geo-science open-source stack built atop Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Afshin Darian&lt;/strong&gt; is a technical director at QuantStack. He is the co-creator of the JupyterLab project and continues working on the project to this day.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/images/006-1_OwFstCVzAGZX3EiQejEWog.webp" alt="Illustration of an astronaut planting a Jupyter flag at the top of a mountain." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLab"/></entry></feed>