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 59 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
150 releases · first in 2018
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)One column per quarter.
Jupytext has a pre-commit hook! Many thanks to John Paton and Aaron Gokaslan for making this happen
Added
--diff option (#722)isort and autoflake8 to the pre-commit configuration file used for developing the Jupytext project (#709)py:percent scripts end with exactly one blank line (#682)Changed
nbformat>=5.1.0 yet, so we added the requirement nbformat<=5.0.8 (#715)Fixed
Include the lab extension that was missing in the conda package (#703).
Fixed
The Jupytext extension for JupyterLab is compatible with Jupyter Lab 3.0, thanks to Martin Renou's awesome contribution #683.
Changed
Changed
Jupytext 1.8.2 depends on python>=3.6. The last version of Jupytext explicitly tested with Python 2.7 and 3.5 was Jupytext 1.7.1, cf. #697.
Changed
python>=3.6. The last version of Jupytext explicitly tested with Python 2.7 and 3.5 was Jupytext 1.7.1, cf. #697.The dependency on markdown-it-py is conditional on python>=3.6
Changed
markdown-it-py is conditional on python>=3.6 (#697)Removed support for Python 2.7 and 3.5, a preliminary step towards a JupyterLab 3.0-compatible extension
Text notebooks have the same format and mimetype as ipynb notebooks. This fixes the _File Load Error - content.indexOf is not a function_ error on tex
Fixed
The readf and writef functions were dropped (they had been deprecated in favor of read and write in June 2019, v1.2.0)
Changed
get and save methods to read and save text files, and explicitly calls jupytext.reads and jupytext.writes to do the conversion. We don't use mock nor internal parent methods any more. Thanks to Max Klein for helping making this work! (#634, #635)FileContentsManager, and in particular it works with jupyterfs (#618)README.md was simplified and now includes many links to the documentation.myst_parser rather than recommonmark. And we use conda on RTD (#650, #652)readf and writef functions were dropped (they had been deprecated in favor of read and write in June 2019, v1.2.0)--set-kernel - command, on a Python notebook, gives an explicit error when no kernel is not found that matches the current Python executable.pypi-publish step to automatically publish the package on PyPi when new releases are created.CHANGELOG.md file was moved under docs to better expose the history of changes.Added
tox.ini file, thanks to Chris Sewell (#605)execution cell metadata is now filtered by default (#656)Fixed
sphinx-gallery frozen to version ~=0.7.0 (#614)The readf and writef functions were dropped (they had been deprecated in favor of read and write in June 2019, v1.2.0)
Changed
get and save methods to read and save text files, and explicitly calls jupytext.reads and jupytext.writes to do the conversion. We don't use mock nor internal parent methods any more. Thanks to Max Klein for helping making this work! (#634, #635)FileContentsManager, and in particular it works with jupyterfs (#618)README.md was simplified and now includes many links to the documentation.myst_parser rather than recommonmark. And we use conda on RTD (#650, #652)readf and writef functions were dropped (they had been deprecated in favor of read and write in June 2019, v1.2.0)--set-kernel - command, on a Python notebook, gives an explicit error when no kernel is not found that matches the current Python executable.pypi-publish step to automatically publish the package on PyPi when new releases are created.CHANGELOG.md file was moved under docs to better expose the history of changes.Added
tox.ini file, thanks to Chris Sewell (#605)execution cell metadata is now filtered by default (#656)Fixed
sphinx-gallery frozen to version ~=0.7.0 (#614)Jupytext's contents manager uses the parent CM's get and save methods to read and save text files, and explicitly calls jupytext.reads and jupytext.wr
Changed
get and save methods to read and save text files, and explicitly calls jupytext.reads and jupytext.writes to do the conversion. We don't use mock nor internal parent methods any more. Thanks to Max Klein for helping making this work! (#634, #635)FileContentsManager, and in particular with jupyterfs (#618)README.md was simplified and now includes many links to the documentation.Added
tox.ini file, thanks to Chris Sewell (#605)Fixed
sphinx-gallery frozen to version ~=0.7.0 (#614)New option hide_notebook_metadata to encapsulate the notebook metadata in an HTML comment
Added
hide_notebook_metadata to encapsulate the notebook metadata in an HTML comment (#527)root_level_metadata_as_raw_cell. Set it to False if you don't want to see root level metadata
of R Markdown notebooks as a raw cell in Jupyter (#415)doxygen_equation_markers to translate Markdown equations into Doxygen equations (#517)custom_cell_magics to comment out cells starting with user-specific cell magics (#513)isort on notebooks (#553)jupytext notebook.ipynb --to filename.py will warn that --to is used in place of --output.jupytext --set-formats filename.py will suggest to use --sync instead of --set-formats (#544)jupytext --to (#543)--run-path to execute the notebooks at the desired location (#595)Changed
markdown-it-py (Python 3.6 and above) and always features the MyST-Markdown format,
thanks to Chris Sewell (#591)md:myst and md:pandoc are always included in the Jupytext formats, and an informative runtime
error will occur if the required dependencies, resp. markdown-it-py and pandoc, are not installed. (#556)# %% cell marker has the same indentation as the first line in the cell (#562)Fixed
--pipe commands are supported (#562)dev-build=False and minimize=False on mybinder to avoid build errorscodecov.ymlActivated GitHub code scanning alerts
Added
hide_notebook_metadata to encapsulate the notebook metadata in an HTML comment (#527)root_level_metadata_as_raw_cell. Set it to False if you don't want to see root level metadata
of R Markdown notebooks as a raw cell in Jupyter (#415)doxygen_equation_markers to translate Markdown equations into Doxygen equations (#517)custom_cell_magics to comment out cells starting with user-specific cell magics (#513)isort on notebooks (#553)jupytext notebook.ipynb --to filename.py will warn that --to is used in place of --output.jupytext --set-formats filename.py will suggest to use --sync instead of --set-formats (#544)jupytext --to (#543)--run-path to execute the notebooks at the desired location (#595)Changed
# %% cell marker has the same indentation as the first line in the cell (#562)md:myst and md:pandoc are always included in the Jupytext formats, and an informative runtime
error will occur if the required dependencies, resp. markdown-it-py and pandoc, are not installed. (#556)markdown-it-py and always features the MyST-Markdown format (Python 3.6 and above, #591)Fixed
codecov.yml--pipe commands are supported (#562)myst is missing (#556)dev-build=False and minimize=False on mybinder to avoid build errorsThe documentation uses the Alabaster theme
Changed
Fixed
jupytext.py is not a configuration file (#559, #567)Added toml as a dependency (#552).
Fixed
toml as a dependency (#552).__pycache__ and .pyc files from the pip package.coverage as a dependency to the conda CI workflow.backports.functools_lru_cache (#554).Jupytext can use a local or global configuration file
Added
notebooks///ipynb,scripts///py:percent if you want to replicate the tree of notebooks under notebooks in a folder named scripts (#424).resource extension from the Robot Framework are supported, thanks to Hiski Valli (#535)pip and conda environments, on Linux, Mac OS and Windows, using Github actions (#487)pre-commit, black and flake8 (#483)--set-kernel, --set-formats, or both (#485)jupytext --check commands like "pytest {}" on Windows (#475)Fixed
jupytext --execute tests when the warning Timeout waiting for IOPub output occurs, which is the case intermittently on Windows (#489)Nothing published for this version
Jupytext can use a local or global configuration file
Added
notebooks///ipynb,scripts///py:percent if you want to replicate the arborescence of notebooks under notebooks in a folder named scripts (#424)pip and conda environments, on Linux, Mac OS and Windows, using Github actions (#487)pre-commit, black and flake8 (#483)--set-kernel, --set-formats, or both (#485)jupytext --check commands like "pytest {}" on Windows (#475)Fixed
jupytext --execute tests when the warning Timeout waiting for IOPub output occurs, which is the case intermittently on Windows (#489)Jupytext can use a local or global configuration file
Added
notebooks///ipynb,scripts///py:percent if you want to replicate the arborescence of notebooks under notebooks in a folder named scripts (#424)pip and conda environments, on Linux, Mac OS and Windows, using Github actions (#487)pre-commit, black and flake8 (#483)--set-kernel, --set-formats, or both (#485)jupytext --check commands like "pytest {}" on Windows (#475)Fixed
jupytext --execute tests when the warning Timeout waiting for IOPub output occurs, which is the case intermittently on Windows (#489)Jupytext can use a local or global configuration file
Added
notebooks///ipynb,scripts///py:percent if you want to replicate the arborescence of notebooks under notebooks in a folder named scripts (#424)pip and conda environments, on Linux, Mac OS and Windows, using Github actions (#487)pre-commit, black and flake8 (#483)--set-kernel, --set-formats, or both (#485)jupytext --check commands like "pytest {}" on Windows (#475)Fixed
jupytext --execute tests when the warning Timeout waiting for IOPub output occurs, which is the case intermittently on Windows (#489)Added an example with custom notebook metadata
Added
Changed
.ipynb file are matched with the input cells from the text file with less strict rules. In this version, a search and replace on the text file will not remove the outputs any more (#464).myst-parser to version ~0.8) (#473)os.path.samefile when searching for the kernel that corresponds to the current environment (--set-kernel -)Fixed
--opt comment_magics=false. In addition, most of the jupytext commands in using-cli.md are now tested! (#465)jupytext.read and jupytext.write now give more meaningful errors when the format information is incorrect (#462)Script of script (SoS) notebooks are now supported. Thanks to Thomas Pernet-coudrier for contributing the sample notebook (#453).
Added
md:myst), developed by the ExecutableBookProject team. Read more about the MyST Markdown format in the documentation. And many thanks to Chris Sewell for contributing the actual implementation! (#447 #456 #458)Fixed
jupytext --pipe cmd, the output of cmd should not appear in the terminal (#432)The new jupyterlab extension (in version 1.2.0) is compatible with JupyterLab 2.0. Many thanks to Jean Helie!
Changed
jupyter labextension install jupyterlab-jupytext@1.1.1.Fixed
jupytext --pipe or jupytext --check (#432)Removed leading slash in notebook paths
Fixed
jupytext --set-formats when using formats with prefix and/or suffix (#450)C# and F# Jupyter notebooks are now supported (#427, #429)
Added
Fixed
jupytext --to script *.ipynb now computes the script extension for each notebook (#428)jupytext --help (#426, #433)Jupytext has a logo! Many thanks to Kyle Kelley for contributing the logo (#423), and to Chris Holdgraf for suggesting this (#260).
Added
jupytext_version if you wish (#416).Fixed
jupytext --test on text files are ignored (#414).The --pre-commit mode now ignores non-notebook files in the index (#338).
Fixed
--pre-commit mode now ignores non-notebook files in the index (#338).nbformat_minor is taken from the notebook with outputs when inputs and outputs are merged.New nomarker format in the Jupyter Notebook and JupyterLab extensions
Added
nomarker format in the Jupyter Notebook and JupyterLab extensions (#397)Changed
normarker format replaces the one previously named bare.Fixed
cd to the list of magic commands.--set-formats is being used (fixes #399).See also What's new in Jupytext 1.3?
See also What's new in Jupytext 1.3?
Added
.md and .py is now supported. Input cells are loaded from the most recent text representation (#290)<!-- #raw --> and <!-- #endraw -->) in Markdown files (#321)<!-- #region -->, <!-- #markdown --> or <!-- #md --> (#344).noeval attribute are inactive in Jupyter (#347)py:percent format. And Markdown cells can start with just # %% [md] (#305)# + [markdown] rather than the previous cell_type metadata to identify markdown cells with metadata (#356)# + [markdown] can use triple quotes (#356)float? are classified as magics, and thus commented in Python scripts (#297)key=value (the new default) or in JSON. An automatic option cell_metadata_json should help minimize the impact on existing files (#344)jupytext notebook.py --to ipynb updates the timestamp of notebook.py so that the paired notebook still works in Jupyter (#335, #254)jupytext --check pytest notebook.ipynb can be used to run test functions in a notebook (#286)jupytext --check and jupytext --pipe can run commands that only operate on files: when {} is found in the text of the command, jupytext saves the text representation of the notebook in a temp file, and replaces {} with the name of that file before executing the command. (#286)Changed
CHANGELOG.md rather than HISTORY.rstFixed
cat = x are not magic commands, so they are not commented any more (#339)"cat" being converted to a markdown cell) in the py:light format (#339)jupytext --test textfile.ext now really compares the text file to its round trip (rather than the corresponding notebook) (#339)%%python3 cell magic are now preserved in a round trip through the Markdown format (#365)jupytext --execute runs the notebook in its folder (#382)#R_CODE# (#383)Read a more user friendly version here!
Read a more user friendly version here!
Added
.md and .py is now supported. Input cells are loaded from the most recent text representation (#290)<!-- #raw --> and <!-- #endraw -->) in Markdown files (#321)<!-- #region -->, <!-- #markdown --> or <!-- #md --> (#344).noeval attribute are inactive in Jupyter (#347)py:percent format. And Markdown cells can start with just # %% [md] (#305)# + [markdown] rather than the previous cell_type metadata to identify markdown cells with metadata (#356)# + [markdown] can use triple quotes (#356)float? are classified as magics, and thus commented in Python scripts (#297)key=value (the new default) or in JSON. An automatic option cell_metadata_json should help minimize the impact on existing files (#344)jupytext notebook.py --to ipynb updates the timestamp of notebook.py so that the paired notebook still works in Jupyter (#335, #254)jupytext --check pytest notebook.ipynb can be used to run test functions in a notebook (#286)jupytext --check and jupytext --pipe can run commands that only operate on files: when {} is found in the text of the command, jupytext saves the text representation of the notebook in a temp file, and replaces {} with the name of that file before executing the command. (#286)Changed
CHANGELOG.md rather than HISTORY.rstFixed
cat = x are not magic commands, so they are not commented any more (#339)"cat" being converted to a markdown cell) in the py:light format (#339)jupytext --test textfile.ext now really compares the text file to its round trip (rather than the corresponding notebook) (#339)%%python3 cell magic are now preserved in a round trip through the Markdown format (#365)jupytext --execute runs the notebook in its folder (#382)#R_CODE# (#383)Read a more user friendly version here!
Read a more user friendly version here!
Improvements
.md and .py is now supported. Input cells are loaded from the most recent text representation (#290)<!-- #raw --> and <!-- #endraw -->) in Markdown files (#321)<!-- #region -->, <!-- #markdown --> or <!-- #md --> (#344).noeval attribute are inactive in Jupyter (#347)py:percent format. And Markdown cells can start with just # %% [md] (#305)# + [markdown] rather than the previous cell_type metadata to identify markdown cells with metadata (#356)# + [markdown] can use triple quotes (#356)float? are classified as magics, and thus commented in Python scripts (#297)cell_metadata_json should help minimize the impact on existing files (#344)jupytext notebook.py --to ipynb updates the timestamp of notebook.py so that the paired notebook still works in Jupyter (#335, #254)jupytext --check pytest notebook.ipynb can be used to run test functions in a notebook (#286)jupytext --check and jupytext --pipe can run commands that only operate on files: when {} is found in the text of the command, jupytext saves the text representation of the notebook in a temp file, and replaces {} with the name of that file before executing the command. (#286)BugFixes
cat = x are not magic commands, so they are not commented any more (#339)"cat" being converted to a markdown cell) in the py:light format (#339)jupytext --test textfile.ext now really compares the text file to its round trip (rather than the corresponding notebook) (#339)%%python3 cell magic are now preserved in a round trip through the Markdown format (#365)Raw cells are now encoded using HTML comments (<!-- #raw --> and <!-- #endraw -->) in Markdown files. And code blocks from Markdown files, when they d
Improvements
<!-- #raw --> and <!-- #endraw -->) in Markdown files. And code blocks from Markdown files, when they don't have an explicit language, are displayed as Markdown cells in Jupyter (#321)py:percent format (#305)jupytext notebook.py --to ipynb updates the timestamp of notebook.py so that the paired notebook still works in Jupyter (#335, #254)BugFixes
"cat" being converted to a markdown cell) in the py:light format (#339)cat = x are not magic commands {#339)jupytext --test now really compares the text (rather than the corresponding notebook) when run on text files (#339)The documentation includes a mention on how to set metadata filters at the command line
Improvements
--warn-only is not set (#327)BugFixes
--warn-only catches every possible error (#263).md and .markdown files are treated identically (#325)--set-kernel when using pipes (#326)Dependency on setuptools in pandoc.py made optional to fix the build of the conda package (#310, #323)
BugFixes
setuptools in pandoc.py made optional to fix the build of the conda package (#310, #323)Documentation includes a section on how to use Jupytext as a Python library
Improvements
jupytext --execute notebook.md (#303)as_version in jupytext.read is nbformat.NO_CONVERT, as for nbformat.readBugFixes
fmt argument in jupytext.read (#312)c.notebook_extensions has a custom value (#318)Added documentation on how to use Jupytext with JupyterLab 0.35
Improvements
read and write functions are easier to use (#292)BugFixes
jupyterlab-jupytext extension in version 1.0.2. The version 1.0.1 erroneously introduces a target_formats metadata in the jupytext section, instead of formats, and works only after two clicks.New --execute option in Jupytext CLI
Improvements
--execute option in Jupytext CLI (#231)--set-formats option in Jupytext CLI also triggers --sync, allowing shorter commands.jupytext's read and write functions can be used as drop-in replacements for nbformat's ones (#262).jupytext --sync will now skip unpaired notebooks (#281).jupyter_server (#270)mock and testfixtures, thanks to Jean-Sebastien Dieu (#279).markdown extension (#288)BugFixes
jupyterlab-jupytext extension shipped with the python package is in version 1.0.1, and is compatible only with JupyterLab >= 1.0. If you use an earlier version of JupyterLab, please install the version 0.19 of the extension with jupyter labextension install jupyterlab-jupytext@0.19 (#276, #278)Nothing published for this version
New --execute option in Jupytext CLI
Improvements
--execute option in Jupytext CLI (#231)--set-formats option in Jupytext CLI also triggers --sync, allowing shorter commands.jupytext's read and write functions can be used as drop-in replacements for nbformat's ones (#262).jupytext --sync will now skip unpaired notebooks (#281).jupyter_server (#270)mock and testfixtures, thanks to Jean-Sebastien Dieu (#279)BugFixes
jupyterlab-jupytext extension shipped with the python package is in version 1.0, and is compatible only with JupyterLab >= 1.0. If you use an earlier version of JupyterLab, please install the version 0.19 of the extension with jupyter labextension install jupyterlab-jupytext@0.19 (#276, #278)Nothing published for this version
Nothing published for this version
Added support for Scala notebook, by Tobias Frischholz
Improvements
BugFixes
jupyter_nbextensions_configurator (#178).md files in the documentation (#255)Added support for Scala notebook, by Tobias Frischholz
Improvements
BugFixes
jupyter_nbextensions_configurator (#178).md files in the documentation (#255)Nothing published for this version
Jupytext now supports Javascript and Typescript, thanks to Hatem Hosny
Improvements
BugFixes
auto pairing (#249)Added
Fixed
auto pairing (#249)Fixed implicit dependency on jupyter_client
Fixed
jupyter_client (#245)New argument --set-kernel in Jupytext command line
Improvements
--set-kernel in Jupytext command line (#230)--to script or --to auto (#240)BugFixes
New argument --set-kernel in Jupytext command line
Improvements
--set-kernel in Jupytext command line (#230)BugFixes
New argument --kernel in Jupytext command line
Improvements
--kernel in Jupytext command line (#230)BugFixes
Support for IDL notebooks and .pro scripts
Improvements
Added
Jupytext's content manager has a new notebook_extensions option (#224, #183)
Improvements
notebook_extensions option (#224, #183)active-ipynb cell tag (#226)BugFixes
Jupytext server extension leaves the contents manager unchanged when it is already a subclass of TextFileContentsManager
Improvements
Markdown and R Markdown formats now support metadata (#66, #111, #188)
Improvements
light format for Scripts can use custom cell markers, e.g. Vim or VScode/PyCharm folding markers (#199)md:pandoc (#208)BugFixes
LargeFileManager to allow large file uploads (#210)jupytext --to py rather than --to python in the README (#216)Markdown and R Markdown formats now support metadata (#66, #111, #188)
Improvements
light format for Scripts can use custom cell markers, e.g. Vim or VScode/PyCharm folding markers (#199)md:pandoc (#208)BugFixes
LargeFileManager to allow large file uploads (#210)Markdown and R Markdown formats now support metadata (#66, #111, #188)
Improvements
light format for Scripts can use custom cell markers, e.g. Vim or VScode/PyCharm folding markers (#199)md:pandoc (#208)BugFixes
LargeFileManager to allow large file uploads (#210)Markdown and R Markdown formats now support metadata (#66, #111, #188)
Improvements
light format for Scripts can use custom cell markers, e.g. Vim or VScode/PyCharm folding markers (#199)BugFixes
LargeFileManager to allow large file uploads (#210)Fix the error 'notebook file has changed on disk' when saving large notebooks
BugFixes
Wildcard are now supported on Windows
Improvements
BugFixes
Added
Fixed
Matlab and Octave notebooks and scripts are now supported
Improvements
BugFixes
notebook_metadata_filter = "all" now works (#196)Rename notebooks in pairs in the tree view
Improvements
.scm file extension with Scheme scripts (#192)BugFixes
? or ! and python or bash command (#189)Added
.scm file extension with Scheme scripts (#192)Fixed
? or ! and python or bash command (#189)Your coding agent can read these notes before it upgrades. Set up the MCP server →