<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - MyST</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-mystmd.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-07-09T15:15:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Navigating the Post-Workshop Fog: a Path to Myst</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/" rel="alternate"/><published>2026-07-09T15:15:00+00:00</published><updated>2026-07-09T15:15:00+00:00</updated><author><name>Chiara Marmo</name></author><id>tag:jasongrout.github.io,2026-07-09:/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/</id><summary type="html">&lt;p&gt;by Chiara Marmo and Serena Bonaretti&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;by Chiara Marmo and Serena Bonaretti&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/001-1_rxDzW-V0Ey6pg-hkg2bPag.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;From June 15th to 17th 2026 a &lt;a href="https://events.linuxfoundation.org/jupyter-workshops/"&gt;Jupyter Workshop&lt;/a&gt; took place at Paris-Saclay University : “&lt;a href="/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/"&gt;Demystifying MyST Markdown in education&lt;/a&gt;”. The workshop combined presentations in the mornings with collaborative sprints during the afternoons. It has been funded by the &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; and &lt;a href="https://www.dataia.eu/formations"&gt;SaclAI-School&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="milestones"&gt;Milestones&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improving documentation and tools for easier deployment even for non-specialists.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Freek Pols from Delft University and Brigitta Sipočz form CalTech presented some examples and challenges in publishing courses and documentation at large scales. Angus Hollands, MyST maintainer, made an in depth presentation of Myst and JupyterBook2. Guided tutorials introduced participants to complete a Jupyter Book workflow. The participants learned how to create their first Jupyter Book, and how to publish it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Text notebooks as first citizens.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Marc Wouts and Yahya Heni discussed the path from &lt;a href="https://jupytext.org/"&gt;jupytext&lt;/a&gt; to &lt;a href="https://github.com/notebook-link/jupyter-plainb"&gt;jupyter-plainb&lt;/a&gt; to open and execute plain markdown text notebooks directly in Jupyter Lab. Two Jupyter Enhancement Proposals (JEP) has been discussed together with Jupyter Lab and MyST maintainers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/103"&gt;Markdown based notebooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/138"&gt;Specify the markup language and flavor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="one-step-at-a-time"&gt;One step at a time&lt;/h2&gt;
&lt;p&gt;Over 30 &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=issues"&gt;issues&lt;/a&gt; and &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=pullrequests"&gt;pull requests&lt;/a&gt; have been opened in the whole Jupyter ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation items: for example, about &lt;a href="https://github.com/jupytext/jupytext/issues/1548"&gt;text notebooks in jupyterlite&lt;/a&gt; or publishing on &lt;a href="https://github.com/jupyter-book/jupyter-book/pull/2635"&gt;different hosting solutions&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;feature requests: for example, &lt;a href="https://github.com/jupyter-book/jupyter-book/issues/2634"&gt;single document feature in JupyterBook2&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/19093"&gt;non-default application to open files in Jupyter Lab&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;adopt JupyterBook2 for software documentation: for instance &lt;a href="https://github.com/mwouts/itables/pull/570"&gt;itables&lt;/a&gt; and &lt;a href="https://gitlab.com/travo-cr/travo/-/merge_requests/240"&gt;travo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sidewalks"&gt;Sidewalks&lt;/h2&gt;
&lt;p&gt;The workshop provided the opportunity to continue previous discussions about AI in education: some participants attended the workshop “&lt;a href="https://events.linuxfoundation.org/ai-in-jupyter/"&gt;AI in Jupyter&lt;/a&gt;” and were able to pick up the conversation from there.&lt;/p&gt;
&lt;p&gt;Relationships between Academia and Open Source Software communities were also topic of conversation: about Open Source Program Offices (OSPOs) and how their action can be connected to education strategies.&lt;/p&gt;
&lt;h2 id="wandering"&gt;Wandering&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/002-1_aWttEDS_jHdMWa1ZwvimPg.jpeg" alt="Participant group photo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Collaboration is a matter of trust. That’s why it is still important for people to meet in person and to know each other. It is about exchanging details, like keys to decrypt characters and aspirations. One might discover a shared passion for shoes. Another may finally enjoy long French-style lunch breaks.&lt;/p&gt;
&lt;p&gt;When the time comes to resume the path, important steps have already been taken in the right direction.&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Book"/><category term="MyST"/><category term="workshops"/></entry><entry><title>A Jupyter Workshop: Demystifying MyST Markdown in Education</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/" rel="alternate"/><published>2026-04-30T15:05:00+00:00</published><updated>2026-04-30T15:05:00+00:00</updated><author><name>Chiara Marmo</name></author><id>tag:jasongrout.github.io,2026-04-30:/medium-archive/pelican/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/</id><summary type="html">&lt;p&gt;A new Jupyter Workshop is happening June 15–17, 2026 in Orsay, France. Demystifying MyST Markdown in Education is a three-day workshop…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A new &lt;a href="https://events.linuxfoundation.org/jupyter-workshops/"&gt;Jupyter Workshop&lt;/a&gt; is happening &lt;strong&gt;June 15–17, 2026&lt;/strong&gt; in Orsay, France. &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/"&gt;Demystifying MyST Markdown in Education&lt;/a&gt; is a three-day workshop organized by the Jupyter community, focused on helping science educators adopt Jupyter Book and the MyST document engine for their teaching materials.&lt;/p&gt;
&lt;h2 id="whats-it-about"&gt;What’s it about?&lt;/h2&gt;
&lt;p&gt;The workshop aims to remove barriers for educators who want to use Jupyter Book and MyST to publish accessible, reproducible pedagogical content. Here are the broad topics of each day of the event:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Teaching use cases and needs&lt;/strong&gt; : what educators actually need from tools like Jupyter Book.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contributor tutorials and onboarding&lt;/strong&gt; : how to get involved with the project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MyST Markdown as a text representation for Jupyter notebooks :&lt;/strong&gt; writing and sharing computational narratives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attendees will learn how to contribute to the Jupyter Book community, collaborate with maintainers, and advocate for the needs of their users.&lt;/p&gt;
&lt;p&gt;Have a look to the &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/program/schedule/"&gt;workshop agenda&lt;/a&gt; and if you have ideas you would like to be discussed there, please share them in the &lt;a href="https://github.com/jupyter-book/team-compass/issues/47"&gt;related issue&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="where-and-how-to-join"&gt;Where and how to join&lt;/h2&gt;
&lt;p&gt;The workshop is hosted by &lt;a href="https://www.lisn.upsaclay.fr/"&gt;Laboratoire Interdisciplinaire des Sciences du Numérique (LISN)&lt;/a&gt; and supported by &lt;a href="https://www.dataia.eu/en/saclai-school"&gt;SaclAI-School&lt;/a&gt; at Université Paris-Saclay.&lt;br&gt;
&lt;strong&gt;Travel funding is available&lt;/strong&gt;, &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/attend/travel-funding/"&gt;apply here for travel funding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Registration and full details are on the &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/"&gt;event page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="thanks"&gt;Thanks&lt;/h2&gt;
&lt;p&gt;A huge thank you to the whole Jupyter community supporting the event and to the &lt;a href="/posts/2025/jupyter-community-workshops-early-2026/"&gt;Jupyter Foundation&lt;/a&gt; for making it possible.&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Book"/><category term="MyST"/><category term="workshops"/></entry><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>The MyST AnyWidget Directive</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/the-myst-anywidget-directive/" rel="alternate"/><published>2026-04-16T15:28:00+00:00</published><updated>2026-04-16T15:28:00+00:00</updated><author><name>Steve Purves</name></author><id>tag:jasongrout.github.io,2026-04-16:/medium-archive/pelican/posts/2026/the-myst-anywidget-directive/</id><summary type="html">&lt;p&gt;Authors of MyST Markdown can now embed interactive JavaScript widgets directly in content using the new {anywidget} directive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Authors of MyST Markdown can now embed interactive JavaScript widgets directly in content using the new &lt;code&gt;{anywidget}&lt;/code&gt; directive.&lt;/p&gt;
&lt;h2 id="what-this-means"&gt;What this means&lt;/h2&gt;
&lt;p&gt;You can now add any javascript interactivity to your MyST Markdown website or Jupyter Book.&lt;/p&gt;
&lt;p&gt;Here’s an example that creates a clickable button 👇 to see an interactive version check out &lt;a href="https://jupyterbook.org/blog/posts/2026/the-myst-anywidget#how-we-got-here"&gt;the post on the Jupyter Book blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/the-myst-anywidget-directive/images/001-1_TksTxGw_ahJkRxlsIVU5_g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="how-we-got-here"&gt;How we got here&lt;/h2&gt;
&lt;p&gt;The idea of a portable widget interface for interactive computing isn’t new: &lt;a href="https://anywidget.dev"&gt;anywidget&lt;/a&gt; has been an emerging standard in the Jupyter community for a while, leveraging modern Javascript principles (via &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules"&gt;ESM Modules&lt;/a&gt;), and giving you a simple &lt;code&gt;initialize({ model }); render({ model, el })&lt;/code&gt;&lt;a href="https://jupyterbook.org/blog/posts/2026/the-myst-anywidget#fn-model"&gt;[1]&lt;/a&gt; contract so that widgets can be written once and reused across notebooks. AnyWidget in Jupyter interfaces supports tight integration with the kernel, allowing interactions similar to &lt;code&gt;ipywidgets&lt;/code&gt;&lt;a href="https://jupyterbook.org/blog/posts/2026/the-myst-anywidget#fn-jupyter"&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the MyST Markdown and Jupyter Book point of view, we’ve focussed on supporting the &lt;code&gt;render()&lt;/code&gt; side of the AnyWidget interface (see &lt;a href="https://anywidget.dev/en/afm/#what-is-afm"&gt;AnyWidget Frontend Modules&lt;/a&gt;) to allow MyST users to bring any kind of javascript-based interactivity into their articles and books &lt;em&gt;without having to lean on Jupyter at all&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That part of the story started at SciPy 2024 with &lt;a href="https://github.com/manzt"&gt;Trevor Mantz&lt;/a&gt; and Steve Purves hacking through a proof of concept during the sprints. Curvenote built working support for &lt;a href="https://www.npmjs.com/package/@curvenote/any-widget"&gt;AnyWidgets as a MyST Markdown extension&lt;/a&gt; while working with researchers to support domain specific visualizations, and then upstreamed the implementation to create the &lt;code&gt;{anywidget}&lt;/code&gt; directive that has just been released in &lt;code&gt;mystmd&lt;/code&gt; and &lt;code&gt;jb2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The new directive in &lt;code&gt;mystmd&lt;/code&gt; and the respective supporting package in &lt;code&gt;@myst-theme/anywidget&lt;/code&gt; evolved with input from the JupyterBook team. Here’s how it is currently structured:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;anywidget&lt;/code&gt; is a new node in the MyST AST, meaning first-class support for this capability outside of notebooks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mystmd&lt;/code&gt; will bundle ESM and CSS modules at build time, ensuring dependencies are packaged with the book/article when it is published or deployed.&lt;/li&gt;
&lt;li&gt;The ESM and CSS modules can either be (a) hosted remotely (which makes sense for shared widgets that many people are using or collaborating around) or (b) added as local files (which makes sense for widgets specific to a single book/website).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;NodeRenderer&lt;/code&gt; part of the release is an independent package &lt;a href="https://www.npmjs.com/package/@myst-theme/anywidget"&gt;@myst-theme/anywidget&lt;/a&gt; that can be optionally adopted by theme developers (it’s already built into the core themes).&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;mystmd&lt;/code&gt; and Jupyter Book users, to upgrade to the latest theme. Run &lt;code&gt;myst clean --templates&lt;/code&gt; before you next start your server and the latest version will be downloaded.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;From an author’s perspective, point the directive at an ESM module (either a URL to a hosted script or a local path) and the widget runs in the page with its own state and DOM. You may optionally pass in a CSS URL/path and a JSON body of props to initialize the widget model.&lt;/p&gt;
&lt;p&gt;To understand how to build your own widgets, the &lt;a href="https://mystmd.org/guide/widgets"&gt;MyST widgets guide&lt;/a&gt; walks through the &lt;code&gt;render({ model, el })&lt;/code&gt; signature, styling with Shadow DOM, and cleanup on unmount. It’s the same mental model as &lt;code&gt;anywidget&lt;/code&gt; in Jupyter, so if you’ve written or seen Jupyter AnyWidgets, you’re already most of the way there.&lt;/p&gt;
&lt;p&gt;If you want to try it, the &lt;a href="https://github.com/jupyter-book/example-widgets"&gt;example-widgets repo&lt;/a&gt; has small demos (confetti, div-map, etc. Contributions are welcome!), and the &lt;a href="https://opensci.dev/"&gt;opensci.dev blog&lt;/a&gt; has some live examples using scientific datasets.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next&lt;/h2&gt;
&lt;p&gt;Widget support in MyST is still marked experimental so the details may evolve. There are still some things on the roadmap for &lt;code&gt;{anywidget}&lt;/code&gt; which will no doubt expand as we hear of new requirements from widget creators, but we expect the following to be close to the top of the stack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;model&lt;/code&gt; part of the interface, which will allow multiple instances of a widget to communicate on the page&lt;a href="https://jupyterbook.org/blog/posts/2026/the-myst-anywidget#fn-model"&gt;[1]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Shipping additional dependencies like static files that the widgets may need&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The JupyterBook team is actively working on improving and evolving the widget model and integrating with Jupyter. We look forward to seeing what the community builds — visit the &lt;a href="https://discord.mystmd.org/"&gt;discord&lt;/a&gt; to showcase what you have built!&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;A shout out to my co-contributors on this work; to &lt;a href="https://github.com/manzt"&gt;@mantz&lt;/a&gt; for the original hacking, &lt;a href="https://github.com/rowanc1"&gt;@rowanc1&lt;/a&gt; and &lt;a href="https://github.com/fwkoch"&gt;@fwkoch&lt;/a&gt; for iterating on the downstream code, &lt;a href="https://github.com/agoose77"&gt;@agoose77&lt;/a&gt; for working with me on the upstream changes, &lt;a href="https://github.com/choldgraf"&gt;@choldgraph&lt;/a&gt; for insightful reviews and a docs! and &lt;a href="https://github.com/jupyter-book"&gt;the broader Jupyter Book Team&lt;/a&gt; for all the reviews and feedback.&lt;/p&gt;
</content><category term="anywidget"/><category term="Jupyter Book"/><category term="MyST"/></entry><entry><title>What’s New in MyST Markdown 1.8.2</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/whats-new-in-myst-markdown-1-8-2/" rel="alternate"/><published>2026-03-26T15:10:00+00:00</published><updated>2026-03-26T15:10:00+00:00</updated><author><name>Jupyter Book</name></author><id>tag:jasongrout.github.io,2026-03-26:/medium-archive/pelican/posts/2026/whats-new-in-myst-markdown-1-8-2/</id><summary type="html">&lt;p&gt;The Jupyter Book team just released mystmd 1.8.2 and a new version of the MyST react theme! Below are a few things that stand out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Jupyter Book team just released &lt;strong&gt;mystmd 1.8.2&lt;/strong&gt; and a new version of the MyST react theme! Below are a few things that stand out.&lt;/p&gt;
&lt;h2 id="interactive-widgets-with-the-anywidget-directive"&gt;Interactive widgets with the &lt;code&gt;{anywidget}&lt;/code&gt; directive&lt;/h2&gt;
&lt;p&gt;You can now &lt;a href="https://mystmd.org/guide/widgets"&gt;embed JavaScript widgets&lt;/a&gt; in your MyST pages using the new &lt;code&gt;{anywidget}&lt;/code&gt; directive. Widgets follow the &lt;a href="https://anywidget.dev/"&gt;anywidget specification&lt;/a&gt;, which gives plugin authors an extension point for embedding JS capabilities in their documents.&lt;/p&gt;
&lt;p&gt;A widget is a JavaScript module that exports a &lt;code&gt;render&lt;/code&gt; function. You pass it initial state as JSON in the directive body, and it renders an interactive element on the page. You could use this for interactive figures, explorable explanations, or custom visualizations without leaving MyST.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A little confetti demo that we use to show off embedding widgets in a MyST document with anywidget!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/whats-new-in-myst-markdown-1-8-2/images/001-0_lkUWCUNKiKhXcUUK.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A little confetti demo that we use to show off embedding widgets in a MyST document with anywidget!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/em&gt;*: Widget support is experimental. The interfaces may change as we learn more about usage patterns. Only load widgets from sources you trust, since they execute JavaScript in the reader’s browser!*&lt;/p&gt;
&lt;h2 id="table-of-contents-improvements"&gt;Table of contents improvements&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;{toc}&lt;/code&gt; directive now supports a &lt;a href="https://github.com/jupyter-book/mystmd/pull/2705"&gt;&lt;code&gt;children&lt;/code&gt; context option&lt;/a&gt;, which lets you display only the child pages of the current page rather than the full project table of contents. Use it on landing pages and index pages that introduce a section and link to its sub-pages. You can see an example in the &lt;a href="https://jupyterbook.org/latest/get-started/"&gt;Jupyter Book getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="better-link-handling-across-multi-site-projects"&gt;Better link handling across multi-site projects&lt;/h2&gt;
&lt;p&gt;If your project spans multiple domains (e.g., a docs site and a blog), you can now &lt;a href="https://github.com/jupyter-book/myst-theme/pull/816"&gt;configure a domain to be treated as “internal”&lt;/a&gt; for link styling. Links to that domain will look like in-site navigation instead of external links. Check out &lt;a href="https://jupyterbook.org/latest/get-started"&gt;the Getting Started guide&lt;/a&gt; for an example.&lt;/p&gt;
&lt;h2 id="upgrade"&gt;Upgrade&lt;/h2&gt;
&lt;p&gt;To get the latest version of mystmd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mystmd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or for pip users:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mystmd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The theme updates automatically. Delete your &lt;code&gt;_build&lt;/code&gt; folder and mystmd will download the latest theme on your next build.&lt;/p&gt;
&lt;h2 id="changelogs"&gt;Changelogs&lt;/h2&gt;
&lt;p&gt;Find an ongoing list of releases in the Jupyter Book ecosystem here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterbook.org/releases"&gt;jupyterbook.org/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also read the original &lt;a href="https://github.com/jupyter-book/mystmd/releases/tag/mystmd%401.8.2"&gt;mystmd release notes&lt;/a&gt; and &lt;a href="https://github.com/jupyter-book/myst-theme/releases/tag/myst-to-react%401.1.4"&gt;myst-theme release notes&lt;/a&gt;.&lt;/p&gt;
</content><category term="MyST"/><category term="publishing"/></entry></feed>