Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Incorporate `jupyter-book` as a Jupyter sub-project

Incorporate Jupyter Book as a Jupyter Sub-project

Summary

One paragraph explanation of the proposal.

We propose the incorporation of a new Jupyter community sub-project: Jupyter Book (hereafter, jupyter-book). This sub-project is dedicated to building tools and standards that facilitate authoring, reading, and publishing workflows for computational narratives. The new sub-project would act as the steward of several successful technology and standards projects currently stewarded by the executablebooks/ project, most notably Jupyter Book and the MyST documentation engine, document standard, and markdown syntax. This will allow these tools to further enhance interoperability with the broader Jupyter stack of tools and to enable extensions that improve the state of authoring, reading, and publishing across the Jupyter ecosystem.

Motivation

Why are we doing this? What use cases does it support? What is the expected outcome?

The Jupyter Book project is a heavily-used user-facing tool for combining multiple computational narratives into an interactive book-like format. It was first created as a Jupyter repository (based on Jekyll), and was then moved into the executablebooks/ organization when the Jupyter Book project received funding from the Sloan Foundation. The Jupyter Book stack was originally based on Sphinx, which was largely driven by development in the first half of the grant’s timeline. It now seeks to migrate to a JavaScript-based document engine with MyST.

In the past two years, Jupyter Book has shifted its technical strategy to focus on a modern, future-proof foundation for authoring and reading computational narratives. It has invested project resources into developing a TypeScript-based documentation engine that can serve as the backbone of Jupyter Book. This documentation engine, called MyST (for Markedly Structured Text, the same name as its flavor of markdown syntax), is designed to be web-native, and to more naturally interact with the web-based tools in the Jupyter ecosystem and beyond.

The executablebooks/ GitHub organization is an artifact of the Sloan Foundation grant that originally funded its operations. This grant is winding down, and we are seeking a longer-lasting and organizationally-neutral home for the vision, strategy, tools, and standards of this modern version of the Jupyter Book toolchain.

The Jupyter project has a technical strategy that often discusses computational narratives. For example, many use Jupyter Notebooks to share data narratives and workflows around them (and in fact, this is one of the original driving use-cases for Jupyter Book). While Jupyter tends to focus on the computational and interactive aspects of the data science workflow first, we believe that jupyter-book would serve as a good “narrative-first” counterpart. By focusing on the content authoring, reading, and sharing aspects of the Jupyter ecosystem, jupyter-book could meet a unique set of use-cases that are relevant to the project. For example, improving Jupyter’s functionality for blogs, scholarship, data science education, software documentation, and community knowledge bases.

For these reasons, we believe that the Jupyter Project would be a natural home for the parts of the executablebooks/ ecosystem that intersect Jupyter’s mission around technology and standards for interactive computing. Below we provide more context for what this could look like.

Guide-level explanation

Explain the proposal as if it was already implemented and you were explaining it to another community member.

At a strategic level: the jupyter-book sub-project focuses on web-native workflows for authoring, reading, and publishing narratives with computation, as well as integrating with existing Jupyter sub-projects. The sub-project assumes responsibility for defining the strategy that guides future development of jupyter-book and its related projects, getting the resources necessary to carry out this strategy, and stewarding an open community.

At a team capacity level: the jupyter-book sub-project is currently maintained with the following team: A three-person Steering Council: Chris Holdgraf (@choldgraf), Greg Caporaso (@gcaporaso), Rowan Cockett (@rowanc1), as well as an additional three engineering team members: Angus Hollands (@agoose77), Franklin Koch (@fwkoch), Steve Purves (@stevejpurves). There have been over 30 additional contributors to the project as well, and we intend on growing the accessibility of the project to new contributors moving forward.

At a functionality level: Jupyter Book allows users to build beautiful, publication-quality books and documents from computational content. The authoring experience works directly in the JupyterLab interface to enhance narrative content with cross-references and specialized markups (like exercises, proofs, theorems, etc.). A Jupyter Book can either be a static-renderer or integrate to computation from existing Jupyter projects that are local, collaborative (JupyterHub), ephemeral (Binder), or browser-based (JupyterLite). A Jupyter Book can be exported to many existing PDF templates used in scientific publishing. The underlying components work with existing Jupyter standards for notebooks and provide ways to write structured content in Markdown that can be accessed by scientific publishing workflows and documentation tool-chains.

