<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Chris Holdgraf</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-chris-holdgraf.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-04-22T13:01:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>How we combine multiple repositories into one website at jupyterbook.org</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/how-we-combine-multiple-repositories-into-one-website/" rel="alternate"/><published>2026-04-22T13:01:00+00:00</published><updated>2026-04-22T13:01:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2026-04-22:/medium-archive/pelican/posts/2026/how-we-combine-multiple-repositories-into-one-website/</id><summary type="html">&lt;p&gt;The Jupyter Book project has content in a bunch of different repositories — user docs, a blog, a team compass, and project &amp;amp; community…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Jupyter Book project has content in a bunch of different repositories — &lt;a href="https://github.com/jupyter-book/jupyter-book"&gt;user docs&lt;/a&gt;, &lt;a href="https://github.com/jupyter-book/blog"&gt;a blog&lt;/a&gt;, &lt;a href="https://github.com/jupyter-book/team-compass"&gt;a team compass&lt;/a&gt;, and &lt;a href="https://github.com/jupyter-book/jupyterbook.org"&gt;project &amp;amp; community pages&lt;/a&gt;. We recently finished an initiative to serve each set of content at &lt;code&gt;jupyterbook.org&lt;/code&gt;, while keeping the source files separated in their repositories.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Book builds tools and standards for communicating and publishing computational narratives." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/how-we-combine-multiple-repositories-into-one-website/images/001-1_5u-ku4TtFxBSmtmjTPqhfA_2x.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Book builds tools and standards for communicating and publishing computational narratives.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Getting there required a combination of Netlify configuration and several improvements to MyST and the MyST theme along the way. This post walks through the pieces and how they fit together, so you can do something similar with a multi-repo project.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cross-posted with this&lt;/em&gt; &lt;a href="https://jupyterbook.org/blog/posts/2026/multi-repo"&gt;&lt;em&gt;Jupyter Book blog post&lt;/em&gt;&lt;/a&gt; &lt;em&gt;where you can see the MyST engine in action.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="why-is-this-useful"&gt;Why is this useful?&lt;/h2&gt;
&lt;p&gt;Two things bugged us about the old setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We had multiple types of content embedded in one repository. In particular we had &lt;strong&gt;versioned user documentation&lt;/strong&gt; alongside &lt;strong&gt;evergreen community documentation&lt;/strong&gt; (e.g., &lt;a href="https://jupyterbook.org/roadmap"&gt;the roadmaps page&lt;/a&gt;). This meant we had duplicated content for some user documentation, and a slow lag time before it’d make it’s way into &lt;code&gt;/stable&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search engines treat subdomains as separate websites, so &lt;code&gt;blog.jupyterbook.org&lt;/code&gt; wasn’t helping &lt;code&gt;jupyterbook.org&lt;/code&gt; in search rankings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We wanted &lt;code&gt;jupyterbook.org&lt;/code&gt;, &lt;code&gt;jupyterbook.org/blog&lt;/code&gt;, &lt;code&gt;jupyterbook.org/stable&lt;/code&gt;, &lt;code&gt;jupyterbook.org/compass&lt;/code&gt; all under one roof, with each repo still deploying on its own via static websites.&lt;/p&gt;
&lt;p&gt;We accomplished this with &lt;strong&gt;Netlify proxy rules&lt;/strong&gt; and &lt;strong&gt;shared MyST configuration&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id="proxying-sub-sites-with-netlify-rewrites"&gt;Proxying sub-sites with Netlify rewrites&lt;/h2&gt;
&lt;p&gt;We discovered that &lt;a href="https://docs.netlify.com/routing/redirects/rewrites-proxies/"&gt;Netlify reverse proxy rules&lt;/a&gt; are a great way to accomplish this. These essentially intercept queries to a URL path (eg. &lt;code&gt;/blog/**&lt;/code&gt;) and serve content at that path from elsewhere (e.g., &lt;code&gt;blog.jupyterbook.org&lt;/code&gt;). The browser sees &lt;code&gt;jupyterbook.org/blog&lt;/code&gt;, but Netlify fetches the content from a totally different site behind the scenes.&lt;/p&gt;
&lt;p&gt;We set up a &lt;a href="https://github.com/jupyter-book/jupyterbook.org"&gt;“jupyterbook.org” repo&lt;/a&gt; that serves the landing page and our evergreen community documentation, and proxies everything else:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; - served directly from the &lt;a href="https://github.com/jupyter-book/jupyterbook.org"&gt;jupyterbook.org repo&lt;/a&gt; (served on Netlify)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/blog&lt;/code&gt; - proxied from the &lt;a href="https://github.com/jupyter-book/blog"&gt;blog repo&lt;/a&gt; (served on Netlify)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compass&lt;/code&gt; - proxied from the &lt;a href="https://github.com/jupyter-book/team-compass"&gt;team-compass repo&lt;/a&gt; (Served on Netlify)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/stable&lt;/code&gt; - proxied from the &lt;a href="https://github.com/jupyter-book/jupyter-book"&gt;jupyter-book repo&lt;/a&gt; (served on &lt;a href="https://readthedocs.org"&gt;ReadTheDocs&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s what the &lt;code&gt;netlify.toml&lt;/code&gt; looks like (simplified):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;another&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Netlify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;[redirects&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;/blog/*&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;https://jupyter-book-blog.netlify.app/blog/:splat&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ReadTheDocs&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;[redirects&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;/stable/*&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;https://jupyter-book.readthedocs.io/stable/:splat&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each repo deploys independently, meaning we can update the content at whatever cadence is best for that repository. The &lt;a href="http://jupyterbook.org"&gt;jupyterbook.org&lt;/a&gt; repo only needs updating when the nav structure changes. But making it all &lt;em&gt;feel&lt;/em&gt; like one site took some work on the MyST side.&lt;/p&gt;
&lt;h2 id="shared-configuration-with-extends"&gt;Shared configuration with &lt;code&gt;extends&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;MyST’s &lt;code&gt;extends:&lt;/code&gt; &lt;a href="https://mystmd.org/guide/external-references"&gt;configuration&lt;/a&gt; lets one project inherit configuration from another. We use this to share navbar, logo, and favicon config across all sub-sites from a single &lt;code&gt;site.yml&lt;/code&gt; in the core repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; In the blog&amp;#39;s myst.yml
extends:
  &lt;span class="k"&gt;-&lt;/span&gt; https://github.com/jupyter-book/jupyterbook.org/raw/refs/heads/main/docs/_site/site.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If we change the configuration at that file, it’ll automatically be inherited in every other repository when we re-build it (usually done on each commit, or on a daily CRON job with GitHub Actions).&lt;/p&gt;
&lt;p&gt;Here are a few useful things that we’ve shared across sites via the pattern above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigation bar URLs&lt;/li&gt;
&lt;li&gt;Site footer configuration&lt;/li&gt;
&lt;li&gt;Site branding (logo, titles, etc)&lt;/li&gt;
&lt;li&gt;Announcement bars (when we need a temporary announcement to show up everywhere)&lt;/li&gt;
&lt;li&gt;Internal domain configuration (see above)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Along the way we &lt;a href="https://github.com/jupyter-book/mystmd/issues/2126"&gt;added&lt;/a&gt; &lt;code&gt;parts:&lt;/code&gt; &lt;a href="https://github.com/jupyter-book/mystmd/issues/2126"&gt;support to the&lt;/a&gt; &lt;code&gt;extends:&lt;/code&gt; &lt;a href="https://github.com/jupyter-book/mystmd/issues/2126"&gt;key&lt;/a&gt; to get this working.&lt;/p&gt;
&lt;h2 id="one-gotcha-base_url-for-asset-paths"&gt;One gotcha: &lt;code&gt;BASE_URL&lt;/code&gt; for asset paths&lt;/h2&gt;
&lt;p&gt;MyST bakes &lt;code&gt;BASE_URL&lt;/code&gt; into CSS, JS, and image paths at build time. If you build with &lt;code&gt;BASE_URL=/&lt;/code&gt; but serve at &lt;code&gt;/blog&lt;/code&gt;, none of those load properly.&lt;/p&gt;
&lt;p&gt;To fix this, each sub-site builds with &lt;code&gt;BASE_URL&lt;/code&gt; set to its final path on &lt;a href="http://jupyterbook.org"&gt;jupyterbook.org&lt;/a&gt;. For example, here’s some &lt;a href="https://github.com/jupyter-book/blog/blob/main/netlify.toml"&gt;Netlify config&lt;/a&gt; from the blog that does this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[build]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;publish&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# This ensures that `/blog` is appended to asset paths&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;environment = { BASE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/blog&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="na"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;cd docs &amp;amp;&amp;amp; myst build --html &amp;amp;&amp;amp; \&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;mkdir -p ../publish/blog &amp;amp;&amp;amp; \&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Here we move the HTML assets to the blog&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;mv _build/html/* ../publish/blog/&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="internal_domains-for-cross-site-navigation"&gt;&lt;code&gt;internal_domains&lt;/code&gt; for cross-site navigation&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BASE_URL&lt;/code&gt; fixes asset loading, but it doesn’t fix navigation. Jupyter Book used to treat full URLs as “external” links, adding an extra icon and opening a new tab when clicked. This led to a bunch of tabs any time you navigated around &lt;a href="http://jupyterbook.org"&gt;jupyterbook.org&lt;/a&gt;, and was &lt;a href="https://github.com/jupyter-book/mystmd/issues/2719"&gt;also reported by the Project Pythia team&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We added an &lt;code&gt;internal_domains&lt;/code&gt; &lt;a href="https://github.com/jupyter-book/myst-theme/pull/816"&gt;option&lt;/a&gt; to fix this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;internal_domains&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jupyterbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;org&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the theme treats any link to &lt;code&gt;jupyterbook.org&lt;/code&gt; as internal. It provides same-tab navigation and no external link icon, even though the link is technically a full URL.&lt;/p&gt;
&lt;h2 id="want-to-do-this-too"&gt;Want to do this too?&lt;/h2&gt;
&lt;p&gt;Hopefully this is a useful workflow for communities that have multiple repositories of content.&lt;/p&gt;
&lt;p&gt;All of the config is in &lt;a href="https://github.com/jupyter-book/jupyterbook.org"&gt;jupyter-book/jupyterbook.org&lt;/a&gt;, and the tracking issue with the full story is &lt;a href="https://github.com/jupyter-book/jupyter-book/issues/2528"&gt;jupyter-book/jupyter-book#2528&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you’ve got questions about this work, come chat with us at &lt;a href="https://discord.mystmd.org"&gt;discord.mystmd.org&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to &lt;a href="https://projectpythia.org/"&gt;Project Pythia&lt;/a&gt; for providing additional guidance, collaboration, and support for this work.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;a href="https://docs.earthscope.org/en/latest/intro.html"&gt;EarthScope&lt;/a&gt; for giving user feedback about the usefulness of this as they explore converting their docs to the new MyST engine.&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Jupyter Book"/><category term="MyST"/></entry><entry><title>Announcing our first Jupyter Community Funded Proposals</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/announcing-our-first-jupyter-community-funded-proposals/" rel="alternate"/><published>2025-11-04T19:19:00+00:00</published><updated>2025-11-04T19:19:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2025-11-04:/medium-archive/pelican/posts/2025/announcing-our-first-jupyter-community-funded-proposals/</id><summary type="html">&lt;p&gt;We are thrilled to announce the results of our first round of Jupyter Community Funding proposals. This is the first funding call from the…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are thrilled to announce the results of our first round of &lt;a href="/posts/2025/your-ideas-our-support-jupyter-community-call-for/"&gt;Jupyter Community Funding proposals&lt;/a&gt;. This is the first funding call from the &lt;a href="http://jupyterfoundation.org"&gt;Jupyter Foundation&lt;/a&gt; to directly solicit proposals from the Jupyter community.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/announcing-our-first-jupyter-community-funded-proposals/images/001-1_mLI9dFl_eCv-u4S_t1J71Q_2x.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We received many outstanding ideas from community members. We are so grateful for the time and effort everyone put into their submissions. This is a new process for us, and we’ve already learned a lot. We’re excited to take this first step in directly supporting community-driven work.&lt;/p&gt;
&lt;p&gt;After a careful review, we are happy to fund the following proposals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/7"&gt;&lt;strong&gt;More reliable visual testing for Jupyter frontends&lt;/strong&gt;&lt;/a&gt;: This project will improve visual regression and integration testing across Jupyter frontends. We hope this will lower maintenance costs and reduce maintainer burnout by making testing more reliable.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/9"&gt;&lt;strong&gt;Separating JupyterLab’s build system for easier maintenance&lt;/strong&gt;&lt;/a&gt;: This work will finish separating JupyterLab’s build system into a standalone tool. This will make maintenance easier for both core developers and extension authors.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/16"&gt;&lt;strong&gt;Improving keyboard accessibility in JupyterLab&lt;/strong&gt;&lt;/a&gt;: This proposal will focus on making JupyterLab fully navigable via keyboard and testing with disabled users. The goal is to find and fix key accessibility blockers, making the tools more usable for everyone.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/6"&gt;&lt;strong&gt;Growing the contributor community for JupyterHub and JupyterBook&lt;/strong&gt;&lt;/a&gt;: This project will tackle efforts like team coordination and mentorship pipelines with clear entry points for contributions. We hope this will grow our contributor base by making it easier to attract, retain, and leverage community contributions.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/11"&gt;&lt;strong&gt;Improving code quality with custom linting rules&lt;/strong&gt;&lt;/a&gt;: This proposal will develop custom linting rules to enforce project-specific standards in the JupyterLab and Notebook codebases. This will help catch common issues early and improve the long-term health of the code.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-governance/funding-proposals/issues/8"&gt;&lt;strong&gt;Reviving the extension playground for easier prototyping&lt;/strong&gt;&lt;/a&gt;: This project will revive and improve the extension playground, a tool for prototyping new extensions. We’re excited for this to lower the entry barrier for extension development and help the ecosystem grow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A huge thank you to everyone who submitted a proposal and participated in the review. We also want to thank the authors of proposals that were not funded in this round. We particularly appreciate their effort and hope they will continue to engage with this process.&lt;/p&gt;
&lt;p&gt;We’re excited to see these projects develop and support the dedicated people behind them. This is just the beginning, and we look forward to more community funding opportunities in the future.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We want to send a special thank-you to&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/savannahostrowski"&gt;&lt;em&gt;Savannah Ostrowski&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, former Jupyter Foundation board treasurer, for her work in setting up this initial round of funding.&lt;/em&gt;&lt;/p&gt;
</content><category term="funding"/><category term="Jupyter Foundation"/><category term="sustainability"/></entry><entry><title>Your Ideas, Our Support: Jupyter Community Call For Funding Proposals</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/your-ideas-our-support-jupyter-community-call-for/" rel="alternate"/><published>2025-08-28T15:18:00+00:00</published><updated>2025-09-26T23:11:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2025-08-28:/medium-archive/pelican/posts/2025/your-ideas-our-support-jupyter-community-call-for/</id><summary type="html">&lt;p&gt;The Jupyter Executive Council and Jupyter Foundation are pleased to announce a call for proposals for the Jupyter community. Visit the…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/your-ideas-our-support-jupyter-community-call-for/images/001-1_62F-8MV2IQQToNrR4GdU_g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://jupyter.org/about#executive-council-members"&gt;Jupyter Executive Council&lt;/a&gt; and &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; are pleased to announce a call for proposals for the Jupyter community. Visit the &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;Jupyter Foundation Community Proposals webpage&lt;/a&gt; to learn more about the process and how to submit proposals. &lt;strong&gt;The&lt;/strong&gt; &lt;a href="https://jupyterfoundation.org/community-funding-proposals"&gt;&lt;strong&gt;call for proposals&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;is open through Sunday, October 5th, 2025.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;edit: We’ve decided to extend this by one week to give a few in-progress proposals time to write and submit! The new deadline is October 5th.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Jupyter Foundation began its operations in early 2025 with a mission to use its resources to support the Jupyter community. We’ve set up the operations, structure, goals, and strategy of the Jupyter Foundation and published them on the &lt;a href="https://compass.jupyterfoundation.org"&gt;Foundation team compass&lt;/a&gt;. We’ve had several rounds of &lt;a href="https://github.com/jupyter-governance/jupyter-foundation-governing-board/issues/1"&gt;feedback from the Jupyter community&lt;/a&gt; and defined the Foundation’s &lt;a href="https://jupyter-governance.github.io/jupyter-foundation-governing-board/strategy/"&gt;overall goals&lt;/a&gt; for its first year of operation.&lt;/p&gt;
&lt;p&gt;Our first funding allocation supported events that grow the connections within the Jupyter community via the &lt;a href="/posts/2025/jupyter-community-workshops-are-back/"&gt;community workshops series&lt;/a&gt; as well as our connection with the broader data science community via &lt;a href="https://jupytercon.com"&gt;JupyterCon 2025&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the next wave of funding for the community, we’re running an experiment to directly solicit funding proposals from the Jupyter community. We think this will result in a strong clear connection between the Foundation’s funds and the needs of Jupyter’s maintainers, contributors, power users, and advocates.&lt;/p&gt;
&lt;h2 id="the-call-for-proposals-is-open-through-sunday-october-5th-2025"&gt;The &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;call for proposals&lt;/a&gt; is open through Sunday, &lt;strong&gt;October 5th, 2025&lt;/strong&gt;.&lt;/h2&gt;
&lt;p&gt;Visit the &lt;a href="https://jupyterfoundation.org/community-funding-proposals/"&gt;Community Proposals webpage&lt;/a&gt; to learn how to submit a proposal and the &lt;a href="https://jupyter-governance.github.io/jupyter-foundation-governing-board/funding/process/"&gt;Jupyter Foundation team compass&lt;/a&gt; for more detailed background about this funding call.&lt;/p&gt;
&lt;p&gt;In this first round, one of our goals is to &lt;em&gt;learn&lt;/em&gt;. We’d like to learn how to administer a community call like this as well as what kind of value it delivers to the Jupyter community. We’ve set minimum targets for funding disbursement and hope to grow our funding allotment as we iterate from here.&lt;/p&gt;
&lt;p&gt;To help inspire proposals we are particularly excited to fund, we’ve defined &lt;a href="https://jupyter-governance.github.io/jupyter-foundation-governing-board/funding/priorities/"&gt;funding priorities for the Jupyter Foundation&lt;/a&gt;. These are key outcomes that we must improve in order to grow the overall health and impact of the ecosystem. Briefly summarizing, these priorities are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grow the contributor capacity of Jupyter&lt;/strong&gt;. We would like to grow the number of contributors, improve the efficiency of existing contributors, and facilitate learning across Jupyter subprojects. We’d love to see proposals that help us mobilize and support the total pool of energy available to contribute to Jupyter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improve the reliability, security, and consistency of Jupyter’s software and team practices.&lt;/strong&gt; We believe that our technology will be more impactful and easier to contribute to and deploy if we improve our development infrastructure and team practices in ways that contribute to reliability, security, and consistency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While we’re particularly excited about these outcomes and aim to focus funding on proposals that clearly feed into one or both of these priorities, we also encourage people to get creative and submit proposals for outcomes that have high impact and strategic value for the Jupyter community. We’re excited to see what others come up with, and are eager to work with you in unlocking critical funding in support of Jupyter’s community.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;We are grateful for the support of the &lt;a href="https://jupyterfoundation.org"&gt;Jupyter Foundation&lt;/a&gt; and its &lt;a href="https://jupyterfoundation.org/members"&gt;members&lt;/a&gt; that makes this opportunity possible. If your organization would like to support this program, please &lt;a href="https://jupyterfoundation.org/contact/"&gt;contact the Jupyter Foundation&lt;/a&gt;.&lt;/p&gt;
</content><category term="funding"/><category term="Jupyter Foundation"/></entry><entry><title>Simplifying and speeding up Binder builds with BuildKit</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/" rel="alternate"/><published>2025-03-03T14:05:00+00:00</published><updated>2025-03-03T14:05:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2025-03-03:/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/</id><summary type="html">&lt;p&gt;The Binder Project allows users to build reproducible, sharable environments for interactive computing. To accomplish this, Binder uses a…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The &lt;a href="http://mybinder.org"&gt;Binder Project&lt;/a&gt; allows users to build reproducible, sharable environments for interactive computing. To accomplish this, Binder uses a tool called &lt;a href="https://repo2docker.readthedocs.io/"&gt;repo2docker&lt;/a&gt; to generate an executable Docker image using the &lt;a href="https://repo2docker.readthedocs.io/en/latest/specification.html"&gt;Reproducible Execution Environment Specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/images/001-1_NOEeFGGHdpGZMHSq5ykl9A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The first time a repository is launched on Binder, repo2docker must build the reproducible environment for it. This process can take a long time because of all the dependencies that need to be installed and turned into the image. As a result, Binder launches can feel slow and clunky, which is a poor UX for workflows that are designed around quick interactive sessions.&lt;/p&gt;
&lt;p&gt;repo2docker was built several years ago, and followed patterns that were commonplace at the time. However, in the past few years the Docker community has made significant advances in optimizing the image building process. One-such improvement is the creation of &lt;a href="https://docs.docker.com/build/buildkit/"&gt;BuildKit&lt;/a&gt;, a replacement for Docker’s historical build system that is much more sophisticated. However, repo2docker hasn’t leveraged these improvements because it was still using the original Docker Build system.&lt;/p&gt;
&lt;p&gt;So, we’ve decided to spend a few cycles modernizing repo2docker’s image building logic by using the more modern &lt;a href="https://docs.docker.com/build/buildkit/"&gt;BuildKit API&lt;/a&gt; (via ‘docker buildx build’). This allows for optimizations like build parallelization, better build caching, and supporting some &lt;code&gt;Dockerfile&lt;/code&gt; features that Binder didn’t support earlier (particularly, &lt;code&gt;COPY --chown&lt;/code&gt;). It also lays a foundation for significantly simplifying the repo2docker build infrastructure and leveraging more of BuildKit’s parallelization functionality. For example, we’d like to &lt;a href="https://docs.docker.com/build/builders/drivers/kubernetes/"&gt;leverage BuildKit’s Kubernetes driver&lt;/a&gt; which distributes builds much more efficiently and in parallel.&lt;/p&gt;
&lt;p&gt;Authors of Binder repositories won’t need to take any action¹, and they’ll simply notice that mybinder.org (and any other community-run BinderHub instance) will be a bit snappier at building images.&lt;/p&gt;
&lt;p&gt;If you’d like to learn more about the changes that enabled this, &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/pull/3225"&gt;check out this mybinder.org pull request&lt;/a&gt; which has links to the repo2docker pull requests that added this functionality. We’re excited keep improving Binder, and are hopeful that this makes the experience of using mybinder.org and community Binders a little bit better.&lt;/p&gt;
&lt;h2 id="authors-and-acknowledgements"&gt;Authors and acknowledgements&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://github.com/yuvipanda"&gt;Yuvi Panda&lt;/a&gt; is a co-founder and the Technical Lead at &lt;a href="http://2i2c.org"&gt;2i2c&lt;/a&gt;. He is passionate about building participatory open infrastructure for scientific &amp;amp; educational use cases. He is a Project Jupyter team member primarily focused on infrastructure related projects (JupyterHub, Binder, etc). He also wrote most of the code for this &lt;code&gt;docker buildx&lt;/code&gt; transition, and shepherded it through to deployment on mybinder.org as well. He is ex-Wikimedia and ex-GNOME. Let’s eliminate accidental complexities wherever we find them.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrisholdgraf.com"&gt;Chris Holdgraf&lt;/a&gt; is a co-founder and the Executive Director of &lt;a href="http://2i2c.org"&gt;2i2c&lt;/a&gt;. He is on the Executive Council of Project Jupyter, and co-leads the &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html#jupyterhub-team"&gt;JupyterHub and Binder team&lt;/a&gt; as well as the &lt;a href="https://compass.jupyterbook.org"&gt;Jupyter Book team&lt;/a&gt;). He was previously a post-doctoral researcher in the Department of Statistics at &lt;a href="https://www.berkeley.edu/"&gt;UC Berkeley&lt;/a&gt;, and a Community Architect with the &lt;a href="https://data.berkeley.edu/"&gt;Division of Data Science&lt;/a&gt; at Berkeley. He’s interested in using open infrastructure to support interactive computing workflows in research and education.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href="https://github.com/minrk"&gt;@minrk&lt;/a&gt;, &lt;a href="https://github.com/manics"&gt;@manics&lt;/a&gt;, and &lt;a href="https://github.com/consideRatio"&gt;@consideRatio&lt;/a&gt; for their help reviewing and shaping this work.&lt;/p&gt;
&lt;h2 id="footnotes"&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;¹ Unless they were relying on undocumented implementation details of the old builder — in particular, the presence of a &lt;code&gt;/.dockerenv&lt;/code&gt; file to detect if you are running in repo2docker &lt;a href="https://github.com/scikit-learn/scikit-learn/pull/30835"&gt;scikit-learn/scikit-learn#30835&lt;/a&gt; has an example.&lt;/p&gt;
</content><category term="Binder"/><category term="cloud computing"/><category term="JupyterHub"/><category term="reproducibility"/></entry><entry><title>CZI awards three EOSS grants to Jupyter community members</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/" rel="alternate"/><published>2021-10-14T20:30:00+00:00</published><updated>2021-10-14T20:32:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2021-10-14:/medium-archive/pelican/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/</id><summary type="html">&lt;p&gt;Read on for a short description of each effort.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Jupyter community is pleased to announce that members of its community have received three awards from the CZI &lt;a href="https://chanzuckerberg.com/eoss/"&gt;Essential Open Source Software grant series&lt;/a&gt;. This grant series has previously funded work in the Jupyter ecosystem such as &lt;a href="https://chanzuckerberg.com/eoss/proposals/real-time-collaboration-in-jupyter/"&gt;real-time collaboration in JupyterLab&lt;/a&gt; and JupyterHub’s &lt;a href="https://chanzuckerberg.com/eoss/proposals/jupyterhub-contributor-in-residence-program/"&gt;Contributor in Residence pilot&lt;/a&gt;. Read below for a brief overview of the recently-funded proposals!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="CZI’s Essential Open Source Software for Science program supports software maintenance, growth, development, and community engagement for critical open source tools." src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/images/001-1_UBrbPqVueIypC9GA9wAccg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;CZI’s &lt;a href="https://chanzuckerberg.com/eoss/"&gt;Essential Open Source Software for Science program&lt;/a&gt; supports software maintenance, growth, development, and community engagement for critical open source tools.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="accessibility-in-jupyter"&gt;Accessibility in Jupyter&lt;/h2&gt;
&lt;p&gt;One of the biggest challenges in building complex web-based applications is ensuring that they are accessible to a broad and diverse audience of users. Improving accessibility requires dedicated time and significant expertise in understanding the major challenges to overcome. Tania (&lt;a href="https://discourse.jupyter.org/u/trallard"&gt;&lt;strong&gt;@trallard&lt;/strong&gt;&lt;/a&gt;), Isabela (&lt;a href="https://discourse.jupyter.org/u/isabela-pf"&gt;&lt;strong&gt;@isabela-pf&lt;/strong&gt;&lt;/a&gt;), and Tony (&lt;a href="https://discourse.jupyter.org/u/tonyfast"&gt;&lt;strong&gt;@tonyfast&lt;/strong&gt;&lt;/a&gt;) were recently awarded an EOSS award to dedicate time and development towards making Jupyter tools more accessible. You can follow some of their work in the &lt;a href="https://github.com/jupyter/accessibility"&gt;Accessibility repository&lt;/a&gt; and see &lt;a href="https://github.com/jupyter/accessibility/blob/f01fe0a71fb0bfcc27211caf916fd6802478834b/grant-applications/Inclusive_and_Accessible_Scientific_Computing_in_Jupyter_Ecosystem_SUBMITTED_PROPOSAL.pdf"&gt;the original text of this proposal here&lt;/a&gt;. This grant will be led by Tania, Isabela, and Tony (each at &lt;a href="https://www.quansight.com/labs"&gt;QuanSight Labs&lt;/a&gt;), and administered by the team at &lt;a href="https://www.quansight.com/labs"&gt;QuanSight Labs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="interactive-documentation"&gt;Interactive documentation&lt;/h2&gt;
&lt;p&gt;Because Jupyter is a dynamic and web-based interface, you can do a lot more with interactive documentation than is possible on traditional static websites. &lt;a href="https://discourse.jupyter.org/u/carreau"&gt;&lt;strong&gt;@carreau&lt;/strong&gt;&lt;/a&gt; was awarded an EOSS grant to improve the state of interactive documentation within Jupyter. You can &lt;a href="https://labs.quansight.org/blog/2021/05/rethinking-jupyter-documentation/"&gt;check out some of his early ideas in this blog post&lt;/a&gt;. This grant will be led by Matthias Bussonnier at &lt;a href="https://www.quansight.com/labs"&gt;QuanSight Labs&lt;/a&gt;, and administered by the team at &lt;a href="https://www.quansight.com/labs"&gt;QuanSight Labs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="community-strategic-support-for-jupyterhub"&gt;Community strategic support for JupyterHub&lt;/h2&gt;
&lt;p&gt;The JupyterHub community built off of its Contributor in Residence pilot to propose a dedicated role for designing and developing community strategy for the JupyterHub sub-project. This role will spearhead efforts to ensure that there are inclusive and effective pathways into and throughout the JupyterHub community, with the goal of sharing best-practices with others in Jupyter and PyData ecosystems. You can follow along with this work in the &lt;a href="https://github.com/jupyterhub/team-compass"&gt;JupyterHub Team Compass&lt;/a&gt; and find &lt;a href="https://drive.google.com/file/d/124LWcFe8Hq2n_3l4jAgDgJ1lpXRzV1Kc/view?usp=sharing"&gt;the original text of this proposal here&lt;/a&gt;. This effort will be led by Sarah Gibson(&lt;a href="https://discourse.jupyter.org/u/sgibson91"&gt;&lt;strong&gt;@sgibson91&lt;/strong&gt;&lt;/a&gt;) and Chris Holdgraf (&lt;a href="https://discourse.jupyter.org/u/choldgraf"&gt;&lt;strong&gt;@choldgraf&lt;/strong&gt;&lt;/a&gt;) (both at &lt;a href="https://2i2c.org"&gt;2i2c&lt;/a&gt;), and Sarah will serve as our first community strategic lead. The grant will be administered by the team at &lt;a href="https://numfocus.org/"&gt;NumFocus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Congrats to the recipients of these awards, we’re excited to see what comes out of this work! And many thanks to all of the community members that helped write and refine these proposals.&lt;/p&gt;
</content><category term="community"/><category term="sustainability"/></entry><entry><title>Announcing the new Jupyter Book</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/" rel="alternate"/><published>2020-08-12T19:55:00+00:00</published><updated>2020-08-12T20:07:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2020-08-12:/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/</id><summary type="html">&lt;p&gt;Note: this announcement is cross-posted between the Jupyter Blog and the Executable Book Project updates blog&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Note: this announcement is cross-posted between the&lt;/em&gt; &lt;a href="https://blog.jupyter.org/"&gt;&lt;em&gt;Jupyter Blog&lt;/em&gt;&lt;/a&gt; &lt;em&gt;and the&lt;/em&gt; &lt;a href="https://executablebooks.org/en/latest/updates/index.html"&gt;&lt;em&gt;Executable Book Project updates blog&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/images/001-1_7SNQTEdxo9qTuEpR-yUNZQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Jupyter Book is an open source project for building beautiful, publication-quality books, websites, and documents from source material that contains computational content. With this post, we’re happy to announce that Jupyter Book has been re-written from the ground up, making it easier to install, faster to use, and able to create more complex publishing content in your books. It is now supported by &lt;a href="https://executablebooks.org/en/latest/"&gt;the Executable Book Project&lt;/a&gt;, an open community that builds open source tools for interactive and executable documents in the Jupyter ecosystem and beyond.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The new Jupyter Book interface, highlighting how you can insert code outputs into your content" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/images/002-0_ExwTAlNcaJadUOkS.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The new Jupyter Book interface, highlighting how you can &lt;a href="https://jupyterbook.org/content/glue.html"&gt;insert code outputs into your content&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This post is a short overview of the new features in Jupyter Book, and gives some background on the future of the project.&lt;/p&gt;
&lt;p&gt;You can also browse the &lt;a href="https://jupyterbook.org/"&gt;new Jupyter Book documentation&lt;/a&gt;, or &lt;a href="https://github.com/executablebooks/jupyter-book"&gt;check out the Jupyter Book GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;❗❗ Jupyter Book is still in beta, so things are always changing. We’d love your feedback, ideas, and PRs for how to make the project better!❗❗&lt;/p&gt;
&lt;h2 id="what-does-the-new-jupyter-book-do"&gt;What does the new Jupyter Book do?&lt;/h2&gt;
&lt;p&gt;The new version of Jupyter Book will feel very similar. However, it has a lot of new features due to the new Jupyter Book stack underneath (more on that later).&lt;/p&gt;
&lt;p&gt;The new Jupyter Book has the following main features (with links to the relevant documentation for each):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/content-types/markdown"&gt;&lt;strong&gt;Write publication-quality content in markdown&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
You can write in either Jupyter markdown, or an extended flavor of markdown with &lt;a href="https://jupyterbook.org/content/myst"&gt;publishing features&lt;/a&gt;. This includes support for rich syntax such as &lt;a href="https://jupyterbook.org/content/citations"&gt;citations and cross-references&lt;/a&gt;, &lt;a href="https://jupyterbook.org/content/math"&gt;math and equations&lt;/a&gt;, and &lt;a href="https://jupyterbook.org/content/figures"&gt;figures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/content-types/notebooks"&gt;&lt;strong&gt;Write content in Jupyter Notebooks&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
This allows you to include your code and outputs in your book. You can also write notebooks &lt;a href="https://jupyterbook.org/content-types/myst-notebooks"&gt;entirely in markdown&lt;/a&gt; to execute when you build your book.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/content/execute"&gt;&lt;strong&gt;Execute and cache your book’s content&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
For &lt;code&gt;.ipynb&lt;/code&gt; and markdown notebooks, execute code and insert the latest outputs into your book. In addition, &lt;a href="https://jupyterbook.org/content/execute.html#cacheing-the-notebook-execution"&gt;cache and re-use&lt;/a&gt; outputs to be used later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/content/glue"&gt;&lt;strong&gt;Insert notebook outputs into your content&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
Generate outputs as you build your documentation, and insert them in-line with your content across pages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/interactive/launchbuttons"&gt;&lt;strong&gt;Add interactivity to your book&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
You can &lt;a href="https://jupyterbook.org/interactive/hiding"&gt;toggle cell visibility&lt;/a&gt;, include &lt;a href="https://jupyterbook.org/interactive/interactive"&gt;interactive outputs&lt;/a&gt; from Jupyter, and &lt;a href="https://jupyterbook.org/interactive/launchbuttons"&gt;connect with online services&lt;/a&gt; like Binder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/start/build"&gt;&lt;strong&gt;Generate a variety of outputs&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
This includes single- and multi-page websites, as well as &lt;a href="https://jupyterbook.org/advanced/pdf"&gt;PDF outputs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅&lt;/strong&gt; &lt;a href="https://jupyterbook.org/reference/cli"&gt;&lt;strong&gt;Build books with a simple command-line interface&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
You can quickly generate your books with one command, like so: &lt;code&gt;jupyter-book build mybook/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;These are just a few of the major changes that we’ve made. For a more complete idea of what you can do, &lt;a href="https://jupyterbook.org/"&gt;check out the Jupyter Book documentation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="major-changes"&gt;Major changes&lt;/h2&gt;
&lt;p&gt;In the next few sections we’ll talk about some major changes that you may notice in Jupyter Book.&lt;/p&gt;
&lt;h3 id="an-enhanced-flavor-of-markdown"&gt;An enhanced flavor of markdown&lt;/h3&gt;
&lt;p&gt;The biggest enhancement to Jupyter Book is support for the &lt;a href="https://myst-parser.readthedocs.io/en/latest/"&gt;MyST Markdown language&lt;/a&gt;. MyST stands for “Markedly Structured Text”, and is a flavor of markdown that implements all of the features of the &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx documentation engine&lt;/a&gt;, allowing you to write scientific publications in markdown. It draws inspiration from RMarkdown and the reStructuredText ecosystem of tools. Anything you can do in Sphinx, you can do with MyST as well.&lt;/p&gt;
&lt;p&gt;MyST Markdown is a &lt;em&gt;superset&lt;/em&gt; of Jupyter Markdown (AKA, CommonMark), meaning that &lt;em&gt;any default markdown in a Jupyter Notebook is valid in Jupyter Book&lt;/em&gt;. If you’d like extra features in markdown such as citations, figures, references, etc, then you may include extra MyST Markdown syntax in your content.&lt;/p&gt;
&lt;p&gt;For example, here’s how you can &lt;a href="https://jupyterbook.org/content/citations.html"&gt;include a citation&lt;/a&gt; in the new Jupyter Book:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A sample citation. Here we see how you can include citation syntax in-line with your markdown, and then insert a bibliography later on in your page." src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/images/003-0_SSmfD6zf7vpQHYy3.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A sample citation. Here we see how you can include citation syntax in-line with your markdown, and then insert a bibliography later on in your page.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And here’s how you can include a figure:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A sample figure. Here we see how you can insert a figure with a caption into your book, and control some aspects of how the figure is displayed with options." src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/images/004-0_yKc7ku6ENbclkhg1.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A sample figure. Here we see how you can insert a figure with a caption into your book, and control some aspects of how the figure is displayed with options.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="a-smarter-build-system"&gt;A smarter build system&lt;/h3&gt;
&lt;p&gt;While the old version of Jupyter Book used a combination of Python and Jekyll to build your book’s HTML, the new Jupyter Book uses Python all the way through. This means that building the HTML for your book is as simple as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-book build mybookname/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In addition, the new build system leverages &lt;a href="https://jupyter-cache.readthedocs.io/"&gt;Jupyter Cache&lt;/a&gt; to execute notebook content &lt;em&gt;only if the code is updated&lt;/em&gt;, and to insert the outputs from the cache at build time. This saves you time by avoiding the need to re-execute code that hasn’t been changed.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="An example build process. Here the jupyter-book command-line interface is used to convert a collection of content into an HTML book." src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/announcing-the-new-jupyter-book/images/005-0_-5xZV1SW6nA4ARWx.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;An example build process. Here the &lt;code&gt;jupyter-book&lt;/code&gt; command-line interface is used to convert a collection of content into an HTML book.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="more-book-output-types"&gt;More book output types&lt;/h3&gt;
&lt;p&gt;By leveraging Sphinx, Jupyter Book will be able to support more complex outputs than &lt;em&gt;just&lt;/em&gt; an HTML website. For example, we are currently prototyping &lt;a href="https://jupyterbook.org/advanced/pdf.html"&gt;PDF Outputs&lt;/a&gt;, both via HTML as well as via LaTeX. This gives Jupyter Book more flexibility to generate the right book for your use case.&lt;/p&gt;
&lt;p&gt;You can also run Jupyter Book on &lt;a href="https://jupyterbook.org/start/build.html#build-a-standalone-page"&gt;individual pages&lt;/a&gt;. This means that you can write single-page content (like a scientific article) entirely in Markdown.&lt;/p&gt;
&lt;h3 id="a-new-stack"&gt;A new stack&lt;/h3&gt;
&lt;p&gt;The biggest change under-the-hood is that Jupyter Book now uses &lt;a href="https://www.sphinx-doc.org/en/master/"&gt;the Sphinx documentation engine&lt;/a&gt; instead of Jekyll for building books. By leveraging the Sphinx ecosystem, Jupyter Book can more effectively build on top of community tools, and can contribute components back to the broader community.&lt;/p&gt;
&lt;p&gt;Instead of being a single repository, the old Jupyter Book repository has now been separated into several modular tools. &lt;strong&gt;Each of these tools can be used on their own in your Sphinx documentation&lt;/strong&gt;, and they can be coordinated together &lt;em&gt;via&lt;/em&gt; Jupyter Book:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://myst-parser.readthedocs.io/en/latest/"&gt;&lt;strong&gt;The MyST markdown parser for Sphinx&lt;/strong&gt;&lt;/a&gt; allows you to write fully-featured Sphinx documentation in Markdown.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://myst-nb.readthedocs.io/en/latest/"&gt;&lt;strong&gt;MyST-NB&lt;/strong&gt;&lt;/a&gt; is an &lt;code&gt;.ipynb&lt;/code&gt; parser for Sphinx that allows you to use MyST Markdown in your notebooks. It also provides tools for execution, cacheing, and variable insertion of Jupyter Notebooks in Sphinx.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sphinx-book-theme.readthedocs.io/"&gt;&lt;strong&gt;The Sphinx Book Theme&lt;/strong&gt;&lt;/a&gt; is a beautiful book-like theme for Sphinx, build on top of the &lt;a href="https://pydata-sphinx-theme.readthedocs.io/en/latest/"&gt;PyData Sphinx Theme&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jupyter-cache.readthedocs.io/en/latest/"&gt;&lt;strong&gt;Jupyter Cache&lt;/strong&gt;&lt;/a&gt; allows you to execute a collection of notebooks and store their outputs in a hashed database. This lets you cache your notebook’s output without including it in the &lt;code&gt;.ipynb&lt;/code&gt; file itself.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sphinx-thebe.readthedocs.io/en/latest/"&gt;&lt;strong&gt;Sphinx-Thebe&lt;/strong&gt;&lt;/a&gt; converts your “static” HTML page into an interactive page with code cells that are run remotely by a Binder kernel.&lt;/li&gt;
&lt;li&gt;Finally, Jupyter Book also supports a growing &lt;strong&gt;collection of Sphinx extensions&lt;/strong&gt;, such as &lt;a href="https://sphinx-copybutton.readthedocs.io/en/latest/"&gt;sphinx-copybutton&lt;/a&gt;, &lt;a href="https://sphinx-togglebutton.readthedocs.io/"&gt;sphinx-togglebutton&lt;/a&gt;, &lt;a href="https://sphinx-comments.readthedocs.io/en/latest/"&gt;sphinx-comments&lt;/a&gt;, and &lt;a href="https://sphinx-panels.readthedocs.io/en/latest/?badge=latest"&gt;sphinx-panels&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ll write a more developer-focused post in the future to describe each of these components in more detail.&lt;/p&gt;
&lt;h2 id="what-next"&gt;What next?&lt;/h2&gt;
&lt;p&gt;Jupyter Book and its related projects will continue to be developed as a part of the &lt;a href="https://executablebooks.org/"&gt;Executable Book Project&lt;/a&gt;, a community that builds open source tools for high-quality scientific publications from computational content in the Jupyter ecosystem and beyond.&lt;/p&gt;
&lt;p&gt;If you’d like to learn more about Jupyter Book or get started building your own books, then check out &lt;a href="https://jupyterbook.org/"&gt;the new Jupyter Book documentation&lt;/a&gt;. Jupyter Book is still in beta and is constantly being improved, so your &lt;a href="https://github.com/executablebooks/jupyter-book/issues/new/choose"&gt;feedback and contributions are always welcome&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If there are particular features you’d like to see, open an issue or give a 👍 to a pre-existing issue, and &lt;a href="https://executablebooks.org/en/latest/feature-vote.html"&gt;it will be bumped up on the feature request leaderboard&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="get-involved"&gt;Get involved&lt;/h2&gt;
&lt;p&gt;If you’d like to contribute to any of the projects listed in this post, you are highly encouraged to do so! The Executable Book Project (and thus Jupyter Book) is run as an open project that &lt;a href="https://executablebooks.org/en/latest/contributing.html"&gt;welcomes contributions from others&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are excited about all the new features and improvements in the new Jupyter Book, and look forward to seeing the new books that the community creates with this stack!&lt;/p&gt;
</content><category term="Jupyter Book"/><category term="publishing"/></entry><entry><title>A 2019 retrospective from the Binder Project</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/" rel="alternate"/><published>2020-01-15T17:48:00+00:00</published><updated>2020-01-15T18:10:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2020-01-15:/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/</id><summary type="html">&lt;p&gt;2019 was a busy year for the Binder and JupyterHub projects — each saw growth in both their community and technology. Now that the year…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;2019 was a busy year for the Binder and JupyterHub projects — each saw growth in both their community and technology. Now that the year has wrapped up, it is a good time to reflect on some of the highlights from the year.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/001-1_ZeTyAGGLPlXs0UlQfKsr6g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Overall, 2019 was about improving the robustness, stability, and team dynamics around the JupyterHub and Binder projects, as well as connecting these projects with other tools and services in the open source community. Here are a few things that we are most-excited about.&lt;/p&gt;
&lt;h2 id="more-people-are-using-mybinderorg"&gt;More people are using mybinder.org&lt;/h2&gt;
&lt;p&gt;The Binder Federation is a collection of BinderHubs accessible from mybinder.org. This deployment is run as a public service and a demonstration of BinderHub, the underlying technology of the Binder project. This deployment is run on a volunteer basis by Binder community members, and is supported through grants and donations in infrastructure from project stakeholders. In 2019, the user base of mybinder.org grew from around 70,000 users per week to around 100,000 users (a growth of nearly 40%). mybinder.org is being used for teaching classes, sharing reproducible analyses, creating interactive documentation and narratives, and much more. We’re astonished at the rapid growth of Binder-ready repositories, and we’re excited to see what the community creates next.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Weekly user sessions at mybinder.org. Here you can see a typical pattern of activity over the course of a year. There are dips in activity over the summer and winter months, reflecting reduced activity from academic institutions." src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/002-0_0_V6rIgF_oAW5VS-.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Weekly user sessions at mybinder.org. Here you can see a typical pattern of activity over the course of a year. There are dips in activity over the summer and winter months, reflecting reduced activity from academic institutions.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyterhub-reaches-10"&gt;JupyterHub reaches 1.0&lt;/h2&gt;
&lt;p&gt;JupyterHub, the underlying technology that provides interactive computing sessions to multiple users, &lt;a href="/posts/2019/announcing-jupyterhub-1-0/"&gt;is now at 1.0 status&lt;/a&gt;. The JupyterHub Python application was written several years ago, and reaching 1.0 reflects the work of dozens of open source contributors over time. JupyterHub is now a robust and stable application, having been used at smaller scales (think 5–10 people running on a single VM) as well as much larger scales (think 5,000 students running Jupyter sessions for a class).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The JupyterHub logo" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/003-1_m2PN2PR-a6X_J3M602tgog.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterHub logo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="binderhub-is-out-of-beta"&gt;BinderHub is out of beta&lt;/h2&gt;
&lt;p&gt;BinderHub, the kubernetes-based technology that powers mybinder.org, also came out of Beta this year. This reflects the fact that BinderHub is a battle-hardened application that can provide a stable service over time. mybinder.org runs nearly 100,000 sessions a week, and requires minimal maintenance time from the Binder’s projects team of volunteer operators.&lt;/p&gt;
&lt;h2 id="the-binderhub-federation-is-launched"&gt;The BinderHub federation is launched&lt;/h2&gt;
&lt;p&gt;The Binder Project envisions a world in which technology can be used in vendor-agnostic and decentralized ways. BinderHub runs on Kubernetes, which can be deployed on a variety of cloud and local infrastructure. While the Binder team runs one BinderHub deployment at mybinder.org, our goal has always been to see &lt;em&gt;other&lt;/em&gt; organizations running their own BinderHubs. This year, we went one step beyond this by &lt;a href="/posts/2019/the-international-binder-federation/"&gt;launching the &lt;strong&gt;BinderHub Federation&lt;/strong&gt;&lt;/a&gt;. This is a collection of research and technology organizations that combine their expertise and computational resources to power mybinder.org. When users visit mybinder.org, they are now directed to one of several BinderHub instances. This makes mybinder.org more robust, and grows the number of organizations that utilize the project’s technology for their communities. A BIG THANKS goes out to Google, OVH, GESIS, and the Turing Institute for supporting the Binder Federation.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The (rough) location of each BinderHub deployment in the mybinder.org federation" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/004-1_KU35naJhl1LSDxKY8gog4g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The (rough) location of each BinderHub deployment in the mybinder.org federation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="binder-connects-with-open-science-services"&gt;Binder connects with open science services&lt;/h2&gt;
&lt;p&gt;Another goal of Binder is to be a &lt;em&gt;part&lt;/em&gt; of the solution to more transparent, sharable, reproducible computational work. This means &lt;a href="/posts/2019/binder-with-zenodo/"&gt;plugging in to other ecosystems and projects&lt;/a&gt; in order to leverage the broader open science community. This year we saw a number of new connections with other services. BinderHub now supports links that point directly to Zenodo and Dataverse repositores, and we are working on a few other integrations in the coming months. This means that projects utilizing these resources will be able to share reproducible and interactive links to their work out-of-the-box.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Binder now works with Zenodo repositories!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/005-1_WVSV4_bwWlGWnT0k8xrlWg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Binder now works with Zenodo repositories!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-binder-community-grows"&gt;The Binder community grows&lt;/h2&gt;
&lt;p&gt;The Binder project’s most important asset is its people — this is a collection of volunteers spread across the world and from a variety of organizations. Binder community members do a variety of things — from working on technology, to teaching others how to make their work more reproducible, to participating in community discussions, to maintaining and debugging Binder tech. There is also a “core team” of Binder members that dedicates a significant part of their time to supporting the project. In 2019, we saw several new members join the core team, as well as a general growth in the Binder community. Welcome to all of our new team members! You can find a &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html"&gt;list of our current team members here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="we-welcome-our-first-contributor-in-residence"&gt;We welcome our first Contributor in Residence&lt;/h2&gt;
&lt;p&gt;One challenge with running large, open projects is that resources tend to be scarce. The Binder Project has no formal project funding, and must find ways to both grow its technology as well as run mybinder.org on resources that are donated from its community. One thing that often suffers as a result is the maintenance and general improvement of our open source technology. This work is often under-appreciated, difficult, and unlikely to happen with purely volunteer labor.&lt;/p&gt;
&lt;p&gt;For this reason, the Binder project decided to &lt;a href="/posts/2019/the-jupyterhub-and-binder-contributor-in-residence/"&gt;apply for the CZI Essential Open Source grant series&lt;/a&gt;. We proposed the creation of the “Binder Contributor in Residence” position — an annual contractor position that pays a member of the Binder community to do many of the daily things that are crucial for the project’s growth. We are excited to have &lt;a href="https://github.com/GeorgianaElena"&gt;Georgiana Dolocan&lt;/a&gt; as our first contributor in residence, and look forward to where this project will go in 2020.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Many thanks to CZI for their support of the Binder and JupyterHub projects in 2020!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/006-0_pzbKC79Svh5Xrtev.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Many thanks to CZI for their support of the Binder and JupyterHub projects in 2020!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="there-are-more-binderhub-deployments"&gt;There are more BinderHub deployments&lt;/h2&gt;
&lt;p&gt;The Binder Project aims to create technology that is deployable anywhere so that other organizations can support their communities with Binder infrastructure. In 2019 we ran a number of training sessions for how other groups can run their own BinderHub. In particular, the Turing Institute ran several workshops that had attendees up-and-running with their own functioning BinderHubs.&lt;/p&gt;
&lt;h2 id="thanks-to-our-community"&gt;Thanks to our community&lt;/h2&gt;
&lt;p&gt;As you can see, 2019 was a busy and exciting year for the Binder community. As a final note, we want to say thanks to all of you who have supported Binder in one form or another over the years. Binder is a project run by the community, for the community. It wouldn’t be possible without all of your hard work and friendly faces, thanks! We look forward to what’s coming next in 2020!&lt;/p&gt;
</content><category term="Binder"/><category term="Kubernetes"/><category term="reproducibility"/></entry><entry><title>The International Binder Federation</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/the-international-binder-federation/" rel="alternate"/><published>2019-07-01T09:11:00+00:00</published><updated>2019-07-01T09:11:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2019-07-01:/medium-archive/pelican/posts/2019/the-international-binder-federation/</id><summary type="html">&lt;p&gt;We are happy to announce that mybinder.org is now backed by two clusters hosted by two different cloud providers: Google Cloud and OVH.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;About two years ago, the Binder project evolved into the community led project that it is today. The deployment at &lt;a href="http://mybinder.org/"&gt;mybinder.org&lt;/a&gt; was upgraded to use&lt;br&gt;
BinderHub, a scalable open-source web application that runs on Kubernetes and provides free, sharable, interactive computing environments to people&lt;br&gt;
all around the world.&lt;/p&gt;
&lt;p&gt;In the ensuing years, the Binder community has grown considerably.&lt;br&gt;
Now people use the public deployment at &lt;a href="http://mybinder.org/"&gt;mybinder.org&lt;/a&gt; around 100,000 times each week, and there are around &lt;a href="https://github.com/betatim/binderlyzer/blob/master/binder-launches.ipynb"&gt;8,000 unique repositories&lt;/a&gt; compatible with Binder. Binder links now work with multiple repository providers, such as GitHub, GitLab, BitBucket, and even Zenodo! This means that providing enough compute power for everyone is a challenge.&lt;/p&gt;
&lt;p&gt;This is why today we are happy to announce that mybinder.org is now backed by two clusters hosted by two different cloud providers: Google Cloud and &lt;a href="https://www.ovh.com"&gt;OVH&lt;/a&gt;. This is the beginning of the International Binder Federation.&lt;/p&gt;
&lt;p&gt;How did we get here? Alongside mybinder.org’s growth we’ve seen growth in another part of the Binder ecosystem: people deploying a BinderHub for their own groups. In the last year, we have seen BinderHubs deployed &lt;a href="http://pangeo.io/"&gt;for large-scale earth analytics with the Pangeo project&lt;/a&gt;, for &lt;a href="https://the-turing-way.netlify.com/introduction/introduction"&gt;communities of best-practices in open science with The Turing Way&lt;/a&gt;, and for &lt;a href="https://notebooks.gesis.org/binder/"&gt;specific domains such as the social sciences like GESIS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As more BinderHubs are deployed, we realized that there was an opportunity to leverage the strengths and resources of the community to improve the large, public BinderHub deployment at &lt;a href="http://mybinder.org/"&gt;mybinder.org&lt;/a&gt;. Instead of a single BinderHub run by the Binder team, we could build a &lt;strong&gt;network&lt;/strong&gt; of BinderHubs that shares the load and keeps &lt;code&gt;mybinder.org&lt;/code&gt; stable and quick.&lt;/p&gt;
&lt;h2 id="ovh-joins-the-mybinderorg-federation"&gt;OVH Joins the &lt;a href="http://mybinder.org/"&gt;mybinder.org&lt;/a&gt; Federation&lt;/h2&gt;
&lt;p&gt;Today, we are thrilled to announce that the Binder Project now has &lt;strong&gt;a world-wide federation of BinderHubs powering&lt;/strong&gt; &lt;a href="http://mybinder.org/"&gt;&lt;strong&gt;mybinder.org&lt;/strong&gt;&lt;/a&gt;. We’ve partnered with OVH, a cloud hosting company based in Europe that is supportive of open projects such as Jupyter and Binder.&lt;/p&gt;
&lt;p&gt;Through the partnership with OVH, all traffic to &lt;code&gt;mybinder.org&lt;/code&gt; will now be split between &lt;strong&gt;two&lt;/strong&gt; BinderHubs - one run by the Binder team, and another run by a team of open-source advocates at OVH. They have generously offered their resources and computing time to allow Binder to serve the scientific and educational communities.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The mybinder.org federation currently has two BinderHubs, but this network can (and will!) grow as more groups offer to connect their own BinderHubs to the network." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/the-international-binder-federation/images/001-1_D0lhgUpJeWhb6K7igl4DvQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The mybinder.org federation currently has two BinderHubs, but this network can (and will!) grow as more groups offer to connect their own BinderHubs to the network.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-does-this-mean"&gt;What does this mean?&lt;/h2&gt;
&lt;p&gt;So what has changed for you, the user? Probably not much. The&lt;br&gt;
biggest difference you’ll notice is that landing at &lt;code&gt;mybinder.org&lt;/code&gt;&lt;br&gt;
will now &lt;em&gt;redirect&lt;/em&gt; you to one of two places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gke.mybinder.org&lt;/code&gt; is the BinderHub hosted on the Google Cloud Platform&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ovh.mybinder.org&lt;/code&gt; is the BinderHub hosted on the OVH platform in France.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other than this, your experience should be the same. You might even notice an improvement in speed and load times because the BinderHub you’re using has a little bit less traffic on it 😀.&lt;/p&gt;
&lt;p&gt;As always, we are pushing this out as soon as we think it is useful. You can help us to scale this model and make it rock solid by reporting weird things you notice. Expect tweaks over the next few weeks based on feedback from users. Let us know about the things you like, dislike or have questions about at &lt;a href="https://discourse.jupyter.org/t/the-binder-federation/1286"&gt;https://discourse.jupyter.org/t/the-binder-federation/1286&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-is-this-a-big-deal"&gt;Why is this a big deal?&lt;/h2&gt;
&lt;p&gt;We think that having a federation of BinderHubs behind mybinder.org is pretty cool, for a few different reasons. First, it demonstrates the dedication that the Binder community has towards building tools that anybody can deploy — we certainly don’t want to be the only ones running a BinderHub, and having other BinderHubs behind mybinder.org is a great example of this. Second, a network of BinderHubs for mybinder.org means that we can eventually do some clever things like use geolocation to distribute users, which should improve the performance that you all experience. Third, having fewer users per BinderHub means that we can optimize the resources available to each hub — resulting in improvements in speed and stability. Finally, having a federation of BinderHubs makes the mybinder.org service significantly more robust, and less-dependent on a single team, deployment, platform, and funding source. We are now more confident than ever that mybinder.org will continue to be available as a stable, free, public service that keeps growing.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Now that we’ve reached N=2 BinderHubs powering &lt;code&gt;mybinder.org&lt;/code&gt;,&lt;br&gt;
it is straightforward for us to grow this network to N=3 and beyond. Over the summer we will continue our work on approaching universities, research councils, and cloud hosting companies.&lt;/p&gt;
&lt;p&gt;If you are interested in helping out: we’d love to see other community members come forward to offer their time or resources to provide more nodes in the international BinderHub federation. If you’re interested in doing so, please &lt;a href="https://github.com/jupyterhub/team-compass/issues"&gt;open an issue in the JupyterHub team compass repository&lt;/a&gt;&lt;br&gt;
to discuss the possibilities of working together!&lt;/p&gt;
&lt;p&gt;We’re excited about the ability for the Binder community continuing&lt;br&gt;
to grow, and to build more tools for distributed, community-run&lt;br&gt;
infrastructure for open science and education. This is all possible&lt;br&gt;
because of the hard work of many people in the community, so a big&lt;br&gt;
thank you to those who spend their time working on open tools in&lt;br&gt;
the Jupyter and Binder ecosystems. We’re excited to see what comes&lt;br&gt;
next!&lt;/p&gt;
</content><category term="Binder"/><category term="cloud computing"/><category term="Kubernetes"/></entry><entry><title>Binder + Zenodo: A how-to guide</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/" rel="alternate"/><published>2019-06-21T13:46:00+00:00</published><updated>2019-06-22T15:42:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2019-06-21:/medium-archive/pelican/posts/2019/binder-with-zenodo/</id><summary type="html">&lt;p&gt;Interactive and reproducible repositories powered by Zenodo and Binder.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Interactive and reproducible repositories powered by &lt;a href="https://zenodo.org/"&gt;Zenodo&lt;/a&gt; and &lt;a href="https://mybinder.org/"&gt;Binder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When the Binder project was first launched, we imagined a world in which scientific scholarship and reproducibility could be carried out by the community using a fully-open stack of technology. We’re happy to say that this is now possible!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Zenodo DOIs now work with BinderHub" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/001-1_r8_qd2QciZ9B4hD2QnYXwQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Zenodo DOIs now work with BinderHub&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;a href="https://binderhub.readthedocs.io/"&gt;BinderHub&lt;/a&gt; team recently added in support for building Binder links that point to &lt;a href="https://zenodo.org/"&gt;Zenodo repositories&lt;/a&gt;. Zenodo is a general purpose open-access repository hosted by CERN that allows researchers to archive and apply a DOI to information that they put up on the web.&lt;/p&gt;
&lt;p&gt;Zenodo has the ability to archive &lt;strong&gt;GitHub repositories&lt;/strong&gt;, which means that you can archive the code, data, or reports that underly a scientific analysis and assign it a unique, citeable identifier. Now that BinderHub knows how to resolve a Zenodo identifier, you’ll be able to share Binder links that point to Zenodo and provide interactive access to your repository, letting readers reproduce results and interact with your analyses!&lt;/p&gt;
&lt;p&gt;Here’s a quick primer for how to do this:&lt;/p&gt;
&lt;h2 id="step-1-create-a-zenodo-account"&gt;Step 1: Create a Zenodo account&lt;/h2&gt;
&lt;p&gt;First off you’ll need to create an account on Zenodo. You can&lt;br&gt;
do so using a number of different log-in options.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/002-0_SbAeCLCNSpmbRQB6.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="step-2-create-your-binder-ready-repository-on-github"&gt;Step 2: Create your Binder-ready repository on GitHub&lt;/h2&gt;
&lt;p&gt;Next, you should create your Binder-ready repository on GitHub. Binder uses pre-existing best practices in data science in order to infer and build the environment needed for your repository.&lt;/p&gt;
&lt;p&gt;To make a repository Binder-ready, &lt;a href="https://mybinder.readthedocs.io/en/latest/introduction.html"&gt;follow the instructions in the Binder docs&lt;/a&gt;.&lt;br&gt;
Briefly, what you need to do is add the configuration files that define the environment needed to run your code. Once those files are in place, and you’ve added an analysis script (a Jupyter or R Notebook) that actually runs your code and displays the results, your repository is ready to build with Binder.&lt;/p&gt;
&lt;h2 id="step-3-make-sure-your-repository-is-ready-to-be-published"&gt;Step 3: Make sure your repository is ready to be published!&lt;/h2&gt;
&lt;p&gt;Once you create a DOI for your repository, it will be frozen in time — you won’t be able to easily update it. So double check that the repository builds properly with Binder and runs the way that you’d expect it to.&lt;/p&gt;
&lt;p&gt;Make sure to launch a Binder from your repository and run the analyses you’d like others to run. If they produce the expected result from within a Binder session, then they’ll continue to do so for others (assuming you have pinned your versions and followed other best practices in reproducibility).&lt;/p&gt;
&lt;h2 id="step-4-create-a-zenodo-doi-for-your-repository"&gt;Step 4: Create a Zenodo DOI for your repository&lt;/h2&gt;
&lt;p&gt;Now that your repository is ready, you’ll connect Zenodo with GitHub to create a DOI for your repository. Remember that this will be unique to the current state of the repo — future changes to this repository won’t be reflected in the DOI.&lt;/p&gt;
&lt;p&gt;We recommend following the &lt;a href="https://guides.github.com/activities/citable-code/"&gt;GitHub &lt;strong&gt;Citable Code Guide&lt;/strong&gt;&lt;/a&gt; which provides some best-practices for creating your Zenodo DOI for a GitHub repository. Click the image below to be taken to this (excellent) guide.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The GitHub Citable Code guide." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/003-0_LIxxv68WDxy6VkfY.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The GitHub Citable Code guide.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once you’re done, you should have a Zenodo DOI badge&lt;br&gt;
like the one below:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A Zenodo DOI badge" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/004-1_CfBmxs8apLrlbGN5vG9MTA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A Zenodo DOI badge&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="step-5-create-a-binder-link-for-your-zenodo-doi"&gt;Step 5: Create a Binder link for your Zenodo DOI&lt;/h2&gt;
&lt;p&gt;Finally, use your Zenodo DOI to create a Binder link that allows others to interact with and replicate your results. You can create a Binder link for your Zenodo record by heading to &lt;a href="https://mybinder.org/"&gt;https://mybinder.org&lt;/a&gt; and filling in the form:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Building a Binder link for your Zenodo archive with the Binder UI." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/005-1_xOABVY2hNtVmjV5-LXreFw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Building a Binder link for your Zenodo archive with the Binder UI.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This will give you a link you can share with others as well as the Markdown and reStructured text snippets for creating a badge.&lt;/p&gt;
&lt;p&gt;The link’s structure should look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/zenodo/&amp;lt;zenodo-DOI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For example, if your Zenodo DOI is &lt;code&gt;10.5281/zenodo.3242074&lt;/code&gt; (corresponding to &lt;a href="https://doi.org/10.5281/zenodo.3242074"&gt;this zenodo repository&lt;/a&gt;), the Binder link for it would be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/zenodo/10.5281/zenodo.3242074/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can even pair this Binder link with your Zenodo DOI badge that&lt;br&gt;
we showed above!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The “launch binder” button contains a Binder link for your Zenodo archive. Clicking will launch a Binder session." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/006-1_hFRv6rDl9BekAFkxDpowOg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The “launch binder” button contains a Binder link for your Zenodo archive. Clicking will launch a Binder session.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And that’s it! You now have an archived version of your analysis with a unique identifier. This identifier can be used in conjunction with BinderHub to allow readers to &lt;em&gt;interact&lt;/em&gt; with your code and results!&lt;/p&gt;
&lt;h2 id="last-minute-update"&gt;Last minute update 🎉&lt;/h2&gt;
&lt;p&gt;A few hours before publishing this post we merged a contribution from &lt;a href="https://twitter.com/temorrell"&gt;Tom Morrell&lt;/a&gt; who works at CalTech’s library that allows you to launch records from &lt;a href="https://data.caltech.edu/"&gt;CalTech’s Data Repository&lt;/a&gt; as well! For example a notebook to analyze traffic to the archive itself: &lt;a href="https://mybinder.org/v2/zenodo/10.22002/d1.1250"&gt;https://mybinder.org/v2/zenodo/10.22002/d1.1250&lt;/a&gt;. You should also check out &lt;a href="https://medium.com/@lorenaabarba/excellent-6b99d506aa28"&gt;a quick response to this post from Lorena Barba&lt;/a&gt;, who describes her group’s approach to creating reproducible, citable bundles for figures in papers, and how Binder+Zenodo DOIs might fit into that workflow!&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We are close to closing the loop of fully reproducible computational environments for scientific publication. We’re excited to see journals begin to integrate these workflows with their own publishing pipelines. For example, the &lt;a href="https://conp-pcno.github.io/"&gt;Neurolibre project&lt;/a&gt; is deploying their own BinderHub and using it alongside their reviewing and archiving process in order to provide more rich&lt;br&gt;
interaction with submitted material.&lt;/p&gt;
&lt;p&gt;Each type of repository needs a small amount of custom work to be integrated with Binder. We started with Zenodo because it is well known,&lt;br&gt;
general purpose and integrated with GitHub already. If there is an archive you’d like to see integrated please do stop by &lt;a href="https://github.com/jupyter/repo2docker"&gt;this repository&lt;/a&gt; and open a new issue or contribute the code to do so directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you’re working with a publisher and are interested in this&lt;/strong&gt;&lt;br&gt;
please reach out! The Binder community would love to work with you in deploying these open tools to make your published work more open and accessible. Whether it is big or small, we hope that these workflows can make an impact across the publishing landscape, and we’re looking forward to seeing what people do next!&lt;/p&gt;
</content><category term="Binder"/><category term="GitHub"/><category term="open science"/><category term="reproducibility"/></entry><entry><title>Introducing repo2docker</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-repo2docker/" rel="alternate"/><published>2018-12-14T18:24:00+00:00</published><updated>2018-12-14T19:02:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2018-12-14:/medium-archive/pelican/posts/2018/introducing-repo2docker/</id><summary type="html">&lt;p&gt;The Binder Project’s repo2docker tool gives data scientists the benefits of containerization technology without needing to learn Docker…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-repo2docker/images/001-1_mZMTfkZE6o94aIr6DG-hYA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The Binder Project’s &lt;a href="https://repo2docker.readthedocs.io/en/latest/"&gt;repo2docker&lt;/a&gt; tool gives data scientists the benefits of containerization technology without needing to learn Docker itself. To make your repository compatible with repo2docker, you only need to add text files that are already present in many repositories. This means that you get the benefits of containerization, a powerful and complex ecosystem, without having to change your workflow.&lt;/p&gt;
&lt;p&gt;repo2docker is a lightweight command-line tool written in Python that takes a path or URL to a git repository and creates a suitable docker image for it. To achieve this it follows the steps that a human would take to do so. The steps are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Inspect the repository for common “configuration” files (like &lt;code&gt;requirements.txt&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;From these well-known files infer the Docker commands to run; and&lt;/li&gt;
&lt;li&gt;Build a Docker image.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It has a few more tricks up its sleeve, such as automatically installing RStudio for you when it detects that you are using R. Once the image has been built, a Docker container is created and executed, giving you access to the environment in which the repository author wanted the code to be executed. To achieve this, one needs access to two things: repo2docker and a docker daemon (they do not necessarily have to have docker installed on their local computer).&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html#jupyterhub-team"&gt;JupyterHub team&lt;/a&gt; just released &lt;a href="https://github.com/jupyter/repo2docker/blob/0.7.0/CHANGES.rst#version-070"&gt;v0.7 of repo2docker&lt;/a&gt;, so we decided to spend a bit of time explaining what it’s all about.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="An example repo2docker workflow. In this case, repo2docker is invoked locally. repo2docker is passed a URL to a git repository (). It then clones the repository, discovers configuration files in the repo (in this case, requirements.txt), builds a Docker image with this environment installed, and opens a local Jupyter server to explore and run the contents of the repo." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-repo2docker/images/002-1_lPmCcgJois-PygoFXI6Bhw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;An example repo2docker workflow. In this case, repo2docker is invoked locally. repo2docker is passed a URL to a git repository (&lt;a href="https://github.com/norvig/pytudes"&gt;https://github.com/norvig/pytudes&lt;/a&gt;). It then clones the repository, discovers configuration files in the repo (in this case, &lt;code&gt;requirements.txt&lt;/code&gt;), builds a Docker image with this environment installed, and opens a local Jupyter server to explore and run the contents of the repo.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-guiding-principles-behind-repo2docker"&gt;The guiding principles behind repo2docker&lt;/h2&gt;
&lt;p&gt;repo2docker is meant to be as lightweight and common-sense as possible. The driving principles behind repo2docker are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Leverage pre-existing workflows&lt;/strong&gt; in data science as much as possible. This means using standard configuration files (like &lt;code&gt;requirements.txt&lt;/code&gt;) instead of requiring people to learn new configuration patterns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The shareable unit is a repository&lt;/strong&gt; or directory containing human-readable files. Not a single file (like a notebook) nor a binary blob (like a built docker image). This means that humans can inspect and extend other repositories meant for repo2docker, and that they can manually do what repo2docker does automatically. No black box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be workflow agnostic&lt;/strong&gt;. repo2docker supports many languages and user interfaces, it can run arbitrary shell scripts that are baked into the image, or it can trigger a script to be run each time a person runs the Docker image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be extensible and composable&lt;/strong&gt;. repo2docker should allow for multiple languages, tools, or workflows to be defined in a single GitHub repository. It should also be relatively easy to extend to support new use-cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable deterministic outputs&lt;/strong&gt;. We want repo2docker to make it possible for authors to generate the exact same environment from their repository every time, provided that they follow best-practices in computational methods (like providing specific version numbers for packages). repo2docker can build a specific commit, tag, or branch of a repository, which allows for an image to be deterministically built.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="how-can-repo2docker-be-used"&gt;How can repo2docker be used?&lt;/h2&gt;
&lt;p&gt;Over the last 18 months, we have been using repo2docker in production to automatically generate images that run repositories for &lt;a href="http://mybinder.org/"&gt;mybinder.org&lt;/a&gt;.&lt;br&gt;
It is used to build around 1000 unique repositories every week. The core functionality has proven itself and is considered production ready.&lt;/p&gt;
&lt;p&gt;Over the last year, we’ve seen a few major use-cases come out of repo2docker:&lt;/p&gt;
&lt;p&gt;First, it can be used as a &lt;strong&gt;part of production systems&lt;/strong&gt; like BinderHub. BinderHub automatically uses repo2docker to build images that run a user’s environment, and lets them share links that let others interact with the image.&lt;/p&gt;
&lt;p&gt;Second, repo2docker can be used to &lt;strong&gt;build an image for use with a JupyterHub&lt;/strong&gt;. For example, teachers have used repo2docker to convert their GitHub repository with course materials into a runnable Docker image that students access via a shared jupyterhub in the cloud.&lt;/p&gt;
&lt;p&gt;Finally, repo2docker has been used by individuals who wish to &lt;strong&gt;build reproducible images from their local work&lt;/strong&gt;. repo2docker can optionally run a Jupyter server from within the built image, which makes it possible to verify the results of analyses in an environment that was built solely from the configuration files present in the repository.&lt;/p&gt;
&lt;h2 id="what-next"&gt;What next?&lt;/h2&gt;
&lt;p&gt;We think that repo2docker serves as a useful tool for the community and that it is an important part of the large reproducible scientific software stack. It gives data scientists the benefits of containerization technology without needing to learn a new tool like Docker. It achieves this by being a lightweight command-line tool written in Python that automates the creation of the environment in which the authors of a piece of software wanted it to be executed.&lt;/p&gt;
&lt;p&gt;We’d love to see the repo2docker community grow, and for more&lt;br&gt;
languages, interfaces, use-cases, and workflows to be supported&lt;br&gt;
with &lt;a href="https://repo2docker.readthedocs.io/en/latest/architecture.html?highlight=build%20pack#buildpack"&gt;repo2docker’s build pack system&lt;/a&gt;. Let us know what you think!&lt;/p&gt;
&lt;p&gt;repo2docker is primarily maintained by the &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html"&gt;JupyterHub and Binder teams&lt;/a&gt;. If you’d like to get involved with the community or want to learn&lt;br&gt;
more about the tool, reach out! Check out these links for more information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/repo2docker"&gt;repo2docker repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://repo2docker.readthedocs.io"&gt;repo2docker documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://discourse.jupyter.org"&gt;JupyterHub community forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitter.im/jupyterhub/binder"&gt;Binder gitter channel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/em&gt;*: some folks might be wondering why we developed repo2docker instead of contributing to a pre-existing containerization tool such as the excellent* &lt;a href="https://github.com/openshift/source-to-image"&gt;&lt;em&gt;source2image project&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. We take the decision to create new open-source tech very seriously, and wrote a blog post about our decision to do-so in this case:&lt;/em&gt; &lt;a href="http://words.yuvi.in/post/why-not-s2i/"&gt;http://words.yuvi.in/post/why-not-s2i/&lt;/a&gt;&lt;/p&gt;
</content><category term="Docker"/><category term="GitHub"/></entry><entry><title>Announcing the JupyterHub Helm Chart v0.5</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/announcing-the-jupyterhub-helm-chart-v0-5/" rel="alternate"/><published>2017-12-20T16:24:00+00:00</published><updated>2018-02-01T10:33:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2017-12-20:/medium-archive/pelican/posts/2017/announcing-the-jupyterhub-helm-chart-v0-5/</id><summary type="html">&lt;p&gt;JupyterHub makes it possible to serve Jupyter instances to multiple users. The JupyterHub Helm Chart makes it possible to run this setup on…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/announcing-the-jupyterhub-helm-chart-v0-5/images/001-1_el1BFE8ImVEackH13RyyWw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;JupyterHub makes it possible to serve Jupyter instances to multiple users. The JupyterHub Helm Chart makes it possible to run this setup on &lt;a href="https://kubernetes.io/"&gt;kubernetes&lt;/a&gt;, making JupyterHub more scalable, stable, and flexible.&lt;/p&gt;
&lt;p&gt;We, the JupyterHub team, are proud to announce the next version of the JupyterHub Helm Chart: version 0.5. This post describes a bit of what’s new in this release. We’ve nicknamed the releases of the JupyterHub Helm Chart after famous cricketers, in this case world-class bowler &lt;a href="http://www.espncricinfo.com/afghanistan/content/player/311427.html"&gt;Hamid Hassan*&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;tl;dr: The release bumps JupyterHub to 0.8, adds better HTTPS support, and improves scalability to ~4,000 simultaneous users. See the &lt;a href="https://github.com/jupyterhub/zero-to-jupyterhub-k8s/blob/master/CHANGELOG.md"&gt;Helm Chart Changelog&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id="new-features"&gt;New Features&lt;/h2&gt;
&lt;p&gt;The following major features have been added to v0.5:&lt;/p&gt;
&lt;h3 id="jupyterhub-08"&gt;JupyterHub 0.8&lt;/h3&gt;
&lt;p&gt;Version 0.8 of JupyterHub was &lt;a href="/posts/2017/jupyterhub-0-8/"&gt;released earlier this year&lt;/a&gt;. It is full of new features, many of which directly benefit the Kubernetes deployment of JupyterHub. Below is a list of relevant points along with the relevant sections of the &lt;a href="https://zero-to-jupyterhub-with-kubernetes.readthedocs.io/en/latest/reference.html"&gt;Helm Chart configuration&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lots of performance improvements. &lt;strong&gt;We now know we can handle up to 4k active users.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limit the number of users who can try to launch the hub at once.&lt;/strong&gt; This can be tuned to avoid crashes when hundreds of users try to launch at the same time. It gives them a friendly error message and asks them to try later. See &lt;code&gt;hub.concurrentSpawnLimit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limit the number of simultaneous active users .&lt;/strong&gt; The Active Server limit can be used to limit the total number of active users that can use the hub at any given time. This allows admins to control the size of their clusters more effectively. See &lt;code&gt;hub.activeServerLimit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory limits &amp;amp; guarantees&lt;/strong&gt; can now contain fractional units. So you can say &lt;code&gt;0.5G&lt;/code&gt; instead of having to use &lt;code&gt;512M&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No more ‘too many redirects’ errors at scale.&lt;/strong&gt; This fixes an annoying race condition causing users to get stuck in a redirect loop when starting their servers.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="easier-https"&gt;Easier HTTPS&lt;/h3&gt;
&lt;p&gt;Version 0.5 of the helm chart makes it easier for admins to set up HTTPS for their users with &lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt;. Users often access a JupyterHub instance from a public URL. To avoid nefarious behavior and increase security, using HTTPS is important. You can now choose to use Let’s Encrypt or a valid HTTPS certificate and key. You can also use your own HTTPS certificates &amp;amp; keys rather than using Let’s Encrypt. You can find &lt;a href="https://zero-to-jupyterhub.readthedocs.io/en/latest/security.html#setting-up-https"&gt;the new instructions here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="more-authenticators"&gt;More authenticators&lt;/h3&gt;
&lt;p&gt;Authenticators allow you to control who has access to your JupyterHub. The following new authentication providers have been added in 0.5:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://about.gitlab.com/"&gt;GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cilogon.org/"&gt;CILogon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.globus.org/"&gt;Globus&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can now also set up a whitelist of usernames that have access to the hub (in addition to other authenticators in use). Do so by adding to the list in &lt;code&gt;auth.whitelist.users&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="hub-services-support"&gt;Hub Services support&lt;/h3&gt;
&lt;p&gt;Services let you connect your JupyerHub to other web services (for example, in &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;). You can now add &lt;a href="https://jupyterhub.readthedocs.io/en/latest/reference/services.html"&gt;external JupyterHub Services&lt;/a&gt; by adding them to &lt;code&gt;hub.services&lt;/code&gt;. Note that you are still responsible for actually running the service somewhere (perhaps as a deployment object in Kubernetes).&lt;/p&gt;
&lt;h3 id="more-customization-with-jupyterhub_configpy"&gt;More customization with &lt;code&gt;jupyterhub_config.py&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Sometimes it is useful to be able to run arbitrary extra code when setting up your deployment. You can put extra snippets of &lt;code&gt;jupyterhub_config.py&lt;/code&gt; configuration in &lt;code&gt;hub.extraConfig&lt;/code&gt;. Now you can also add &lt;a href="http://zero-to-jupyterhub.readthedocs.io/en/latest/advanced.html#hub-extraenv"&gt;extra environment variables&lt;/a&gt; to the hub in &lt;code&gt;hub.extraEnv&lt;/code&gt; and &lt;a href="http://zero-to-jupyterhub.readthedocs.io/en/latest/advanced.html#hub-extraconfigmap"&gt;extra configmap items&lt;/a&gt; via &lt;code&gt;hub.extraConfigMap&lt;/code&gt;. This makes it cleaner to customize the hub’s configuration in ways that are not yet possible with &lt;code&gt;config.yaml&lt;/code&gt;. You can find more information in the &lt;a href="http://zero-to-jupyterhub.readthedocs.io/en/latest/advanced.html#arbitrary-code-in-jupyterhub-config-py"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="more-customization-options-for-user-server-environments"&gt;More customization options for user server environments&lt;/h3&gt;
&lt;p&gt;More options have been added under &lt;code&gt;singleuser&lt;/code&gt; to help you customize the environment that the user session is spawned in. You can…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the uid / gid of the user with &lt;code&gt;singleuser.uid&lt;/code&gt; and &lt;code&gt;singleuser.fsGid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mount extra volumes with &lt;code&gt;singleuser.storage.extraVolumes&lt;/code&gt; &amp;amp; &lt;code&gt;singleuser.storage.extraVolumeMounts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Provide extra environment variables with &lt;code&gt;singleuser.extraEnv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="more-information"&gt;More information&lt;/h2&gt;
&lt;p&gt;For more information about the JupyterHub Helm Chart, and the JupyterHub ecosystem more broadly, see the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://jupyterhub.readthedocs.io/en/latest/"&gt;JupyterHub documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub development repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/jupyterhub/zero-to-jupyterhub-k8s"&gt;JupyterHub Helm Chart development repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://zero-to-jupyterhub.readthedocs.io"&gt;Zero to JupyterHub guide&lt;/a&gt; to deploying JupyterHub on Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;*&lt;em&gt;&lt;strong&gt;Hamid Hassan&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;is a fast bowler who currently plays for the Afghanistan National Cricket Team. With nicknames ranging from&lt;/em&gt; &lt;a href="https://www.rferl.org/a/interview-afghan-cricketer-living-the-dream/24752618.html"&gt;&lt;em&gt;“Afghanistan’s David Beckham”&lt;/em&gt;&lt;/a&gt; &lt;em&gt;to&lt;/em&gt; &lt;a href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;amp;objectid=11413633"&gt;&lt;em&gt;“Rambo”&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, he is considered by many to be Afghanistan’s first Cricket Superhero. Currently known for fast (145km/h+) deliveries, cartwheeling celebrations, war painted face and having had to flee Afghanistan as a child to escape from war. He&lt;/em&gt; &lt;a href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;amp;objectid=11413633"&gt;&lt;em&gt;says&lt;/em&gt;&lt;/a&gt; &lt;em&gt;he plays because “We are ambassadors for our country and we want to show the world that Afghanistan is not like people recognize it by terrorists and these things. We want them to know that we have a lot of talent as well.”&lt;/em&gt;&lt;/p&gt;
</content><category term="JupyterHub"/><category term="Kubernetes"/></entry><entry><title>Binder 2.0, a Tech Guide</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/" rel="alternate"/><published>2017-11-30T16:01:00+00:00</published><updated>2017-11-30T19:25:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2017-11-30:/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/</id><summary type="html">&lt;p&gt;Authors: The Binder project is comprised of many individuals within and outside of the core Jupyter team. A list of members that…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/images/001-1_cWQj_YdmY_p14eh628N_Kg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Authors: The Binder project is comprised of many individuals within and outside of the core Jupyter team. A list of members that contributed to this post is at the end of this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: this post focuses more on technical changes in the Binder 2.0 reboot. For a post about user-facing features and future plans, see&lt;/em&gt; &lt;a href="https://elifesciences.org/labs/8653a61d"&gt;&lt;em&gt;this eLife blog post&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are undergoing a dramatic increase in the complexity of techniques for analyzing data, doing scientific research, and sharing our work with others. In early 2016, the &lt;a href="https://mybinder.org"&gt;Binder project&lt;/a&gt; was announced, attempting to connect these three components. A &lt;a href="https://elifesciences.org/labs/a7d53a88/toward-publishing-reproducible-computation-with-binder"&gt;blogpost in eLife&lt;/a&gt; described a vision where scientists could specify dependencies along with a collection of Jupyter notebooks. Binder builds a Docker image from these dependencies, and provides a URL where any user in the world can instantly recreate this environment.&lt;/p&gt;
&lt;p&gt;Want to see it in action? Click the button below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/wildtreetech/explore-open-data/binder20-elife?filepath=bikes-per-week.ipynb"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/images/002-1_IA00K8fa8FvXedoBBDh2fg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With this post we are proud to announce the next version of Binder. It aims to be more modular, more flexible, more stable, faster, and more extensible than its predecessor. Powering this version of Binder is a collection of tools in the Jupyter ecosystem. Since being released, the Binder project has learned many things about implementing fast, flexible online deployments. In addition, its vision has expanded to include not only Jupyter notebooks, but many other computational workflows. You can access an open beta version of this deployment here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can find a list of sample repositories to learn how to create “Binder”-ready repositories here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/binder-examples"&gt;github.com/binder-examples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also see what the Binder community has been up to in creating their own repositories by checking the GitHub Binder topic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://github.com/topics/binder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Give it a shot, build some repositories, and importantly, tell us what could be improved on our &lt;a href="https://github.com/jupyterhub/binderhub"&gt;GitHub repo&lt;/a&gt;. Below we’ll describe a bit about what’s new.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The new Binder UI. Users input a URL to a git repository (or specify a specific branch/tag/commit). Upon clicking “launch”, you will be directed to a live environment where you can interact with the code." src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/images/003-1_lWcoBaRvNzXxzGPqV_3vew.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The new Binder UI. Users input a URL to a git repository (or specify a specific branch/tag/commit). Upon clicking “launch”, you will be directed to a live environment where you can interact with the code.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="whats-new"&gt;What’s new?&lt;/h2&gt;
&lt;p&gt;First off we’ll describe how the experience will change for users. The short answer is: not much. The goal of Binder is still enabling you to intantly create interactive and shareable repositories. We’ve completely rebuilt the backend of Binder, but we’ve made minimal changes to the front-end user experience.&lt;/p&gt;
&lt;p&gt;The biggest difference you should notice is that Binder is both faster and more stable. You’ll still be able to generate Binder links from a git URL from a single web-page. However, there are a few key differences:&lt;/p&gt;
&lt;h3 id="new-default-environment"&gt;New Default Environment&lt;/h3&gt;
&lt;p&gt;Old versions of Binder were based off of a Docker image that contained a fairly heavy computational environment. The new Binder deployment makes minimal assumptions about what environment you want installed, by default the only thing that will be installed is the Jupyter Notebook and Python 3. This means you’ll need to be more expressive in the dependencies you include in your dependency files. For example, if you want &lt;code&gt;numpy&lt;/code&gt; or &lt;code&gt;matplotlib&lt;/code&gt;, you should specify them in a &lt;code&gt;requirements.txt&lt;/code&gt; or &lt;code&gt;environment.yml&lt;/code&gt; file. Since you’re explicitly listing your requirements it makes reproducing your work more reliable, and allows the Binder infrastructure to change more freely without breaking your repository code.&lt;/p&gt;
&lt;h3 id="new-url-structure"&gt;New URL structure&lt;/h3&gt;
&lt;p&gt;The new URL structure for Binder follows the following convention:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/gh/&amp;lt;org-name&amp;gt;/&amp;lt;repo-name&amp;gt;/&amp;lt;branch|tag|hash-name&amp;gt;?filepath=&amp;lt;path-to-file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For example, below is the URL for a basic Binder-ready Python 3 repository, it includes basic information about the repository:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/gh/binder-examples/requirements/master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also specify parameters that do things like point users to a particular file or initialize a user-interface. For example, the following URL starts JupyterLab once users click the link:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/gh/binder-examples/jupyterlab/master?urlpath=lab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In each case, note the &lt;code&gt;gh&lt;/code&gt; at the very beginning — this specifies that the git URL exists on github.com. It is possible to build new URL parsers for other online repositories such as BitBucket, osf.io, or any other provider. We are currently focusing on Git and GitHub, but nothing prevents Binder from being compatible with other kinds of content providers. Shortly before this blog post we added support for arbitrary git URLs to binderhub, so watch this space.&lt;/p&gt;
&lt;h3 id="specify-a-specific-branch-tag-commit"&gt;Specify a specific branch / tag / commit&lt;/h3&gt;
&lt;p&gt;Also notice that in the URL above you can specify a branch, tag, or commit hash for the Binder image. This allows you to ensure that a Binder image will &lt;strong&gt;always&lt;/strong&gt; remain the same (if you specify package versions properly). This is a crucial step for reproducibility and maintaining consistency in how users experience the files in your repository.&lt;/p&gt;
&lt;p&gt;Notice that in the URL above you can specify a commit hash or git tag for the Binder image. This hash is unique to the state of the code at the moment that the commit was made, ensuring that Binder can rebuild the exact same environment any time. Note that if authors don’t want to guarantee the same reproducible environment, they can specify a branch and BinderHub will resolve it to the latest commit hash before building the environment.&lt;/p&gt;
&lt;h3 id="binder-auto-building"&gt;Binder auto-building&lt;/h3&gt;
&lt;p&gt;When a git repository is launched, Binder will now check whether an image has already been built for that repository at the same commit hash. If it has, then Binder will skip the building process and take you straight to a JupyterHub instance that serves this image.&lt;/p&gt;
&lt;p&gt;If the image hasn’t been built, then it will automatically be generated before sending the user to JupyterHub. The only difference will be the amount of time it takes before entering the JupyterHub environment. This means that authors no longer need to explicitly build their Binder images when they update a branch. The next time someone clicks a Binder link, it will happen automatically. If you don’t want this behavior, be sure to point Binder to a specific tag or commit hash, rather than a branch name or tag. For example, here’s a Binder URL that will always point to the same commit hash:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/gh/wildtreetech/explore-open-data/binder20-elife
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;While this URL points to a branch, and will thus be re-built each time a new commit is made to that branch:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/gh/wildtreetech/explore-open-data/master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="more-options-for-dependency-files"&gt;More options for dependency files&lt;/h3&gt;
&lt;p&gt;Users often want to specify a computational environment that is more complex than a simple list of Python requirements. While this is possible by specifying a Dockerfile, it’s often an overly-complicated solution to this problem. Binder now uses &lt;a href="https://github.com/jupyter/repo2docker"&gt;repo2docker&lt;/a&gt; to build a Docker image from your repository. This makes it possible to specify a more complex environment with text files. For example, you can use an &lt;code&gt;apt.txt&lt;/code&gt; file to install packages with &lt;code&gt;apt-get&lt;/code&gt;, or use a file called &lt;code&gt;postBuild&lt;/code&gt; to define shell commands that are run before generating the Docker image (e.g. for downloading some data or running scripts). See the &lt;a href="https://repo2docker.readthedocs.io/en/latest/samples.html"&gt;repo2docker documentation&lt;/a&gt; for a list of files that are supported with Binder.&lt;/p&gt;
&lt;p&gt;For a selection of examples that show off how to specify dependencies take a look at the example gallery: &lt;a href="https://github.com/binder-examples"&gt;https://github.com/binder-examples&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="more-user-interfaces"&gt;More user interfaces&lt;/h3&gt;
&lt;figure&gt;
&lt;img alt="The JupyterLab interface running on Binder. You can access the JupyterLab demo repository at mybinder.org/v2/gh/binder-examples/jupyterlab/master?urlpath=lab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/images/004-1_TW7Gnwl-02cejzgs1nnX2Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab interface running on Binder. You can access the JupyterLab demo repository at ``mybinder&lt;code&gt;.org/v2/gh/binder-examples/jupyterlab/master?urlpath=lab&lt;/code&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The previous iteration of Binder only supported the classic Jupyter Notebook user interface, while the new deployment will additionally support &lt;a href="https://github.com/binder-examples/dockerfile-rstudio"&gt;RStudio&lt;/a&gt; and &lt;a href="https://github.com/binder-examples/jupyterlab"&gt;JupyterLab&lt;/a&gt;. Because of the extra build configuration files specified above, you can also utilize more tools in the Jupyter widgets ecosystem, such as the &lt;a href="https://github.com/binder-examples/jupyter-rise"&gt;RISE plugin for interactive presentations&lt;/a&gt; or the &lt;a href="https://github.com/oschuett/appmode"&gt;appmode plugin&lt;/a&gt; to generate interactive apps from your repository. We also welcome contributions to add support for other user interfaces.&lt;/p&gt;
&lt;h3 id="more-online-repository-providers"&gt;More online repository providers&lt;/h3&gt;
&lt;p&gt;While GitHub is a fantastic repository of open-source code, it’s not the only repository. The new Binder deployment makes it straightforward to adding support for new sources of code (for example, GitLab, the OSF, or even non-git codebases). Currently GitHub is the only supported source for code, but we welcome contributions enabling support for new sources.&lt;/p&gt;
&lt;p&gt;We’re excited about this next step in Binder’s development, and hopeful that we can build a community around this powerful set of tools. Don’t hesitate to open an issue or pull request on our &lt;a href="https://github.com/jupyterhub/binderhub"&gt;GitHub repository&lt;/a&gt;, or to reach out via &lt;a href="https://gitter.im/jupyterhub/binder"&gt;our Gitter channel&lt;/a&gt;. We look forward to seeing what comes next, and to continue enabling reproducible and open workflows in data science and research.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;The next few sections are meant for developers interested in deploying their own Binder, or for those interested in the technical details behind the new deployment.&lt;/p&gt;
&lt;h3 id="tech-components"&gt;Tech components&lt;/h3&gt;
&lt;p&gt;The three main technical components behind the new Binder backend are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://binderhub.readthedocs.io/"&gt;BinderHub&lt;/a&gt;, currently on display at &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt; and contained in the &lt;a href="https://github.com/jupyterhub/binderhub"&gt;binderhub repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://repo2docker.readthedocs.io/"&gt;repo2docker&lt;/a&gt;, a tool that converts a code repository into a Docker image with an environment specified via dependency files (e.g., &lt;code&gt;requirements.txt&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jupyterhub.readthedocs.io/en/latest/"&gt;JupyterHub&lt;/a&gt;, which hosts user instances with a server in the cloud. We use a distribution of JupyterHub that runs on top of Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information on the infrastructure behind Binder, &lt;a href="https://binderhub.readthedocs.io/en/latest/"&gt;see the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A prototype of RStudio running in a Binder. This is currently support with a Dockerfile, and we are working on supporting R build files natively. You can access this repository at:" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/binder-2-0-a-tech-guide-2017/images/005-1_EgMk1PYMl6ouIP_XQ5G5Fg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A prototype of RStudio running in a Binder. This is currently support with a Dockerfile, and we are working on supporting R build files natively. You can access this repository at: &lt;code&gt;&amp;lt;https://mybinder.org/v2/gh/binder-examples/dockerfile-rstudio/master&amp;gt;&lt;/code&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="kubernetes"&gt;Kubernetes&lt;/h3&gt;
&lt;p&gt;Binder now also heavily relies on &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; for scaling our image building service and the JupyterHub. Kubernetes is massively scalable and has a strong community of developers behind it. Moreover, Kubernetes is cloud-agnostic. It can be run on Google Cloud, Microsoft Azure, and AWS among others, as well as on your own bare metal hardware if needed. Because BinderHub is built to run on top of Kubernetes, you can deploy Binder off of any of these resources as well (see below).&lt;/p&gt;
&lt;h3 id="deploying-your-own-binder-server"&gt;Deploying your own Binder server&lt;/h3&gt;
&lt;p&gt;While mybinder.org will continue to exist as a public service, we hope to see new Binder deployments for many different use cases in the wild. One of our primary goals is to make it easier for users to deploy their own Binder servers. This is relatively straightforward by following the instructions on the &lt;a href="https://binderhub.readthedocs.io/en/latest/"&gt;BinderHub documentation&lt;/a&gt;, which are currently under active development to make ongoing improvements as the Kubernetes technology evolves. We’re continuously updating these steps to make them as clear as possible, so please don’t hesitate to open an issue or a pull request on our &lt;a href="https://github.com/jupyterhub/binderhub"&gt;github repository&lt;/a&gt; and make suggestions.&lt;/p&gt;
&lt;p&gt;We would love to see others deploy their own BinderHub servers, either for their own communities, or as part of a federated public service of BinderHubs.&lt;/p&gt;
&lt;h2 id="future-development"&gt;Future development&lt;/h2&gt;
&lt;p&gt;This is the just the beginning of new features and improvements to Binder. We’re working hard to grow an open-source community around these tools, and we encourage issues, comments, and PRs on the &lt;a href="https://github.com/jupyterhub/binderhub"&gt;BinderHub&lt;/a&gt;, &lt;a href="https://github.com/jupyter/repo2docker"&gt;repo2docker&lt;/a&gt;, and &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; repositories. We look forward to growing the Binder ecosystem, and we’re excited to see all of the Binders that people design.&lt;/p&gt;
&lt;h2 id="acknowledgements-alphabetical-order"&gt;Acknowledgements (alphabetical order)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;C. Titus Brown (UC Davis), Matthias Bussonnier (UC Berkeley), Jessica Forde (UC Berkeley), Brian Granger (Cal Poly), Tim Head (Wild Tree Tech), Chris Holdgraf (UC Berkeley), Andrew Osheroff (Google), Naomi Penfold (eLife Sciences), M Pacer (UC Berkeley), Yuvi Panda (UC Berkeley), Fernando Perez (UC Berkeley), Min Ragan-Kelley (Simula Research Laboratory), and Carol Willing (Cal Poly). The Binder project is currently being funded from a grant from the Moore Foundation.&lt;/em&gt;&lt;/p&gt;
</content><category term="Binder"/><category term="Docker"/><category term="Kubernetes"/><category term="open science"/></entry></feed>