<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Jenny Wong · Jupyter Blog</title>
    <link>https://jupyter.org/medium-archive/hugo/authors/jenny-wong/</link>
    <description>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</description>
    <generator>Hugo</generator>
    <lastBuildDate>Thu, 09 Apr 2026 15:02:48 &#43;0000</lastBuildDate>
    <atom:link href="https://jupyter.org/medium-archive/hugo/authors/jenny-wong/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Better sharing UX with nbgitpuller and contextual error handling</title>
      <link>https://jupyter.org/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/</link>
      <pubDate>Thu, 09 Apr 2026 15:02:48 &#43;0000</pubDate>
      <dc:creator>Jenny Wong</dc:creator>
      <guid>https://jupyter.org/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/</guid>
      <description>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 …</description>
      <content:encoded>&lt;p&gt;&lt;img src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/001-1_d1wtukpXH7983Z0nCKv33Q.webp&#34; width=&#34;1168&#34; height=&#34;478&#34; fetchpriority=&#34;high&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tldr&#34;&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jupyterhub/nbgitpuller&#34;&gt;nbgitpuller&lt;/a&gt; now has improved UX context-aware error handling. Update to &lt;a href=&#34;https://pypi.org/project/nbgitpuller/1.3.0/&#34;&gt;version 1.3.0&lt;/a&gt; and let us know what you think by opening an &lt;a href=&#34;https://github.com/jupyterhub/nbgitpuller/issues&#34;&gt;issue&lt;/a&gt; 🚀&lt;/p&gt;
&lt;h3 id=&#34;what-is-nbgitpuller&#34;&gt;What is nbgitpuller?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jupyterhub/nbgitpuller&#34;&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=&#34;https://nbgitpuller.readthedocs.io/en/latest/topic/automatic-merging.html&#34;&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=&#34;https://nbgitpuller.readthedocs.io/en/latest/link.html&#34;&gt;nbgitpuller link generator&lt;/a&gt; to create a link.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/002-0_2M4f_Hh6iyGP7VCo.webp&#34; width=&#34;1888&#34; height=&#34;959&#34; loading=&#34;lazy&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&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;video src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/003-0_J_A7MbZ2JI5hZh7n.mp4&#34; poster=&#34;/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/003-0_J_A7MbZ2JI5hZh7n-poster.webp&#34; width=&#34;1104&#34; height=&#34;620&#34; preload=&#34;none&#34; loop muted playsinline controls&gt;&lt;/video&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=&#34;how-does-nbgitpuller-work&#34;&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=&#34;when-it-goes-wrong&#34;&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 src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/004-1_v1NGeWyH5Frl9QDJ2qed0Q.webp&#34; width=&#34;700&#34; height=&#34;500&#34; loading=&#34;lazy&#34; alt=&#34;Bar chart showing the most common errors users faced.]&#34;&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 src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/005-1_6sYjI1QPnc_yz6IiIw442g.webp&#34; width=&#34;700&#34; height=&#34;500&#34; loading=&#34;lazy&#34; alt=&#34;Bar chart showing the most unique errors link authors made.&#34;&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=&#34;merge-conflicts&#34;&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=&#34;error-ux-old&#34;&gt;Error UX (old)&lt;/h3&gt;
&lt;figure&gt;
&lt;img src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/006-1_prhJ0nFlArAhfFwFFZbbLA.webp&#34; width=&#34;1553&#34; height=&#34;1027&#34; loading=&#34;lazy&#34; alt=&#34;Old UX for merge errors.&#34;&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=&#34;error-ux-new&#34;&gt;Error UX (new)&lt;/h3&gt;
&lt;figure&gt;
&lt;img src=&#34;https://jupyter.org/medium-archive/hugo/medium-archive/hugo/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error-handling/images/007-1_iE8c5G51r3qL8ITBFiOZKg.webp&#34; width=&#34;998&#34; height=&#34;553&#34; loading=&#34;lazy&#34; alt=&#34;New UX for merge errors.&#34;&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=&#34;learn-more&#34;&gt;Learn more&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nbgitpuller.readthedocs.io/en/latest/&#34;&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=&#34;https://www.berkeley.edu/&#34;&gt;UC Berkeley&lt;/a&gt; and the &lt;a href=&#34;https://www.cloudbank.org/training/access-cloudbank-classroom&#34;&gt;CloudBank Classroom&lt;/a&gt; project&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cal-icor.org/&#34;&gt;CAL ICOR&lt;/a&gt; for co-funding this development work&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ericvd-ucb&#34;&gt;Eric Van Dusen&lt;/a&gt; and &lt;a href=&#34;https://github.com/sean-morris&#34;&gt;Sean Morris&lt;/a&gt; for championing this work&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/balajialg&#34;&gt;Balaji Alwar&lt;/a&gt; for providing the error data and sharing feedback&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nthiery&#34;&gt;Nicolas M. Thiéry&lt;/a&gt; for feedback on the UX design&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/cmarmo&#34;&gt;cmarmo&lt;/a&gt; for contributing the ‘Backup and resync button’&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
  </channel>
</rss>
