NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2179 most downloaded on PyPI
Jupyter notebooks as Markdown documents, Julia, Python or R scripts
Last release today
04 Oct 2026
Ships fairly regularly
a new release about every 6 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
150 releases · first in 2018
Nothing published for this version
The Quarto conversions now run in a private temporary directory, so that the output file that quarto convert names after its input can no longer be pr
Security
quarto convert names after its input can no longer be pre-created as a symlink by another user of the machine. Thanks to Naveed for the PR (#1615).formats metadata are now prevented from escaping the working tree, including when an absolute notebook path is used. Thanks to Naveed for addressing the issue (#1588).trusted cell metadata when the notebook signature is invalid, so a trusted=true option in a--sync. Thanks to Naveed for the fix (#1617).cell_markers and endofcell values in the light format are now matched literally, preventing regular-expressionFixed
%% comments inside a markdown cell are no longer mistaken for py:percent cell markers (#1533). Thanks to Sanjay Santhanam for his PR (#1609)jupyter-builder import (#1632). Thanks again to Michał Krassowski for this fix.notebooks/tutorials///ipynb.Changed
Added
One column per quarter.
Harden the github action (#1569). Thanks to Peyton Murray for this PR
Changed
jupyter-builder - Thanks to Mahendra Paipuri for this PR (#1590)zizmor and pre-commit are now required to pass before any other CI job runs, and the extension lint is now part of pre-commit (#1594)Fixed
languageInfo.extensions array, which could still make Jupytext show notebook icons for Python files when the kernel metadata was incomplete - Thanks to Michał Krassowski for this PR (#1584)Security
Jupytext's documentation is now at https://jupytext.org!
Changed
pandoc<3.10 on the CI as pandoc converts the "3.10" string to a float, which then causes issues in Jupytext (#1545)jupyterfs tests are skipped when their initialization fails (#1539)build pixi environment.Fixed
Added
Security
update-playwright-snapshots workflow was
triggerable by any user via an issue_comment event. It now checks that the
comment author is an OWNER, MEMBER, or COLLABORATOR before running
(#1535)persist-credentials: false on all workflow checkout steps as
defense-in-depth, preventing a live GITHUB_TOKEN from being left in
.git/config where attacker-controlled build hooks could read it. This is
strictly required only for update-playwright-snapshots (fixed above), but
applies to all workflows so they remain safe if their scope is later extended.Removed deprecated stylelint packages (stylelint-config-prettier and stylelint-prettier) from the JupyterLab extension dependencies
Fixed
Changed
stylelint-config-prettier and stylelint-prettier) from the JupyterLab extension dependencies (#1530)Trusted notebooks remain trusted after jupytext --sync
Fixed
jupytext --sync (#1505)package.json. Thanks to Michał Krassowski for making this PR (#1494)--quiet flag now suppresses the creating missing directory warning when writing to a path that includes a prefix (#1533)Changed
jupyterfs on Python 3.12+ as they started failing on the CI with no obvious way to fix them (#1509)Jupytext does not change the file icons anymore! Thanks to Michał Krassowski for finally solving this long standing issue!
Changed
marimo<=0.19.4 in tests following a change in the location of the marimo import (#1485)The environment used to develop Jupytext is now maintained using Pixi
Changes
Fixed
.qmd documents in Jupyter (#1435)Cell is missing an id field or Additional properties are not allowed ('id' was unexpected) when converting to some formats, including Pandoc (#1464)Added
py:marimo format, which uses the marimo command line interface to convert notebooks to and from the Marimo format (#1431)Changes The environment used to develop Jupytext is now maintained using Pixi
Changes The environment used to develop Jupytext is now maintained using Pixi (#1459)
Fixed
Cell is missing an id field or Additional properties are not allowed ('id' was unexpected) when converting to some formats, including Pandoc (#1464)Added
We have added a new py:marimo format, which uses the marimo command line interface to convert notebooks to and from the Marimo format (#1431)
Fixed test test_check_source_is_newer_when_using_jupytext_sync to work reliably on systems with low filesystem timestamp resolution
Fixed
test_check_source_is_newer_when_using_jupytext_sync to work reliably on systems with low filesystem timestamp resolution (#1460)Changed
pixi to maintain the local Python environments used for developing and testing Jupytext.The documentation has a chapter on the Jupytext Sync extension for VS Code
Added
--check-source-is-newer to the Jupytext CLI. Use this option if you want to make sure that the file passed as argument to Jupytext is the newest of all paired files, and/or newer than the destination file.formats configuration option now supports a list of format dictionaries for first-match pairing. Use [[formats]] sections in your TOML configuration to define multiple format specifications, where the first matching format is used. This allows applying different pairing rules to notebooks in different locations, such as generating documentation markdown files only for tutorial notebooks (#1383)Fixed
notebook when jupyter_server is available (#1436)jupyterlab-slideshow (#1441). Thanks to Nicolas Thierry for this fix.find_jupytext_configuration_file now works with relative directories (#1440). This fix was contributed by Thierry Parmentelat.Changed
ruff format, and updated for Python 3.9+ using https://github.com/asottile/pyupgrade (#1423)The documentation has a chapter on the Jupytext Sync extension for VS Code
Added
--check-source-is-newer to the Jupytext CLI. Use this option if you want to make sure that the file passed as argument to Jupytext is the newest of all paired files, and/or newer than the destination file.formats configuration option now supports a list of format dictionaries for first-match pairing. Use [[formats]] sections in your TOML configuration to define multiple format specifications, where the first matching format is used. This allows applying different pairing rules to notebooks in different locations, such as generating documentation markdown files only for tutorial notebooks (#1383)Fixed
notebook when jupyter_server is available (#1436)jupyterlab-slideshow (#1441). Thanks to Nicolas Thierry for this fix.find_jupytext_configuration_file now works with relative directories (#1440). This fix was contributed by Thierry Parmentelat.Changed
ruff format, and updated for Python 3.9+ using https://github.com/asottile/pyupgrade (#1423)All the extensions supported by Jupytext now appear in the --to paragraph of jupytext --help
Added
--to paragraph of jupytext --help (#433)get_formats_from_notebook_path that returns the list of paired
formats for a given notebook (#1419)Fixed
jupytext --sync, and the contents manager, to make sure that a simple .py file (not in the percent format) will not be treated as a paired file when the Jupytext configuration file has formats="ipynb,py:percent" (#1418)jupyter-fs now installs its fs extra dependency (#1398)jupytext --sync command now works correctly with symbolic links. Thanks to mccullerlp for reporting (#1407) and addressing (#1408) the problem!quarto.cmd on Windows. Thanks to mccullerlp for documenting the issue (#1406, #1409).jupytext --paired-paths command: it will now take the Jupytext configuration file, if any, into account (#1419)The --set-formats argument takes precedence over pre-existing pairing information in the notebook
Fixed
--set-formats argument takes precedence over pre-existing pairing information in the notebook (#1386)Changed
Added
.cpp files - thanks to Steven Gardiner for this contribution (#1384)Renaming files other than notebooks will not load their content
Fixed
The MyST frontmatter found in MyST Markdown notebooks can be mapped to a YAML header at the top of the Jupyter notebook. This way MyST notebooks in ei
Added
md:myst or ipynb format can be used with MyST. Thanks to Ian Carroll for proposing and implementing this change (#1314)Changed
jupytext --to py notebook.ipynb you now get a py:percent script (use --to py:light for the light format) #1201rst2md conversion now works with sphinx-gallery>=0.8. Thanks to Thomas J. Fan for fixing this! (#1334)Fixed
--quiet option now works with the --pipe mode of Jupytext CLI (#1305)Jupytext's default contents manager is now derived from the asynchronous AsyncLargeFileManager. Thanks to Darshan Poudel for making this finally happe
Changed
md:myst or ipynb format can be used with MyST. Thanks to Ian Carroll for proposing and implementing this change (#1314)jupytext --to py notebook.ipynb you now get a py:percent script (use --to py:light for the light format) #1201rst2md conversion now works with sphinx-gallery>=0.8. Thanks to Thomas J. Fan for fixing this! (#1334)Added
Fixed
--quiet option now works with the --pipe mode of Jupytext CLI (#1305)Jupytext's default contents manager is now derived from the asynchronous AsyncLargeFileManager. Thanks to Darshan Poudel for making this finally happe
Changed
md:myst or ipynb format can be used with MyST. Thanks to Ian Carroll for proposing and implementing this change (#1314)jupytext --to py notebook.ipynb you now get a py:percent script (use --to py:light for the light format) #1201rst2md conversion now works with sphinx-gallery>=0.8. Thanks to Thomas J. Fan for fixing this! (#1334)Added
Fixed
--quiet option now works with the --pipe mode of Jupytext CLI (#1305)Logtalk notebooks are now supported (#1308) - thanks to Paulo Moura for this contribution
Added
Fixed
Added
Fixed We have updated the dependencies of the JupyterLab extension to address security issues.
We fixed a "File Changed" warning when saving notebooks
Fixed
Changed
We have fixed a notebook corruption issue when using Jupytext with Jupyter-Collaboration (#1124, jupyter-collaboration 214).
Fixed
require_hash argument on the Jupytext contents manager. The hash of a paired file is the concatenation of the hash of the text file and the hash for the .ipynb file (#1165)rst2md tests have been fixed by requiring sphinx<8 (#1266)Added
We use asyncio.iscoroutinefunction to determine whether the current contents manager is sync or async
Fixed
asyncio.iscoroutinefunction to determine whether the current contents manager is sync or async (#1260)A Python 3.13 deprecation warning was fixed #1241 - thanks to Jerry James
Fixed
inspect to determine whether the current contents manager derives from AsyncContentsManager (which is not
supported by Jupytext at the moment). This fixes a compatibility issue with jupyter-fs==1.0.0 (#1239). Thanks to Mahendra Paipuri for this PR!build_jupytext_contents_manager_class can't be imported (#1162)build_jupytext_contents_manager_class can't be imported (#1162)Added
Changed
Added support for Xonsh notebooks (#1213) - thanks to Jeffrey Odongo for this contribution
Added
Changed
HATCH_BUILD_HOOKS_ENABLE=true to include it). This simplifies the installation of Jupytext in pre-commit hooks (#1210)--pipe or --check commands are now created in the notebook directory (#1206)tomllib in Python 3.11, or tomli in Python 3.10 or older, to match JupyterLab's dependencies (#1195)jupytext --sync will not update the timestamp of text notebooks if their content is unchanged (#1215)Fixed
pandoc>=3.0. Please note that switching to pandoc>=3.0 will add cell ids to your pandoc:md notebooks (#1006)The CI has been updated. Thanks to Christian Le for taking care of this! (#1190, #1204)
Changed
Fixed
The Jupytext Menu is back! And text notebooks can be created directly from the launcher. This is an outstanding contribution by Mahendra Paipuri (#115
Added
Changed
pyproject.toml and built with hatch. The layout has been reorganised to follow src-layout (#1140). This is another outstanding contribution by Mahendra Paipuri.sdist. They have been reorganized into unit/functional/integration/external (#1167, #1173).Fixed
The Jupytext Menu is back! And text notebooks can be created directly from the launcher. This is an outstanding contribution by Mahendra Paipuri (#115
Added
Changed
pyproject.toml and built with hatch. The layout has been reorganised to follow src-layout (#1140). This is another outstanding contribution by Mahendra Paipuri.sdist. They have been reorganized into unit/functional/integration/external (#1167, #1173).Fixed
The Jupyter Lab extension is now compatible with the JupyterLab RISE extension. Many thanks to Frédéric Collonval for his PR (#1126)!
Added
Added
We have added a new command line interface jupytext-config that you can use to set Jupytext as the default viewer for text notebooks in Jupyter Lab an
Added
jupytext-config that you can use to set Jupytext as the default viewer for text notebooks in Jupyter Lab and Jupyter Notebook 7. Thanks to Thierry Parmentelat for this contribution! (#1094)This version comes with a version of the JupyterLab extension that is compatible with JupyterLab 4.x. Many thanks to Thierry Parmentelat for his PRs!
Changed
pyproject.toml files will be ignored by Jupytext in Jupyter (#1103)This version comes with a version of the JupyterLab extension that is compatible with JupyterLab 4.x. Many thanks to Thierry Parmentelat for his PRs!
Changed
Changed
This version comes with a version of the JupyterLab extension that is compatible with JupyterLab 4.x. Many thanks to Thierry Parmentelat for this PR!
Changed
We have updated the GitHub workflows - thanks to Matthew Feickert and to Cristian Le for their help on this subject
Changed
markdown-it-py<3. Now we test Jupytext with markdown-it-py in versions 2.x and 3.x on the CI (#1075)Fixed
pkg_resources or packaging to parse version numbers (#1085)This version comes with a build requirement jupyterlab>=3,<4, as the Jupyterlab extension for Jupytext is not compatible with JupyterLab 4 yet
Changed
jupyterlab>=3,<4, as the Jupyterlab extension for Jupytext is not compatible with JupyterLab 4 yet (#1054)npm in version 1.3.9.We updated the yarn.lock file for the jupyter lab extension to address security vulnerabilities (#1030, #1036)
Added
Fixed
concurrency to cancel previous runs on the same branch/PR (#1037)codecov.notify.after_n_builds and comment.after_n_builds to get only the final codecov commentChanged
Added Wolfram Language as a supported language (#1014) - thanks to Etienne Dechamps for this contribution
Added
When the default contents manager is _async_ (i.e. jupyter_server>=2.0.0), the Jupyter server extension for Jupytext derives a contents manager from L
Fixed
jupyter_server>=2.0.0), the Jupyter server extension for Jupytext derives a contents manager from LargeFileManager instead, as async contents managers are not supported by Jupytext at the moment (#1020)ubuntu-latestWe updated the yarn.lock file for the jupyter lab extension to address security vulnerabilities (#984, #1005, #1011)
Fixed
nbformat.validator.normalize (#1002).pytest.ini fileyarn.lock file for the jupyter lab extension to address security vulnerabilities (#984, #1005, #1011)Changed
Added
The timestamp of a paired notebook is the timestamp of the most recent paired file. This fixes the warning "File Changed" after reloading the notebook
Fixed
The Jupytext configuration file has a new option cm_config_log_level that defaults to info_if_changed. With that value, the contents manager will log
Changed
cm_config_log_level that defaults to info_if_changed.
With that value, the contents manager will log a line regarding the configuration file used only when the
config file is not the same as the one previously used (#959) -
many thanks to R.C. Thomas for suggesting this and thoughtfully testing the patch..jupytext.toml or .jupytext.py are now ignored by Jupytext's contents manager
when allow_hidden=False (that option was introduced in jupyter_server==2.0.0a1) (#964).jupytext --set-formats to make it more similar to jupytext --sync. Now --set-formats will not
override existing paired files anymore (#969).Added
test_pre_commit_hook_sync_with_no_config that documents how to use the pre-commit hook without
a configuration file (#967)Text-only notebooks are always trusted (as they don't include any output cells)
Fixed
tests folder has been restored at 100%!{cmd} are now correctly escaped in the py:percent format (#938)Added
Changed
LargeFileManager imported from jupyter_server rathen than notebook (#933)yarn.lock file for the jupyter lab extension (#904, #925, #935, #939)The Jupytext CLI only suggest --update when the target is an .ipynb file (#905) - thanks to st-- for this contribution
Fixed
--update when the target is an .ipynb file (#905) - thanks to st-- for this contributioncat notebook.md | jupytext --execute work (#908)Added
Changed
black==22.1.0.pandoc==2.16.2 for testing. The representation for code cells changed from ``` {.python} to ``` python in that version of Pandoc (#906). We don't use pandoc>=2.17 in tests at the moment because of the introduction of cell ids that cannot be filtered.pyupgrade to the pre-commit hooks used for developing Jupytext (#907)The text_representation metadata of text notebooks is filtered from .ipynb files both in jupytext.write and in the contents manager for Jupyter
Jupytext will not open a text notebook that is not UTF-8
Fixed
The test suite filters the warnings that don't belong to Jupytext
The "Jupytext Notebook" factory that lets the user configure the Notebook viewer as the default for text notebooks accepts more filetypes: "myst", "r-
The extension for Jupyter Lab benefited from a series of improvements contributed by Frédéric Collonval:
Changed
master was renamed to main (links update)Changed
master was renamed to main (links in the documentation were updated)The magic commands in py:percent scripts with no explicit format information remain commented over a round trip
py:percent scripts with no explicit format information remain commented over a round trip (#848)We have upgraded the jupyterlab extension dependencies and especially ansi-regex to fix a security vulnerability
Added
--diff command to show the differences between two notebooks (and if you want to see the changes in a file being updated by Jupytext, use --show-changes) (#799)ipynb paired notebooks when it cannot open a paired notebook because the ipynb version is more recent. Also, if the inputs in the two files are identical then the notebook will open with no error (#799)py:percent format will use raw strings when encoding Markdown cells as string, if they contain backslash characters (#836)Fixed
ansi-regex to fix a security vulnerability (#857)Changed
Jupytext supports Quarto notebooks (with .qmd extension)
Added
.qmd extension) (#837)pyproject.toml file. Thanks to Robin Brown for this contribution! (#828).ml extension. Thanks to Quentin Fortier for getting this started (#832)Fixed
Fixed typos revealed by codespell - thanks to @hectormz for this contribution
Fixed
codespell - thanks to @hectormz for this contribution (#829)jupyterlab-jupytext extension to address several security issues (#842) (#843)requirements-dev.txt) now uses jupyterlab==3.0.17 rather than 3.0.0 because of another security issue (#839)The documentation illustrates how the cell_markers option (and the other ones) can be set directly in the jupytext.toml config file (#809).
Changed
cell_markers option (and the other ones) can be set directly in the jupytext.toml config file (#809).mdit-py-plugins through markdown-it-py[plugins] was made explicit (#814)Fixed
var = !cmd are commented out (#816)InconsistentPath issue with notebooks paired with scripts in a folder. The prefix in the Jupytext formats always use /, while paths might use either / or \ (#806)sphinx-gallery is too recent, or when pandoc is not up-to-date (#814)Dependencies of the JupyterLab extension have been upgraded to fix a security vulnerability
Changed
--use-source-timestamp that sets the last modification time of the output file equal to that of the source file (this avoids having to change the timestamp of the source file) (#784)Fixed
--warn-only option also applies to pipes. Use this if the pipe may fail, e.g. if you apply black on a possibly invalid script (#781)py scripts (#781)Jupytext's dependency markdown-it-py is now in v1
Changed
fmt in jupytext.reads now has the default value None - thanks to Yuvi Panda (#763)Fixed
utf-8 encoding (#770)--pipe black was not always putting two blank lines between functions. To fix that we load the internal Jupytext
cell metadata like lines_to_next_cell from the text file rather than ipynb (#761)Added
ipython3 pygment lexer appears in MyST Markdown files (#759)Format options stored in the notebook itself are now taken into account (Fixes #757)
Fixed
The jupytext.toml config file can now be used together with the jupytext pre-commit hook
Fixed
jupytext.toml config file can now be used together with the jupytext pre-commit hook (#752)notebook_extensions option of the jupytext.toml file now works (#746)Changed
jupytext.toml where renamed to match the jupytext metadata in the text notebooks. One should now use formats rather than default_jupytext_formats and notebook_metadata_filter rather than default_notebook_metadata_filter (#753)We have updated marked, an indirect dependency of the jupyterlab-jupytext extension, to fix a moderate vulnerability (#750).
We have adjusted the MANIFEST.in file to exclude the node_modules but still include the JupyterLab extension that was missing in the .tar.gz (and cond
Fixed
MANIFEST.in file to exclude the node_modules but still include the JupyterLab extension that was missing in the .tar.gz (and conda) package in v1.10.1. Many thanks to Martin Renou for providing the fix at (#741)Nothing published for this version
The recursive glob pattern /*.ipynb is now supported by Jupytext - Thanks to Banst for this contribution
Added
**/*.ipynb is now supported by Jupytext - Thanks to Banst for this contribution (#731).sage and .md files and back. Thanks to Lars Franke for suggesting this! (#727)python -m jupytext. Thanks to Matthew Brett for his PR! (#739)Changed
nbformat>=5.1.0. Cell ids are preserved by the --sync and --update command. So we removed the constraint on the version of nbformat (#735).Fixed
node_modules folder from the .tar.gz package for Jupytext (#730)Your coding agent can read these notes before it upgrades. Set up the MCP server →