{"id":13468695,"url":"https://github.com/mwouts/jupytext","last_synced_at":"2026-01-18T19:00:45.286Z","repository":{"id":38375092,"uuid":"137444487","full_name":"mwouts/jupytext","owner":"mwouts","description":"Jupyter Notebooks as Markdown Documents, Julia, Python or R scripts","archived":false,"fork":false,"pushed_at":"2026-01-18T11:36:43.000Z","size":32117,"stargazers_count":7092,"open_issues_count":143,"forks_count":413,"subscribers_count":72,"default_branch":"main","last_synced_at":"2026-01-18T12:04:01.169Z","etag":null,"topics":["hydrogen","jupyter-notebook","jupyterlab","jupyterlab-extension","knitr","markdown","notebooks","python","rmarkdown","rstudio","version-control"],"latest_commit_sha":null,"homepage":"https://jupytext.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mwouts.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-06-15T05:25:36.000Z","updated_at":"2026-01-18T08:40:44.000Z","dependencies_parsed_at":"2023-11-11T23:21:00.772Z","dependency_job_id":"d23941b7-8e59-4eb3-bc5b-5755bcf5642c","html_url":"https://github.com/mwouts/jupytext","commit_stats":{"total_commits":2392,"total_committers":93,"mean_commits":25.72043010752688,"dds":"0.12625418060200666","last_synced_commit":"b74f5ce78ed5b7daf770da2550ecd1b973cee99c"},"previous_names":["mwouts/nbrmd"],"tags_count":169,"template":false,"template_full_name":null,"purl":"pkg:github/mwouts/jupytext","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mwouts%2Fjupytext","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mwouts%2Fjupytext/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mwouts%2Fjupytext/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mwouts%2Fjupytext/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mwouts","download_url":"https://codeload.github.com/mwouts/jupytext/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mwouts%2Fjupytext/sbom","scorecard":{"id":190666,"data":{"date":"2025-08-11","repo":{"name":"github.com/mwouts/jupytext","commit":"767660dc3ff2e229ccbd995d14bad00b7d430a44"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.1,"checks":[{"name":"Code-Review","score":3,"reason":"Found 8/21 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"14 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:36","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/ci.yml:37","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yml:23","Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:22","Info: topLevel 'contents' permission set to 'read': .github/workflows/publish.yml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_build.yml:17","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_coverage.yml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_pre-commit.yml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_static-analysis.yml:8","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/step_static-analysis.yml:9","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_tests-conda.yml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_tests-pip.yml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/step_tests-ui.yml:8","Warn: topLevel 'contents' permission set to 'write': .github/workflows/update-playwright-snapshots.yml:8"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:14"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: invalid parameter name: .github/workflows/step_tests-pip.yml:59","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/comment-pr.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/comment-pr.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/comment-pr.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/comment-pr.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_build.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_build.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_coverage.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_coverage.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_coverage.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_pre-commit.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_pre-commit.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_pre-commit.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_pre-commit.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_pre-commit.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_pre-commit.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_pre-commit.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_static-analysis.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_static-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_static-analysis.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_static-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_static-analysis.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_static-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_tests-conda.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-conda.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_tests-conda.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-conda.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_tests-conda.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-conda.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_tests-conda.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-conda.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_tests-pip.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-pip.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_tests-pip.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-pip.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_tests-pip.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-pip.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_tests-ui.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-ui.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/step_tests-ui.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-ui.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/step_tests-ui.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/step_tests-ui.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-playwright-snapshots.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/update-playwright-snapshots.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-playwright-snapshots.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/mwouts/jupytext/update-playwright-snapshots.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:35","Warn: pipCommand not pinned by hash: .github/workflows/step_coverage.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/step_pre-commit.yml:41","Warn: pipCommand not pinned by hash: .github/workflows/step_tests-pip.yml:68","Warn: pipCommand not pinned by hash: .github/workflows/step_tests-ui.yml:26","Warn: pipCommand not pinned by hash: .github/workflows/step_tests-ui.yml:38","Warn: pipCommand not pinned by hash: .github/workflows/update-playwright-snapshots.yml:34","Info:   0 out of  17 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  15 third-party GitHubAction dependencies pinned","Info:   0 out of   7 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-44cc-43rp-5947","Warn: Project is vulnerable to: GHSA-4m77-cmpx-vjc4","Warn: Project is vulnerable to: GHSA-9q39-rmj3-p4r2","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T20:36:40.002Z","repository_id":38375092,"created_at":"2025-08-16T20:36:40.003Z","updated_at":"2025-08-16T20:36:40.003Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28548938,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hydrogen","jupyter-notebook","jupyterlab","jupyterlab-extension","knitr","markdown","notebooks","python","rmarkdown","rstudio","version-control"],"created_at":"2024-07-31T15:01:16.893Z","updated_at":"2026-01-18T19:00:45.278Z","avatar_url":"https://github.com/mwouts.png","language":"Python","funding_links":[],"categories":["Python","Data Exploration","Rendering/Publishing/Conversion","markdown","Python 程序","Coding Resources","rstudio","Jupyter-Notebook分享与格式转换","Notebook Sharing \u0026 Conversion","转换工具"],"sub_categories":["网络服务_其他","开发组件"],"readme":"![](https://github.com/mwouts/jupytext/blob/17aea37c612f33a4e27eeee4b81966f1506920fd/docs/images/logo_large.png?raw=true)\n\n\u003c!-- INDEX-START --\u003e\n\n[![CI](https://github.com/mwouts/jupytext/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/mwouts/jupytext/actions)\n[![Documentation Status](https://readthedocs.org/projects/jupytext/badge/?version=latest)](https://jupytext.readthedocs.io/en/latest/?badge=latest)\n[![codecov.io](https://codecov.io/github/mwouts/jupytext/coverage.svg?branch=main)](https://codecov.io/gh/mwouts/jupytext/branch/main)\n[![MIT License](https://img.shields.io/github/license/mwouts/jupytext)](https://github.com/mwouts/jupytext/blob/main/LICENSE)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![GitHub language count](https://img.shields.io/github/languages/count/mwouts/jupytext)](docs/languages.md)\n[![Conda Version](https://anaconda.org/conda-forge/jupytext/badges/version.svg)](https://anaconda.org/conda-forge/jupytext/)\n[![Pypi](https://img.shields.io/pypi/v/jupytext.svg)](https://pypi.python.org/pypi/jupytext)\n[![pyversions](https://img.shields.io/pypi/pyversions/jupytext.svg)](https://pypi.python.org/pypi/jupytext)\n[![Binder:lab](https://img.shields.io/badge/binder-jupyterlab-0172B2.svg)](https://mybinder.org/v2/gh/mwouts/jupytext/main?urlpath=lab/tree/demo/get_started.ipynb)\n[![Binder:notebook](https://img.shields.io/badge/binder-notebook-0172B2.svg)](https://mybinder.org/v2/gh/mwouts/jupytext/main?filepath=demo)\n[![launch - renku](https://renkulab.io/renku-badge.svg)](https://renkulab.io/projects/best-practices/jupytext/sessions/new?autostart=1)\n[![Jupyter Con 2020](https://img.shields.io/badge/YouTube-JupyterCon%202020-red.svg)](https://www.youtube.com/watch?v=SDYdeVfMh48)\n\n# Jupytext\n\nHave you always wished Jupyter notebooks were plain text documents? Wished you could edit them in your favorite IDE? And get clear and meaningful diffs when doing version control? Then, Jupytext may well be the tool you're looking for!\n\n## Text Notebooks\n\nA Python notebook encoded in the `py:percent` [format](docs/formats-scripts.md#the-percent-format) has a `.py` extension and looks like this:\n\n```\n# %% [markdown]\n# This is a markdown cell\n\n# %%\ndef f(x):\n  return 3*x+1\n```\n\nOnly the notebook inputs (and optionally, the metadata) are included. Text notebooks are well suited for version control. You can also edit or refactor them in an IDE - the `.py` notebook above is a regular Python file.\n\nWe recommend the `percent` format for notebooks that mostly contain code. The `percent` format is available for Julia, Python, R and many other [languages](docs/languages.md).\n\nIf your notebook is documentation-oriented, a [Markdown-based format](docs/formats-markdown.md) (text notebooks with a `.md` extension) might be more appropriate. Depending on what you plan to do with your notebook, you might prefer the Myst Markdown format, which interoperates very well with Jupyter Book, or Quarto Markdown, or even Pandoc Markdown.\n\n## Installation\n\nInstall Jupytext in the Python environment that you use for Jupyter. Use either\n\n    pip install jupytext\n\nor\n\n    conda install jupytext -c conda-forge\n\nThen, restart your JupyterLab server, and make sure Jupytext is activated in Jupyter:  `.py` and `.md` files have a Notebook icon, and you can open them as Notebooks with a right click in JupyterLab.\n\n![Notebook icon on text notebooks](https://github.com/mwouts/jupytext/blob/64b4be818508760116f91bf156342cb4cf724d93/docs/images/jupyterlab_right_click.png?raw=true)\n\n## Paired Notebooks\n\nText notebooks with a `.py` or `.md` extension are well suited for version control. They can be edited or authored conveniently in an IDE. You can open and run them as notebooks in JupyterLab with a right click. However, the notebook outputs are lost when the notebook is closed, as only the notebook inputs are saved in text notebooks.\n\nA convenient alternative to text notebooks are [paired notebooks](docs/paired-notebooks.md). These are a set of two files, say `.ipynb` and `.py`, that contain the same notebook, but in different formats.\n\nYou can edit the `.py` version of the paired notebook, and get the edits back in Jupyter by selecting _reload notebook from disk_. The outputs will be reloaded from the `.ipynb` file, if it exists. The `.ipynb` version will be updated or recreated the next time you save the notebook in Jupyter.\n\n💡 **Tip:** You can automate the notebook reloading by installing the [Jupyter Collaboration](docs/jupyter-collaboration.md) extension.\n\nTo pair a notebook in JupyterLab, use the command `Pair Notebook with percent Script` from the Command Palette:\n\n![](https://github.com/mwouts/jupytext/blob/64b4be818508760116f91bf156342cb4cf724d93/docs/images/pair_commands.png?raw=true)\n\nTo pair all the notebooks in a certain directory, create a [configuration file](docs/config.md) with this content:\n\n```\n# jupytext.toml at the root of your notebook directory\nformats = \"ipynb,py:percent\"\n```\n\n## Command line\n\nJupytext is also available at the [command line](docs/using-cli.md). You can\n\n- pair a notebook with `jupytext --set-formats ipynb,py:percent notebook.ipynb`\n- synchronize the paired files with `jupytext --sync notebook.py` (the inputs are loaded from the most recent paired file)\n- convert a notebook in one format to another with `jupytext --to ipynb notebook.py` (use `-o` if you want a specific output file)\n- pipe a notebook to a linter with e.g. `jupytext --pipe black notebook.ipynb`\n\n## Sample use cases\n\n### Notebooks under version control\n\nThis is a quick how-to:\n- Open your `.ipynb` notebook in Jupyter and [pair](docs/paired-notebooks.md) it to a `.py` notebook, using either the _pair_ command in JupyterLab, or a global [configuration file](docs/config.md)\n- Save the notebook - this creates a `.py` notebook\n- Add this `.py` notebook to version control\n\nYou might exclude `.ipynb` files from version control (unless you want to see the outputs versioned!). Jupytext will recreate the `.ipynb` files locally when the users open and save the `.py` notebooks.\n\n### Collaborating on notebooks with Git\n\nCollaborating on Jupyter notebooks through Git becomes as easy as collaborating on text files.\n\nAssume that you have your `.py` notebooks under version control (see above). Then,\n- Your collaborator pulls the `.py` notebook\n- They open it _as a notebook_ in Jupyter (right-click in JupyterLab)\n- At that stage the notebook has no outputs. They run the notebook and save it. Outputs are regenerated, and a local `.ipynb` file is created\n- They edit the notebook, and push the updated `notebook.py` file. The diff is nothing else than a standard diff on a Python script.\n- You pull the updated `notebook.py` script, and refresh your browser. The input cells are updated based on the new content of `notebook.py`. The outputs are reloaded from your local `.ipynb` file. Finally, the kernel variables are untouched, so you have the option to run only the modified cells to get the new outputs.\n\n### Editing or refactoring a notebook in an IDE\n\nOnce your notebook is [paired](docs/paired-notebooks.md) with a `.py` file, you can easily edit or refactor the `.py` representation of the notebook in an IDE.\n\nOnce you are done editing the `.py` notebook, you will just have to _reload_ the notebook in Jupyter to get the latest edits there.\n\nNote: It is simpler to close the `.ipynb` notebook in Jupyter when you edit the paired `.py` file. There is no obligation to do so; however, if you don't, you should be prepared to read carefully the pop-up messages. If Jupyter tries to save the notebook while the paired `.py` file has also been edited on disk since the last reload, a conflict will be detected and you will be asked to decide which version of the notebook (in memory or on disk) is the appropriate one. Alternatively, the [Jupyter Collaboration](docs/jupyter-collaboration.md) extension provides an autoreload feature which simplifies this.\n\n## More resources\n\nRead more about Jupytext in the [documentation](https://jupytext.readthedocs.io).\n\nIf you're new to Jupytext, you may want to start with the [FAQ](docs/faq.md) or with the [Tutorials](docs/tutorials.md).\n\nThere is also this short introduction to Jupytext: [![](https://img.shields.io/badge/YouTube-JupyterCon%202020-red.svg)](https://www.youtube.com/watch?v=SDYdeVfMh48).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmwouts%2Fjupytext","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmwouts%2Fjupytext","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmwouts%2Fjupytext/lists"}