<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Jenny Wong</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-jenny-wong.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-04-09T15:02:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Better sharing UX with nbgitpuller and contextual error handling</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/" rel="alternate"/><published>2026-04-09T15:02:00+00:00</published><updated>2026-04-09T15:02:00+00:00</updated><author><name>Jenny Wong</name></author><id>tag:jasongrout.github.io,2026-04-09:/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/</id><summary type="html">&lt;p&gt;TL;DR nbgitpuller now has improved UX context-aware error handling. Update to version 1.3.0 and let us know what you think by opening …&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/001-1_d1wtukpXH7983Z0nCKv33Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h3 id="tldr"&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/nbgitpuller"&gt;nbgitpuller&lt;/a&gt; now has improved UX context-aware error handling. Update to &lt;a href="https://pypi.org/project/nbgitpuller/1.3.0/"&gt;version 1.3.0&lt;/a&gt; and let us know what you think by opening an &lt;a href="https://github.com/jupyterhub/nbgitpuller/issues"&gt;issue&lt;/a&gt; 🚀&lt;/p&gt;
&lt;h3 id="what-is-nbgitpuller"&gt;What is nbgitpuller?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/nbgitpuller"&gt;nbgitpuller&lt;/a&gt; lets you distribute content to a Jupyter user via the click of a button! This allows your users to focus on the content without needing to understand git or other version control machinery.&lt;/p&gt;
&lt;p&gt;nbgitpuller provides &lt;a href="https://nbgitpuller.readthedocs.io/en/latest/topic/automatic-merging.html"&gt;automatic, opinionated conflict resolution&lt;/a&gt; by using git under the hood. It is commonly used to distribute content to multiple users of a JupyterHub, though it works just fine on an individual person’s computer, if they have Jupyter installed.&lt;/p&gt;
&lt;p&gt;Here’s an example of nbgitpuller in action:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The author uses the &lt;a href="https://nbgitpuller.readthedocs.io/en/latest/link.html"&gt;nbgitpuller link generator&lt;/a&gt; to create a link.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/002-0_2M4f_Hh6iyGP7VCo.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;The consumer clicks the link, and the content is pulled into a live Jupyter session.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/003-0_J_A7MbZ2JI5hZh7n.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Example use cases for sharing with nbgitpuller include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive demos&lt;/li&gt;
&lt;li&gt;Workshop and training scenarios&lt;/li&gt;
&lt;li&gt;University exams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and many more!&lt;/p&gt;
&lt;h3 id="how-does-nbgitpuller-work"&gt;How does nbgitpuller work?&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;nbgitpuller&lt;/code&gt; package is installed in the compute environment. The compute environment now has a &lt;code&gt;/git-pull&lt;/code&gt; endpoint URL that can understand where to pull content from using URL parameters. Syncing content critically depends on &lt;code&gt;git&lt;/code&gt; operations to &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h3 id="when-it-goes-wrong"&gt;When it goes wrong&lt;/h3&gt;
&lt;p&gt;Based on the data sent through by the kind folks running the Berkeley DataHub, there were 2163 logs available, of which:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;983 (45%) were ‘merge’ conflicts&lt;/li&gt;
&lt;li&gt;493 (23%) were ‘fetch’ errors&lt;/li&gt;
&lt;li&gt;467 (22%) were ‘ls-remote’ errors&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Bar chart showing the most common errors users faced.]" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/004-1_v1NGeWyH5Frl9QDJ2qed0Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Bar chart showing the most common errors users faced.]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The remaining errors (10%) were mostly ‘checkout’ errors. This represents the most &lt;strong&gt;frequent&lt;/strong&gt; errors as seen by students.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Bar chart showing the most unique errors link authors made." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/005-1_6sYjI1QPnc_yz6IiIw442g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Bar chart showing the most unique errors link authors made.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In the same set of logs, there were 172 &lt;strong&gt;unique&lt;/strong&gt; errors: most ‘ls-remote’ errors come from mistakes in the content repo URL. This represents the most uniquely common errors made by instructors.&lt;/p&gt;
&lt;h3 id="merge-conflicts"&gt;Merge conflicts&lt;/h3&gt;
&lt;p&gt;If the link author changes content after the consumer clicks a link, then &lt;code&gt;nbgitpuller&lt;/code&gt; needs to sync updates for the consumer on subsequent link clicks. The &lt;code&gt;nbgitpuller&lt;/code&gt; merging strategy makes opinionated choices so that the link consumer &lt;em&gt;never&lt;/em&gt; has to interact with git, and will always preserve the consumer’s working changes.&lt;/p&gt;
&lt;p&gt;Things can go wrong when&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consumers can diverge the git history if they perform a git commit&lt;/li&gt;
&lt;li&gt;Authors can diverge the git history if they perform force push commits&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="error-ux-old"&gt;Error UX (old)&lt;/h3&gt;
&lt;figure&gt;
&lt;img alt="Old UX for merge errors." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/006-1_prhJ0nFlArAhfFwFFZbbLA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Old UX for merge errors.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Problems with the old UX include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a scary terminal&lt;/li&gt;
&lt;li&gt;difficulty for the user to figure out what went wrong&lt;/li&gt;
&lt;li&gt;no suggestion for the user to fix the problem or a signpost to continue to the compute platform&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="error-ux-new"&gt;Error UX (new)&lt;/h3&gt;
&lt;figure&gt;
&lt;img alt="New UX for merge errors." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/007-1_iE8c5G51r3qL8ITBFiOZKg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New UX for merge errors.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;New improvements to the UX include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The terminal is closed by default, but you can optionally toggle it open&lt;/li&gt;
&lt;li&gt;There is a copy to clipboard button to easily share the error log from the terminal&lt;/li&gt;
&lt;li&gt;A more user-friendly and context-aware helper message is displayed&lt;/li&gt;
&lt;li&gt;A link to the general documentation for reference&lt;/li&gt;
&lt;li&gt;A ‘Proceed without syncing’ button takes the user to the compute platform without making any changes&lt;/li&gt;
&lt;li&gt;In the case of merge errors, an extra &lt;strong&gt;Backup and resync&lt;/strong&gt; button option is presented&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="learn-more"&gt;Learn more&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nbgitpuller.readthedocs.io/en/latest/"&gt;nbgitpuller documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Acknowledgements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.berkeley.edu/"&gt;UC Berkeley&lt;/a&gt; and the &lt;a href="https://www.cloudbank.org/training/access-cloudbank-classroom"&gt;CloudBank Classroom&lt;/a&gt; project&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cal-icor.org/"&gt;CAL ICOR&lt;/a&gt; for co-funding this development work&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ericvd-ucb"&gt;Eric Van Dusen&lt;/a&gt; and &lt;a href="https://github.com/sean-morris"&gt;Sean Morris&lt;/a&gt; for championing this work&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balajialg"&gt;Balaji Alwar&lt;/a&gt; for providing the error data and sharing feedback&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nthiery"&gt;Nicolas M. Thiéry&lt;/a&gt; for feedback on the UX design&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cmarmo"&gt;cmarmo&lt;/a&gt; for contributing the ‘Backup and resync button’&lt;/li&gt;
&lt;/ul&gt;
</content><category term="JupyterHub"/></entry></feed>