We’ve identified a subset of the executablebooks/ repositories that fit within this strategic focus, and that we propose transferring to a newly-created Jupyter sub-project called jupyter-book. See the appendix below for a list of projects and their proposed homes.

We’ve selected repositories based on the likelihood that they integrate and interoperate cleanly with other major projects in the Jupyter ecosystem, and that they follow Jupyter’s strategy for standards and protocols. For example, repositories that are largely based on web technologies (in order to integrate with tools like JupyterLab/Lite, Voila, etc), that integrate with Jupyter’s underlying server and computation infrastructure (like Jupyter server and Binder), and that define and re-use standards for third-party communities to build on top of (like the MyST Markdown syntax or the notebook format).

The remaining repositories that are not transferred into the jupyter-book organization will remain under the governing structures of the executablebooks/ project. The steering council of that project will continue to steward those repositories or identify alternative homes for them, but the Jupyter project will not have any responsibility or oversight over this process.

Reference-level explanation

We wish to:

This proposal does not include any ideas around changes to technology or standards, both within jupyter-book and in its relation to the broader Jupyter community.

Rationale and alternatives

Why Jupyter?

Jupyter is a natural home for the jupyter-book project for several key reasons described below:

  1. The strategy of jupyter-book aligns heavily with the broader goals of the Jupyter ecosystem. While Jupyter builds technology and standards for interactive computing workflows, Jupyter Book focuses on the “authoring, reading, and publishing” aspects of interactive computing, with an emphasis on traditional publishing workflows like “books”, “articles”, “knowledge bases”, etc.

  2. The technical direction for jupyter-book aligns heavily with Jupyter’s broader technical direction and standards, and being a sub-project will create more opportunities for integrations, re-using components and standards, and generally connecting with the Jupyter stack in a way that is greater than the sum of its parts.

  3. The proposed Steering Council of the jupyter-book project each have extensive experience in the open source ecosystem and understand how to build healthy open source communities aligned with Jupyter’s principles.

  4. Some members of the Steering Council (Chris Holdgraf) have extensive experience with other Jupyter sub-projects. For example, Chris was part of the inaugural Distinguished Contributor cohort and has served on the JupyterHub and Binder steering council for more than 5 years.

  5. Jupyter Book (the technology project) began within the jupyter/ organization, and was originally framed as “a way to publish collections of .ipynb files as a web-based book”.

  6. MyST Markdown (the markdown syntax) was initially brainstormed within the Jupyter community, with several then-Steering Council members serving as key catalysts in the creation of MyST.

Why split the executablebooks/ repositories into two homes?

We believe that the executablebooks/ repositories naturally fall into two technical directions: one based on docutils and sphinx (with heavy overlap with the broader developer documentation community), and one based on Javascript (with heavy overlap with scientific computing and authoring workflows).

The technical direction and user-focus of each is distinct enough that it is natural to split them into two projects. This will allow each organization to define their own set of target users and strategies to serve them.

Note that, initially, the Steering Council of executablebooks/ and that of the jupyter-book organization will be the same. This will allow us to coordinate the direction of projects in each organization for the immediate future, and minimize the friction associated with having two organizational homes. Over time, we intend for the strategy and governance of each organization to begin to evolve independent of one another.

What other options do we have?

The most natural alternative is to define executablebooks/ as its own standalone open source community, and request incorporation under a fiscal sponsor like NumFocus. We believe that this is a perfectly reasonable direction, but also believe that there is a unique opportunity to empower the workflows and users we care about by building a deeper relationship with the Jupyter community.

Alternatively, we could decide to take no action, and retain executablebooks/'s current status as a project-focused GitHub organization with a governing body defined in its team compass, but with no formal organizational status. We believe that this would hinder the project’s ability to grow its community, to define an organizationally-neutral place to host its tools and strategy, and to raise funds needed to sustain and grow the community’s operations.

Prior art

This proposal is similar to other JEP proposals to incorporate new Jupyter sub-projects from pre-existing technology.

In each case, a team independently defined the strategy, direction, and early development to bring technology projects to a more “stable” state. They then proposed incorporation as a sub-project once the key ideas that drove these projects solidified, and when it became clear that there was a natural overlap at a technical and strategic level with the Jupyter ecosystem. In these cases, the leaders of the project were also leaders within the Jupyter project, which facilitated the flow of information and collaboration across Jupyter and the new sub-project.

