written by Eric J. Ma on 2020-09-12 | tags: jupyter notebooks data science education teaching binder
I recently figured out how to dynamically insert a Binder badge into HTML pages built from Jupyter notebooks, so that users can one-click directly open a Jupyter notebook in the correct conda
environment without needing to navigate or build an environment from scratch. Come see how I figured this out!
I recently learned a thing! If you write tutorial material in Jupyter notebooks, it's possible to include a Binder link directly to a notebook, such that Binder opens up directly inside that notebook (rather than in the file browser).
The "vanilla" link one usually gets from mybinder.org looks like this (using Network Analysis Made Simple as an example):
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/ericmjl/Network-Analysis-Made-Simple/master)
More generally speaking, the anatomy of the URL is:
https://mybinder.org/v2/<PROVIDER>/<REPO_NAME>/<BRANCH/TAG/COMMIT>
Now, if you want to point directly to a file to be opened on Binder launch, you would instead do something like this:
https://mybinder.org/v2/gh/ericmjl/Network-Analysis-Made-Simple/master?filepath=docs%2F01-introduction%2F02-networkx-intro.ipynb
The general form of the URL looks now like the following:
https://mybinder.org/v2/<PROVIDER>/<REPO_NAME>/<BRANCH/TAG/COMMIT>?filepath=<FILE_PATH>
Here, the <FILE_PATH>
is a POSIX-style string relative to the repository root. A thing to note: all of the /
characters in the <FILE_PATH>
probably have to be replaced with %2F
, otherwise the URL might not work correctly!
Using this pattern, I was able to insert a Launch Binder icon for all of my Jupyter notebooks in the Network Analysis Made Simple repository!
That said, manually inserting that many Launch Binder icons by hand is not an easy-to-maintain thing. Is there a better way? You bet!
Leveraging the Jupyter notebook Python API (the nbformat
package) as well as the mkdocs
navigation section, I was able to write a few custom functions that inserted a correct Binder URL with the badge into the top of each notebook before building the HTML pages with mkdocs
. The code roughly looked like this:
badge_url = f"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/ericmjl/Network-Analysis-Made-Simple/master?filepath=docs%2F{nb_relpath.parent.name}%2F{nb_relpath.name})" nb_path = docroot / nb_relpath nb["cells"].insert(0, nbformat.v4.new_markdown_cell(source=badge_url))
The full build script is located here.
I thought this might be a useful addition to mknotebooks
, which handles Jupyter notebook preprocessing for mkdocs
, so I also raised an issue up there to see if the maintainer of mknotebooks
is interested in it!
@article{
ericmjl-2020-add-notebooks,
author = {Eric J. Ma},
title = {Add a direct Binder link for built HTML notebooks},
year = {2020},
month = {09},
day = {12},
howpublished = {\url{https://ericmjl.github.io}},
journal = {Eric J. Ma's Blog},
url = {https://ericmjl.github.io/blog/2020/9/12/add-a-direct-binder-link-for-built-html-notebooks},
}
I send out a newsletter with tips and tools for data scientists. Come check it out at Substack.
If you would like to sponsor the coffee that goes into making my posts, please consider GitHub Sponsors!
Finally, I do free 30-minute GenAI strategy calls for teams that are looking to leverage GenAI for maximum impact. Consider booking a call on Calendly if you're interested!