<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Angus Hollands | 2i2c</title><link>https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/</link><atom:link href="https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/index.xml" rel="self" type="application/rss+xml"/><description>Angus Hollands</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><image><url>https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/avatar_hu20f69ef59c88298f5eb2ca612e2f5d16_48021_270x270_fill_q75_lanczos_center.jpg</url><title>Angus Hollands</title><link>https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/</link></image><item><title>Introducing Jupyter Book 2 at FOSDEM 2026</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/fosdem-jupyter-book-2/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/fosdem-jupyter-book-2/</guid><description>&lt;p>Our teammate
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/" >Angus Hollands&lt;/a> gave a talk at FOSDEM 2026:
&lt;a href="https://fosdem.org/2026/schedule/event/ZY9WYD-introducing-jb-2/" target="_blank" rel="noopener" >Introducing Jupyter Book 2&lt;/a>.&lt;/p>
&lt;p>The talk shares why the Jupyter Book 2 and MyST stack was rebuilt, and how it supports open, reusable computational publishing workflows.&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="https://video.fosdem.org/2026/aw1120/ZY9WYD-introducing-jb-2.mp4" target="_blank" rel="noopener" >Watch the recording&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://fosdem.org/2026/schedule/event/ZY9WYD-introducing-jb-2/" target="_blank" rel="noopener" >FOSDEM event page&lt;/a>&lt;/li>
&lt;/ul>
&lt;figure id="figure-slide-from-the-fosdem-2026-session-introducing-jupyter-book-2">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Slide from the FOSDEM 2026 session introducing Jupyter Book 2." srcset="
/blog/fosdem-jupyter-book-2/featured_huebc44838a5457ae22511d566a17f4261_473619_ce68173621cc9d0cafd80f67e5937361.webp 400w,
/blog/fosdem-jupyter-book-2/featured_huebc44838a5457ae22511d566a17f4261_473619_70e28470934a2403242eb19afd9cb036.webp 760w,
/blog/fosdem-jupyter-book-2/featured_huebc44838a5457ae22511d566a17f4261_473619_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://deploy-preview-608--2i2c-org.netlify.app/blog/fosdem-jupyter-book-2/featured_huebc44838a5457ae22511d566a17f4261_473619_ce68173621cc9d0cafd80f67e5937361.webp"
width="760"
height="383"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Slide from the FOSDEM 2026 session introducing Jupyter Book 2.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="learn-more">
Learn more
&lt;a class="header-anchor" href="#learn-more">#&lt;/a>
&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://proceedings.scipy.org/articles/hwcj9957" target="_blank" rel="noopener" >Jupyter Book 2 and the MyST Document Stack (SciPy 2025 paper)&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://jupyterbook.org/" target="_blank" rel="noopener" >Jupyter Book documentation&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyter-book/jupyter-book" target="_blank" rel="noopener" >Jupyter Book on GitHub&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="acknowledgements">
Acknowledgements
&lt;a class="header-anchor" href="#acknowledgements">#&lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Thanks to
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >Project Pythia&lt;/a> and to
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/bids/" >BIDS&lt;/a> for supporting deeper
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/blog/fosdem-jupyter-book-2/../../2025/foundational-contributions/" >foundational contributions&lt;/a> like this in Jupyter Book.&lt;/li>
&lt;li>Thanks to the
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book&lt;/a> team for helping out with slide creation and doing all the work Angus spoke about here!&lt;/li>
&lt;/ul></description></item><item><title>Jupyter Book at the Scientific Python 2025 Developer Summit</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/scientific-python-summit/</link><pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/scientific-python-summit/</guid><description>&lt;p>Chris and Angus recently attended the Scientific Python 2025 Developer Summit on behalf of
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book&lt;/a>, here&amp;rsquo;s
&lt;a href="https://blog.jupyterbook.org/posts/2025-05-23-scientific-python-dev-summit" target="_blank" rel="noopener" >a brief blog post about their experience&lt;/a> written with the Jupyter Book team.&lt;/p></description></item><item><title>Launching Jupyter Book for 2i2c Communities</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/jb-for-communities/</link><pubDate>Thu, 08 May 2025 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/jb-for-communities/</guid><description>&lt;p>We&amp;rsquo;re excited to announce out-of-the-box support for
&lt;a href="https://next.jupyterbook.org" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a> for our community members. This allows communities to create and share knowledge bases together for their community workflows. This post describes the motivation behind this new functionality, and how you can learn more about the project.&lt;/p>
&lt;blockquote>
&lt;p>⭐ &lt;strong>Members of 2i2c&amp;rsquo;s community network&lt;/strong> can use this feature in their hubs by following
&lt;a href="https://docs.2i2c.org/user/sharing/documentation" target="_blank" rel="noopener" >our documentation and sharing guide&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>A core component of our mission to make research and education more &lt;em>impactful&lt;/em>, &lt;em>accessible&lt;/em>, and &lt;em>delightful&lt;/em> is leveraging our unique
&lt;a href="https://2i2c.org/communities/" target="_blank" rel="noopener" >global network of communities&lt;/a> to make meaningful improvements to the open-source tools that power their work. Learning from one community can then provide value to our entire network, e.g.,
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/blog/pace-hackweek/" >our work with PACE on speeding up their CNN model training&lt;/a>.&lt;/p>
&lt;p>Central to our communities&amp;rsquo; work is the importance of sharing new findings, best practices, and community resources. Across our network, we have seen communities creating their own &amp;ldquo;books&amp;rdquo; that provide a home for this kind of content. Many of these books feature the concept of a &amp;ldquo;landing page&amp;rdquo; that welcomes new members, establishes an identity, and provides jumping-off points (or &amp;ldquo;calls to action&amp;rdquo;) to more detailed resources.&lt;/p>
&lt;p>Until now, each community has been required to undertake this work independently. 2i2c believes that by
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/blog/community-ownership/" >building upon existing open-source tools&lt;/a> like
&lt;a href="https://next.jupyterbook.org" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a>, we can help communities focus on the &lt;em>content&lt;/em> of their home, rather than spending time worrying about its &lt;em>appearance&lt;/em>. To that end, we have been working on
&lt;a href="https://github.com/2i2c-org/infrastructure/issues/5045" target="_blank" rel="noopener" >an initiative&lt;/a> to allow communities to rapidly build interactive starter documentation and provide users with a rich, interactive, and informative onboarding experience. Through this initiative, we have:&lt;/p>
&lt;ul>
&lt;li>Improved the user experience of launching into interactive compute environments from a Jupyter Book.&lt;/li>
&lt;li>Built components into the Jupyter Book &amp;ldquo;book theme&amp;rdquo; for low-density landing page content like call-to-action blocks.&lt;/li>
&lt;li>Extended our service to co-locate community documentation alongside community hubs (i.e., &lt;code>docs.hub.2i2c.cloud&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./landing-page.png" alt="Screenshot of the 2i2c Showcase Hub landing page" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
(A screenshot of the 2i2c
&lt;a href="https://docs.showcase.2i2c.cloud/" target="_blank" rel="noopener" >Showcase Hub&lt;/a> landing page, featuring a simple banner image and call-to-action.)&lt;/p>
&lt;p>To take advantage of this feature, communities can use the
&lt;a href="https://github.com/2i2c-org/community-docs-template" target="_blank" rel="noopener" >&lt;code>2i2c-org/community-docs-template&lt;/code>&lt;/a> to deploy a Jupyter Book site to GitHub Pages. This template demonstrates simple usage of Jupyter Book 2 for computational content and landing page creation, and establishes the necessary CD workflows for web publication. Meanwhile, 2i2c can update our domain name management to point the &lt;code>docs.hub.2i2c.cloud&lt;/code> nested subdomain to the newly deployed documentation.&lt;/p>
&lt;p>For more information, see
&lt;a href="https://docs.2i2c.org/user/sharing/documentation" target="_blank" rel="noopener" >our community documentation for deploying Jupyter Books&lt;/a>.&lt;/p>
&lt;p>Developing these new capabilities taught us a lot about what makes building &amp;ldquo;good&amp;rdquo; community documentation so difficult. A wide range of bespoke website-building tools and integration quirks previously made it challenging for communities to both keep documentation current with internal changes and keep up with necessary software updates. We also learned that by trading bespoke complexity for simplicity and readability, we could build a solution that scales to multiple communities, with a consequently reduced maintenance burden.&lt;/p>
&lt;p>With these improvements, we have initiated a conversation about what a more unified &amp;ldquo;look and feel&amp;rdquo; for our network might entail, and how it might benefit our communities. Much more can be done to build on this first step, and we are eager to gather feedback on how to improve these features for users.&lt;/p>
&lt;p>To learn more about this work, consider exploring a minimal example on
&lt;a href="https://docs.showcase.2i2c.cloud/" target="_blank" rel="noopener" >our Showcase Hub&lt;/a>, and check out
&lt;a href="https://docs.2i2c.org/user/sharing/documentation" target="_blank" rel="noopener" >our service guide&lt;/a>.
&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSff-u-sWFuwO1-VTgk2Ir7f1nfUUlLevQk_Vkk_jnmcI1nJnw/viewform" target="_blank" rel="noopener" >Let us know&lt;/a> what you think!&lt;/p></description></item><item><title>Designing for an ecosystem: a case study in cross-project open source contribution</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/jupyter-book-cors/</link><pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/jupyter-book-cors/</guid><description>&lt;p>A key challenge in the open source space is that projects are often independent and autonomous, with relatively few formal ways to collaborate and coordinate efforts. While this usually isn&amp;rsquo;t a big deal, it means that there is a missed opportunity to grow the impact of an ecosystem because it requires coordinated development among multiple stakeholders within it.&lt;/p>
&lt;p>This is one of the reasons we created 2i2c&amp;rsquo;s open community hub platform. By deploying a single platform that utilizes entirely open infrastructure that we contribute back to, we have visibility over a variety of projects along with the need to combine them together for a specific end-user outcome. One-such development scenario recently came up involving
&lt;a href="https://next.jupyterbook.org/" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a> and
&lt;a href="https://jupyterhub.org/" target="_blank" rel="noopener" >JupyterHub&lt;/a>.&lt;/p>
&lt;h2 id="allowing-readers-to-bring-their-own-binders">
Allowing readers to &amp;ldquo;bring their own Binders&amp;rdquo;
&lt;a class="header-anchor" href="#allowing-readers-to-bring-their-own-binders">#&lt;/a>
&lt;/h2>&lt;p>We&amp;rsquo;ve recently been working to integrate
&lt;a href="https://next.jupyterbook.org/" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a> workflows with our community hubs for a more seamless experience (for example, having book pages link back to interactive cloud sessions that allow users to interact with the content). We imagine a network of Jupyter Books that all build upon the same core infrastructures (JupyterHub, Binder, etc) for cloud-based computing. Our hope is to allow a user to &lt;em>bring their own Binder&lt;/em> with them so that they can interact with another book&amp;rsquo;s content with their own cloud infrastructure. For example:&lt;/p>
&lt;ul>
&lt;li>A student with access to &lt;code>binder.myuniversity.edu&lt;/code> could read a Jupyter Book created by a professor at &lt;code>otheruniversity.edu&lt;/code>.&lt;/li>
&lt;li>The Jupyter Book is defined with a
&lt;a href="https://repo2docker.readthedocs.io/en/latest/specification.html" target="_blank" rel="noopener" >Binder specification&lt;/a> that has a recipe for re-building the environment needed to run te book&amp;rsquo;s content.&lt;/li>
&lt;li>From the professor&amp;rsquo;s book, the student can choose to launch an interactive Binder sessions on &lt;em>their university&amp;rsquo;s Binder&lt;/em>, allowing them to interact with the book&amp;rsquo;s content on their own infrastructure.&lt;/li>
&lt;/ul>
&lt;p>We want a workflow like this to be as seamless and un-complicated as possible. We also want it to follow the same fundamental workflow as the
&lt;a href="https://docs.2i2c.org/user/sharing/files" target="_blank" rel="noopener" >nbgitpuller-based launch buttons&lt;/a>. Along the way, we realized that we needed to coordinate development across
&lt;a href="https://next.jupyterbook.org/" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a>,
&lt;a href="https://jupyter.readthedocs.io" target="_blank" rel="noopener" >JupyterHub&lt;/a>, and
&lt;a href="https://binderhub.readthedocs.io" target="_blank" rel="noopener" >BinderHub&lt;/a>.&lt;/p>
&lt;figure id="figure-the-three-projects-jupyter-book-binderhub-and-jupyterhub-that-needed-to-work-together-to-enable-bring-your-own-binderhub-workflows">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./featured.png" alt="The three projects (Jupyter Book, BinderHub, and JupyterHub) that needed to work together to enable &amp;#39;bring your own binderhub&amp;#39; workflows." loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
The three projects (Jupyter Book, BinderHub, and JupyterHub) that needed to work together to enable &amp;lsquo;bring your own binderhub&amp;rsquo; workflows.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="getting-jupyter-book-to-discover-jupyter-hub">
Getting Jupyter Book to discover Jupyter Hub
&lt;a class="header-anchor" href="#getting-jupyter-book-to-discover-jupyter-hub">#&lt;/a>
&lt;/h2>&lt;p>As we began developing this workflow, we realized that there was a blocker in the JupyterHub and BinderHub ecosystem that needed to be fixed. We needed a way to &lt;strong>ask a JupyterHub whether it had an unauthenticated end-point for service discovery&lt;/strong>. Basically, a way to ask a hub &amp;ldquo;what kind of hub are you, and how can we launch an interactive session on you?&amp;rdquo; Doing this is simple-enough - JupyterHub already has a way of reporting its version and application type, which allows us to infer how to launch interactive sessions. But, we hit a snag in an HTML context.&lt;/p>
&lt;p>By default, JupyterHub disallows certain kinds of
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" target="_blank" rel="noopener" >Cross-Origin Resource Sharing&lt;/a> (CORS) requests, in order to restrict other applications from abusing a JupyterHub&amp;rsquo;s API. If you hit parts of a JupyterHub API from &lt;em>the command line&lt;/em>, things work fine. But if you do the same thing via JavaScript from a website, the request is disallowed. This was a problem if we want Jupyter Book (a web application) to be able to make requests of JupyterHub&amp;rsquo;s API.&lt;/p>
&lt;p>So, we realized that we needed to make an &lt;strong>upstream contribution in JupyterHub&lt;/strong> in order to &lt;strong>enable an interaction between JupyterHub and Jupyter Book&lt;/strong>. In this case, it was a relatively simple fix: allowing CORS requests for the specific API endpoint we needed (which is a very lightweight endpoint that is not vulnerable to security risks, and is broadly useful to make accessible)&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>. That resulted in two PRs:&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="https://github.com/jupyterhub/jupyterhub/pull/4966" target="_blank" rel="noopener" >&lt;i class='fa-brands fa-github'>&lt;/i> jupyterhub/jupyterhub#4966&lt;/a> allows CORS requests for the API that was needed for service discovery in JupyterHub.&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyterhub/binderhub/pull/1906" target="_blank" rel="noopener" >&lt;i class='fa-brands fa-github'>&lt;/i> jupyterhub/binderhub#1906&lt;/a> enables this workflow on a BinderHub so that its services can be discovered.&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyter-book/myst-theme/pull/503" target="_blank" rel="noopener" >&lt;i class='fa-brands fa-github'>&lt;/i> jupyter-book/myst-theme#503&lt;/a> adds new launch button functionality to
&lt;a href="https://next.jupyterbook.org/" target="_blank" rel="noopener" >Jupyter Book 2&lt;/a> that allows readers to bring their own Binder / JupyterHub links for launching. (this is what necessitated the above two PRs)&lt;/li>
&lt;/ul>
&lt;p>As a result of this upstream contribution loop, JupyterHub can now accept API requests at its &amp;ldquo;service discovery&amp;rdquo; endpoint, which means that Jupyter Book (and any other web application) can more easily learn about a hub&amp;rsquo;s capabilities and version.&lt;/p>
&lt;p>We wanted to share this short vignette because it&amp;rsquo;s a good reflection of the kind of value that 2i2c tries to provide, given its role in helping to build and enhance networks of infrastructure, domain communities, and open source communities. In this case, we enabled a &lt;em>cross-project&lt;/em> workflow that required knowledge of each project, and a vision for how they could be used together in a way that exceeded the sum of their parts.&lt;/p>
&lt;p>We think there&amp;rsquo;s a lot more potential in these kinds of workflows, and are eager to continue our work to identify and enhance community-centric infrastructure for interactive computing.&lt;/p>
&lt;h2 id="acknowledgements">
Acknowledgements
&lt;a class="header-anchor" href="#acknowledgements">#&lt;/a>
&lt;/h2>&lt;p>Thanks to the
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyterhub/" >JupyterHub&lt;/a> and
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book&lt;/a> communities for collaboration and review on this work.&lt;/p>
&lt;p>This &amp;ldquo;bring your own Binder&amp;rdquo; workflow benefits NASA training communities including
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/nasa-open-science/" >NASA Open Science / ScienceCore&lt;/a>, which partially supports this work.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>This actually required an interesting bit of team discussion that was much easier with a few 2i2c staff on the JupyterHub team. The original request from Angus was interpreted as opening up the &lt;em>entire hub API&lt;/em> to external requests (which is a bad idea!) but we were able to quickly discuss this with the JupyterHub team to clarify that this was only about a very specific API endpoint. This is the kind of communication loop that often goes haywire when you have people contributing to a project without historical relationships to the project&amp;rsquo;s maintainers.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>MyST Mini-Hackathon with the DeepLabCut Team</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/deeplabcut-myst-hackathon/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/deeplabcut-myst-hackathon/</guid><description>
&lt;h2 id="the-deeplabcut-team">
The DeepLabCut Team
&lt;a class="header-anchor" href="#the-deeplabcut-team">#&lt;/a>
&lt;/h2>&lt;p>
&lt;figure id="figure-animal-pose-estimation-using-deep-neural-networks-courtesy-of-the-deeplabcut-jupyter-bookhttpsdeeplabcutgithubiodeeplabcutreadmehtml">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/daed7f16-527f-4150-8bdd-cbb20e267451/cheetah-ezgif.com-video-to-gif-converter.gif?format=180w" alt="Animal pose estimation using deep neural networks. Courtesy of the DeepLabCut Jupyter Book" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Animal pose estimation using deep neural networks. Courtesy of the
&lt;a href="https://deeplabcut.github.io/DeepLabCut/README.html" target="_blank" rel="noopener" >DeepLabCut Jupyter Book&lt;/a>
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>The
&lt;a href="http://www.mackenziemathislab.org/deeplabcut" target="_blank" rel="noopener" >DeepLabCut team&lt;/a> is a group of researchers and developers who are working on open source tools for analyzing animal pose estimation by training deep neural networks on videos.&lt;/p>
&lt;p>Chris Holdgraf visited the lab in early August to learn more about how the group were using open-source tools to document and share their work.&lt;/p>
&lt;h2 id="jupyter-book-and-myst">
Jupyter Book and MyST
&lt;a class="header-anchor" href="#jupyter-book-and-myst">#&lt;/a>
&lt;/h2>&lt;p>Extensive documentation for using the DeepLabCut software package is already available as a
&lt;a href="https://deeplabcut.github.io/DeepLabCut/README.html" target="_blank" rel="noopener" >Jupyter Book&lt;/a>. The group was interested in adopting MyST Markdown to stay ahead of the curve and upgrade their Jupyter Book (see the related announcement
&lt;a href="https://executablebooks.org/en/latest/blog/2024-05-20-jupyter-book-myst/" target="_blank" rel="noopener" >Jupyter Book 2 will be build upon the MyST-MD engine&lt;/a>).&lt;/p>
&lt;p>Chris led a mini-hackathon to introduce the group to MyST and collect feedback on where enhancement features could be made in the future. Here&amp;rsquo;s a summary of the outcomes:&lt;/p>
&lt;ul>
&lt;li>Many improvements were made to the
&lt;a href="https://mystmd.org/guide/" target="_blank" rel="noopener" >MyST documentation&lt;/a> 📖
&lt;ul>
&lt;li>The
&lt;a href="https://mystmd.org/guide/quickstart" target="_blank" rel="noopener" >MyST Quick Start Guide&lt;/a> was used to onboard new users. Amendments were
&lt;a href="https://github.com/jupyter-book/mystmd/pull/1433" target="_blank" rel="noopener" >upstreamed to the MyST docs directly&lt;/a> and were immediately available to all.&lt;/li>
&lt;li>A
&lt;a href="https://mystmd.org/guide/quickstart-executable-documents" target="_blank" rel="noopener" >tutorial on executable documents&lt;/a> was added to the collection of MyST tutorials.&lt;/li>
&lt;li>MyST-MD installation instructions were
&lt;a href="https://github.com/jupyter-book/mystmd/pull/1454" target="_blank" rel="noopener" >simplified using &lt;code>mamba&lt;/code>&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>A bunch of enhancement features were requested ✨
&lt;ul>
&lt;li>
&lt;a href="https://github.com/jupyter-book/mystmd/issues/1455" target="_blank" rel="noopener" >Using cell tags for labelling notebook cells&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyter-book/myst-theme/issues/321" target="_blank" rel="noopener" >Support for loading user-defined CSS stylesheets for theming&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyter-book/mystmd/issues/1458" target="_blank" rel="noopener" >Better UX for multi-versioned documentation&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/jupyter-book/mystmd/issues/1462" target="_blank" rel="noopener" >Bibliography styling in HTML&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/DeepLabCut/DeepLabCut/pull/2712" target="_blank" rel="noopener" >Automatic API documentation generation&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>And we found a bug in the
&lt;a href="https://github.com/jupyter-book/mystmd/issues/1456" target="_blank" rel="noopener" >table of contents validation&lt;/a> 🐞&lt;/li>
&lt;/ul>
&lt;h2 id="summary">
Summary
&lt;a class="header-anchor" href="#summary">#&lt;/a>
&lt;/h2>&lt;p>Hackathons are a great way for quickly imparting knowledge and gathering feedback in a short space of time. The event spurred rapid contributions to the MyST ecosystem – embracing reuse of the MyST quick start guides saved time and effort, while engaging with users directly closed a tight feedback loop for enhancements.&lt;/p>
&lt;h2 id="acknowledgments">
Acknowledgments
&lt;a class="header-anchor" href="#acknowledgments">#&lt;/a>
&lt;/h2>&lt;ul>
&lt;li>Thank to the
&lt;a href="http://www.mackenziemathislab.org/" target="_blank" rel="noopener" >Mackenzie Mathis Lab&lt;/a> for hosting Chris Holdgraf at EPFL, Lausanne, Switzerland.&lt;/li>
&lt;li>Thanks to the
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book team&lt;/a> for collaborating on this with us.&lt;/li>
&lt;/ul></description></item><item><title>Hacking the Project Pythia Cook-off with MyST Markdown</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/</guid><description>&lt;p>
&lt;figure id="figure-photo-courtesy-of-dr-debanjana-das">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./cover-featured.png" alt="Group selfie of Project Pythia Cook-off participants." loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Photo courtesy of Dr Debanjana Das
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;h2 id="what-is-project-pythia">
What is Project Pythia?
&lt;a class="header-anchor" href="#what-is-project-pythia">#&lt;/a>
&lt;/h2>&lt;p>
&lt;a href="https://projectpythia.org/" target="_blank" rel="noopener" >Project Pythia&lt;/a> is the education working group for
&lt;a href="https://pangeo.io/index.html" target="_blank" rel="noopener" >Pangeo&lt;/a>, a community platform for Big Data geoscience in which 2i2c operates a cloud hub. The core aim of Project Pythia is to spearhead the creation and curation of community-driven, open-source documentation, in the form of &amp;ldquo;cookbooks&amp;rdquo;, to enable the adoption of &lt;em>open&lt;/em>, &lt;em>scalable&lt;/em> and &lt;em>reproducible&lt;/em> workflows for geoscientists.&lt;/p>
&lt;h2 id="what-did-2i2c-do">
What did 2i2c do?
&lt;a class="header-anchor" href="#what-did-2i2c-do">#&lt;/a>
&lt;/h2>&lt;p>Jenny, James and Angus from the 2i2c team participated in the annual
&lt;a href="https://projectpythia.org/pythia-cookoff-2024/" target="_blank" rel="noopener" >Project Pythia Cook-off 2024&lt;/a>, a hackathon where cookbook authors and collaborators can spend dedicated time on creating and maintaining their content using
&lt;a href="https://jupyterbook.org/en/stable/intro.html" target="_blank" rel="noopener" >Jupyter Book&lt;/a> and deploying their cookbooks with GitHub actions.&lt;/p>
&lt;p>2i2c teamed up with the infrastructure breakout group during the hackathon, led by Katelyn FitzGerald (
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >UCAR&lt;/a>) and Kevin Tyle (
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >University at Albany&lt;/a>), and members of the
&lt;a href="https://curvenote.com" target="_blank" rel="noopener" >Curvenote&lt;/a> team also joined the group.&lt;/p>
&lt;h2 id="day-1">
Day 1
&lt;a class="header-anchor" href="#day-1">#&lt;/a>
&lt;/h2>&lt;p>2i2c deployed and demonstrated a dedicated BinderHub service for Project Pythia that allowed hackathon participants to &amp;ldquo;self-serve&amp;rdquo; images of their software environment, which were specified by including a list of packages in an &lt;code>environment.yml&lt;/code> file placed in their GitHub cookbook repository. Participants could then pull the image from a container registry into their 2i2c hub (or indeed, any other JupyterHub server) to share and reproduce their computational environments with ease.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screenshot of Project Pythia BinderHub service" srcset="
/blog/project-pythia-cookoff/binder_huace4be54dd679dccbefe8a204243ae9f_316548_910c0edf3df8ee944ca59a76f07cbceb.webp 400w,
/blog/project-pythia-cookoff/binder_huace4be54dd679dccbefe8a204243ae9f_316548_4c49b1ac76e6399844adddf8a1c200f3.webp 760w,
/blog/project-pythia-cookoff/binder_huace4be54dd679dccbefe8a204243ae9f_316548_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/binder_huace4be54dd679dccbefe8a204243ae9f_316548_910c0edf3df8ee944ca59a76f07cbceb.webp"
width="760"
height="498"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="day-2">
Day 2
&lt;a class="header-anchor" href="#day-2">#&lt;/a>
&lt;/h2>&lt;p>During the first half of the day, we quickly identified a number of issues that were proving to be a maintenance headache for the Project Pythia infrastructure group:&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Configuration files for each cookbook were difficult to update at scale. Project Pythia currently have a gallery of over 30 cookbooks!&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Changes to Sphinx-based themes inherited from upstream were prone to breaking custom Project Pythia branding downstream.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Executable content was not able to run on the Project Pythia&amp;rsquo;s dedicated BinderHub hosted on
&lt;a href="https://jetstream-cloud.org/index.html" target="_blank" rel="noopener" >JetStream2&lt;/a> (operated by NSF).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Cookbooks frequently cross-referenced materials from other cookbooks to build upon pre-existing knowledge, but this was not easy to author and the reader experience was not as smooth as it could be.&lt;/li>
&lt;/ul>
&lt;p>Following the announcement that
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/../myst-jupyter-book/index" >Jupyter Book 2.0 will use MyST&lt;/a> last month, Rowan (Curvenote) and Angus (2i2c) delivered a compelling demonstration of the
&lt;a href="https://mystmd.org/" target="_blank" rel="noopener" >MyST&lt;/a> ecosystem centered around modern web-first technologies (JavaScript/TypeScript) that offers improved interactivity and accessibility.&lt;/p>
&lt;p>In the second half of the day, we decided to use the hackathon to explore migrating the Pythia cookbooks from using a Sphinx-based to a MyST-based document structure and engine. Within one afternoon, the group migrated four cookbooks to use MyST MD&lt;/p>
&lt;ol>
&lt;li>
&lt;a href="https://projectpythia-mystmd.github.io/pythia-foundations/" target="_blank" rel="noopener" >Pythia Foundations&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://projectpythia-mystmd.github.io/HRRR-AWS-cookbook/" target="_blank" rel="noopener" >High Resolution Rapid Refresh on AWS&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://projectpythia-mystmd.github.io/radar-cookbook/" target="_blank" rel="noopener" >Radar Cookbook&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://projectpythia-mystmd.github.io/advanced-viz-cookbook/" target="_blank" rel="noopener" >Advanced Visualization&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screenshot of a side by side comparison of the Sphinx (left) and MyST (right) based cookbook." srcset="
/blog/project-pythia-cookoff/side-by-side_hu9cd3b350a3f864d97093bd955d197fa3_1447042_e593e37e5e427b324ce4522a66502926.webp 400w,
/blog/project-pythia-cookoff/side-by-side_hu9cd3b350a3f864d97093bd955d197fa3_1447042_d492501d5a4784b6e56aea2179e4e4d5.webp 760w,
/blog/project-pythia-cookoff/side-by-side_hu9cd3b350a3f864d97093bd955d197fa3_1447042_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/side-by-side_hu9cd3b350a3f864d97093bd955d197fa3_1447042_e593e37e5e427b324ce4522a66502926.webp"
width="760"
height="438"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>This moment was palpably exciting! It was evident that MyST MD supported backwards compatible content out of the box, which alleviated fears of sunk cost into existing Sphinx-based cookbooks. The migration workflow was as simple as executing the following commands&lt;/p>
&lt;p>&lt;code>conda install mystmd&lt;/code>&lt;/p>
&lt;p>&lt;code>myst&lt;/code>.&lt;/p>
&lt;h2 id="day-3">
Day 3
&lt;a class="header-anchor" href="#day-3">#&lt;/a>
&lt;/h2>&lt;p>We spent this day tackling support for managing a gallery of Project Pythia cookbooks at scale. See the
&lt;a href="https://executablebooks.org/en/latest/blog/2024-06-14-project-pythia-mystmd/" target="_blank" rel="noopener" >Executable Books blog post&lt;/a> for technical details on how we&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="https://github.com/projectpythia-mystmd/pythia-config" target="_blank" rel="noopener" >Centralized configuration&lt;/a>&lt;/li>
&lt;li>Prototyped a
&lt;a href="https://projectpythia-mystmd.github.io/" target="_blank" rel="noopener" >gallery&lt;/a> plugin in Python&lt;/li>
&lt;li>Fixed a number of bugs related to integrated computation with
&lt;a href="https://mystmd.org/guide/integrating-jupyter#connecting-to-a-binder" target="_blank" rel="noopener" >Binder&lt;/a> and
&lt;a href="https://mystmd.org/guide/integrating-jupyter#jupyterlite" target="_blank" rel="noopener" >JupyterLite&lt;/a>&lt;/li>
&lt;li>Embraced the referencing and reuse of content with
&lt;a href="https://mystmd.org/guide/external-references#tbl-syntax-xref" target="_blank" rel="noopener" >simple markdown syntax for hover-references&lt;/a>.&lt;/li>
&lt;/ul>
&lt;video mute autoplay loop >
&lt;source src="https://deploy-preview-608--2i2c-org.netlify.app/blog/project-pythia-cookoff/hover-ref.mp4" type="video/mp4">
&lt;/video>
&lt;h2 id="day-4">
Day 4
&lt;a class="header-anchor" href="#day-4">#&lt;/a>
&lt;/h2>&lt;p>Looking to the future, we spent time reflecting on our experiences and discussing the potential, transformative impact MyST MD tooling could have in the hands of the scientific community at large, including the communities served by 2i2c. Knowledge-sharing based on static figures and PDFs would fall obsolete and give way to a dynamic, web-first approach to sharing interactive narratives backed by compute from a Jupyter server.&lt;/p>
&lt;p>Throughout the course of the hackathon, the rate of iterated development for both end users of the community cookbook and the developers of the open-source tooling was astounding. For example, we were able to quickly expose small bugs (
&lt;a href="https://github.com/executablebooks/mystmd/issues/1297" target="_blank" rel="noopener" >e.g. support for HTML video tags&lt;/a>) in the MyST MD tooling, which were immediately fixed upstream and released within minutes. The feedback loop that connected the user experience with the software tooling was incredibly synergistic, with immediate impact both upstream and downstream that 2i2c hopes to continue replicating across many facets of their operations.&lt;/p>
&lt;p>Beyond the Project Pythia Cook-off, the breakout group will continue conversations around strengthening their community of practice and hopefully advocating for wider adoption of MyST MD amongst the scientific community (say hello to some of our group members at
&lt;a href="https://www.scipy2024.scipy.org/" target="_blank" rel="noopener" >SciPy 2024&lt;/a> in July!).&lt;/p>
&lt;h2 id="acknowledgements">
Acknowledgements
&lt;a class="header-anchor" href="#acknowledgements">#&lt;/a>
&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >University at Albany&lt;/a> (NSF award 2324302): Led the funding acquisition, helped organize and facilitate the event&lt;/li>
&lt;li>
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >UCAR&lt;/a> (NSF award 2324303): Led the planning and logistics for the event&lt;/li>
&lt;li>
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >Project Pythia&lt;/a> for organizing this workshop.&lt;/li>
&lt;li>
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book&lt;/a> for providing development and collaboration at this workshop.&lt;/li>
&lt;li>2i2c / Code for Science and Society (NSF award 2324304): Provided tailored compute services and on-site support&lt;/li>
&lt;li>
&lt;a href="https://curvenote.com" target="_blank" rel="noopener" >Curvenote&lt;/a>: Contributed engineering cycles to MyST MD development.&lt;/li>
&lt;/ul></description></item><item><title>Jupyter Book 2.0 will use MyST</title><link>https://deploy-preview-608--2i2c-org.netlify.app/blog/myst-jupyter-book/</link><pubDate>Tue, 21 May 2024 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/blog/myst-jupyter-book/</guid><description>&lt;p>See
&lt;a href="https://executablebooks.org/en/latest/blog/2024-05-20-jupyter-book-myst/" target="_blank" rel="noopener" >the Executable Books blog&lt;/a> for a post on the future directions of the Jupyter Book project, which will be built on top of the
&lt;a href="https://mystmd.org" target="_blank" rel="noopener" >MyST Markdown engine&lt;/a>.&lt;/p>
&lt;h2 id="acknowledgements">
Acknowledgements
&lt;a class="header-anchor" href="#acknowledgements">#&lt;/a>
&lt;/h2>&lt;ul>
&lt;li>This post relates to our ongoing collaboration with the
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/jupyter-book/" >Jupyter Book&lt;/a> project.&lt;/li>
&lt;li>Thanks to
&lt;a href="https://deploy-preview-608--2i2c-org.netlify.app/collaborators/pythia/" >Project Pythia&lt;/a> for funding part of our work on Jupyter Book.&lt;/li>
&lt;/ul></description></item><item><title>Angus Hollands</title><link>https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-608--2i2c-org.netlify.app/author/angus-hollands/</guid><description>&lt;p>Angus Hollands is an Open Source Applications Engineer at 2i2c. He was previously a post-doctoral researcher in the Computational High Energy Physics group at Princeton University. He has a long-standing history of working collaboratively in open source projects, such as Executable Books, Jupyter, scikit-hep, and Blender. He is motivated by open-source, open-science, and the FAIR principles to build a more accessible, empowering future for scientific research and publication. He obtained his PhD in nuclear structure from the University of Birmingham, and later worked as a postdoctoral researcher for the Princeton Institute for Computational Science and Engineering (PICSciE).&lt;/p></description></item></channel></rss>