We believe that the jupyter-book/ project follows the same pattern described here. For examples of previous JEPs similar to the one proposed here, see Voila incorporation JEP, and the Xeus incorporation JEP.

Unresolved questions

This JEP does not propose any new ideas for the technical future of the jupyter-book project or any other part of the Jupyter ecosystem. There may be many new directions to consider if jupyter-book is incorporated as a subproject, but this can be discussed and iterated on in the future. This proposal is only about defining the organizational structure of the jupyter-book subproject and its initial set of repositories.

Future possibilities

There are many ways that the jupyter-book project could connect and integrate with the broader Jupyter community. For example:

Appendix: Frequently Asked Questions (FAQs)

Why is the Jupyter Book CLI being moved, given that it depends on the Sphinx stack?

Our intention is to gradually swap the back-end of Jupyter Book to use the mystmd backend instead of Sphinx. For this reason, it will be aligned at a technical strategy level with the rest of the web-native stack. This will likely take several months or more, as we slowly bring the MyST document engine up to feature parity with the Jupyter Book stack, and we plan on coordinating with the Executable Books community throughout this process (and note that initially the leadership of this sub-project, and Executable Books, will be the same in order to make this easier).

Does that mean the Sphinx stack is being abandoned?

No! The Sphinx-focused repositories will remain inside the executablebooks/ organization and governance. Those projects will continue to be useful to the Sphinx community, as they’ve been designed to work independently of Jupyter Book and have a large user base without it (from the developer community in Sphinx). This will continue to grow/evolve as an independent GitHub organization with its own developer community. We think that it’s better to have a Sphinx-focused stack in its own space, so that the Jupyter project can reduce its extra maintenance burden, and focus on the web-native nature of its technology stack.

Does this involve other JS-based repositories like Papyri?

Not right now. We think Papyri is awesome and would love to find ways to integrate more with it and potentially include it in this organization. Right now we’d like to keep the decision relatively simple and tightly scoped to Executable Books repositories.

What about reading-focused Jupyter services like NBConvert?

Same idea as above. We’re open to talking about how Jupyter Book could support, integrate and/or help steward services like these, but want to focus this decision on bringing “Jupyter Book” into existence as a sub-project just with our current list of repositories.

Security considerations

The main content for Jupyter Book is text-based and images, and can also include interactive Jupyter outputs that can potentially be untrusted vectors for abuse. Currently, the Jupyter Book and MyST Markdown tools are primarily intended and used for stand-alone sites that do not have authentication. There is the possibility to include user-generated content through Jupyter and other untrusted output that could provide a problem in an authenticated environment. The project uses React for rendering HTML, which provides some assurances around not rendering untrusted or arbitrary HTML, all content is stored as JSON data, and transformed on the fly to HTML. The Jupyter outputs are using the same components as the JupyterLab project. Currently deployed projects can be connected to a remote Jupyter kernel in a JupyterHub or BinderHub (using Thebe), these have the same security concerns as those tools, which is mitigated by having containerized environments. It is possible, when running locally, to connect to arbitrary user environments in Jupyter, this is always initiated through a user action through the terminal (documentation).

Accessibility considerations

The Jupyter Book team is committed to making its interfaces accessible, and believes that building on modern web frameworks is a good foundation to begin with. It does not have accessibility expertise itself, although we have sponsored some of our team members to attend web-accessibility courses. The Jupyter Book team will need guidance and resourcing (at the least in a consulting/assessment capacity) from the Jupyter community in order to identify and implement accessibility improvements.

From a technology standpoint, we are adopting tools that have a good accessibility track record (e.g. RadixUI, see accessibility docs for Radix). This allows us to implement rather than reinvent accessibility best-practices. The interactive Jupyter components are inherited directly from the JupyterLab ecosystem, so improvements to accessibility there will directly improve MyST Markdown and Jupyter Book. We discuss some of the accessibility considerations in the MyST Markdown project here.

Appendix: List of executablebooks/ repositories to incorporate under jupyter-book

(note the “last updated” field is out of date, and reflects when this draft first started in early March 2024)

