<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://nebari.dev/blog</id>
    <title>Nebari Blog</title>
    <updated>2026-03-16T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://nebari.dev/blog"/>
    <subtitle>Nebari Blog</subtitle>
    <icon>https://nebari.dev/logo/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[From uv to nebi: Reproducible Python Environments for Data Science Teams]]></title>
        <id>https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments</id>
        <link href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how conda, pixi, and nebi solve Python environment reproducibility for data science teams that need GDAL, CUDA, and C libraries beyond uv.]]></summary>
        <content type="html"><![CDATA[<p>uv has quickly become the go-to Python package manager. It's fast, handles lockfiles, and manages virtual environments out of the box. For pure Python projects, it works great.</p>
<p>But data science and AI projects rarely stay pure Python. Many key packages depend on compiled C/C++ libraries that must be installed at the system level.</p>
<p>uv can install the Python bindings, but not the system libraries underneath them.</p>
<p>In this article, we'll explore three tools, each adding a layer on top of the previous:</p>
<ul>
<li><strong><a href="https://github.com/conda/conda" target="_blank" rel="noopener noreferrer">conda</a></strong> creates isolated environments with both Python and non-Python dependencies, including R, C++, and system libraries</li>
<li><strong><a href="https://github.com/prefix-dev/pixi" target="_blank" rel="noopener noreferrer">pixi</a></strong> adds lockfiles, multi-platform support, system requirements like CUDA versions, and a built-in task runner on top of conda-forge</li>
<li><strong><a href="https://github.com/nebari-dev/nebi" target="_blank" rel="noopener noreferrer">nebi</a></strong> layers version control and team collaboration on top of pixi workspaces</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-problem-with-uv">The Problem with uv<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#the-problem-with-uv" class="hash-link" aria-label="Direct link to The Problem with uv" title="Direct link to The Problem with uv">​</a></h2>
<p>To make the comparison concrete, we'll set up the same geospatial ML project with each tool. Its dependencies come from two sources:</p>
<ul>
<li><strong>conda-forge</strong>: geopandas and GDAL (compiled C/C++ geospatial libraries) and LightGBM (optimized compiled binaries)</li>
<li><strong>PyPI</strong>: scikit-learn (pure Python, uv handles it fine)</li>
</ul>
<p>uv installs Python packages from PyPI, but it has no mechanism for installing compiled system libraries, header files, or non-Python dependencies.</p>
<p>This becomes a problem with packages like GDAL. <code>uv add gdal</code> only downloads Python bindings. If the underlying C/C++ library isn't already installed, the build fails:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">uv add gdal</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">× Failed to build `gdal==3.12.2`</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">├─▶ The build backend returned an error</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">╰─▶ Call to `setuptools.build_meta.build_wheel` failed (exit status: 1)</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    gdal_config_error: [Errno 2] No such file or directory: 'gdal-config'</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    Could not find gdal-config. Make sure you have installed</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    the GDAL native library and development headers.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Fixing this means installing GDAL through your OS package manager, then matching the exact version to the Python package:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># Ubuntu/Debian: install system library + headers</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">sudo apt-get install -y libgdal-dev gdal-bin</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">export C_INCLUDE_PATH=/usr/include/gdal</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">uv add GDAL==$(gdal-config --version)</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># macOS: install via Homebrew</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">brew install gdal</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">uv add GDAL==$(gdal-config --version)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conda-the-established-default">conda: The Established Default<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#conda-the-established-default" class="hash-link" aria-label="Direct link to conda: The Established Default" title="Direct link to conda: The Established Default">​</a></h2>
<p>conda launched in 2012 to solve exactly this problem. It ships pre-compiled binaries with all their system dependencies bundled, so packages like GDAL work across platforms without manual compilation:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">conda install -c conda-forge gdal</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">Solving environment: done</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">The following NEW packages will be INSTALLED:</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  gdal            3.11.4   # Python bindings</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  libgdal-core    3.11.4   # compiled C/C++ library</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  proj            9.7.1    # coordinate system library</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  geos            3.10.6   # geometry engine</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  geotiff         1.7.4    # GeoTIFF support</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  libspatialite   5.1.0    # spatial SQL engine</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  xerces-c        3.3.0    # XML parser</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  ... and 50+ other compiled dependencies</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">Total: 72.2 MB</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We can see that one command pulls in GDAL along with 60+ compiled dependencies, including the C/C++ library, coordinate system tools, and geometry engines.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="where-environments-live">Where Environments Live<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#where-environments-live" class="hash-link" aria-label="Direct link to Where Environments Live" title="Direct link to Where Environments Live">​</a></h3>
<p>With uv, environments live inside your project directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># creates ./my-project/.venv/</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">uv venv</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">source .venv/bin/activate</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>conda stores environments in a central directory instead:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># creates ~/miniconda3/envs/geo-ml/</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">conda create -n geo-ml python=3.11</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">conda activate geo-ml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Imagine you're working on two projects: land cover classification and flood risk analysis. Here's how each tool handles their environments:</p>
<!-- -->
<p>Here's what the diagram shows:</p>
<ul>
<li><strong>uv</strong> creates a separate <code>.venv/</code> for each project. Python packages are duplicated, and system libraries must be installed separately through your OS package manager.</li>
<li><strong>conda</strong> lets multiple projects share one environment. Python packages and system libraries are all managed in one place.</li>
</ul>
<p>This makes it easy to reuse the same setup across related projects without reinstalling anything.</p>
<p>However, sharing creates a tracking problem. Since environments live outside project directories, there's no way to tell which environment a project needs just by looking at its files.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="two-package-managers-one-environment">Two Package Managers, One Environment<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#two-package-managers-one-environment" class="hash-link" aria-label="Direct link to Two Package Managers, One Environment" title="Direct link to Two Package Managers, One Environment">​</a></h3>
<p>conda uses its own package channels instead of PyPI. The most popular is <a href="https://conda-forge.org/" target="_blank" rel="noopener noreferrer">conda-forge</a>, a community-maintained channel where packages come with system dependencies pre-compiled and bundled. However, its selection is much smaller than PyPI.</p>
<p>For everything conda-forge doesn't have, you fall back to pip:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># conda-forge packages (non-Python dependencies)</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">conda install -c conda-forge geopandas gdal lightgbm</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># PyPI packages for Python-only libraries</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pip install scikit-learn</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This means two package managers modify the same environment independently, but neither checks what the other installed. If both install conflicting versions of a shared dependency, you won't get a warning:</p>
<!-- -->
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sharing-environments-with-your-team">Sharing Environments with Your Team<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#sharing-environments-with-your-team" class="hash-link" aria-label="Direct link to Sharing Environments with Your Team" title="Direct link to Sharing Environments with Your Team">​</a></h3>
<p>To make a project reproducible, you need to share the exact environment used to run it. That includes the precise version of every dependency, from Python packages to compiled system libraries.</p>
<p>conda handles this with <code>environment.yml</code>. You export your current environment to a file, commit it to your repo, and teammates use it to recreate the same setup.</p>
<p>To generate the file, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">conda env export &gt; environment.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This generates a file listing every package and its version:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> geo</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token key atrule">channels</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">forge</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> python=3.11.9</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> geopandas=0.14.4</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> gdal=3.8.5</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> lightgbm=4.3.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">pip</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> scikit</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">learn==1.4.2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Unlike uv's <code>uv.lock</code>, this file captures both conda-forge and pip packages in one place. It also records the channel each package came from, so conda knows where to fetch them during installation.</p>
<p>Once committed to the repo, a teammate can recreate the environment with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">conda env create -f environment.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This works, but notice the file only lists packages you explicitly installed. It doesn't pin the 60+ transitive dependencies underneath them.</p>
<p>For example, geopandas depends on proj, geos, and shapely, but their versions aren't recorded. Running <code>conda env create</code> next month may pull newer versions of those libraries, silently changing behavior.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="good-practices-that-arent-enforced">Good Practices That Aren't Enforced<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#good-practices-that-arent-enforced" class="hash-link" aria-label="Direct link to Good Practices That Aren't Enforced" title="Direct link to Good Practices That Aren't Enforced">​</a></h3>
<p>conda works well when you follow a set of unwritten rules:</p>
<ul>
<li><strong>Always create a named environment before installing anything.</strong> Otherwise packages land in the always-active base environment, where they accumulate and conflict with project environments over time.</li>
<li><strong>Never mix conda and pip install order.</strong> conda can't track what pip installed. If you install pip packages first, a later <code>conda install</code> may overwrite them without warning.</li>
<li><strong>Re-export <code>environment.yml</code> after every change.</strong> Forget once, and the file your teammates rely on no longer matches the actual environment.</li>
</ul>
<p>These rules exist because conda doesn't automate what it should. The best tools make good practices the default, not something you have to remember.</p>
<p>pixi was designed around that idea.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pixi-modern-environment-management">pixi: Modern Environment Management<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#pixi-modern-environment-management" class="hash-link" aria-label="Direct link to pixi: Modern Environment Management" title="Direct link to pixi: Modern Environment Management">​</a></h2>
<p>pixi, built in Rust by prefix-dev, takes the opposite approach to conda. It manages both conda-forge and PyPI dependencies in a single tool, resolving dependencies 10-100x faster while enforcing good practices structurally.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h3>
<p>Install pixi with the official install script:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">curl -fsSL https://pixi.sh/install.sh | sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>See the <a href="https://pixi.prefix.dev/latest/installation/" target="_blank" rel="noopener noreferrer">pixi documentation</a> for other installation methods.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="project-level-environments">Project-Level Environments<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#project-level-environments" class="hash-link" aria-label="Direct link to Project-Level Environments" title="Direct link to Project-Level Environments">​</a></h3>
<p>Instead of creating environments separately like conda, pixi defines the environment inside the project directory from the start.</p>
<p>To start a new project, run <code>pixi init</code> in your project directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># Create and enter project directory</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">mkdir geo-ml &amp;&amp; cd geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># Initialize pixi project</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi init</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This creates a <code>pixi.toml</code> manifest that tracks dependencies and lives in version control with your code.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">[workspace]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">authors = ["Khuyen Tran &lt;khuyentran@codecut.ai&gt;"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">channels = ["conda-forge"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">name = "geo-ml"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">platforms = ["osx-arm64"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">version = "0.1.0"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[tasks]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[dependencies]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Notice that pixi automatically detects your platform and sets <code>conda-forge</code> as the default channel. The <code>[dependencies]</code> section is empty, ready for you to add packages.</p>
<p>If you're migrating from conda, pixi can import your existing environment directly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi init --import environment.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="environment-activation">Environment Activation<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#environment-activation" class="hash-link" aria-label="Direct link to Environment Activation" title="Direct link to Environment Activation">​</a></h3>
<p>conda requires you to activate environments by name (<code>conda activate my-env</code>). pixi simplifies this by using the current project directory to determine the environment.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi shell</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>pixi creates a <code>.pixi/envs/</code> directory inside your project, so each environment lives with its code:</p>
<!-- -->
<p>For one-off commands, <code>pixi run</code> launches the command inside the environment without requiring activation:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi run python train.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="unified-dependency-management">Unified Dependency Management<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#unified-dependency-management" class="hash-link" aria-label="Direct link to Unified Dependency Management" title="Direct link to Unified Dependency Management">​</a></h3>
<p>With conda, you need separate tools for conda-forge and PyPI packages. pixi handles both in one command, recording each dependency in the manifest automatically.</p>
<p>Add conda-forge packages and PyPI packages:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># conda-forge packages</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi add python geopandas gdal lightgbm</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># PyPI packages</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi add --pypi scikit-learn</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Each command updates the <code>pixi.toml</code> manifest and regenerates the lockfile automatically. The resulting manifest looks like this:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">[workspace]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">authors = ["Khuyen Tran &lt;khuyentran@codecut.ai&gt;"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">channels = ["conda-forge"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">name = "geo-ml"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">platforms = ["osx-arm64"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">version = "0.1.0"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[tasks]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[dependencies]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">python = "&gt;=3.14.3,&lt;3.15"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">geopandas = "&gt;=1.1.3,&lt;2"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">gdal = "&gt;=3.12.2,&lt;4"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">lightgbm = "&gt;=4.6.0,&lt;5"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[pypi-dependencies]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">scikit-learn = "*"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If your project already uses <code>pyproject.toml</code>, pixi can use it as the manifest instead of <code>pixi.toml</code>. Initialize with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi init --format pyproject</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="automatic-lockfiles">Automatic Lockfiles<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#automatic-lockfiles" class="hash-link" aria-label="Direct link to Automatic Lockfiles" title="Direct link to Automatic Lockfiles">​</a></h3>
<p>To install all dependencies from <code>pixi.toml</code>, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi install</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Unlike conda's manual <code>conda env export</code>, pixi also generates a <code>pixi.lock</code> file automatically. The lockfile pins every transitive dependency to an exact version, hash, and download URL:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic"># pixi.lock (excerpt)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain">//conda.anaconda.org/</span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/gdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.2.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">sha256</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> ac9a886dc1b4784da86c10946920031ccf85ebd97</span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">md5</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> 61e0829c9528ca287918fa86e56dbca2</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">depends</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> __osx </span><span class="token punctuation" style="color:rgb(153, 76, 195)">&gt;</span><span class="token plain">=11.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> libcxx </span><span class="token punctuation" style="color:rgb(153, 76, 195)">&gt;</span><span class="token plain">=19</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> libgdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">core 3.12.2.*</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> numpy </span><span class="token punctuation" style="color:rgb(153, 76, 195)">&gt;</span><span class="token plain">=1.23</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain">&lt;3</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">license</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> MIT</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To share this with your team, commit both <code>pixi.toml</code> and <code>pixi.lock</code> to version control. When a teammate runs <code>pixi install</code>, they get the exact same environment.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="built-in-task-runner">Built-in Task Runner<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#built-in-task-runner" class="hash-link" aria-label="Direct link to Built-in Task Runner" title="Direct link to Built-in Task Runner">​</a></h3>
<p>Data science projects involve commands that are hard to remember:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">python src/preprocess.py --input data/raw --output data/processed</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">python src/train.py --config configs/experiment_3.yaml --epochs 100</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pytest tests/ -v --cov=src</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Teams typically manage these with Makefiles or shell scripts. pixi has a built-in task runner that stores these commands alongside your dependencies, so no one has to memorize them.</p>
<p>To define a task, use <code>pixi task add</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi task add preprocess "python src/preprocess.py --input data/raw --output data/processed"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi task add train "python src/train.py"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi task add test "pytest tests/"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This adds three tasks to <code>pixi.toml</code>: <code>preprocess</code> runs the data pipeline, <code>train</code> starts model training, and <code>test</code> runs the test suite.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">[tasks]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">preprocess = "python src/preprocess.py --input data/raw --output data/processed"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">train = "python src/train.py"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">test = "pytest tests/"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To run any task, use <code>pixi run</code> followed by the task name:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi run train</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi run test</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Tasks run inside the project environment automatically, with no need to activate first.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="multi-platform-support">Multi-Platform Support<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#multi-platform-support" class="hash-link" aria-label="Direct link to Multi-Platform Support" title="Direct link to Multi-Platform Support">​</a></h3>
<p>pixi can target multiple platforms from a single manifest. The lockfile includes platform-specific entries for both Python packages and system libraries.</p>
<p>For example, to support both macOS and Linux from the same project:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi workspace platform add linux-64 win-64</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>pixi.toml</code> now lists all target platforms:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">[workspace]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">channels = ["conda-forge"]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">name = "geo-ml"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">platforms = ["osx-arm64", "linux-64", "win-64"]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The lockfile reflects this change. Previously it only contained entries for your machine:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic"># pixi.lock (single platform)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token key atrule">packages</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">osx-arm64</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/gdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">py314h0ed7ee7_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/libgdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">core</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">h38a4fdb_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/proj</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">9.8.0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">hfb14a63_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After adding platforms, pixi resolves the correct binaries for each one:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic"># pixi.lock (multi-platform)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token key atrule">packages</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">linux-64</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/gdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">py314hd76b233_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/libgdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">core</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">h4f65170_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/proj</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">9.8.0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">he0df7b0_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">osx-arm64</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/gdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">py314h0ed7ee7_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/libgdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">core</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">h38a4fdb_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/proj</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">9.8.0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">hfb14a63_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token key atrule">win-64</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/gdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">py314h589ebb0_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/libgdal</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">core</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">3.12.3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">h977623c_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain"> </span><span class="token key atrule">conda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><span class="token plain">/proj</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">9.8.0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">-</span><span class="token plain">hd30e2cd_0.conda</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="multiple-environments">Multiple Environments<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#multiple-environments" class="hash-link" aria-label="Direct link to Multiple Environments" title="Direct link to Multiple Environments">​</a></h3>
<p>Teams might also need separate environments for different purposes, like only keeping testing and linting tools in a dev environment.</p>
<p>pixi supports this with features. A feature groups extra dependencies that you can layer on top of the default environment:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi add --feature dev pytest ruff</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then create an environment that includes the feature:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi workspace environment add dev --feature dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>These two commands update <code>pixi.toml</code> with the new feature and environment:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">[feature.dev.dependencies]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pytest = "*"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">ruff = "*"</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">[environments]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">dev = ["dev"]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>dev = ["dev"]</code> means the <code>dev</code> environment includes default dependencies plus everything under <code>[feature.dev.dependencies]</code>.</p>
<p>To use the dev environment, pass <code>-e dev</code> to any pixi command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi shell -e dev       # activate an interactive shell</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi run -e dev pytest  # run a single command</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="global-tool-installation">Global Tool Installation<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#global-tool-installation" class="hash-link" aria-label="Direct link to Global Tool Installation" title="Direct link to Global Tool Installation">​</a></h3>
<p>Not every tool belongs in a project environment. Code formatters, linters, and interactive shells are useful everywhere but don't need to be a dependency of any specific project. pixi handles this with global installs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi global install ipython</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi global install ruff</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Once installed, they're available from any directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">ipython    # start interactive Python shell</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">ruff check .  # lint any project</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="limitations-of-pixi">Limitations of pixi<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#limitations-of-pixi" class="hash-link" aria-label="Direct link to Limitations of pixi" title="Direct link to Limitations of pixi">​</a></h3>
<p>pixi solves dependency management, but it wasn't designed for environment lifecycle management. These limitations affect both individual developers and teams:</p>
<p><strong>No version history or diffing:</strong> pixi overwrites the lockfile on every <code>pixi add</code> or <code>pixi remove</code>. There's no built-in way to see what changed or roll back. You could diff <code>pixi.lock</code> in git history, but lockfiles pin hundreds of packages, making manual comparison impractical:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi add numpy=2.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># The previous lockfile is gone</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Environments are tied to projects:</strong> pixi environments live inside project directories. There's no way to share an environment without sharing the entire repo, or publish it as a standalone artifact others can install:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">cd geo-ml &amp;&amp; pixi shell # must be inside the project</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>No governance:</strong> pixi has no concept of permissions, approval workflows, or audit trails. Anyone who can edit <code>pixi.toml</code> can change the environment, with no way to require approval or track who changed what.</p>
<!-- -->
<p>nebi was built to fill these gaps.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="nebi-team-environment-collaboration">nebi: Team Environment Collaboration<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#nebi-team-environment-collaboration" class="hash-link" aria-label="Direct link to nebi: Team Environment Collaboration" title="Direct link to nebi: Team Environment Collaboration">​</a></h2>
<p>nebi is a CLI and desktop application that adds version control and team sharing to pixi. Think of it as "git for environments."</p>
<p>For individual developers, it adds version history and rollback. For organizations, it adds governance, access control, and shareable environments.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h3>
<p>nebi builds on top of pixi, so make sure pixi is installed first. Then install nebi using pixi:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># Install pixi (if not already installed)</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">curl -fsSL https://pixi.sh/install.sh | sh</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"># Install nebi</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi global install nebi</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>See the <a href="https://nebi.nebari.dev/docs/installation" target="_blank" rel="noopener noreferrer">installation guide</a> for other installation options, including the install script, conda, and source builds.</p>
<p>Then initialize nebi inside an existing pixi project:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">cd geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi init</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If the directory doesn't have a <code>pixi.toml</code> yet, nebi runs <code>pixi init</code> automatically.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-workspaces-by-name">Use Workspaces by Name<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#use-workspaces-by-name" class="hash-link" aria-label="Direct link to Use Workspaces by Name" title="Direct link to Use Workspaces by Name">​</a></h3>
<p>pixi environments are tied to project directories. nebi lets you activate any tracked workspace by name from any directory. First, see what's available:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi workspace list</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">NAME           PATH</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">geo-ml         /home/user/projects/geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">data-science   /home/user/projects/data-science</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>With this setup, you can activate the same environment from any directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">cd ~/projects/analysis</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi shell geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">cd ~/projects/dashboard</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi shell geo-ml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Or run a specific task directly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi run geo-ml train</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-the-server">Setting Up the Server<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#setting-up-the-server" class="hash-link" aria-label="Direct link to Setting Up the Server" title="Direct link to Setting Up the Server">​</a></h3>
<p>The features above work locally. For team collaboration, nebi adds a server layer for syncing, sharing, and governing environments.</p>
<p>Create an admin account by setting environment variables:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">export ADMIN_USERNAME=admin</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">export ADMIN_PASSWORD=your-password</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then start the server:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi serve</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This starts a server on <code>http://localhost:8460</code>. To connect your CLI to the server, log in:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi login http://localhost:8460</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In production, you'd deploy the server behind a domain like <code>https://nebi.company.com</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="versioning-environments">Versioning Environments<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#versioning-environments" class="hash-link" aria-label="Direct link to Versioning Environments" title="Direct link to Versioning Environments">​</a></h3>
<p>pixi overwrites the lockfile on every change. nebi lets you push snapshots as you iterate:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain"># Push current state using the project name</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi push geo-ml:v1.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>A colleague can reproduce your environment by logging in to the same server and pulling it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi login http://localhost:8460</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi pull geo-ml:v1.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This pulls the latest <code>pixi.toml</code> and <code>pixi.lock</code> into the current directory. Running <code>pixi install</code> then recreates the exact same environment.</p>
<p><strong>Diff environments:</strong> Lockfiles contain hundreds of pinned packages. Manually diffing them is tedious. To see a diff in action, add a package and push a new version:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">pixi add pandas</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi push geo-ml:v2.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then compare what changed between versions:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi diff geo-ml:v1.0 geo-ml:v2.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">--- geo-ml:v1.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+++ geo-ml:v2.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">@@ pixi.toml @@</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> [dependencies]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+pandas = "&gt;=3.0.1,&lt;4"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The diff shows that pandas was added between v1.0 and v2.0, without having to scan hundreds of lockfile entries.</p>
<p><strong>Rolling back:</strong> If an update breaks your workflow, pull the last working tag and reinstall:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi pull geo-ml:v1.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">pixi install</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To check which version is currently active, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi status</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">Workspace: geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">Path:      /Users/khuyentran/openteams/geo-ml</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">Server:    http://localhost:8460</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">Origin:</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">  geo-ml:v1.0 (pull)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sharing-and-governance">Sharing and Governance<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#sharing-and-governance" class="hash-link" aria-label="Direct link to Sharing and Governance" title="Direct link to Sharing and Governance">​</a></h3>
<p>Server-based sharing works within a team, but requires everyone to connect to the same nebi instance.</p>
<p>For broader distribution, you can publish environments to an OCI registry, the same standard behind Docker Hub and GitHub Container Registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi publish my-project</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can also tag a specific version or target a different registry like GitHub Container Registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi publish my-project --tag v1.0.0</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">nebi publish my-project --registry ghcr --repo myorg/myenv</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To see what's available in the registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi registry list</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Anyone with registry access can then import the environment without needing a nebi server:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">nebi import quay.io/nebari/data-science:v1.0 -o ./my-project</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>As environments are shared more broadly, you also need to control who can publish or modify them. nebi handles this through role-based access control:</p>
<ul>
<li><strong>Role-based access control (RBAC)</strong>: Control who can push, pull, or modify shared environments</li>
<li><strong>OIDC authentication</strong>: Integrate with existing identity providers so IT teams can enforce access policies</li>
<li><strong>Multi-user collaboration</strong>: Multiple team members track and share environments through a central server</li>
<li><strong>Desktop application</strong>: A graphical interface for managing environments without touching the terminal</li>
</ul>
<p>Together, these features give teams visibility into environment changes and control over who can modify production dependencies.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-not-docker">Why Not Docker?<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#why-not-docker" class="hash-link" aria-label="Direct link to Why Not Docker?" title="Direct link to Why Not Docker?">​</a></h2>
<p>Docker solves reproducibility at the container level, packaging your entire operating system, libraries, and code into a portable image. For deployment, Docker is the standard.</p>
<p>However, for day-to-day data science development, Docker adds friction that slows down iteration:</p>
<ul>
<li><strong>Rebuild overhead</strong>: Every dependency change requires rebuilding the image, even with layer caching</li>
<li><strong>Disk usage</strong>: Docker images for data science often exceed 5-10 GB per project</li>
<li><strong>GPU passthrough</strong>: CUDA access inside containers requires nvidia-docker and driver-specific configuration</li>
</ul>
<p>In contrast, pixi and nebi give you reproducibility through lockfiles and sharing through registries, all at the environment level with no container overhead.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://nebari.dev/blog/conda-pixi-nebi-reproducible-environments#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>Here's how the three tools compare:</p>
<table><thead><tr><th>Feature</th><th>uv</th><th>conda</th><th>pixi</th><th>nebi</th></tr></thead><tbody><tr><td>Compiled system libraries</td><td>No</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Fast dependency resolution</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td></tr><tr><td>Lockfiles</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td></tr><tr><td>Project-based environments</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td></tr><tr><td>PyPI + conda-forge support</td><td>No</td><td>Limited</td><td>Yes</td><td>Yes</td></tr><tr><td>Environment versioning</td><td>No</td><td>No</td><td>No</td><td>Yes</td></tr><tr><td>Team sharing via registries</td><td>No</td><td>No</td><td>No</td><td>Yes</td></tr><tr><td>Role-based access control</td><td>No</td><td>No</td><td>No</td><td>Yes</td></tr></tbody></table>
<p>In short:</p>
<ul>
<li>Start with <strong>pixi</strong> for fast, lockfile-based environment management.</li>
<li>Add <strong>nebi</strong> when you need version history, team sharing, or access control.</li>
<li>Stick with <strong>conda</strong> only if migrating isn't an option for your existing workflow.</li>
</ul>
<p>Learn more about nebi and how to set it up for your team at <a href="https://nebi.nebari.dev/" target="_blank" rel="noopener noreferrer">nebi.nebari.dev</a>.</p>]]></content>
        <author>
            <name>Khuyen Tran</name>
            <uri>https://github.com/khuyentran1401</uri>
        </author>
        <category label="python" term="python"/>
        <category label="conda" term="conda"/>
        <category label="pixi" term="pixi"/>
        <category label="nebi" term="nebi"/>
        <category label="reproducibility" term="reproducibility"/>
        <category label="environment-management" term="environment-management"/>
        <category label="data-science" term="data-science"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nebari Blog - A New Community Space]]></title>
        <id>https://nebari.dev/blog/introducing-blogs</id>
        <link href="https://nebari.dev/blog/introducing-blogs"/>
        <updated>2026-03-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A new community space for sharing blog posts.]]></summary>
        <content type="html"><![CDATA[<p>We're excited to start this blog for Nebari, a space for the Nebari development team and community members to share their work.</p>
<p>If you are interested in contributing a blog, open a pull request in the <a href="https://github.com/nebari-dev/nebari-docs" target="_blank" rel="noopener noreferrer"><code>nebari-dev/nebari-docs</code> repository</a>. You can share details about how you and your organization use Nebari, ways you have extended it, and more.</p>
<p>The Nebari team is building many new and interesting projects that we can't wait to share with you here. Stay tuned!</p>]]></content>
        <author>
            <name>Nebari team</name>
            <uri>https://github.com/nebari-dev</uri>
        </author>
    </entry>
</feed>