Status: In Progress · Proposal
August 2026¶
Summary of Work Completed¶
New rules were added to the ESLint plugin and enabled downstream; existing rules were improved:
new
jupyter/no-dynamic-translationrule to improve translation coverage jupyterlab/eslint -plugin #91 new rules aimed at preventing memory leaks:
ensuring signal cleanup
require-signal-cleanup,require-signal-this-argandprefer-signal-this-argjupyterlab/eslint -plugin #78 ensuring cleanup of disposables
require-disposable-ownershipandrequire-disposable-transferjupyterlab/eslint -plugin #77, jupyterlab /eslint -plugin #89, jupyterlab /eslint -plugin #93
jupyter/galata-prefer-filebrowser-helpersuggesting to use the filebrowser utilities for Playwright UI tests over custom code jupyterlab/eslint -plugin #73, jupyterlab /eslint -plugin #97
In addition to the galata-prefer-filebrowser-helper rule we are in various stages of developing additional rules that encourage use of methods with known reliability when developing new UI tests for Jupyter frontends:
galata-prefer-notebook-cell-helperjupyterlab/eslint -plugin #105 galata-prefer-sidebar-activity-helperjupyterlab/eslint -plugin #101 galata-prefer-menu-helperjupyterlab/eslint -plugin #85
We are working on improving two rules:
adding autofix to
jupyter/no-schema-enumand detection of missingtypeinformation in the correct formulation jupyterlab/eslint -plugin #106 expanding the
jupyter/no-untranslated-stringrule to catch more gaps in translation jupyterlab/eslint -plugin #102
The ESLint plugin was updated to the latest version in the JupyterLab extension-template (jupyterlab
Finally, we assisted community members adding a new jupyter/incorrect-translator-usage rule (jupyterlabjupyter/prefer-lazy-imports rule (jupyterlab
We track most of the issues and pull requests associated with this proposal in this public GitHub project.
Deliverables/Milestones¶
Goal: develop and maintain custom ESLint rules tailored to the JupyterLab/Notebook codebase.
Done
Impact Metric: Adoption of the additional rules by the community
Done
Impact: Reduction in time to CI failure on violation of best practices
Done
Impact: reduction in late-stage CI failures
Done
Challenges or Risks¶
None
Budget Update¶
As of 25th August 2026 we used 15,120.50 USD out of 17,496 USD budget.
Part of the budget was used to support the visual testing improvements, with the end-goal of preventing future regressions in the test suite reliability by codifying all the best practices developed throughout the work on the proposal focused on the visual regression tests.
Next Steps¶
We intend to complete the work on the pull requests that are currently open. We do not plan any major addition going forward given that we are close to exhausting the budget.
June 2026¶
Summary of Work Completed¶
New rules were added to the ESLint plugin and enabled downstream; existing rules were improved:
new
jupyter/no-pageconfig-base-urljupyterlab/eslint -plugin #68 new
jupyter/no-schema-enumrule jupyterlab/eslint -plugin #55, jupyterlab /eslint -plugin #60, jupyterlab /eslint -plugin #58 new
jupyter/require-soft-assertions-before-snapshotsrule jupyterlab/eslint -plugin #53 improved
jupyter/plugin-activation-argsrule jupyterlab/eslint -plugin #64, jupyterlab /eslint -plugin #54, jupyterlab /eslint -plugin #56 improved
jupyter/no-untranslated-stringjupyterlab/eslint -plugin #49
We performed necessary maintenance and improved the documentation
fixing release workflow jupyterlab
/eslint -plugin #46 add CONTRIBUTING.md jupyterlab
/eslint -plugin #67
The existing linter rules in JupyterLab were tightened and new ones were added:
spell checking for documentation jupyterlab
/jupyterlab #18398 regular expression linting jupyterlab
/jupyterlab #18908 rule to forbid serial mode in regression testing jupyterlab
/jupyterlab #18838 GitHub Actions security linter jupyterlab
/jupyterlab #18898 adopted shell script and documentation linter jupyterlab
/jupyterlab #18858 forbid explicit
anyjupyterlab/jupyterlab #18847 and progressively remove it from the codebase jupyterlab
/jupyterlab #18869 enforce that certain CSS rules use variables jupyterlab
/jupyterlab #18614
The blog post describing the ESLint plugin was published: https://
The ESLint plugin was included in the latest version of JupyterLab extension-template (jupyterlab
We started adopting the eslint plugin in official Jupyter extensions:
We track most of the issues and pull requests associated with this proposal in this public GitHub project.
Deliverables/Milestones¶
Goal: develop and maintain custom ESLint rules tailored to the JupyterLab/Notebook codebase.
Done
Impact Metric: Adoption of the additional rules by the community
following projects adopted this rule organically:
jupyter-chat (jupyterlab
/jupyter -chat #410) ipyparallel (ipython
/ipyparallel #1009)
community extensions started pulling the package via
extension-templateupdates:
Impact: Reduction in time to CI failure on violation of best practices
Done - the lint job completes and reports back within 6 minutes, the frequency of review comments discussing the best practice significantly decreases as most frequent issues are now caught by pre-commit, or fixed by linter integration of coding agents authoring the patches
Impact: reduction in late-stage CI failures
Done
Challenges or Risks¶
None
Budget Update¶
As of 23rd June 2026 we used 8,591 USD out of 17,496 USD budget.
20% of the budget was used to support the visual testing improvements, with the end-goal of preventing future regressions in the test suite reliability by codifying all the best practices developed throughout the work on the proposal focused on the visual regression tests.
Next Steps¶
Tightening of select rules in extension-template and Notebook repositories based on lessons from the adoption of stricter rules in JupyterLab, accounting for distinct needs of these two repositories
Adding linting rules for galata visual testing to prevent flaky tests from being committed in the first place
Further improve the ESLint plugin, based on any community feedback received
Beyond these, we intend to spend the remainder of the budget on ensuring no flaky tests are present, enabling easy validation of the efficacy of the linting rules preventing flakiness of UI tests.
April 2026¶
Summary of Work Completed¶
The ESLint plugin was transition to the JupyterLab organization (https://
github .com /jupyterlab /eslint -plugin) and published on npm as jupyter/eslint-plugin The plugin was adopted by JupyterLab (jupyterlab
/jupyterlab #18615), Notebook (jupyter /notebook #7856) and JupyterLite (jupyterlite /jupyterlite #1917) The documentation was published (https://
eslint -plugin .readthedocs .io /en /latest/) Existing rules were improved, and new rules were added, including:
new
jupyter/no-translation-concatenationrule jupyterlab/eslint -plugin #44 new
jupyter/no-untranslated-stringrule jupyterlab/eslint -plugin #41 new
jupyter/token-formatrule jupyterlab/eslint -plugin #40 improved
jupyter/plugin-descriptionrule jupyterlab/eslint -plugin #37 improvements to
@jupyter/plugin-activation-argsrule jupyterlab/eslint -plugin #31, jupyterlab /eslint -plugin #36
Downstream tests are now on CI to ensure no regressions are introduced and allowing early evaluation of new rules/rule changes
We track some of the issues and pull requests associated with this proposal in this public GitHub project.
Deliverables/Milestones¶
Goal: develop and maintain custom ESLint rules tailored to the JupyterLab/Notebook codebase.
Done
Impact Metric: Adoption of the additional rules by the community
jupyter-chat (jupyterlab
/jupyter -chat #410) adopted this rule organically
Impact: improvement in the code quality
Adoption of the plugin highlighted multiple previously unknown issues with translation, documentation, and dependency injection that were since fixed
Challenges or Risks¶
None
Budget Update¶
As of 26th April 2026 we used 3,102 USD out of 17,496 USD budget.
Next Steps¶
Further expansion of new bespoke rules based on the discussions tracked in JupyterLab repository issues
Tightening of existing rules in JupyterLab, extension-template and Notebook repositories
February 2026¶
Summary of Work Completed¶
ESLint plugin with custom rules was created https://
github .com /Darshan808 /eslint -plugin -jupyter ESLint upgrade to v9 is in progress jupyterlab
/jupyterlab #18434
We track some of the issues and pull requests associated with this proposal in this public GitHub project.
Deliverables/Milestones¶
Goal: develop and maintain custom ESLint rules tailored to the JupyterLab/Notebook codebase.
The plugin now exists, is pending transfer to JupyterLab-governed repository
Impact Metric: Adoption of the additional rules by the community
Multiple community members expressed interest in adopting the ESLint plugin during the Feb 25th, 2026 Jupyter Community Call
Challenges or Risks¶
Security vulnerabilities in ESLint v8 forced an early migration to v9. As a consequence the early work aimed at making the plugin compatible with both versions was shelved in favour of prioritising migration of JupyterLab codebase to the newer version.
Budget Update¶
As of 20th Feb 2026 we used 330 USD out of 17,496 USD budget.
Next Steps¶
Transition the ESLint plugin to the JupyterLab organization
Expansion of new bespoke rules based on the discussions tracked in JupyterLab repository issues
Tightening of existing rules in JupyterLab, extension-template and Notebook repositories