RepositoryDescriptionLast UpdatedNew Home
myst-templatesA GitHub organization with templates for MyST renderers. Will remain a github org but move governance under the jupyter-book org.2/28/2024jupyter-book
mystmdCommand line tools for working with MyST Markdown.2/9/2024jupyter-book
myst-themePackages for creating MyST websites themes using React and Remix2/8/2024jupyter-book
jupyter-bookCreate beautiful, publication-quality books and documents from computational content.2/8/2024jupyter-book
jupyterlab-mystUse MyST Markdown directly in Jupyter Lab2/6/2024jupyter-book
jupyter-cacheA defined interface for working with a cache of executed jupyter notebooks1/29/2024jupyter-book
jupyter-cache-upgrader1/25/2024jupyter-book
myst-specMyST is designed to create publication-quality, computational documents written entirely in Markdown.1/24/2024jupyter-book
thebeTurn static HTML pages into live documents with Jupyter kernels.1/20/2024jupyter-book
cookiecutter-jupyter-bookCookiecutter template for a simple jupyter book11/29/2023jupyter-book
github-activitySimple markdown changelogs for GitHub repositories11/22/2023jupyter-book
myst-enhancement-proposalsMyST Enhancement Proposals (MEPs)10/9/2023jupyter-book
mystmd.orgA splash page for the MyST Markdown ecosystem8/2/2023jupyter-book
jupyterlab-myst-quickstartQuickstart examples for working with MyST in Jupyter7/5/2023jupyter-book
github-action-demoA demonstration repository to build and host a book with GitHub Actions6/21/2023jupyter-book
myst-theme-patchesA minimal repository containing essential patches for myst-theme deveopment6/14/2023jupyter-book
thebe-binder-baseA minimal binder setup for thebe demos4/27/2023jupyter-book
myst-vs-codeA syntax highlighter for the MyST Markdown format3/6/2023jupyter-book
mystmd-quickstartRepository to be used in the mystjs quickstart guide1/25/2023jupyter-book
thebe-coreTypescript based Jupyter connectivity and code execution layer for thebe8/22/2022jupyter-book
myst-demoA web-component for interactive myst demos in documentation.6/20/2022jupyter-book
unified-mystA repository of packages for working with MyST in the https://unifiedjs.com/ ecosystem4/30/2022jupyter-book
sphinx-book-themeA clean book theme for scientific explanations and documentation with Sphinx2/9/2024executablebooks
metaA community dedicated to supporting tools for technical and scientific communication and interactive computing2/8/2024executablebooks
sphinx-thebeA Sphinx extension to convert static code into interactive code cells with Jupyter, Thebe, and Binder.2/7/2024executablebooks
mdformat-tablesAn mdformat plugin for rendering tables2/7/2024executablebooks
mdformatCommonMark compliant Markdown formatter2/6/2024executablebooks
mdit-py-pluginsCollection of core plugins for markdown-it-py2/5/2024executablebooks
sphinx-external-tocA sphinx extension that allows the site-map to be defined in a single YAML file2/5/2024executablebooks
markdown-it-pyMarkdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed. Now in Python!2/5/2024executablebooks
MyST-NBParse and execute ipynb files in Sphinx2/5/2024executablebooks
MyST-ParserAn extended commonmark compliant parser, with bridges to docutils/sphinx2/5/2024executablebooks
sphinx-designA sphinx extension for designing beautiful, screen-size responsive web components.1/29/2024executablebooks
sphinx-copybuttonAdd a “copy” button to code blocks in Sphinx1/29/2024executablebooks
rst-to-mystConvert ReStructuredText to MyST Markdown1/29/2024executablebooks
sphinx-tabsTabbed views for Sphinx1/29/2024executablebooks
web-compileA CLI to compile/minify SCSS & JS, and associated pre-commit hook.1/29/2024executablebooks
mdurlURL utilities for markdown-it (a Python port)1/29/2024executablebooks
sphinx-togglebuttonShow and hide content with a button in Sphinx12/22/2023executablebooks
sphinx-panelsA sphinx extension for creating panels in a grid layout12/18/2023executablebooks
sphinx-jupyterbook-latexSupporting LaTeX infrastructure for Jupyter Book12/11/2023executablebooks
grant-admin12/6/2023executablebooks
.githubCommunity health files: Contributing guidelines, Code of Conduct, ...12/4/2023executablebooks
team-compassOrganizational policy and internal documentation for the executablebooks community11/28/2023executablebooks
grant-applicationWeb publishing tool funding application11/21/2023executablebooks
mdformat-pluginA template for creating an mdformat parser extension plugin11/3/2023executablebooks
sphinx-remove-toctreesSpeed up Sphinx builds by selectively removing toctrees from some pages11/3/2023executablebooks
markdown-it-myst-extrasAdditional plugins required for the MyST specification9/26/2023executablebooks
markdown-it-dollarmathA markdown-it plugin for $-delimited math9/26/2023executablebooks
markdown-it-amsmathA markdown-it plugin for amsmath LaTeX environments.9/26/2023executablebooks
sphinx-proofA Sphinx extension for producing proof, theorem, lemma, definition, remark, conjecture, corollary and algorithm directives.9/18/2023executablebooks
mdformat-mystMdformat plugin for MyST compatibility8/26/2023executablebooks
mdformat-deflistmdformat plugin for deflist8/26/2023executablebooks
staged-recipesA place to submit conda recipes before they become fully fledged conda-forge feedstocks8/1/2023executablebooks
sphinx-commentshypothes.is interaction layer with Sphinx5/3/2023executablebooks
myst-article-themeA light-weight theme for rendering scientific articles and associated notebooks4/26/2023executablebooks
myst-book-themeA lightweight MyST theme designed to mimic the look-and-feel of an interactive book.4/26/2023executablebooks
markdown-it-docutilsA markdown-it plugin for implementing docutils style roles/directives.3/6/2023executablebooks
jupyterlab-mystjsTO ARCHIVE: Jupyterlab extension using the MySTjs parser2/10/2023executablebooks
sphinx-exerciseA Sphinx extension for producing exercise and solution directives.1/23/2023executablebooks
markdown-it-plugin-templateA template for creating a markdown-it plugin.1/9/2023executablebooks
sphinx-examplesA Sphinx extension to create examples of source markdown and the result of rendering it.5/3/2022executablebooks
mdformat-footnoteFootnote format addition for mdformat2/16/2022executablebooks
quantecon-mini-exampleA short example showing how to write a lecture series using Jupyter Book 2.0.11/13/2021executablebooks
sphinx-multitoc-numberingA Sphinx extension to support continuous numbering of sections across multiple tocs in HTML output.7/6/2021executablebooks
myst-reactTO ARCHIVE: A web-based UI for rendering MyST Markdown5/28/2021executablebooks
sphinx-tomystA sphinx translator for producing myst syntax files5/26/2021executablebooks
myst-standardTO ARCHIVE: A meta-repository to discuss and plan for the MyST standard5/20/2021executablebooks
sphinx-yaml-config5/8/2021executablebooks
jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts4/25/2021executablebooks
quantecon-exampleA demonstration of Jupyter Book functionality using QuantEcon Python programming source material.10/30/2020executablebooks
sphinx-conditional-assetA small extension for developers of Sphinx to conditionally add assets to a page.10/25/2020executablebooks
mistletoe-ebpThe EPB fork of mistletoe: A fast, extensible and spec-compliant Markdown parser in pure Python.8/6/2020executablebooks
mappingsWork on Mappings between IPYNB-RST and IPYNB-MD++7/29/2020executablebooks
rst2mystTools for converting RST files to MyST-NB files6/23/2020executablebooks
python-pkg-cookiecutterA cookiecutter for python packages, with docs and GitHub Actions CI6/3/2020executablebooks
sphinx-ext-autodocAuto-documentation for sphinx extension components6/3/2020executablebooks
myst-nb.example-projectAn example project for working with myst-nb and developing myst syntax6/3/2020executablebooks
tcs_to_jbFor conversion of TCS to Jupyter Book format5/26/2020executablebooks
cli🛑🛑DEPRECATED, see https://github.com/ExecutableBookProject/jupyter-book🛑🛑5/15/2020executablebooks
multi-book-demo5/1/2020executablebooks
myst-parser.example-projectAn self contained example project for testing and development of myst syntax using myst-parser4/11/2020executablebooks
sphinx-jupyter-book-themeAn experimental Sphinx theme for Jupyter Book3/5/2020executablebooks
sphinx-globaltoc2/29/2020executablebooks
write_upsWrite ups and publications that document the project2/25/2020executablebooks
markup_test_casesMarkup test cases for source files2/14/2020executablebooks
profile-sphinx-siteA tiny repository to profile a Sphinx site1/23/2020executablebooks
mystTO ARCHIVE: Myst - Markedly Structured Text11/17/2019executablebooks