<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>conda.org Blog</title>
        <link>https://conda.org/blog</link>
        <description>conda.org Blog</description>
        <lastBuildDate>Thu, 07 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Conda and pip are two ecosystems, not just tools]]></title>
            <link>https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems</link>
            <guid>https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems</guid>
            <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[`conda` and `pip` are two parallel ecosystems trying to solve different problems rather than two competing tools]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preface">Preface<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#preface" class="hash-link" aria-label="Direct link to Preface" title="Direct link to Preface" translate="no">​</a></h2>
<p>This post is adapted from a talk I gave at PyConDE &amp; PyData 2026.</p>
<p>In it, I walk through the evolution of Python packaging, from <code>distutils</code> to <code>pip</code>, and later to <code>conda</code>, and how these tools emerged in response to different needs within the Python community.</p>
<p>The ideas in this post are based on my experience as a maintainer in the conda ecosystem and conversations I’ve had with users and contributors over time. A recurring theme in those discussions is the tendency to frame <code>conda</code> and <code>pip</code> as competing tools.</p>
<p>What I’ve found more useful is to view them instead as parts of different ecosystems, shaped by different constraints and priorities. That perspective also helps explain why mixing them can sometimes lead to unexpected behavior in practice.</p>
<p>This post is an attempt to share that perspective in a more structured form.</p>
<h1>Conda and Pip: A Story of Two Ecosystems</h1>
<p>If you've spent any time in the Python world, you've probably heard some version of this question:</p>
<blockquote>
<p>"Should I use <code>conda</code> or <code>pip</code>?"</p>
</blockquote>
<p>It usually comes up framed as a debate, sometimes even a heated one. People pick sides, compare features, and argue about which tool is "better."</p>
<p>But that framing misses something fundamental.</p>
<p><strong><code>conda</code> and <code>pip</code> were never meant to compete in the first place.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-we-got-here">How We Got Here<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#how-we-got-here" class="hash-link" aria-label="Direct link to How We Got Here" title="Direct link to How We Got Here" translate="no">​</a></h2>
<p>To understand why, it helps to take a step back and look at how Python packaging evolved.</p>
<p>In the early days, Python came with <code>distutils</code>, a module that let developers distribute and install software. If you wanted to install a package, you'd typically run something like <code>python setup.py install</code>. It worked, but just barely. There was no concept of uninstalling a package, no way to track dependencies, and improvements moved slowly because it was tied to Python's release cycle.</p>
<p>Frustration with these limitations led to the creation of <code>setuptools</code> in 2004. It extended distutils and introduced Easy Install, one of the first tools that could fetch packages from PyPI, the Python Package Index. For the first time, dependency management became part of the story, though still incomplete. Uninstalling packages, however, was still not really possible.</p>
<p>Then came <code>pip</code> in 2008, and things started to feel more modern. <code>pip</code> added proper uninstall support, better dependency handling, and, something people really appreciated at the time, clearer error messages. Around the same time, <code>virtualenv</code> introduced isolated environments, which solved a growing problem: everything had previously been installed into a single global directory. That meant different projects could easily break each other.</p>
<p>With virtual environments, each project got its own isolated space. Suddenly, it was possible to work on multiple projects without dependency conflicts. <code>pip</code> and <code>virtualenv</code> together became the standard workflow for a large part of the Python community.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gap-pip-didnt-fill">The Gap <code>pip</code> Didn't Fill<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#the-gap-pip-didnt-fill" class="hash-link" aria-label="Direct link to the-gap-pip-didnt-fill" title="Direct link to the-gap-pip-didnt-fill" translate="no">​</a></h2>
<p>For many developers, this combination was more than enough. But there was an entire group of users for whom it wasn't.</p>
<p>Scientific computing introduced a different set of challenges. Libraries like <code>NumPy</code> and <code>SciPy</code> rely heavily on compiled <code>C</code> and <code>Fortran</code> code. Early versions of <code>pip</code> didn't handle these non-Python dependencies well, which meant users often had to install system-level libraries manually. That process could be fragile, confusing, and platform-dependent.</p>
<p>This is the context in which <code>conda</code> was created in 2012 by Anaconda, Inc. (at the time called Continuum Analytics).</p>
<p><code>conda</code> took a different approach from the beginning. It was not limited to Python packages. Instead, it was designed as a general-purpose package and environment manager that could handle both Python and non-Python packages.</p>
<p>That meant it could install and manage compiled libraries like <code>C</code> and <code>Fortran</code> dependencies in the same way it handled Python packages.</p>
<p>And that difference in design philosophy is crucial.</p>
<p><strong><code>conda</code> wasn't trying to be a better version of <code>pip</code>. It was trying to solve a different problem.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tools-vs-ecosystems">Tools vs Ecosystems<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#tools-vs-ecosystems" class="hash-link" aria-label="Direct link to Tools vs Ecosystems" title="Direct link to Tools vs Ecosystems" translate="no">​</a></h2>
<p>Once you see that, the "Conda vs <code>pip</code>" debate starts to feel a bit misplaced.</p>
<p>A more useful way to think about them is as <strong>ecosystems</strong>, not tools.</p>
<p>When you start thinking about <code>conda</code> and <code>pip</code> in terms of ecosystems, it becomes clear that they have different objectives and different design constraints. As a result, different tools naturally emerge within each ecosystem.</p>
<p>For example, newer tools like <strong>uv</strong> and <strong>Poetry</strong> belong to the <code>pip</code> ecosystem, while tools like <strong>mamba</strong> and <strong>pixi</strong> belong to the <code>conda</code> ecosystem.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="differences">Differences<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#differences" class="hash-link" aria-label="Direct link to Differences" title="Direct link to Differences" translate="no">​</a></h2>
<p>There are architectural and distributional differences between the two ecosystems.</p>
<ul>
<li class="">
<p><strong>Package formats</strong>
<code>conda</code> packages are distributed in <code>.conda</code> or <code>.tar.bz2</code> formats. In the pip ecosystem, packages are distributed mainly as <code>.whl</code> (wheel files) or <code>.tar.gz</code> source distributions.</p>
</li>
<li class="">
<p><strong>Metadata structures</strong>
Both ecosystems ship packages with "metadata" that helps package managers understand how to install and resolve dependencies, but they organize it differently. Each ecosystem uses its own directory structure and conventions for storing this information.</p>
</li>
<li class="">
<p><strong>Package locations</strong>
<code>conda</code> packages are distributed through <em>channels</em> such as <code>conda-forge</code> and <code>mains</code>. <code>pip</code> packages, on the other hand, are distributed through package <em>indices</em>, most notably PyPI (Python Package Index).</p>
</li>
<li class="">
<p><strong>Package distribution</strong>
Packages on PyPI are typically uploaded by the original authors.
On the conda side, packages are distributed through channels. <code>conda-forge</code> performs downstream repackaging, and both authors and non-authors can upload packages there. There is however a "screening process" before packages can become available on <code>conda-forge</code>.
The Anaconda <code>main</code> channel is restricted, and only Anaconda engineers can publish packages to it.</p>
</li>
<li class="">
<p><strong>Non-Python dependencies</strong>
Packages on PyPI are typically uploaded by the original authors.
On the conda side, packages are distributed through channels. <code>conda-forge</code> performs downstream repackaging, and both authors and non-authors can upload packages there. There is however a "screening process" before packages can become available on <code>conda-forge</code>.
The Anaconda <code>main</code> channel is restricted, and only Anaconda engineers can publish packages to it.</p>
</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-worlds-collide">When Worlds Collide<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#when-worlds-collide" class="hash-link" aria-label="Direct link to When Worlds Collide" title="Direct link to When Worlds Collide" translate="no">​</a></h2>
<p>Problems start to appear when these ecosystems are mixed without understanding how they interact.</p>
<p>At first glance, using <code>pip</code> inside a <code>conda</code> environment might seem harmless. In fact, it's quite common. But under the hood, the two tools don't share information with each other. <code>conda</code> keeps track of what it installs, and <code>pip</code> keeps track of what it installs, but neither fully understands the other.</p>
<p>This can lead to subtle and confusing issues. For example, <code>conda</code> may list a package as installed even after <code>pip</code> has removed it. Or <code>conda</code> might refuse to update a package because it doesn't recognize how it was installed. From the user's perspective, everything looks inconsistent, and debugging becomes frustrating.</p>
<p>What makes this especially tricky is that the errors don't always point clearly to the root cause. You might see a failure in your code and not realize it stems from a mismatch between package managers.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-mixing-still-happens">Why Mixing Still Happens<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#why-mixing-still-happens" class="hash-link" aria-label="Direct link to Why Mixing Still Happens" title="Direct link to Why Mixing Still Happens" translate="no">​</a></h2>
<p>Despite these pitfalls, people continue to mix <code>conda</code> and <code>pip</code>, and often for good reasons.</p>
<p>One of the biggest factors is sheer scale. PyPI hosts hundreds of thousands of packages, far more than what's available in <code>conda</code> channels. Inevitably, you'll encounter a package that exists only on PyPI.</p>
<p>Another reason is version availability. Even when a package exists in <code>conda</code>, the latest version might not be there yet. If you need that specific version, <code>pip</code> becomes the quickest option.</p>
<p>And then there's the reality of learning and experimentation. Developers often follow tutorials, copy commands from forums, and try different solutions until something works. In the process, it's easy to end up with a mix of tools, and a fragile environment.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bridging-the-gap">Bridging the Gap<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#bridging-the-gap" class="hash-link" aria-label="Direct link to Bridging the Gap" title="Direct link to Bridging the Gap" translate="no">​</a></h2>
<p>Recognizing this reality, the community has been exploring ways to improve interoperability between the two ecosystems.</p>
<p>One of the latest efforts is <a href="https://github.com/conda/conda-pypi" target="_blank" rel="noopener noreferrer" class=""><code>conda-pypi</code></a>, which brings PyPI packages into the standard <code>conda</code> workflow. Instead of reaching for <code>pip</code>, users can install compatible PyPI wheels directly through <code>conda</code>, with PyPI wheels handled as first-class artifacts alongside traditional <code>conda</code> packages.</p>
<p>This approach preserves the consistency and reliability that <code>conda</code> environments are known for, while giving users access to the broader pure Python ecosystem on PyPI.</p>
<p>It also adds guardrails to help maintain environment consistency. When enabled, it can block accidental pip install commands that could otherwise introduce conflicts or leave the environment in an unpredictable state, encouraging a more reliable and reproducible workflow.</p>
<p><code>conda-pypi</code> represents an important shift in how the ecosystem thinks about interoperability: rather than treating PyPI and <code>conda</code> as competing worlds, it acknowledges that users often need both, and provides tooling designed to make that interaction smoother and safer.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-shift-in-perspective">A Shift in Perspective<a href="https://conda.org/blog/2026-05-07-conda-and-pip-ecosystems#a-shift-in-perspective" class="hash-link" aria-label="Direct link to A Shift in Perspective" title="Direct link to A Shift in Perspective" translate="no">​</a></h2>
<p>If there's one idea I hope you take away from this, it's this:</p>
<p><strong>Stop thinking in terms of "which tool is better."</strong></p>
<p>Start thinking in terms of ecosystems and context.</p>
<p>When you understand the problems each ecosystem was designed to solve, their differences start to make sense. You become more intentional about your choices, and less frustrated when things behave the way they do.</p>
<p>And perhaps most importantly, you begin to see the bigger picture.</p>
<p>Tools come and go. New ones will replace old ones. But ecosystems, the communities, ideas, and design principles behind them, tend to last much longer.</p>]]></content:encoded>
            <category>conda</category>
            <category>pip</category>
            <category>packaging ecosystems</category>
            <category>python packaging</category>
        </item>
        <item>
            <title><![CDATA[Introducing conda-workspaces]]></title>
            <link>https://conda.org/blog/introducing-conda-workspaces</link>
            <guid>https://conda.org/blog/introducing-conda-workspaces</guid>
            <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A new conda plugin that brings pixi-style project workspaces and a built-in task runner to conda, with a single multi-platform conda.lock and full reuse of conda's existing solver, channels, and authentication.]]></description>
            <content:encoded><![CDATA[<p>Earlier this month, Dan Yeaw described his vision for a better conda CLI in <a class="" href="https://conda.org/blog/2026-04-17-vision-for-conda-cli">Building a Better conda CLI: A Vision</a>: declarative project environments via <code>conda.toml</code>, a workspace-aware CLI, and reproducible cross-platform locks shipped as part of conda itself. <a href="https://github.com/conda-incubator/conda-workspaces" target="_blank" rel="noopener noreferrer" class="">conda-workspaces 0.4.0</a> ships today as a concrete step in that direction.</p>
<p>The workspace model itself comes from <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a> by <a href="https://prefix.dev/" target="_blank" rel="noopener noreferrer" class="">prefix.dev</a>, where one TOML manifest declares a project's environments, features, platforms, and tasks. conda-workspaces is a conda plugin that brings that model to conda: it reads the same <code>conda.toml</code>, <code>pixi.toml</code>, or <code>pyproject.toml</code> manifest, materializes each declared environment as an ordinary conda prefix under <code>.conda/envs/</code>, and runs the declared tasks through the conda CLI. Nothing underneath is replaced: the same solver, package cache, channel authentication, and <code>condarc</code> that any other conda command uses keep doing the work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="isnt-that-what-pixi-is-for">“Isn’t that what pixi is for?”<a href="https://conda.org/blog/introducing-conda-workspaces#isnt-that-what-pixi-is-for" class="hash-link" aria-label="Direct link to “Isn’t that what pixi is for?”" title="Direct link to “Isn’t that what pixi is for?”" translate="no">​</a></h2>
<p>It is the first thing every reviewer asks.</p>
<p>pixi is its own complete stack: the workspace manifest, plus a Rust runtime (<a href="https://github.com/prefix-dev/resolvo" target="_blank" rel="noopener noreferrer" class="">resolvo</a> for solving and the <a href="https://github.com/conda/rattler" target="_blank" rel="noopener noreferrer" class="">rattler</a> crates for conda primitives) distributed as a single binary. conda-workspaces reuses the manifest part and runs it through conda's stack instead. Both tools read the same <code>conda.toml</code> / <code>pixi.toml</code> / <code>pyproject.toml</code> and turn the declared environments into conda prefixes.</p>
<p>The difference is what sits underneath. conda-workspaces uses conda for everything below the manifest: conda's solver, conda's package cache, conda's transaction code, and whatever channel and authentication setup is already in <code>condarc</code>. Environments land under <code>.conda/envs/</code> as ordinary conda prefixes. <code>conda activate .conda/envs/test</code> works. <code>conda list</code> works. Both tools can sit on the same <code>pixi.toml</code> and see the same dependencies, environments, and tasks. Each writes to its own subdirectory (<code>.pixi/envs/</code> for pixi, <code>.conda/envs/</code> for conda-workspaces), so the two tools never collide on disk.</p>
<!-- -->
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Definition</div><div class="admonitionContent_BuS1"><p>A workspace is a directory containing a manifest (<code>conda.toml</code>, <code>pixi.toml</code>, or <code>pyproject.toml</code>) that declares one or more named environments, optional reusable features (groups of dependencies, channels, or activation scripts), the platforms the workspace targets, and optional tasks that run inside those environments. Installing the workspace materializes each environment as a project-local conda prefix under <code>.conda/envs/&lt;name&gt;/</code>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-looks-like">What it looks like<a href="https://conda.org/blog/introducing-conda-workspaces#what-it-looks-like" class="hash-link" aria-label="Direct link to What it looks like" title="Direct link to What it looks like" translate="no">​</a></h2>
<p>A <code>conda.toml</code> in the project root:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">workspace</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-project"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">channels</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"conda-forge"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">platforms</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"linux-64"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"osx-arm64"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"win-64"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">python</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=3.10"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">numpy</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=1.24"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">feature.test.dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pytest</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=8.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pytest-cov</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=4.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">environments</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">test</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">features</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">tasks</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">lint</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ruff check ."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">test</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">cmd</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pytest tests/ -v"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">tasks.check</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">depends-on</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lint"</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<p>Then drive it from the conda CLI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">install</span><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic"># solve + install all envs + write conda.lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace envs            </span><span class="token comment" style="color:#999988;font-style:italic"># list the environments it built</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda task run check            </span><span class="token comment" style="color:#999988;font-style:italic"># runs lint and test in dependency order</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace shell </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># spawn a shell with the test env activated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--locked</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># reproducible install from conda.lock</span><br></span></code></pre></div></div>
<p>For projects that would rather skip writing a manifest by hand, <code>conda workspace quickstart</code> composes init, add, install, and shell into a single command. From an empty directory to an installed environment with an activated shell, in one step:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace quickstart </span><span class="token assign-left variable" style="color:#36acaa">python</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3.14</span><span class="token plain"> numpy</span><br></span></code></pre></div></div>
<p><code>--no-shell</code> makes it CI-friendly, and <code>--json</code> returns a scriptable summary. See <a href="https://conda-incubator.github.io/conda-workspaces/quickstart/#your-first-workspace" target="_blank" rel="noopener noreferrer" class="">Your first workspace</a> for the full walkthrough.</p>
<p><img decoding="async" loading="lazy" alt="workspace quickstart demo" src="https://conda.org/assets/images/workspace-quickstart-704ec26eb2345cb92fdb92f087ef70df.gif" width="1200" height="600" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-exists">Why this exists<a href="https://conda.org/blog/introducing-conda-workspaces#why-this-exists" class="hash-link" aria-label="Direct link to Why this exists" title="Direct link to Why this exists" translate="no">​</a></h2>
<p>The conda ecosystem has tried to solve this before.</p>
<p><a href="https://github.com/anaconda/anaconda-project" target="_blank" rel="noopener noreferrer" class="">anaconda-project</a> was the first tool to attach project-scoped conda environments to a manifest, with command runners, downloads, and platform variants baked in. <a href="https://github.com/conda-incubator/conda-project" target="_blank" rel="noopener noreferrer" class="">conda-project</a> is its community successor, layering <a href="https://github.com/conda/conda-lock" target="_blank" rel="noopener noreferrer" class="">conda-lock</a> on top for reproducibility. <a href="https://github.com/ESSS/conda-devenv" target="_blank" rel="noopener noreferrer" class="">conda-devenv</a> takes a different angle: Jinja2 over <code>environment.yml</code> for composition and inheritance. Each of these still has a healthy user base and solves the problem its constituency cares about. What none of them share is a manifest format with each other, or with anything outside the conda ecosystem.</p>
<p>pixi reframed what a TOML workspace manifest could look like (composable features, named environments, platform targeting, a built-in task runner), and that schema is what conda-workspaces uses. The manifest itself is, by design, identical between the two tools.</p>
<p>What conda-workspaces adds is a way to drive that same manifest from inside a conda installation. Solving uses conda or libmamba (or <a href="https://github.com/conda-incubator/conda-rattler-solver" target="_blank" rel="noopener noreferrer" class="">conda-rattler-solver</a> when installed). Installation uses conda's transaction code. PyPI dependencies, when present, are handled by <a href="https://github.com/conda/conda-pypi" target="_blank" rel="noopener noreferrer" class="">conda-pypi</a>. Lockfile reading and writing route through <a href="https://github.com/conda-incubator/conda-lockfiles" target="_blank" rel="noopener noreferrer" class="">conda-lockfiles</a>. A workspace ends up looking, on disk, exactly like a directory full of conda environments.</p>
<p>That makes the two tools comfortably complementary. Teams that prefer pixi's batteries-included Rust experience keep using pixi. Teams that already live in the conda ecosystem (with their own channels, mirrors, authentication, and <code>condarc</code>) get the same workspace ergonomics without swapping out the rest of the stack. The same <code>pixi.toml</code> can live in a shared repo and serve both groups.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Where this is going</div><div class="admonitionContent_BuS1"><p>The longer-term direction sketched in the <a class="" href="https://conda.org/blog/2026-04-17-vision-for-conda-cli">Vision</a> post is for the workspace model (<code>conda.toml</code> as the project format, workspaces as a first-class CLI concept, <code>conda.lock</code> as a community-owned lockfile) to ship as part of a future conda release. conda-workspaces is an early preview of that direction. Today it is a plugin install. The goal is that nothing about how an individual workspace is shaped has to change on the day that integration moves upstream.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-does">What it does<a href="https://conda.org/blog/introducing-conda-workspaces#what-it-does" class="hash-link" aria-label="Direct link to What it does" title="Direct link to What it does" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-command-bootstrap">One-command bootstrap<a href="https://conda.org/blog/introducing-conda-workspaces#one-command-bootstrap" class="hash-link" aria-label="Direct link to One-command bootstrap" title="Direct link to One-command bootstrap" translate="no">​</a></h3>
<p><code>conda workspace quickstart</code> (shown above) takes a project from "no manifest" to "installed environment" in one step: it picks a manifest format, drops a sensible starting <code>conda.toml</code> (or <code>pixi.toml</code>, or <code>[tool.conda.workspace]</code> in <code>pyproject.toml</code>), solves, installs, and writes <code>conda.lock</code>. <code>--copy &lt;path&gt;</code> clones an existing workspace's manifest instead of running init, which is the fastest way to spin up a sister project from a known-good template.</p>
<p>Day-to-day edits go through <code>conda workspace add</code> and <code>conda workspace remove</code>, which by default install into the affected environments and refresh <code>conda.lock</code> in one step. <code>--no-install</code> and <code>--no-lockfile-update</code> opt back into manifest-only changes, and <code>--dry-run</code> solves without touching disk. The full flow is documented under <a href="https://conda-incubator.github.io/conda-workspaces/quickstart/#add-and-remove-dependencies" target="_blank" rel="noopener noreferrer" class="">Add and remove dependencies</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-environment-workspaces-with-composable-features">Multi-environment workspaces with composable features<a href="https://conda.org/blog/introducing-conda-workspaces#multi-environment-workspaces-with-composable-features" class="hash-link" aria-label="Direct link to Multi-environment workspaces with composable features" title="Direct link to Multi-environment workspaces with composable features" translate="no">​</a></h3>
<p>A feature is a reusable group of dependencies, channels, activation scripts, or environment variables. Environments compose features:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">feature.test.dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pytest</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=8.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pytest-cov</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=4.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">feature.docs.dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">sphinx</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=7.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">myst-parser</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=3.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">environments</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">test</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">features</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">docs</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">features</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"docs"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">ci</span><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">features</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docs"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Each named environment is solved independently and installed under <code>.conda/envs/&lt;name&gt;/</code>. Cloning a repo is then all it takes to recreate every environment a project needs. See <a href="https://conda-incubator.github.io/conda-workspaces/features/#environments" target="_blank" rel="noopener noreferrer" class="">Environments</a> for the full model.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pypi-dependencies-in-the-same-solve">PyPI dependencies in the same solve<a href="https://conda.org/blog/introducing-conda-workspaces#pypi-dependencies-in-the-same-solve" class="hash-link" aria-label="Direct link to PyPI dependencies in the same solve" title="Direct link to PyPI dependencies in the same solve" translate="no">​</a></h3>
<p>PyPI packages live in their own table and resolve in the same solver call as conda packages, so a workspace can mix the two without a separate <code>pip install</code> step:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">python</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=3.10"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">numpy</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=1.24"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">pypi-dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">my-local-pkg</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">path</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">editable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">some-pypi-only</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=1.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">feature.test.pypi-dependencies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pytest-benchmark</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=4.0"</span><br></span></code></pre></div></div>
<p>This path requires <a href="https://github.com/conda/conda-pypi" target="_blank" rel="noopener noreferrer" class="">conda-pypi</a> (which maps PyPI names to their conda equivalents and handles wheel extraction) and <a href="https://github.com/conda-incubator/conda-rattler-solver" target="_blank" rel="noopener noreferrer" class="">conda-rattler-solver</a> as the solver backend. Both are still under active development, so PyPI integration is the most experimental part of conda-workspaces today. The common cases work (declared specs, named PyPI packages, plus editable / git / URL specs handed off to conda-pypi's build system after the main solve), and rough edges are being filed down upstream. If conda-pypi is not installed, PyPI dependencies are skipped with a warning, so a workspace that does not declare any works on a stock conda. Full reference in <a href="https://conda-incubator.github.io/conda-workspaces/features/#pypi-dependencies" target="_blank" rel="noopener noreferrer" class="">PyPI dependencies</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-platform-condalock">Multi-platform <code>conda.lock</code><a href="https://conda.org/blog/introducing-conda-workspaces#multi-platform-condalock" class="hash-link" aria-label="Direct link to multi-platform-condalock" title="Direct link to multi-platform-condalock" translate="no">​</a></h3>
<p><code>conda workspace lock</code> writes a single <code>conda.lock</code> that covers every platform every environment declares, not just the host. One file, one commit, one source of truth for cross-platform projects.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> linux-64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> linux-64 </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> osx-arm64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock --skip-unsolvable</span><br></span></code></pre></div></div>
<p>Each platform's solve runs with conda pointed at the target platform rather than the host. That single switch picks the right channel repodata to fetch and makes conda's virtual package plugins (<code>__linux</code>, <code>__osx</code>, <code>__win</code>) report the target platform too, so a <code>linux-64</code> lock generated on macOS sees the same world a <code>linux-64</code> machine would. Tighter constraints come from <code>CONDA_OVERRIDE_*</code> or the <code>[system-requirements]</code> table when cross-compiling. Unknown platform names fail fast before any solver runs, so typos like <code>lixux-64</code> get caught at parse time instead of after a 90-second metadata download.</p>
<p><code>conda workspace info</code> exposes a <code>Known Platforms</code> row (and matching <code>known_platforms</code> JSON key) that surfaces the full set of platforms reachable through any feature, not just the workspace-level list. Full reference in <a href="https://conda-incubator.github.io/conda-workspaces/features/#platform-targeting" target="_blank" rel="noopener noreferrer" class="">Platform targeting</a>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>On the lockfile format</div><div class="admonitionContent_BuS1"><p><code>conda.lock</code> is a derivative of <code>pixi.lock</code>, which is itself derived from <a href="https://github.com/conda/rattler/tree/main/crates/rattler_lock" target="_blank" rel="noopener noreferrer" class="">rattler-lock v6</a>. It is not a standard yet. The plan is to take it through the <a href="https://github.com/conda/ceps" target="_blank" rel="noopener noreferrer" class="">conda CEP process</a> so the format becomes a community-owned spec rather than a private detail of two project tools. In the meantime, the loader composes the upstream <code>conda_lockfiles.rattler_lock.v6</code> converter via an in-memory <code>version: 1 -&gt; 6</code> swap, so reading and writing always go through the canonical implementation.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ci-split-locking-with---merge">CI-split locking with <code>--merge</code><a href="https://conda.org/blog/introducing-conda-workspaces#ci-split-locking-with---merge" class="hash-link" aria-label="Direct link to ci-split-locking-with---merge" title="Direct link to ci-split-locking-with---merge" translate="no">​</a></h3>
<p>Solving every platform from a single CI job becomes the bottleneck as a workspace grows. The lock command is matrix-friendly: each runner emits one fragment with <code>--output</code>, and a coordinator job stitches them back together with <code>--merge</code>, with no solver runs.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># In each matrix job</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> linux-64 </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> conda.lock.linux-64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> osx-arm64 </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> conda.lock.osx-arm64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--platform</span><span class="token plain"> win-64 </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> conda.lock.win-64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># On the coordinator: pure file-level merge, no solving</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace lock </span><span class="token parameter variable" style="color:#36acaa">--merge</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"conda.lock.*"</span><br></span></code></pre></div></div>
<p><code>--merge</code> validates schema version and per-environment channel agreement, rejects overlapping <code>(environment, platform)</code> pairs, and produces output that is byte-identical to a single-job <code>conda workspace lock</code> over the same inputs. That last part is the one that matters: the merged lockfile is indistinguishable from one produced sequentially, so caching, hashing, and "lockfile changed?" diffs all behave normally. The flag matrix is documented under <a href="https://conda-incubator.github.io/conda-workspaces/features/#ci-split-locking-with-merge" target="_blank" rel="noopener noreferrer" class="">CI-split locking</a>, and the <a href="https://conda-incubator.github.io/conda-workspaces/tutorials/ci-pipeline/" target="_blank" rel="noopener noreferrer" class="">CI pipeline tutorial</a> wires the same flow into GitHub Actions end-to-end.</p>
<p><img decoding="async" loading="lazy" alt="ci-split demo" src="https://conda.org/assets/images/ci-split-4159863a4139651ec4acfa550b9f3e0f.gif" width="1200" height="600" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cross-format-conversion">Cross-format conversion<a href="https://conda.org/blog/introducing-conda-workspaces#cross-format-conversion" class="hash-link" aria-label="Direct link to Cross-format conversion" title="Direct link to Cross-format conversion" translate="no">​</a></h3>
<p><code>conda workspace export</code> plugs into conda's <code>conda_environment_exporters</code> plugin hook. Every format reachable through <code>conda export</code>, plus anything a third-party plugin like <a href="https://github.com/conda-incubator/conda-lockfiles" target="_blank" rel="noopener noreferrer" class="">conda-lockfiles</a> registers, is reachable through <code>conda workspace export</code> and vice versa. conda-workspaces registers three of those exporters itself: <code>conda-toml</code>, <code>pixi-toml</code>, and <code>pyproject-toml</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--file</span><span class="token plain"> environment.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--format</span><span class="token plain"> conda-toml </span><span class="token parameter variable" style="color:#36acaa">--file</span><span class="token plain"> conda.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--format</span><span class="token plain"> pyproject-toml </span><span class="token parameter variable" style="color:#36acaa">--file</span><span class="token plain"> pyproject.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token builtin class-name">export</span><span class="token plain"> --from-lockfile </span><span class="token parameter variable" style="color:#36acaa">--file</span><span class="token plain"> env.conda-lock.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token builtin class-name">export</span><span class="token plain"> --from-prefix --no-builds --from-history</span><br></span></code></pre></div></div>
<p>When the target file already exists, the <code>pyproject-toml</code> exporter splices the <code>[tool.conda]</code> subtree into the document and leaves the existing <code>[project]</code>, <code>[build-system]</code>, <code>[tool.ruff]</code>, <code>[tool.pixi]</code>, and friends untouched. Any stale <code>[tool.conda]</code> is replaced. Everything else survives. Full matrix in <a href="https://conda-incubator.github.io/conda-workspaces/features/#export" target="_blank" rel="noopener noreferrer" class="">Export</a>.</p>
<p>The reverse direction is <code>conda workspace import</code>. It detects the source format and writes a <code>conda.toml</code> next to it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">import</span><span class="token plain"> environment.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">import</span><span class="token plain"> anaconda-project.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">import</span><span class="token plain"> conda-project.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">import</span><span class="token plain"> pixi.toml --dry-run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace </span><span class="token function" style="color:#d73a49">import</span><span class="token plain"> pyproject.toml </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> conda.toml</span><br></span></code></pre></div></div>
<p>The per-tool walkthroughs in the docs cover how each source format maps onto the workspace schema, including command and feature mappings, what carries over, and what does not: <a href="https://conda-incubator.github.io/conda-workspaces/tutorials/coming-from/conda/" target="_blank" rel="noopener noreferrer" class="">Coming from conda</a>, <a href="https://conda-incubator.github.io/conda-workspaces/tutorials/coming-from/conda-project/" target="_blank" rel="noopener noreferrer" class="">Coming from conda-project</a>, <a href="https://conda-incubator.github.io/conda-workspaces/tutorials/coming-from/anaconda-project/" target="_blank" rel="noopener noreferrer" class="">Coming from anaconda-project</a>, and <a href="https://conda-incubator.github.io/conda-workspaces/tutorials/coming-from/pixi/" target="_blank" rel="noopener noreferrer" class="">Coming from pixi</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-task-runner">Built-in task runner<a href="https://conda.org/blog/introducing-conda-workspaces#built-in-task-runner" class="hash-link" aria-label="Direct link to Built-in task runner" title="Direct link to Built-in task runner" translate="no">​</a></h3>
<p><code>conda task</code> ships in the same plugin. The design is borrowed from pixi: task dependencies with topological ordering, per-platform overrides, input/output caching, Jinja2 templates with a <code>conda.*</code> context, and named arguments with defaults.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">tasks</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">lint</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ruff check ."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">build</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">cmd</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"python -m build"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">inputs</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"src/**/*.py"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">outputs</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"dist/*.whl"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">test</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">cmd</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pytest {{ test_path }} -v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key property" style="color:#36acaa">depends-on</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"build"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">target.win-64.tasks</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">clean</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"rd /s /q build"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">tasks.check</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">depends-on</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lint"</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<p>Tasks defined in a workspace manifest run in the workspace's <code>default</code> environment, and <code>-e &lt;env&gt;</code> targets a different one. Tasks in a manifest with no workspace section run in whatever conda environment is active, which is useful for adopting <code>conda task</code> in a project that is not ready for a full workspace yet. Each capability has a dedicated section in the docs:</p>
<ul>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/features/#task-dependencies" target="_blank" rel="noopener noreferrer" class="">Task dependencies</a></li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/features/#task-arguments" target="_blank" rel="noopener noreferrer" class="">Task arguments and template variables</a></li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/features/#task-caching" target="_blank" rel="noopener noreferrer" class="">Task caching</a></li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/features/#platform-specific-tasks" target="_blank" rel="noopener noreferrer" class="">Platform-specific tasks</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-and-try-it">Install and try it<a href="https://conda.org/blog/introducing-conda-workspaces#install-and-try-it" class="hash-link" aria-label="Direct link to Install and try it" title="Direct link to Install and try it" translate="no">​</a></h2>
<p>conda-workspaces is a conda plugin, so a conda installation has to exist first. Installing into a conda <code>base</code> environment registers the <code>conda workspace</code> and <code>conda task</code> plugin subcommands. The standalone <code>cw</code> and <code>ct</code> shortcut commands are always installed and work without going through <code>conda &lt;subcommand&gt;</code> at all.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">conda</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">mamba / micromamba</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">pixi global</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token parameter variable" style="color:#36acaa">--channel</span><span class="token plain"> conda-forge conda-workspaces</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mamba </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> conda-forge conda-workspaces</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># or:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">micromamba </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> conda-forge conda-workspaces</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pixi global </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> conda-workspaces</span><br></span></code></pre></div></div></div></div></div>
<p>Then, in any directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda workspace quickstart python numpy</span><br></span></code></pre></div></div>
<p>That is it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-doesnt-do">What it doesn't do<a href="https://conda.org/blog/introducing-conda-workspaces#what-it-doesnt-do" class="hash-link" aria-label="Direct link to What it doesn't do" title="Direct link to What it doesn't do" translate="no">​</a></h2>
<p>A few things to set expectations.</p>
<p>It is not a replacement for pixi. If a self-contained, batteries-included project tool with its own solver, runtime, and cache is the right fit, <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a> is the better answer. conda-workspaces is for teams that already live in the conda ecosystem and want pixi-style project workflows without moving everything else.</p>
<p>It does not change how conda is configured. Channels, authentication, mirrors, proxy settings, and <code>.condarc</code> continue to behave exactly the way they do for any other conda command. There is nothing new to teach existing tooling about.</p>
<p>It does not invent a new lockfile schema. <code>conda.lock</code> is intentionally compatible with the rattler-lock family so that lockfiles can be inspected, shared, and (eventually) standardized through the <a href="https://github.com/conda/ceps" target="_blank" rel="noopener noreferrer" class="">CEP process</a>.</p>
<p>It does not require any of this all at once. A <code>conda.toml</code> with just a <code>[tasks]</code> table is a valid file: tasks run in whatever conda environment is currently active, and workspace features can be added later. Most projects start there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get involved<a href="https://conda.org/blog/introducing-conda-workspaces#get-involved" class="hash-link" aria-label="Direct link to Get involved" title="Direct link to Get involved" translate="no">​</a></h2>
<p>conda-workspaces is a <a href="https://github.com/conda-incubator" target="_blank" rel="noopener noreferrer" class="">conda-incubator</a> project. Contributions, bug reports, and feature requests are welcome:</p>
<ul>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/" target="_blank" rel="noopener noreferrer" class="">Documentation</a></li>
<li class=""><a href="https://github.com/conda-incubator/conda-workspaces" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a></li>
<li class=""><a href="https://github.com/conda-incubator/conda-workspaces/issues" target="_blank" rel="noopener noreferrer" class="">Issue tracker</a></li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/tutorials/coming-from/" target="_blank" rel="noopener noreferrer" class="">Migration guides</a> for users coming from conda, conda-project, anaconda-project, or pixi</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="acknowledgements">Acknowledgements<a href="https://conda.org/blog/introducing-conda-workspaces#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>The workspace and task design in conda-workspaces is directly inspired by the work of the <a href="https://prefix.dev/" target="_blank" rel="noopener noreferrer" class="">prefix.dev</a> team on <a href="https://github.com/prefix-dev/pixi" target="_blank" rel="noopener noreferrer" class="">pixi</a>. Composable features, named environments, platform targeting, task dependencies, caching, and template variables all come from their playbook. Many thanks for it, and for keeping the manifest format open enough that two tools can share it.</p>
<p>Thanks also to the <a href="https://github.com/anaconda/anaconda-project" target="_blank" rel="noopener noreferrer" class="">anaconda-project</a> and <a href="https://github.com/conda-incubator/conda-project" target="_blank" rel="noopener noreferrer" class="">conda-project</a> teams for laying the groundwork on project-scoped conda long before this plugin existed, and to the <a href="https://github.com/conda/conda-lock" target="_blank" rel="noopener noreferrer" class="">conda-lock</a> maintainers for years of work on cross-platform conda lockfiles (the idea <code>conda.lock</code> builds on, even though the on-disk format goes through rattler-lock). Finally, thanks to everyone who has filed issues, tested early releases, and pushed the design forward in the open.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://conda.org/blog/introducing-conda-workspaces#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/" target="_blank" rel="noopener noreferrer" class="">conda-workspaces documentation</a></li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/motivation/" target="_blank" rel="noopener noreferrer" class="">conda-workspaces motivation</a> (the design rationale, in long form)</li>
<li class=""><a href="https://conda-incubator.github.io/conda-workspaces/reference/cli/" target="_blank" rel="noopener noreferrer" class="">conda-workspaces CLI reference</a></li>
<li class=""><a href="https://github.com/conda-incubator/conda-workspaces" target="_blank" rel="noopener noreferrer" class="">conda-workspaces on GitHub</a></li>
<li class=""><a class="" href="https://conda.org/blog/2026-04-17-vision-for-conda-cli">Building a Better conda CLI: A Vision</a></li>
<li class=""><a href="https://pixi.sh/latest/workspace/advanced_tasks/" target="_blank" rel="noopener noreferrer" class="">pixi workspace documentation</a></li>
<li class=""><a href="https://docs.conda.io/projects/conda/en/stable/dev-guide/plugins/index.html" target="_blank" rel="noopener noreferrer" class="">conda plugin documentation</a></li>
</ul>]]></content:encoded>
            <category>conda</category>
            <category>conda-incubator</category>
            <category>plugin</category>
            <category>workspaces</category>
            <category>tasks</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Building a Better conda CLI: A Vision]]></title>
            <link>https://conda.org/blog/2026-04-17-vision-for-conda-cli</link>
            <guid>https://conda.org/blog/2026-04-17-vision-for-conda-cli</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A vision for the conda CLI in 2026: making conda fast, trusted, and delightful.]]></description>
            <content:encoded><![CDATA[<p>A vision for <code>conda</code> in 2026 is a package manager that is fast (real-time progress, sharded repodata, lighter shell integration, Rattler integration), trusted (better error messages, smarter confirmation friction, streaming output), and delightful (sensible defaults, helpful suggestions, intentional visuals, accessibility). Beyond the core CLI, the roadmap includes native PyPI wheel support, declarative <code>conda.toml</code> project environments, single-binary installers, and a comprehensive API for IDE and agent integrations.</p>
<p>After extensive discussion with stakeholders across the community, I've laid out my vision for where <code>conda</code> could go. This included a maintainer offsite in Málaga, Spain, in December. I also looked at incubated and third-party projects that extend <code>conda</code> through its plugin system. Since that offsite, other maintainers have turned several of those ideas into experiments such as <code>conda-ng</code> to help show what is possible. I invite the broader community to help build it.</p>
<p>My name is Dan Yeaw, and I'm a Sr. Engineering Manager at Anaconda where I have been leading OSS projects for the last year. Since August, I've had the opportunity to lead the <code>conda</code> CLI OSS team, and I'm also on the conda-maintainers team. I've also started to get involved in conda-forge to get the full GTK GUI toolkit supported by adding feedstocks for libraries like libadwaita and gtksourceview.</p>
<p>Last month, I gave a <a href="https://youtu.be/BMzO_kPcoME?si=JeSabXluCHKuALAz" target="_blank" rel="noopener noreferrer" class="">talk at Michigan Python</a> called "Designing Delightful CLIs with Python." The premise was that some CLI tools put a smile on your face, and some make you want to close the terminal and go for a walk. I asked the audience what CLI tool they actually enjoy using, and the answers were things like: Claude Code, <code>uv</code>, <code>ripgrep</code>, <code>gh</code>, <code>bat</code>. These tools are a new generation that feels alive, gives you feedback, and gets out of your way.</p>
<p>Then someone asked me: "What about <code>conda</code>?"</p>
<p><code>conda</code> is one of the most powerful package managers in existence. It handles multi-language dependencies, manages complex environments, and serves everyone from data scientists running notebooks to engineers building production systems. But power and delight aren't always the same thing, and we have real work to do.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-brief-history">A Brief History<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#a-brief-history" class="hash-link" aria-label="Direct link to A Brief History" title="Direct link to A Brief History" translate="no">​</a></h2>
<p>Before we dive into the future, let's first spend a minute reflecting on the past. By the end of 2012, the Anaconda Distribution had about 100 packages and <code>conda</code> ran on Python 2.7. The CLI was a set of modules that used <code>optparse</code>, the precursor to <code>argparse</code>, and the progress bar library was vendored. Even so, the look and feel are not all that different from modern <code>conda</code>. Below, <code>conda</code> 1.4 shows its help output and creates an environment.</p>
<img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-1-4-light.gif" alt="conda CLI 1.4 in action" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-1-4-dark.gif" alt="conda CLI 1.4 in action" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<br>
<p>Fast-forward five years to 2017: <code>conda</code> 4.4 shipped with both Python 3.6 and 2.7 installers and included a major cleanup of the CLI. One large change was new <code>conda activate</code> and <code>conda deactivate</code> commands, which replaced <code>source activate</code> / <code>source deactivate</code> (on Linux/macOS) and <code>activate</code> / <code>deactivate</code> (on Windows). It also added a new spinner and used the <a href="https://github.com/tqdm/tqdm" target="_blank" rel="noopener noreferrer" class=""><code>tqdm</code></a> library for progress bars. Those pieces are still in <code>conda</code> today.</p>
<img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-4-4-light.gif" alt="conda CLI 4.4 in action" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-4-4-dark.gif" alt="conda CLI 4.4 in action" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<br>
<p><code>conda</code> 22.11.0, released in November 2022, added a pluggy-based hook system so <code>conda</code> could be extended with plugins.</p>
<p>2023 was also a big year: 23.10.0 switched the default solver from the classic <code>pycosat</code> implementation to <code>libmamba</code> via a solver plugin, which dramatically improved how long solves took.</p>
<p>In 2024, <code>conda</code> gained a reporter backend plugin, and Travis Hathaway put together a demo of what a more modern CLI could look like with the <a href="https://github.com/conda-incubator/conda-rich" target="_blank" rel="noopener noreferrer" class="">conda-rich</a> incubator project.</p>
<img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-rich-light.gif" alt="conda CLI with conda-rich in action" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-rich-dark.gif" alt="conda CLI with conda-rich in action" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<br>
<p>In January 2025, Jaime Rodríguez-Guerra started <a href="https://github.com/conda-incubator/conda-spawn" target="_blank" rel="noopener noreferrer" class="">conda-spawn</a>, in the spirit of <code>poetry shell</code> and <code>pixi shell</code>: spawn a subshell with the environment already active instead of activating in place, so you can skip <code>conda init</code> hooks on every login. That keeps ordinary shell startup light and defers loading <code>conda</code> until you are ready to use it.</p>
<p>Finally, in December 2025, <code>conda</code> shipped <a href="https://conda.org/blog/sharded-repodata-improvements" target="_blank" rel="noopener noreferrer" class="">sharded repodata</a> in beta, a fundamental step forward for <code>conda</code> by cutting how much metadata you download and process.</p>
<p>A couple of takeaways from this: <code>conda</code>'s CLI has kept a fairly consistent look and feel over the years, and the maintainers have been improving the experience incrementally. I'm grateful for that history and for the maintainers and community members who sustained it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fast-trusted-and-delightful">Fast, Trusted, and Delightful<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#fast-trusted-and-delightful" class="hash-link" aria-label="Direct link to Fast, Trusted, and Delightful" title="Direct link to Fast, Trusted, and Delightful" translate="no">​</a></h2>
<p>In <a href="https://youtu.be/BMzO_kPcoME?si=JeSabXluCHKuALAz" target="_blank" rel="noopener noreferrer" class="">my talk</a>, I presented that great CLIs nail three things:</p>
<ol>
<li class="">Fast</li>
<li class="">Trusted</li>
<li class="">Delightful</li>
</ol>
<p>For fast, we aren’t just talking about benchmarks-fast, but <em>perceived</em> fast, where the tool communicates what it's doing so silence never turns into doubt. For trusted, the tool is transparent about its actions, careful about dangerous operations, and honest when things go wrong. Finally, for delightful we have sensible defaults, helpful suggestions, clean output, and just enough personality to remind you that a human thought about your experience.</p>
<p>That's the lens I would like to apply to my vision, so let’s dive into the details as part of this post.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="blazingly-fast">Blazingly Fast<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#blazingly-fast" class="hash-link" aria-label="Direct link to Blazingly Fast" title="Direct link to Blazingly Fast" translate="no">​</a></h2>
<p>Package management shouldn't be a coffee break. When I demoed <code>conda</code> next to <code>pixi</code> at Michigan Python, the contrast was stark, not because <code>conda</code> was dramatically slower, but because <code>pixi</code> <em>communicated</em>. Color, emoji, a real-time progress bar. The same underlying work, a completely different feeling.
Speed is about perception as much as raw performance. <a href="https://www.nngroup.com/articles/response-times-3-important-limits/" target="_blank" rel="noopener noreferrer" class="">Nielsen's research</a> on response times shows that feedback within 100 ms feels instant and anything over a second creates uncertainty. In other words, silence is the enemy of responsiveness.
<code>conda</code> has already landed substantial speedups, and we should keep building on that foundation. What I lay out below is mostly the next layer: how installs feel in the terminal and which primitives we lean into (progress and repodata, shell startup, and Rattler).</p>
<p>Our approach to speed has several dimensions:</p>
<ul>
<li class="">Progress over spinners – Replacing spinners with progress bars that show operation steps, package counts, and timing gives users confidence that work is happening and finishing. We can show meaningful progress during the fetching, downloading, and installing phases.</li>
<li class="">Sharded repodata – As I mentioned above, sharded repodata is a game changer for performance, and the next step is that we need to enable this by default and ensure it is available on a wider set of channels.</li>
<li class="">Shell startup – There should be no shell startup penalty for using <code>conda</code>, and my vision is that a conda-spawn approach to spawn a new subshell will become the default <code>conda activate</code> and <code>conda deactivate</code> behavior.</li>
<li class="">Rattler integration – We would like to use <a href="https://github.com/conda/rattler" target="_blank" rel="noopener noreferrer" class="">Rattler</a> more, a high-performance Rust implementation of core conda primitives. The performance floor rises significantly when the resolver and file I/O are written in Rust.</li>
</ul>
<p>Our goal isn't to win a benchmark, but to make conda feel fast and responsive. Jaime Rodríguez-Guerra created a demo called <a href="https://github.com/jaimergp/conda-ng/" target="_blank" rel="noopener noreferrer" class=""><code>conda-ng</code></a> that demonstrates what a blazingly fast <code>rattler</code>-based <code>conda</code> might look like:</p>
<img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-ng-light.gif" alt="Conda CLI in action" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/conda-ng-dark.gif" alt="Conda CLI in action" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<br>
<p>The <code>conda-ng</code> demo is deliberately Rattler-forward, but the <code>conda</code> you install today is not waiting on Rust to get faster. Sharded repodata and steady improvements to solving and repodata handling already changed what day-to-day installs feel like. Where we integrate Rattler further, it extends that groundwork.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="trusted">Trusted<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#trusted" class="hash-link" aria-label="Direct link to Trusted" title="Direct link to Trusted" translate="no">​</a></h2>
<p>Trust is the foundation everything else rests on. Unlike a GUI where you can normally click undo if something goes wrong, a CLI has real consequences. For example, if <code>conda</code> installs the wrong package, you could easily end up with a broken environment. Users need to trust that <code>conda</code> is telling them what's happening, that dangerous operations are clearly marked, and that routine operations don't require confirmation prompts.
Here is what I envision to create more trust:</p>
<ul>
<li class="">Streaming output provides transparency – When <code>conda</code> shows you what it's resolving and downloading in real-time, you can spot problems early. It is also important for conda to provide a summary at the end of an operation to help increase confidence.</li>
<li class="">Error messages are a conversation – <code>conda</code> should be a helpful colleague, and its error messages should state the cause clearly, show exactly what went wrong, and provide an actionable path to fix it. For example, Python 3.14 has improved error guidance which doesn't just report a syntax error, it tells you how to fix it.</li>
<li class="">Match friction to a consequence – We should have a spectrum of interaction so that routine operations need no confirmation. Moderately risky operations get a preview and a brief pause. Genuinely dangerous operations like deleting an environment or wiping a package cache require a confirmation. Currently, conda asks for confirmation for most operations. This causes alert fatigue where users learn to dismiss prompts without reading them. Then, when an operation is genuinely dangerous, the confirmation prompts offer no real protection.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="delightful">Delightful<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#delightful" class="hash-link" aria-label="Direct link to Delightful" title="Direct link to Delightful" translate="no">​</a></h2>
<p>Delight is the part people tend to skip because it feels like polish on top of substance. However, I think this <em>is the substance</em>. A tool that delights users gets recommended to colleagues, it gets contributors, and it gets maintained and loved and improved.
A few areas that I envision we focus on:</p>
<ul>
<li class="">Sensible defaults – A great CLI works out of the box. Beginners should succeed immediately without reading a configuration guide. Power users can opt into more control, but beginners shouldn't have to opt out of complexity. We also should think carefully before adding extra configurations, since each one added becomes an extra complexity for users to understand and an extra maintenance burden for the maintainers.</li>
<li class="">Helpful suggestions – Type a mistyped command and conda should say "did you mean X?" This is the difference between a user feeling frustrated and feeling supported.</li>
<li class="">Color and emoji with intention – Every visual element should do work. Green means success. Red means error. A progress emoji communicates stage without a wall of text.</li>
<li class="">Accessibility – Delight has to be for all users. As we add intentional color and emoji, we also need to support the <code>NO_COLOR</code> environment variable to disable all color output, use colorblind-safe palettes that don't rely on red/green alone, and provide <code>--no-progress</code> for animation-sensitive users and automation environments. The GitHub CLI with its <code>a11y</code> subcommand does a great job with this, and we should have something similar.</li>
<li class="">Progressive disclosure – Clean, minimal output by default and full debug detail with <code>--verbose</code> only when you need it. Right now conda displays too much information, which can be overwhelming and cause users to just ignore it. This matters for human users and for automation. Agents and scripts need reliable fields without fragile parsing of prose, and structured modes like <code>--json</code> help with that. Long JSON dumps also cost context tokens, so compact defaults and optional structured output both matter. The fact that we already have a JSON output mode is a strength of <code>conda</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="excellence-beyond-the-cli">Excellence Beyond the CLI<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#excellence-beyond-the-cli" class="hash-link" aria-label="Direct link to Excellence Beyond the CLI" title="Direct link to Excellence Beyond the CLI" translate="no">​</a></h2>
<p>Fast, Trusted, and Delightful apply to more than the core CLI experience. A few other areas where this vision extends:</p>
<ul>
<li class="">Native PyPI support – If you look closely at the animation above, <code>conda</code> 1.4 shipped with a <code>conda pip</code> command. This shows that the Python ecosystem and PyPI are inextricably linked to <code>conda</code> from the very beginning. It is also a problem we have been trying to solve ever since. The <a href="https://github.com/conda/conda-pypi" target="_blank" rel="noopener noreferrer" class=""><code>conda-pypi</code></a> plugin already supports natively installing wheels without shelling out to <code>pip</code>. My vision goes further: a conda channel that indexes all versions of all pure-Python wheels from PyPI directly in repodata, so they are always available without leaving the conda ecosystem.</li>
<li class="">Declarative environments – Modern development workflows need modern configuration. We have recently been working on improving cross-platform lockfile support, and we need to continue to build on that. Poetry, <code>uv</code>, and <code>pixi</code> have shown that software engineers really value having the ability to run tasks and manage their dependencies through projects or workspaces. I envision that we support these workflows with an ecosystem-standardized <code>conda.toml</code> configuration file to help make your projects easier to manage and more reproducible, in the same direction <code>conda-workspaces</code> is already exploring.</li>
<li class="">CI/CD and development environments – <code>conda</code> should excel where developers actually use it most in places like GitHub Actions, CI pipelines, and development containers. A lightweight single-binary conda bootstrapper that makes installation a one-line command would severely simplify this experience. It should also be easy to convert an environment into a container with dependencies already resolved and installed, not reconstructed during the container’s startup.</li>
<li class="">Cross-platform excellence – Windows is home to the majority of <code>conda</code> users, and it deserves a first-class experience: the fastest installers, the most polished interface, the smoothest integration with Windows development workflows. As we perfect that experience, we bring those same improvements to macOS and Linux.</li>
<li class="">A comprehensive API for frontend integration – The CLI is one way to interact with <code>conda</code>, but it shouldn’t be the only one. IDE integrations, Jupyter extensions, web interfaces, GUI tools, and even AI agents all deserve access to <code>conda</code>’s power without reimplementing it. A well-documented API built on <code>conda</code> and <code>rattler</code> makes that ecosystem possible.</li>
</ul>
<p>Here is an example based on Jannis Leidel's proof-of-concept <a href="https://github.com/jezdez/conda-express" target="_blank" rel="noopener noreferrer" class=""><code>conda-express</code></a> of what a future Miniconda installer could look like as a lightweight, single-binary:</p>
<img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/miniconda-light.gif" alt="Conda CLI in action" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://conda.org/img/blog/2026-04-17-vision-for-conda-cli/miniconda-dark.gif" alt="Conda CLI in action" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<br>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="innovation-across-the-ecosystem">Innovation Across the Ecosystem<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#innovation-across-the-ecosystem" class="hash-link" aria-label="Direct link to Innovation Across the Ecosystem" title="Direct link to Innovation Across the Ecosystem" translate="no">​</a></h2>
<p>This vision is already starting to take shape through community-driven projects that extend <code>conda</code> through its plugin system.</p>
<p><a href="https://github.com/conda-incubator/conda-lockfiles" target="_blank" rel="noopener noreferrer" class=""><code>conda-lockfiles</code></a> is launching in the next few weeks in beta. It adds support for multiplatform lockfile formats, including <code>conda-lock</code> and <code>pixi.lock</code>, making cross-platform environment reproducibility a first-class <code>conda</code> feature.</p>
<p><a href="https://github.com/conda-incubator/conda-self" target="_blank" rel="noopener noreferrer" class=""><code>conda-self</code></a> is also launching in beta soon. It adds a <code>conda self</code> command that lets you safely manage your <code>base</code> environment, including protecting it from accidental modifications.</p>
<p>The following three projects are proof-of-concepts from Jannis Leidel that explore what future <code>conda</code> workflows could look like. Together with <code>conda-lockfiles</code> and <code>conda-self</code>, they paint a picture of covering all kinds of gaps in <code>conda</code> today:</p>
<p><a href="https://github.com/conda-incubator/conda-global" target="_blank" rel="noopener noreferrer" class=""><code>conda-global</code></a> enables installing CLI tools into isolated environments and placing them on your PATH, similar to <code>pipx install</code>, <code>uv tool</code>, or <code>pixi global</code>.</p>
<p><a href="https://github.com/jezdez/conda-express" target="_blank" rel="noopener noreferrer" class=""><code>conda-express</code></a> is the lightweight, single-binary bootstrapper shown above. My vision is that it becomes the future Miniconda and Miniforge installer itself, a small static binary that gets you a fully functional <code>conda</code> installation in seconds.</p>
<p><a href="https://github.com/conda-incubator/conda-workspaces" target="_blank" rel="noopener noreferrer" class=""><code>conda-workspaces</code></a> brings a pixi-like project-based workflow to <code>conda</code> with project-scoped environments, composable features, a task runner with dependency ordering, and reproducible <code>conda.lock</code> files, all defined in a <code>conda.toml</code> (with <code>pixi.toml</code> and <code>pyproject.toml</code> manifests also supported). My vision is that workspaces become the future of environment management in <code>conda</code>. It builds on <code>conda</code> itself for solving and installation, and uses <a href="https://github.com/conda/conda-pypi" target="_blank" rel="noopener noreferrer" class=""><code>conda-pypi</code></a> to resolve PyPI dependencies alongside conda packages. Cloning a repo should be all it takes to start working in a reproducible project.</p>
<p>These projects prove the ideas are sound, and many of them can and should keep evolving. Several are incubating in <a href="https://github.com/conda-incubator" target="_blank" rel="noopener noreferrer" class=""><code>conda-incubator</code></a> today. When a piece is ready, <code>conda</code> can take it on as a dependency and ship it as the default behavior without necessarily merging the whole implementation into the main <code>conda</code> codebase. My vision is that we keep investing in both the plugin ecosystem and core <code>conda</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-get-there">How To Get There<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#how-to-get-there" class="hash-link" aria-label="Direct link to How To Get There" title="Direct link to How To Get There" translate="no">​</a></h2>
<p>This vision laid out above will not come to fruition without community involvement. I would like to see us organize more working groups around specific improvement areas, continue to strive to run our development in the open, and continue to guide changes through the <a href="https://conda.org/learn/ceps" target="_blank" rel="noopener noreferrer" class="">Conda Enhancement Proposal (CEP)</a> process. We have seen some huge strides in this area, especially with the recent <a href="https://conda.org/blog/2026-03-11-conda-standards-ceps" target="_blank" rel="noopener noreferrer" class="">foundational CEP approvals</a>, however, we need to keep improving and strengthening our community. The <a href="https://conda.org/community/calendar/" target="_blank" rel="noopener noreferrer" class="">Conda Community Calls</a> so far this year have been really great discussions, and we’ll continue to chat on <a href="https://conda.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">Zulip</a> with the broader community so everyone can provide input.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-invitation">An Invitation<a href="https://conda.org/blog/2026-04-17-vision-for-conda-cli#an-invitation" class="hash-link" aria-label="Direct link to An Invitation" title="Direct link to An Invitation" translate="no">​</a></h2>
<p>Whether you're a data scientist who knows where the pain points are, a contributor who wants to help solve them, or a maintainer helping to keep the lights on, we need your input and participation!
The conda ecosystem has assets other package managers don't: contributors with deep expertise across an enormous range of use cases, multi-language package support, enterprise-scale real-world feedback, and a strong academic presence. We're building on a solid foundation.</p>
<p>The goal is a package manager that will be around for many years to come, and is trusted by researchers, loved by engineers, and recommended to anyone who's ever fought a dependency. Come help us build it.</p>]]></content:encoded>
            <category>conda</category>
            <category>vision</category>
        </item>
        <item>
            <title><![CDATA[March 2026 Releases]]></title>
            <link>https://conda.org/blog/2026-04-06-march-releases</link>
            <guid>https://conda.org/blog/2026-04-06-march-releases</guid>
            <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[conda 26.3.x, conda-build 26.3.0, conda-libmamba-solver 26.3.0, conda-content-trust 0.3.0, constructor 3.15.x, conda-pypi 0.5/0.6, and more have shipped! 🎉
]]></description>
            <content:encoded><![CDATA[<p>The March 2026 releases included updates to conda, conda-build, conda-libmamba-solver, conda-content-trust, conda-rattler-solver, conda-standalone, constructor, and conda-pypi! 🎉 All of these have been released to both <code>defaults</code> and <code>conda-forge</code> channels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-26302631">Changes in conda <a href="https://github.com/conda/conda/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a>/<a href="https://github.com/conda/conda/releases/tag/26.3.1" target="_blank" rel="noopener noreferrer" class="">26.3.1</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-26302631" class="hash-link" aria-label="Direct link to changes-in-conda-26302631" title="Direct link to changes-in-conda-26302631" translate="no">​</a></h2>
<p>To update <code>conda</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">conda</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26.3</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class=""><code>conda create --file</code> and <code>conda install --file</code> accept <code>environment.yaml</code> as well as <code>requirements.txt</code> and explicit exports; with <code>--name</code> / <code>--prefix</code> omitted, the name or prefix is inferred from the file. <code>-f</code> is a recognized alias for <code>--file</code> (and is no longer an alias for <code>--force</code>).</li>
<li class="">Richer solver metadata: <code>PackageRecord.requested_specs</code> and unmerged match specs through the solver and <code>pre-solve</code> plugins.</li>
<li class="">Environment plugins support aliases, wildcard <code>default_filenames</code>, and new <code>description</code> / <code>environment_format</code> metadata.</li>
<li class="">Faster <code>conda run</code> (inline activators), optimized S3 downloads, and improved Windows activation for paths containing <code>^</code>.</li>
<li class="">Clearer errors with <code>PackagesNotFoundInChannelsError</code> vs <code>PackagesNotFoundInPrefixError</code>; <code>conda list --size</code> shows non-zero sizes for metapackages; <code>conda search --envs</code> errors if the package is not found anywhere.</li>
<li class="">Trust / signature verification moved out of core: the <code>conda.trust</code> module and built-in signature post-solve plugin are removed; use the <strong><code>conda-content-trust</code></strong> plugin when you need verification with <code>extra_safety_checks</code>.</li>
<li class=""><strong>26.3.1:</strong> plugin metadata records where each plugin was registered; diagnostics and <code>conda info</code> can surface that. Conda no longer discovers subcommands by scanning <code>conda-*</code> executables on <code>PATH</code> when building the CLI (prefer the plugin system).</li>
</ul>
<p>Many long-deprecated APIs and legacy behaviors were removed in 26.3.0; see the release notes before upgrading automation that imports conda internals.</p>
<p>Full changelogs: <a href="https://github.com/conda/conda/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a>, <a href="https://github.com/conda/conda/releases/tag/26.3.1" target="_blank" rel="noopener noreferrer" class="">26.3.1</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-build-2630">Changes in conda-build <a href="https://github.com/conda/conda-build/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-build-2630" class="hash-link" aria-label="Direct link to changes-in-conda-build-2630" title="Direct link to changes-in-conda-build-2630" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-build</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26.3</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable changes:</strong></p>
<ul>
<li class="">Build <a href="https://rattler.build/" target="_blank" rel="noopener noreferrer" class=""><strong>v1 recipes</strong></a> using the <code>rattler-build</code> CLI.</li>
<li class="">Tar extraction sets an explicit <code>filter</code> for <strong>Python 3.14</strong> compatibility.</li>
<li class="">Dropped unused <code>pytz</code> dependency; recipe requires <code>conda &gt;=25.11.0</code> and <code>conda-libmamba-solver &gt;=25.11.0</code>.</li>
</ul>
<p>Full changelog: <a href="https://github.com/conda/conda-build/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-libmamba-solver-2630">Changes in conda-libmamba-solver <a href="https://github.com/conda/conda-libmamba-solver/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-libmamba-solver-2630" class="hash-link" aria-label="Direct link to changes-in-conda-libmamba-solver-2630" title="Direct link to changes-in-conda-libmamba-solver-2630" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-libmamba-solver</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26.3</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable changes:</strong></p>
<ul>
<li class=""><strong><a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a> sharded repodata</strong> is marked ready for wider use (building on 25.11’s preliminary support).</li>
<li class="">Offline mode can use cached shards (with sensible fallbacks); improved shard fetch fallbacks, channel ordering, sqlite cache recovery, and S3 URL joining; <code>.tar.bz2</code> duplicates are dropped when <code>.conda</code> exists and <code>use_only_tar_bz2</code> is off.</li>
</ul>
<p>Full changelog: <a href="https://github.com/conda/conda-libmamba-solver/releases/tag/26.3.0" target="_blank" rel="noopener noreferrer" class="">26.3.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-content-trust-030031">Changes in conda-content-trust <a href="https://github.com/conda/conda-content-trust/releases/tag/0.3.0" target="_blank" rel="noopener noreferrer" class="">0.3.0</a>/<a href="https://github.com/conda/conda-content-trust/releases/tag/0.3.1" target="_blank" rel="noopener noreferrer" class="">0.3.1</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-content-trust-030031" class="hash-link" aria-label="Direct link to changes-in-conda-content-trust-030031" title="Direct link to changes-in-conda-content-trust-030031" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> conda-content-trust</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.3</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<p><strong>Notable changes:</strong></p>
<ul>
<li class=""><strong><code>CondaPostSolve</code> hook</strong> for signature verification (migrated from conda’s former <code>conda.trust</code> implementation), aligned with conda 26.3’s plugin-based trust story.</li>
<li class="">Supports <strong>Python 3.13</strong> and <strong>3.14</strong>; drops <strong>3.8</strong> and <strong>3.9</strong>.</li>
</ul>
<p>Full changelogs: <a href="https://github.com/conda/conda-content-trust/releases/tag/0.3.0" target="_blank" rel="noopener noreferrer" class="">0.3.0</a>, <a href="https://github.com/conda/conda-content-trust/releases/tag/0.3.1" target="_blank" rel="noopener noreferrer" class="">0.3.1</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-rattler-solver-006">Changes in conda-rattler-solver <a href="https://github.com/conda/conda-rattler-solver/releases/tag/0.0.6" target="_blank" rel="noopener noreferrer" class="">0.0.6</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-rattler-solver-006" class="hash-link" aria-label="Direct link to changes-in-conda-rattler-solver-006" title="Direct link to changes-in-conda-rattler-solver-006" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> conda-rattler-solver</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.0</span><span class="token plain">.6</span><br></span></code></pre></div></div>
<p><strong>Notable changes:</strong></p>
<ul>
<li class="">Bumps <strong>py-rattler</strong> to <strong>0.23</strong>.</li>
</ul>
<p>Full changelog: <a href="https://github.com/conda/conda-rattler-solver/releases/tag/0.0.6" target="_blank" rel="noopener noreferrer" class="">0.0.6</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-standalone-2611">Changes in conda-standalone <a href="https://github.com/conda/conda-standalone/releases/tag/26.1.1" target="_blank" rel="noopener noreferrer" class="">26.1.1</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-standalone-2611" class="hash-link" aria-label="Direct link to changes-in-conda-standalone-2611" title="Direct link to changes-in-conda-standalone-2611" translate="no">​</a></h2>
<p><strong>Notable changes:</strong></p>
<ul>
<li class="">Updated embedded <strong>conda</strong>, <strong>libmambapy 2.5.0</strong>, and <strong>Python 3.13.12</strong>.</li>
<li class="">Data files only for the <strong>native</strong> platform; <strong>PATH</strong> ordering fixed for classic (<code>--classic</code>) init; <strong><code>constructor extract</code></strong> legacy argument handling fixed.</li>
</ul>
<p>Full changelog: <a href="https://github.com/conda/conda-standalone/releases/tag/26.1.1" target="_blank" rel="noopener noreferrer" class="">26.1.1</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-constructor-3150--3151">Changes in constructor <a href="https://github.com/conda/constructor/releases/tag/3.15.0" target="_blank" rel="noopener noreferrer" class="">3.15.0</a> / <a href="https://github.com/conda/constructor/releases/tag/3.15.1" target="_blank" rel="noopener noreferrer" class="">3.15.1</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-constructor-3150--3151" class="hash-link" aria-label="Direct link to changes-in-constructor-3150--3151" title="Direct link to changes-in-constructor-3150--3151" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">constructor</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3.15</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<p><strong>Notable changes (3.15.0):</strong></p>
<ul>
<li class="">Support for installing <a href="https://conda.org/learn/ceps/cep-0022#specification" target="_blank" rel="noopener noreferrer" class=""><strong>protected (frozen) environments</strong></a> (CEP 22).</li>
<li class=""><strong><code>INSTALLER_PATH</code></strong> (and <strong><code>INSTALLER_PLUGINSDIR</code></strong> for EXE) exposed to pre/post install scripts.</li>
<li class="">Architecture checks on <strong>macOS</strong> <code>.sh</code> and <code>.pkg</code> installers; EXE pre-install script respects the UI checkbox; Mach-O signing under <code>_internal</code> for notarization.</li>
</ul>
<p><strong>3.15.1:</strong> EXE uninstaller fix for <strong><code>INSTDIR</code></strong> vs <strong><code>PATH</code></strong>; canary CI uses the latest <code>conda-standalone</code> <strong>onedir</strong> build.</p>
<p>Full changelogs: <a href="https://github.com/conda/constructor/releases/tag/3.15.0" target="_blank" rel="noopener noreferrer" class="">3.15.0</a>, <a href="https://github.com/conda/constructor/releases/tag/3.15.1" target="_blank" rel="noopener noreferrer" class="">3.15.1</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-pypi-050--060">Changes in conda-pypi <a href="https://github.com/conda/conda-pypi/releases/tag/0.5.0" target="_blank" rel="noopener noreferrer" class="">0.5.0</a> / <a href="https://github.com/conda/conda-pypi/releases/tag/0.6.0" target="_blank" rel="noopener noreferrer" class="">0.6.0</a><a href="https://conda.org/blog/2026-04-06-march-releases#changes-in-conda-pypi-050--060" class="hash-link" aria-label="Direct link to changes-in-conda-pypi-050--060" title="Direct link to changes-in-conda-pypi-050--060" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> conda-pypi</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.6</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable changes (0.5.0):</strong></p>
<ul>
<li class="">Test injection for <strong><code>conda pypi convert</code></strong>; <strong><code>--name-mapping</code></strong> for custom PyPI→conda name maps; fixes for <strong><code>headers</code></strong> wheels, <strong>hex</strong> wheel hashes (conda-rattler-solver compatibility), and <strong><code>data</code> / <code>scripts</code></strong> schemes.</li>
</ul>
<p><strong>0.6.0:</strong> repodata <strong><code>v3.whl</code></strong> test fixtures (<code>extra_depends</code>, normalized <strong><code>when</code></strong>); <strong>PEP 508</strong> marker conversion for <code>[when=…]</code> entries; dependency fix for <strong><code>conda-package-streaming</code></strong>.</p>
<p>Full changelogs: <a href="https://github.com/conda/conda-pypi/releases/tag/0.5.0" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, <a href="https://github.com/conda/conda-pypi/releases/tag/0.6.0" target="_blank" rel="noopener noreferrer" class="">0.6.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-️-our-community">We ❤️ our community<a href="https://conda.org/blog/2026-04-06-march-releases#we-%EF%B8%8F-our-community" class="hash-link" aria-label="Direct link to We ❤️ our community" title="Direct link to We ❤️ our community" translate="no">​</a></h2>
<p>Altogether, we had 8 new contributors this release cycle; thank you to all of our open source community members for helping make these improvements possible.</p>
<ul>
<li class=""><a href="https://github.com/ELundby45" target="_blank" rel="noopener noreferrer" class="">@ELundby45</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15716" target="_blank" rel="noopener noreferrer" class="">conda#15716</a></li>
<li class=""><a href="https://github.com/crowecawcaw" target="_blank" rel="noopener noreferrer" class="">@crowecawcaw</a> in <a href="https://github.com/conda/conda/pull/15636" target="_blank" rel="noopener noreferrer" class="">conda#15636</a></li>
<li class=""><a href="https://github.com/lsoksane" target="_blank" rel="noopener noreferrer" class="">@lsoksane</a> in <a href="https://github.com/conda/conda/pull/15549" target="_blank" rel="noopener noreferrer" class="">conda#15549</a></li>
<li class=""><a href="https://github.com/shenhaofang" target="_blank" rel="noopener noreferrer" class="">@shenhaofang</a> in <a href="https://github.com/conda/conda/pull/15664" target="_blank" rel="noopener noreferrer" class="">conda#15664</a></li>
<li class=""><a href="https://github.com/agriyakhetarpal" target="_blank" rel="noopener noreferrer" class="">@agriyakhetarpal</a> in <a href="https://github.com/conda/conda-content-trust/pull/238" target="_blank" rel="noopener noreferrer" class="">conda-content-trust#238</a> and <a href="https://github.com/conda/conda-pypi/pull/246" target="_blank" rel="noopener noreferrer" class="">conda-pypi#246</a></li>
<li class=""><a href="https://github.com/dbast" target="_blank" rel="noopener noreferrer" class="">@dbast</a> in <a href="https://github.com/conda/conda-content-trust/pull/98" target="_blank" rel="noopener noreferrer" class="">conda-content-trust#98</a></li>
<li class=""><a href="https://github.com/jaimergp" target="_blank" rel="noopener noreferrer" class="">@jaimergp</a> in <a href="https://github.com/conda/conda-content-trust/pull/227" target="_blank" rel="noopener noreferrer" class="">conda-content-trust#227</a></li>
<li class=""><a href="https://github.com/danyeaw" target="_blank" rel="noopener noreferrer" class="">@danyeaw</a> in <a href="https://github.com/conda/conda-build/pull/5920" target="_blank" rel="noopener noreferrer" class="">conda-build#5920</a></li>
<li class=""><a href="https://github.com/opoplawski" target="_blank" rel="noopener noreferrer" class="">@opoplawski</a> in <a href="https://github.com/conda/conda-build/pull/5859" target="_blank" rel="noopener noreferrer" class="">conda-build#5859</a></li>
<li class=""><a href="https://github.com/tombenes" target="_blank" rel="noopener noreferrer" class="">@tombenes</a> in <a href="https://github.com/conda/conda-pypi/pull/253" target="_blank" rel="noopener noreferrer" class="">conda-pypi#253</a></li>
<li class=""><a href="https://github.com/danpetry" target="_blank" rel="noopener noreferrer" class="">@danpetry</a> in <a href="https://github.com/conda/conda-pypi/pull/242" target="_blank" rel="noopener noreferrer" class="">conda-pypi#242</a></li>
</ul>]]></content:encoded>
            <category>announcement</category>
            <category>conda</category>
            <category>conda-build</category>
            <category>conda-libmamba-solver</category>
            <category>conda-content-trust</category>
            <category>conda-rattler-solver</category>
            <category>conda-standalone</category>
            <category>constructor</category>
            <category>conda-pypi</category>
        </item>
        <item>
            <title><![CDATA[Standardization of the conda ecosystem]]></title>
            <link>https://conda.org/blog/2026-03-11-conda-standards-ceps</link>
            <guid>https://conda.org/blog/2026-03-11-conda-standards-ceps</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How the conda ecosystem adopted a new set of voted standards and specifications]]></description>
            <content:encoded><![CDATA[<p>Over the last few months, the conda steering council has put significant resources into reducing the standardization debt in the conda ecosystem. This effort culminated in the approval of 10 new CEPs covering the foundational pillars of conda. This is a turning point in our community that is worth celebrating with a blog post!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="de-facto-standards">De facto standards<a href="https://conda.org/blog/2026-03-11-conda-standards-ceps#de-facto-standards" class="hash-link" aria-label="Direct link to De facto standards" title="Direct link to De facto standards" translate="no">​</a></h2>
<p>The conda ecosystem is mostly founded upon the tooling initially built by Anaconda. Since Anaconda was the sole vendor, many aspects of the conda "standards" did not go through a process of design and standardization in the open; instead, they were probably deliberated internally by the responsible teams at the time. Excerpts of those decisions are sometimes captured in Github issues or pull requests, but not always.</p>
<p>As a result, the body of standards for the conda ecosystem has been dictated by the implementations found in <code>conda/conda</code> and <code>conda/conda-build</code>, among others. Reimplementations like <code>mamba</code> or <code>rattler</code> only had two things to guide their process: the source code and the behaviour of the existing tools. However, it was never clear which parts of the implementation were intentional or accidental (bug or feature?), leading to some ambiguity in their interpretation that in turn created an opportunity for drift.</p>
<p>That's why the conda community decided to implement an Enhancement Proposal system modeled after Python or Jupyter's process: CEPs (Conda Enhancement Proposals). This created the scaffolding needed to discuss and decide on policies and standards that affect the whole community. The CEPs system was successfully used by the community to innovate and address some design limitations of the original standards. In the last few years, we have seen new recipe formats and repodata distribution strategies. Unfortunately, the lack of formal standards meant that these innovative CEPs had to leave many details out of the document. For a person outside of the ecosystem, a sentence like "this field can take one or more MatchSpec strings" meant probably nothing. "What is a MatchSpec?" would be the only natural response... and we had no formal document for that!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pay-down-the-debt">Pay down the debt<a href="https://conda.org/blog/2026-03-11-conda-standards-ceps#pay-down-the-debt" class="hash-link" aria-label="Direct link to Pay down the debt" title="Direct link to Pay down the debt" translate="no">​</a></h2>
<p>The only logical way to proceed was to roll up our sleeves and fill in the missing details, from the beginning. We took a look at how other ecosystems had addressed this issue and adopted many of their practices. The <a href="https://opencontainers.org/" target="_blank" rel="noopener noreferrer" class="">Open Container Initiative (OCI)</a> specs and <a href="https://packaging.python.org/en/latest/specifications/" target="_blank" rel="noopener noreferrer" class="">PyPA specifications</a> were instrumental in this stage.</p>
<p>The first CEP we wrote (and approved!) in this direction was <a href="https://github.com/conda/ceps/blob/main/cep-0026.md" target="_blank" rel="noopener noreferrer" class="">CEP 26</a>, where we discussed what valid identifiers for packages and channels look like. This was the first time that the community was explicitly saying that unicode characters are not allowed in conda package names. Yes, <code>conda-build</code> <a href="https://github.com/conda/conda-build/blob/2ec652f69c94a0ec5f339c221c1cff54218e2c7c/tests/test-recipes/metadata/unicode_all_over/love-feedstock/meta.yaml#L1" target="_blank" rel="noopener noreferrer" class="">would happily build</a> <code>❤️-1.0-0.tar.bz2</code> for you.</p>
<p>While writing that CEP, we realized we had to leave many details out. We only went so far as to say which characters are allowed in a version string, but not how these strings are structured. We knew that opening that can of worms was a free ticket for quite the rabbit hole. But the only way is through, so there we went, and this is what happened:</p>
<!-- -->
<p>After several months of writing and discussions, we <a href="https://github.com/conda/ceps/issues/147" target="_blank" rel="noopener noreferrer" class="">started</a> the final RFC (Request For Comments) period on January 28th. Two weeks later, on February 16th, we <a href="https://github.com/conda/ceps/issues/147#issuecomment-3908100064" target="_blank" rel="noopener noreferrer" class="">opened</a> the voting period for two more weeks. The votes were counted on March 3rd, with the following results:</p>








































































































<table><thead><tr><th>CEP</th><th style="text-align:center">Votes</th><th style="text-align:center">Yes</th><th style="text-align:center">No</th><th style="text-align:center">Abstain</th><th style="text-align:center">Passed?</th><th style="text-align:center">Minted as</th></tr></thead><tbody><tr><td><a href="https://github.com/conda/ceps/pull/82#issuecomment-3908064782" target="_blank" rel="noopener noreferrer" class="">#82: MatchSpec</a></td><td style="text-align:center">13</td><td style="text-align:center">13</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">29</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/103#issuecomment-3908069079" target="_blank" rel="noopener noreferrer" class="">#103: Virtual packages</a></td><td style="text-align:center">14</td><td style="text-align:center">14</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">30</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/113#issuecomment-3908070984" target="_blank" rel="noopener noreferrer" class="">#113: Build provenance</a></td><td style="text-align:center">11</td><td style="text-align:center">11</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">31</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/124#issuecomment-3908072251" target="_blank" rel="noopener noreferrer" class="">#124: Structure of conda envs</a></td><td style="text-align:center">11</td><td style="text-align:center">11</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">32</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/132#issuecomment-3908074012" target="_blank" rel="noopener noreferrer" class="">#132: Versions</a></td><td style="text-align:center">11</td><td style="text-align:center">11</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">33</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/133#issuecomment-3908077317" target="_blank" rel="noopener noreferrer" class="">#133: Contents of packages</a></td><td style="text-align:center">11</td><td style="text-align:center">11</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">34</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/134#issuecomment-3908078822" target="_blank" rel="noopener noreferrer" class="">#134: Package file formats</a></td><td style="text-align:center">11</td><td style="text-align:center">11</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">35</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/135#issuecomment-3908081288" target="_blank" rel="noopener noreferrer" class="">#135: Repodata</a></td><td style="text-align:center">12</td><td style="text-align:center">12</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">36</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/138#issuecomment-3908083860" target="_blank" rel="noopener noreferrer" class="">#138: conda-lock.yml</a></td><td style="text-align:center">13</td><td style="text-align:center">12</td><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">✅</td><td style="text-align:center">37</td></tr><tr><td><a href="https://github.com/conda/ceps/pull/140#issuecomment-3908085930" target="_blank" rel="noopener noreferrer" class="">#140: Channeldata</a></td><td style="text-align:center">12</td><td style="text-align:center">12</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">✅</td><td style="text-align:center">38</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://conda.org/blog/2026-03-11-conda-standards-ceps#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<p>The CEP numbers are somewhat arbitrary and don't necessarily allow for a structured reading of the specifications. Following PyPA's example, we will organize their content in the <a class="" href="https://conda.org/learn/specifications/">Learn &gt; Specifications</a> part of this website, trimmed to just the specification bits and leaving other details like rationale and motivation out. The idea is to have a single place where newcomers can quickly learn the details of what a valid package name is without having to parse through all the existing CEPs. This section will also aggregate the results of newer CEPs, should they supersede or extend the existing ones.</p>
<p>Most of the CEPs we passed simply codify what <code>conda</code> had already been doing for years. While this provides a much needed baseline, some of those legacy behaviors aren't necessarily ideal. In the future, we plan to refine these standards and deprecate outdated behaviors to keep the ecosystem lean.</p>
<p>But that is a goal for the next round. For now, let’s celebrate this milestone. A huge thank you to the steering council and everyone who contributed to the discussions!</p>]]></content:encoded>
            <category>specifications</category>
            <category>ceps</category>
        </item>
        <item>
            <title><![CDATA[condastats is back]]></title>
            <link>https://conda.org/blog/condastats-is-back</link>
            <guid>https://conda.org/blog/condastats-is-back</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[condastats returns after three years of silence with modern Python support, a refactored codebase, rewritten documentation, and an interactive browser demo powered by Pyodide.]]></description>
            <content:encoded><![CDATA[<p><a href="https://github.com/conda-incubator/condastats" target="_blank" rel="noopener noreferrer" class="">condastats</a> is a command-line tool and Python library for querying download statistics of conda packages from the <a href="https://github.com/anaconda/anaconda-package-data" target="_blank" rel="noopener noreferrer" class="">Anaconda public dataset</a>. The project hadn't seen a release since August 2022, so we spent some time updating it to work with current Python and pandas versions, cleaning up the codebase, rewriting the documentation, and adding an interactive browser demo. The result is condastats 0.4.2 -- here's what's new and how to use it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why this matters<a href="https://conda.org/blog/condastats-is-back#why-this-matters" class="hash-link" aria-label="Direct link to Why this matters" title="Direct link to Why this matters" translate="no">​</a></h2>
<p>Ever wondered how many times a conda package has been downloaded? Which platforms are popular? Whether conda-forge or defaults drives more installs? condastats answers these questions with a single command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall pandas </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-01</span><br></span></code></pre></div></div>
<p>Or from Python:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> condastats </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> overall</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">overall</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pandas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> month</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2024-01"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>The tool queries the <a href="https://github.com/anaconda/anaconda-package-data" target="_blank" rel="noopener noreferrer" class="">Anaconda public dataset</a>, a collection of monthly Parquet files containing download counts for conda packages since January 2017. Think of it as <a href="https://pypistats.org/" target="_blank" rel="noopener noreferrer" class="">pypistats</a> for the conda ecosystem.</p>
<p>The last release (0.2.1) shipped in <strong>August 2022</strong>. Since then, pandas 2.x changed its categorical handling, newer Python versions broke dask imports, and the build tooling around <code>setup.py</code> and <code>versioneer</code> became outdated. These releases catch up with all of that -- and then some.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-in-the-browser">Try it in the browser<a href="https://conda.org/blog/condastats-is-back#try-it-in-the-browser" class="hash-link" aria-label="Direct link to Try it in the browser" title="Direct link to Try it in the browser" translate="no">​</a></h2>
<p>You can query conda download statistics right here -- no installation required. Enter a package name, pick a date range, and hit <strong>Query</strong>:</p>
<div class="desktop-only"><iframe src="https://condastats.readthedocs.io/en/latest/try/?embed" style="width:100%;height:620px;border:1px solid var(--ifm-color-emphasis-300);border-radius:8px" loading="lazy" title="Try condastats in your browser"></iframe></div>
<div class="mobile-only"><a href="https://condastats.readthedocs.io/en/latest/try/" class="button button--primary button--lg" style="display:block;text-align:center">Open the condastats demo →</a></div>
<p><em><a href="https://condastats.readthedocs.io/en/latest/try/" target="_blank" rel="noopener noreferrer" class="">Open the full demo in a new tab</a> for 15 curated example queries, shareable URLs, and more.</em></p>
<p>This runs <a href="https://pyodide.org/" target="_blank" rel="noopener noreferrer" class="">Pyodide</a> (CPython compiled to WebAssembly) directly in your browser with the real <code>condastats</code> package. It uses the pure-pandas query API introduced in 0.4.0, which doesn't require dask or s3fs -- making it lightweight enough to run in WebAssembly. Expect about 20 MB for Pyodide plus 1-15 MB of Parquet data per queried month.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-030-through-042">What changed: 0.3.0 through 0.4.2<a href="https://conda.org/blog/condastats-is-back#what-changed-030-through-042" class="hash-link" aria-label="Direct link to What changed: 0.3.0 through 0.4.2" title="Direct link to What changed: 0.3.0 through 0.4.2" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polished-browser-demo-042">Polished browser demo (0.4.2)<a href="https://conda.org/blog/condastats-is-back#polished-browser-demo-042" class="hash-link" aria-label="Direct link to Polished browser demo (0.4.2)" title="Direct link to Polished browser demo (0.4.2)" translate="no">​</a></h3>
<p>The browser demo ships a full Python REPL (jQuery Terminal + Prism.js) with syntax highlighting, tab completion, and command history. It includes 15 curated example query cards, shareable URLs, and quick date range presets.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pure-pandas-query-api-040">Pure-pandas query API (0.4.0)<a href="https://conda.org/blog/condastats-is-back#pure-pandas-query-api-040" class="hash-link" aria-label="Direct link to Pure-pandas query API (0.4.0)" title="Direct link to Pure-pandas query API (0.4.0)" translate="no">​</a></h3>
<p>A new set of functions -- <code>query_overall()</code>, <code>query_grouped()</code>, and <code>top_packages()</code> -- operate on any pandas DataFrame without requiring dask or s3fs. This makes <code>import condastats</code> work in environments where dask isn't available (like Pyodide in the browser), while the existing S3-backed functions continue to work as before.</p>
<p>Dask is now lazily imported only when S3 functions are called, so the library starts up faster even in traditional environments.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="refactored-codebase-030">Refactored codebase (0.3.0)<a href="https://conda.org/blog/condastats-is-back#refactored-codebase-030" class="hash-link" aria-label="Direct link to Refactored codebase (0.3.0)" title="Direct link to Refactored codebase (0.3.0)" translate="no">​</a></h3>
<p>The business logic has been extracted from <code>cli.py</code> into a dedicated <code>_core.py</code> module. All public functions now have type hints and NumPy-style docstrings. The CLI gained a <code>--version</code> flag, proper argument validation, and better error messages.</p>
<p>The build system migrated from <code>setup.py</code> + <code>versioneer</code> to <code>pyproject.toml</code> + <code>setuptools_scm</code>. Travis CI has been replaced by GitHub Actions, and Dependabot keeps dependencies up to date. The project now has <strong>31 tests</strong> covering all CLI subcommands and the Python API.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="critical-bug-fixes-030">Critical bug fixes (0.3.0)<a href="https://conda.org/blog/condastats-is-back#critical-bug-fixes-030" class="hash-link" aria-label="Direct link to Critical bug fixes (0.3.0)" title="Direct link to Critical bug fixes (0.3.0)" translate="no">​</a></h3>
<p>Several issues that made condastats unusable on recent Python and pandas versions have been resolved:</p>
<ul>
<li class=""><strong><code>TypeError: descriptor '__call__'</code></strong> on Python 3.11+ caused by an older dask version</li>
<li class=""><strong><code>ValueError: Not all columns are categoricals</code></strong> (<a href="https://github.com/conda-incubator/condastats/issues/19" target="_blank" rel="noopener noreferrer" class="">#19</a>) when reading Parquet files</li>
<li class=""><strong><code>ArrowStringArray requires PyArrow array of string type</code></strong> (<a href="https://github.com/conda-incubator/condastats/issues/17" target="_blank" rel="noopener noreferrer" class="">#17</a>, <a href="https://github.com/conda-incubator/condastats/issues/24" target="_blank" rel="noopener noreferrer" class="">#24</a>) from pandas/pyarrow version mismatches</li>
</ul>
<p>If you tried condastats in the last couple of years and hit errors, these releases fix them.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modern-python-support-030">Modern Python support (0.3.0)<a href="https://conda.org/blog/condastats-is-back#modern-python-support-030" class="hash-link" aria-label="Direct link to Modern Python support (0.3.0)" title="Direct link to Modern Python support (0.3.0)" translate="no">​</a></h3>
<p>condastats now supports <strong>Python 3.10 through 3.14</strong> and requires updated dependencies:</p>
<ul>
<li class=""><code>numpy&gt;=1.20.0</code></li>
<li class=""><code>pandas&gt;=2.0.0</code></li>
<li class=""><code>dask&gt;=2024.5.2</code></li>
<li class=""><code>pyarrow&gt;=10.0.0</code></li>
</ul>
<p>Python 3.8 and 3.9 are no longer supported.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-and-try-it">Install and try it<a href="https://conda.org/blog/condastats-is-back#install-and-try-it" class="hash-link" aria-label="Direct link to Install and try it" title="Direct link to Install and try it" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">pixi</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">conda / mamba</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">uv / pip</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">pipx</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pixi global </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> condastats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--channel</span><span class="token plain"> conda-forge condastats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">uv pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> condastats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pipx </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> condastats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div></div></div>
<p>Or run it without installing -- just pick your tool:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">pixi x</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">uvx</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">pipx run</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pixi x condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">uvx condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pipx run condastats overall numpy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-examples">Quick examples<a href="https://conda.org/blog/condastats-is-back#quick-examples" class="hash-link" aria-label="Direct link to Quick examples" title="Direct link to Quick examples" translate="no">​</a></h3>
<p>Compare multiple packages for a specific month:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall pandas numpy scipy </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-01</span><br></span></code></pre></div></div>
<p>Break down downloads by platform:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">condastats pkg_platform pandas </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-01</span><br></span></code></pre></div></div>
<p>See monthly trends over a range:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">condastats overall pandas </span><span class="token parameter variable" style="color:#36acaa">--start_month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-01 </span><span class="token parameter variable" style="color:#36acaa">--end_month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-06 </span><span class="token parameter variable" style="color:#36acaa">--monthly</span><br></span></code></pre></div></div>
<p>Group by conda channel (anaconda vs. conda-forge):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">condastats data_source pandas </span><span class="token parameter variable" style="color:#36acaa">--month</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-01</span><br></span></code></pre></div></div>
<p>All of these work as Python functions too:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> condastats </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> overall</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pkg_platform</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data_source</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">overall</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pandas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"numpy"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> month</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2024-01"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pkg_platform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pandas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> month</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2024-01"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">data_source</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pandas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> start_month</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2024-01"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> end_month</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2024-06"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> monthly</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-documentation">New documentation<a href="https://conda.org/blog/condastats-is-back#new-documentation" class="hash-link" aria-label="Direct link to New documentation" title="Direct link to New documentation" translate="no">​</a></h2>
<p>The documentation at <a href="https://condastats.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">condastats.readthedocs.io</a> has been completely rewritten using the <a href="https://diataxis.fr/" target="_blank" rel="noopener noreferrer" class="">Diataxis</a> framework, organized into four clear sections:</p>
<table><thead><tr><th>Section</th><th>What you'll find</th></tr></thead><tbody><tr><td><strong><a href="https://condastats.readthedocs.io/en/latest/tutorial.html" target="_blank" rel="noopener noreferrer" class="">Tutorial</a></strong></td><td>Step-by-step guide from your first query to comparing packages</td></tr><tr><td><strong><a href="https://condastats.readthedocs.io/en/latest/howto.html" target="_blank" rel="noopener noreferrer" class="">How-to guides</a></strong></td><td>Recipes for filtering, grouping, Jupyter usage, running without installing</td></tr><tr><td><strong><a href="https://condastats.readthedocs.io/en/latest/reference/api.html" target="_blank" rel="noopener noreferrer" class="">API reference</a></strong></td><td>Full autodoc for all Python functions with parameter descriptions</td></tr><tr><td><strong><a href="https://condastats.readthedocs.io/en/latest/reference/cli.html" target="_blank" rel="noopener noreferrer" class="">CLI reference</a></strong></td><td>Every subcommand, option, and exit code</td></tr><tr><td><strong><a href="https://condastats.readthedocs.io/en/latest/explanation.html" target="_blank" rel="noopener noreferrer" class="">Explanation</a></strong></td><td>How the Anaconda dataset works, query pipeline, performance tips</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get involved<a href="https://conda.org/blog/condastats-is-back#get-involved" class="hash-link" aria-label="Direct link to Get involved" title="Direct link to Get involved" translate="no">​</a></h2>
<p>condastats is a <a href="https://github.com/conda-incubator" target="_blank" rel="noopener noreferrer" class="">conda-incubator</a> project. Contributions are welcome:</p>
<ul>
<li class=""><strong>Try the browser demo:</strong> <a href="https://condastats.readthedocs.io/en/latest/tryit.html" target="_blank" rel="noopener noreferrer" class="">condastats.readthedocs.io</a></li>
<li class=""><strong>Report bugs or request features:</strong> <a href="https://github.com/conda-incubator/condastats/issues" target="_blank" rel="noopener noreferrer" class="">GitHub Issues</a></li>
<li class=""><strong>Install it:</strong> <code>conda install --channel conda-forge condastats</code> or <code>pip install condastats</code></li>
</ul>
<p>Originally created by <a href="https://github.com/sophiamyang" target="_blank" rel="noopener noreferrer" class="">Sophia Man Yang</a>, condastats is now maintained by the <a href="https://github.com/conda-incubator" target="_blank" rel="noopener noreferrer" class="">conda-incubator</a> community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://conda.org/blog/condastats-is-back#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/conda-incubator/condastats" target="_blank" rel="noopener noreferrer" class="">condastats on GitHub</a></li>
<li class=""><a href="https://pypi.org/project/condastats/" target="_blank" rel="noopener noreferrer" class="">condastats on PyPI</a></li>
<li class=""><a href="https://anaconda.org/conda-forge/condastats" target="_blank" rel="noopener noreferrer" class="">condastats on conda-forge</a></li>
<li class=""><a href="https://github.com/anaconda/anaconda-package-data" target="_blank" rel="noopener noreferrer" class="">Anaconda public dataset</a></li>
<li class=""><a href="https://github.com/conda-incubator/condastats/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">Full changelog</a></li>
</ul>]]></content:encoded>
            <category>condastats</category>
            <category>conda-incubator</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[January 2026 Releases]]></title>
            <link>https://conda.org/blog/2026-02-03-january-releases</link>
            <guid>https://conda.org/blog/2026-02-03-january-releases</guid>
            <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[conda 26.1.0, conda-build 26.1.0, and conda-pack 0.9.1 have been released! 🎉
]]></description>
            <content:encoded><![CDATA[<p>The January 2026 releases included updates to conda, conda-build, and conda-pack! 🎉 All of these have been released to both <code>defaults</code> and <code>conda-forge</code> channels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-2610">Changes in conda <a href="https://github.com/conda/conda/releases/tag/26.1.0" target="_blank" rel="noopener noreferrer" class="">26.1.0</a><a href="https://conda.org/blog/2026-02-03-january-releases#changes-in-conda-2610" class="hash-link" aria-label="Direct link to changes-in-conda-2610" title="Direct link to changes-in-conda-2610" translate="no">​</a></h2>
<p>To update <code>conda</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">conda</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26.1</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added support for Python 3.14.</li>
<li class="">Added new <code>--size</code> flag to <code>conda info --envs</code>, <code>conda env list</code>, and <code>conda list</code> commands to display disk usage for environments and packages.</li>
<li class="">Added <code>--fix</code> flag to <code>conda doctor</code> with health check fix capabilities.</li>
<li class="">Added <code>-s</code> as a shorthand alias for <code>conda run --no-capture-output</code> and <code>-O</code> as an alias for <code>--override-channels</code>.</li>
<li class="">Speed improvements: faster context initialization through caching condarc file reads, deferred <code>PrefixData</code> record instantiation, and faster <code>conda run</code> via inline environment activation.</li>
<li class="">Added <code>conda_package_extractors</code> plugin hook to allow plugins to register custom package archive extractors.</li>
<li class="">Added <code>conda.cli.condarc.ConfigurationFile</code> class for programmatic configuration file manipulation.</li>
<li class=""><code>conda run</code> now properly deactivates the environment on exiting the command.</li>
<li class="">Improved error messages for HTTP 403 responses and various platform-specific issues.</li>
<li class="">Fixed parallel conda command failures on Windows by using GUIDs for unique temp filenames.</li>
<li class="">Fixed <code>conda clean --tarballs</code> to also clean up <code>.partial</code> download files.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda/releases/tag/26.1.0" target="_blank" rel="noopener noreferrer" class="">26.1.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-build-2610">Changes in conda-build <a href="https://github.com/conda/conda-build/releases/tag/26.1.0" target="_blank" rel="noopener noreferrer" class="">26.1.0</a><a href="https://conda.org/blog/2026-02-03-january-releases#changes-in-conda-build-2610" class="hash-link" aria-label="Direct link to changes-in-conda-build-2610" title="Direct link to changes-in-conda-build-2610" translate="no">​</a></h2>
<p>To update <code>conda-build</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-build</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26.1</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added support for <a href="https://github.com/conda/ceps/blob/main/cep-0028.md" target="_blank" rel="noopener noreferrer" class="">CEP 28</a> (customizable system DLL linkage checks for Windows).</li>
<li class="">Enabled <code>echo on</code> for Windows build scripts for better debugging visibility.</li>
<li class="">Added riscv64 architecture support to the <code>cdt()</code> Jinja function.</li>
<li class="">Fixed rpath handling on macOS to delete rpath before adding to avoid space errors.</li>
<li class="">Fixed handling of unknown dynamic tags in liefldd.</li>
<li class="">Fixed handling of empty source archives (now ignores and continues instead of failing).</li>
<li class="">Bumped minimum <code>conda</code> version to 25.11.0 and <code>conda-libmamba-solver</code> to 25.11.0.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-build/releases/tag/26.1.0" target="_blank" rel="noopener noreferrer" class="">26.1.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-pack-090091">Changes in conda-pack <a href="https://github.com/conda/conda-pack/releases/tag/0.9.0" target="_blank" rel="noopener noreferrer" class="">0.9.0</a>/<a href="https://github.com/conda/conda-pack/releases/tag/0.9.1" target="_blank" rel="noopener noreferrer" class="">0.9.1</a><a href="https://conda.org/blog/2026-02-03-january-releases#changes-in-conda-pack-090091" class="hash-link" aria-label="Direct link to changes-in-conda-pack-090091" title="Direct link to changes-in-conda-pack-090091" translate="no">​</a></h2>
<p>To update <code>conda-pack</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> conda-pack</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.9</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Replaced deprecated <code>pkg_resources</code> with <code>importlib.resources</code> for better compatibility with modern Python.</li>
<li class="">Added optional progress bar to <code>conda-unpack</code> for better user feedback.</li>
<li class="">Fixed issue with extended path format on Windows.</li>
<li class="">Fixed executables for all users.</li>
<li class="">Updated Python supported versions.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-pack/releases/tag/0.9.0" target="_blank" rel="noopener noreferrer" class="">0.9.0</a>/<a href="https://github.com/conda/conda-pack/releases/tag/0.9.1" target="_blank" rel="noopener noreferrer" class="">0.9.1</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-️-our-community">We ❤️ Our Community<a href="https://conda.org/blog/2026-02-03-january-releases#we-%EF%B8%8F-our-community" class="hash-link" aria-label="Direct link to We ❤️ Our Community" title="Direct link to We ❤️ Our Community" translate="no">​</a></h2>
<p>Altogether, we had 8 new contributors this release cycle; thank you to all of our open source community members for helping make these improvements possible.</p>
<ul>
<li class=""><a href="https://github.com/degerahmet" target="_blank" rel="noopener noreferrer" class="">@degerahmet</a> made their first contribution in <a href="https://github.com/conda/conda/pull/14698" target="_blank" rel="noopener noreferrer" class="">conda#14698</a></li>
<li class=""><a href="https://github.com/Bhanuu01" target="_blank" rel="noopener noreferrer" class="">@Bhanuu01</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15554" target="_blank" rel="noopener noreferrer" class="">conda#15554</a></li>
<li class=""><a href="https://github.com/barabo" target="_blank" rel="noopener noreferrer" class="">@barabo</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15418" target="_blank" rel="noopener noreferrer" class="">conda#15418</a></li>
<li class=""><a href="https://github.com/gayanMatch" target="_blank" rel="noopener noreferrer" class="">@gayanMatch</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15596" target="_blank" rel="noopener noreferrer" class="">conda#15596</a></li>
<li class=""><a href="https://github.com/giacomo-ciro" target="_blank" rel="noopener noreferrer" class="">@giacomo-ciro</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15428" target="_blank" rel="noopener noreferrer" class="">conda#15428</a></li>
<li class=""><a href="https://github.com/matthewfeickert" target="_blank" rel="noopener noreferrer" class="">@matthewfeickert</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15622" target="_blank" rel="noopener noreferrer" class="">conda#15622</a></li>
<li class=""><a href="https://github.com/pirzada-ahmadfaraz" target="_blank" rel="noopener noreferrer" class="">@pirzada-ahmadfaraz</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15602" target="_blank" rel="noopener noreferrer" class="">conda#15602</a></li>
<li class=""><a href="https://github.com/vshevchenko-anaconda" target="_blank" rel="noopener noreferrer" class="">@vshevchenko-anaconda</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15376" target="_blank" rel="noopener noreferrer" class="">conda#15376</a></li>
</ul>]]></content:encoded>
            <category>announcement</category>
            <category>conda</category>
            <category>conda-build</category>
            <category>conda-pack</category>
        </item>
        <item>
            <title><![CDATA[Conda CLI Roadmap Updates: Q1, 2026]]></title>
            <link>https://conda.org/blog/conda-roadmap-q1-2026</link>
            <guid>https://conda.org/blog/conda-roadmap-q1-2026</guid>
            <pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The Q1 2026 Conda CLI roadmap highlights faster performance, safer ways to work with PyPI packages, and progress toward reproducible environments.
]]></description>
            <content:encoded><![CDATA[<p><em>The Q1 2026 Conda CLI roadmap update highlights faster performance, safer ways to work with PyPI packages, and progress toward more reproducible environments.</em></p>
<hr>
<p>Welcome to another quarterly update on what shipped in conda CLI and what we're building next. These posts complement our <strong><a href="https://github.com/orgs/conda/projects/22/views/15" target="_blank" rel="noopener noreferrer" class="">project board</a></strong> by pulling out the highlights and showing where your feedback matters most.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights-from-q4-2025">Highlights from Q4 2025<a href="https://conda.org/blog/conda-roadmap-q1-2026#highlights-from-q4-2025" class="hash-link" aria-label="Direct link to Highlights from Q4 2025" title="Direct link to Highlights from Q4 2025" translate="no">​</a></h2>
<p>A quick look at roadmap items shipped last quarter and available to try today. See previous update <a href="https://conda.org/blog/conda-roadmap-q4-2025" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="faster-performance-with-sharded-repodata-beta">Faster Performance with Sharded Repodata (Beta)<a href="https://conda.org/blog/conda-roadmap-q1-2026#faster-performance-with-sharded-repodata-beta" class="hash-link" aria-label="Direct link to Faster Performance with Sharded Repodata (Beta)" title="Direct link to Faster Performance with Sharded Repodata (Beta)" translate="no">​</a></h3>
<p><strong>What’s new:</strong> We released beta support for sharded repodata (<a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a>) in conda CLI, alongside support for the conda-forge channel on Anaconda.org. This means you can now enable sharded repodata in conda CLI and use it with conda-forge end-to-end for faster package metadata fetching!</p>
<p><strong>What it does:</strong> Instead of downloading a single, large metadata file from each channel before solving, sharded repodata fetches metadata in smaller pieces as needed. On conda-forge, this results in roughly <strong>10× faster</strong> metadata fetching and about <strong>90% less bandwidth</strong> usage in benchmarked scenarios. Full benchmarks and technical details are available in the announcement blog post: <a href="https://conda.org/blog/sharded-repodata-improvements" target="_blank" rel="noopener noreferrer" class="">https://conda.org/blog/sharded-repodata-improvements</a></p>
<p><strong>How to try it:</strong></p>
<p>Opt-in via conda CLI when using conda-forge:</p>
<ul>
<li class=""><code>conda install --name base 'conda-libmamba-solver&gt;=25.11.0'</code></li>
<li class=""><code>conda config --set plugins.use_sharded_repodata true</code></li>
</ul>
<p>Pixi and rattler-build already use sharded repodata by default, no opt-in required.</p>
<p><strong>Share feedback:</strong> We need your feedback before we can make sharded repodata the default in conda. If you try it and see performance improvements, great. If you hit regressions or edge cases, that's equally useful. Share what you're seeing on <a href="https://conda.zulipchat.com/#narrow/channel/457607-general/topic/NEW.3A.20Faster.20metadata.20fetching.20with.20Sharded.20Repodata.20.28beta.29/with/562694717" target="_blank" rel="noopener noreferrer" class="">Zulip</a> or open a <a href="https://github.com/conda/conda-libmamba-solver/issues" target="_blank" rel="noopener noreferrer" class="">GitHub issue</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="safer-pypi-installs-with-conda-pypi-plugin">Safer PyPI installs with conda-pypi plugin<a href="https://conda.org/blog/conda-roadmap-q1-2026#safer-pypi-installs-with-conda-pypi-plugin" class="hash-link" aria-label="Direct link to Safer PyPI installs with conda-pypi plugin" title="Direct link to Safer PyPI installs with conda-pypi plugin" translate="no">​</a></h3>
<p><strong>What’s new:</strong> The <a href="https://github.com/conda-incubator/conda-pypi" target="_blank" rel="noopener noreferrer" class="">conda-pypi</a>
plugin is where our ongoing PyPI interoperability work is taking shape. The plugin provides a supported and explicit way to install PyPI packages inside conda environments. It's a safer alternative to the ad hoc <code>pip install</code> commands that everyone uses but that often leave environments fragile and hard to recover when something goes wrong.</p>
<p><strong>What it does:</strong> The <code>conda pypi</code> subcommand makes PyPI package installs intentional and visible. It prefers conda packages for dependencies when they exist in configured channels, supports editable installs for development workflows, and respects the EXTERNALLY-MANAGED marker from <a href="https://peps.python.org/pep-0668/" target="_blank" rel="noopener noreferrer" class="">PEP 668</a> to reduce accidental environment corruption.</p>
<p><strong>How to get started:</strong> You can install the plugin and experiment with it now. Full <a href="https://conda.github.io/conda-pypi/quickstart/" target="_blank" rel="noopener noreferrer" class="">documentation</a> is available for supported workflows and usage.</p>
<p>This is actively evolving, and it's not production-ready yet! The real value of trying it now is helping us understand edge cases, behavior quirks, and whether these workflows actually fit how you work.</p>
<p><strong>Share feedback:</strong> Please report issues or feature ideas on the <a href="https://github.com/conda-incubator/conda-pypi/issues" target="_blank" rel="noopener noreferrer" class="">conda-pypi GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-were-building-in-q1-2026">What We're Building in Q1 2026<a href="https://conda.org/blog/conda-roadmap-q1-2026#what-were-building-in-q1-2026" class="hash-link" aria-label="Direct link to What We're Building in Q1 2026" title="Direct link to What We're Building in Q1 2026" translate="no">​</a></h2>
<p>These areas are active work in progress and will evolve as design and implementation continue.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reproducible-environments-with-native-lockfile-support">Reproducible Environments with Native Lockfile Support<a href="https://conda.org/blog/conda-roadmap-q1-2026#reproducible-environments-with-native-lockfile-support" class="hash-link" aria-label="Direct link to Reproducible Environments with Native Lockfile Support" title="Direct link to Reproducible Environments with Native Lockfile Support" translate="no">​</a></h3>
<p><strong>What we’re working on:</strong> We're adding native support in conda CLI for working with lockfiles. This includes the ability to generate a lockfile from an existing environment and to create a new environment directly from a lockfile using conda.</p>
<p><strong>Why this matters:</strong> <code>environment.yml</code> files describe intended dependencies, but recreating an environment requires solving against the current state of channels and metadata. Over time, or across platforms, this can lead to different results from the same input file. Run <code>conda create</code> six months later, on a different platform, or after channel updates, and you may get a different environment. Worse, it might fail to recreate at all.</p>
<p>Native lockfile support will allow conda users to recreate the exact same environment deterministically without re-solving, get identical results across machines, platforms, and points in time, use lockfiles as the source of truth for CI, production, and shared workflows, and work directly with common lockfile formats in the ecosystem, such as <code>conda-lock</code> and <code>pixi/rattler.lock</code></p>
<p><strong>Current status:</strong> This work is in progress. You can follow along and engage on our <a href="https://github.com/conda-incubator/conda-lockfiles/issues/83" target="_blank" rel="noopener noreferrer" class="">GitHub project board</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-python-wheels-in-repodata">Support for Python Wheels in Repodata<a href="https://conda.org/blog/conda-roadmap-q1-2026#support-for-python-wheels-in-repodata" class="hash-link" aria-label="Direct link to Support for Python Wheels in Repodata" title="Direct link to Support for Python Wheels in Repodata" translate="no">​</a></h3>
<p><strong>What we’re working on:</strong> We’re working on adding support for pure-Python wheels to conda’s package index (repodata). This work focuses on making metadata about Python packages from PyPI available to conda’s dependency solver, rather than introducing a new install workflow.</p>
<p><strong>Why this matters:</strong> By representing Python wheels in repodata, conda can take these packages into account during solving. Instead of treating PyPI packages as opaque additions that happen outside of conda's model, conda can reason about them alongside conda packages. This means better conflict detection, more accurate dependency resolution, and a clearer picture of what's actually in your environment.</p>
<p>We're starting with pure-Python wheels because they're the most straightforward case. It's a focused scope that lets us validate the design and implementation before expanding further.</p>
<p><strong>Current status:</strong> This work is active in Q1 and includes both design and implementation.</p>
<p>The proposed approach is described in a draft CEP, <a href="https://github.com/conda/ceps/pull/145" target="_blank" rel="noopener noreferrer" class="">Repodata Wheel Support</a>. Feedback on the design is especially valuable at this stage. Implementation progress and related discussion are tracked on our <a href="https://github.com/conda-incubator/conda-pypi/issues/192" target="_blank" rel="noopener noreferrer" class="">GitHub project board</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get Involved!<a href="https://conda.org/blog/conda-roadmap-q1-2026#get-involved" class="hash-link" aria-label="Direct link to Get Involved!" title="Direct link to Get Involved!" translate="no">​</a></h2>
<p>This roadmap update reflects work that is already underway, but priorities are always evolving based on community feedback.
The most effective ways to get involved are:</p>
<ul>
<li class="">File <a href="https://github.com/conda/conda/issues" target="_blank" rel="noopener noreferrer" class="">GitHub issues</a> when something doesn’t work as expected or when you have an idea for improvement</li>
<li class="">Join <a href="https://conda.org/community/calendar" target="_blank" rel="noopener noreferrer" class="">conda community calls</a> or participate in conversations on <a href="https://conda.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">Zulip</a></li>
<li class=""><a href="https://docs.conda.io/projects/conda/en/latest/dev-guide/contributing.html" target="_blank" rel="noopener noreferrer" class="">Contribute</a> code, documentation, or reviews where you see gaps or opportunities</li>
</ul>
<p>We’ll continue sharing progress through quarterly roadmap updates. If you have thoughts on what’s useful in these posts or what could be clearer, please let us know in this <a href="https://conda.zulipchat.com/#narrow/channel/457607-general/topic/conda.20roadmap.20format/with/546521363" target="_blank" rel="noopener noreferrer" class="">Zulip topic</a>.</p>
<p>None of this work happens without the conda community. Thank you for your feedback, contributions, and patience as we build together.</p>]]></content:encoded>
            <category>conda</category>
            <category>roadmap</category>
        </item>
        <item>
            <title><![CDATA[You Can Install PostgreSQL with conda?]]></title>
            <link>https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda</link>
            <guid>https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda</guid>
            <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Did you know it's possible to install and run PostgreSQL with conda? Find out how in this first post in the "You Can Do That with conda?" series.]]></description>
            <content:encoded><![CDATA[<p><em>Part 1 of the "You Can Do That with conda?" series—exploring unexpected capabilities of conda beyond Python packages.</em></p>
<p>Conda has long been the driver of data science workflows because of its unique ability to manage the complexities around Python packaging's diverse dependency requirements. It's precisely because of this that conda is also able to handle managing much more than just Python dependencies.</p>
<p>In this tutorial, we'll show the strengths of conda's flexibility and provide a guide on how you can install <a href="https://postgresql.org/" target="_blank" rel="noopener noreferrer" class="">PostgreSQL</a> for local development environments. Installing PostgreSQL this way offers several advantages: no root or admin permissions are required, the installation is isolated and reproducible, and your database can be version-controlled alongside other project dependencies—making it a lighter-weight alternative to container-based solutions like Docker.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Throughout this tutorial, we'll show you how to install and run PostgreSQL from <a href="https://conda-forge.org/" target="_blank" rel="noopener noreferrer" class="">conda-forge</a> using <a href="https://docs.conda.io/projects/conda" target="_blank" rel="noopener noreferrer" class="">conda</a>, <a href="https://mamba.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">mamba</a> (or <a href="https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html" target="_blank" rel="noopener noreferrer" class="">micromamba</a>), or <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a>. Please refer to those projects' documentation for information on how to install them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-environment">Setting up your environment<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#setting-up-your-environment" class="hash-link" aria-label="Direct link to Setting up your environment" title="Direct link to Setting up your environment" translate="no">​</a></h2>
<p>To start, we'll create a new environment with the <code>postgresql</code> package.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">conda</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">(micro)mamba</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">pixi</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>To create a new conda environment with PostgreSQL, run the following command:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda create </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> postgresql </span><span class="token parameter variable" style="color:#36acaa">--channel</span><span class="token plain"> conda-forge postgresql</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>To create a new environment with PostgreSQL, run the following command:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mamba create </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> postgresql </span><span class="token parameter variable" style="color:#36acaa">--channel</span><span class="token plain"> conda-forge postgresql</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>To create a new pixi project with PostgreSQL, run the following commands:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Create your project directory first</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> postgresql</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> postgresql</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Initialize your pixi environment and add dependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pixi init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pixi </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> postgresql</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can also use <code>pixi global</code> to create a single installation of PostgreSQL that's available only to your user account:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pixi global </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> postgresql</span><br></span></code></pre></div></div></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-postgresql">Running PostgreSQL<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#running-postgresql" class="hash-link" aria-label="Direct link to Running PostgreSQL" title="Direct link to Running PostgreSQL" translate="no">​</a></h2>
<p>Now that we have our environment set up and packages installed, we can initialize our database and get it running. The <code>postgresql</code> package exposes the following commands that we'll use to do that:</p>
<ul>
<li class=""><code>initdb</code></li>
<li class=""><code>createuser</code></li>
<li class=""><code>createdb</code></li>
<li class=""><code>pg_ctl</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-data-directory">Creating a data directory<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#creating-a-data-directory" class="hash-link" aria-label="Direct link to Creating a data directory" title="Direct link to Creating a data directory" translate="no">​</a></h3>
<p>The first thing we need to do is create the directory we'll use to store our data. For this example, we're going to create a "postgresql" directory in the home directory, but this could be anywhere you'd like:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> ~/postgresql</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">initdb </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> ~/postgresql</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-the-server">Starting the server<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#starting-the-server" class="hash-link" aria-label="Direct link to Starting the server" title="Direct link to Starting the server" translate="no">​</a></h3>
<p>Now that we have a location set for storing our data, we can launch the <code>postgresql</code> process by running the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pg_ctl </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> ~/postgresql </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> ~/postgresql/logfile start</span><br></span></code></pre></div></div>
<p>With <code>-D</code>, we pass it the location of our data directory and the <code>-l</code> option sets the file path that will receive postgresql's log output.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-user-and-a-database">Creating a user and a database<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#creating-a-user-and-a-database" class="hash-link" aria-label="Direct link to Creating a user and a database" title="Direct link to Creating a user and a database" translate="no">​</a></h3>
<p>The next two commands will create a user account and database we can use for our application:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">createuser user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">createdb </span><span class="token parameter variable" style="color:#36acaa">--owner</span><span class="token plain"> user user</span><br></span></code></pre></div></div>
<p>After this, your new database should be ready to accept connections. You can test this by running the following <code>psql</code> command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">psql </span><span class="token parameter variable" style="color:#36acaa">-U</span><span class="token plain"> user</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>At this point, the database accepts connections from localhost without passwords. In postgresql's configuration, this is referred to as "trust". This is only advisable if you are the only person using your computer. Read further to learn how to adjust this.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="editing-the-configuration">Editing the configuration<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#editing-the-configuration" class="hash-link" aria-label="Direct link to Editing the configuration" title="Direct link to Editing the configuration" translate="no">​</a></h3>
<p>To make changes to how the server is configured, you can edit the default configuration that was created with the <code>initdb</code> command. The two most important files for postgresql's configuration are:</p>
<ul>
<li class=""><code>pg_hba.conf</code>: controls authentication</li>
<li class=""><code>postgresql.conf</code>: all other configuration settings</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Where are these files?</div><div class="admonitionContent_BuS1"><p>These configuration files are located in the data directory you specified with <code>initdb</code> (in our example, <code>~/postgresql/</code>). The <code>pg_hba.conf</code> file controls "host-based authentication"—which users can connect from which hosts and how they authenticate.</p></div></div>
<p>For example, if you wanted to change the default authentication behavior of your postgresql server, you could edit the lines at the bottom of the <code>pg_hba.conf</code> to use <code>password</code> instead of <code>trust</code>:</p>
<div class="language-conf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-conf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># TYPE  DATABASE        USER            ADDRESS                 METHOD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># "local" is for Unix domain socket connections only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">local   all             all                                     password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># IPv4 local connections:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">host    all             all             127.0.0.1/32            password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># IPv6 local connections:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">host    all             all             ::1/128                 password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Allow replication connections from localhost, by a user with the</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># replication privilege.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">local   replication     all                                     password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">host    replication     all             127.0.0.1/32            password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">host    replication     all             ::1/128                 password</span><br></span></code></pre></div></div>
<p>Afterwards, you would need to restart the server with the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pg_ctl </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> ~/postgresql </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> ~/postgresql/logfile restart</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final thoughts<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#final-thoughts" class="hash-link" aria-label="Direct link to Final thoughts" title="Direct link to Final thoughts" translate="no">​</a></h2>
<p>We hope this gave you a good orientation on using PostgreSQL via conda! Installing PostgreSQL this way offers several practical benefits:</p>
<ul>
<li class=""><strong>No root permissions required</strong>: You can set up a full database server in user space.</li>
<li class=""><strong>Reproducible environments</strong>: Include <code>postgresql</code> in your <code>environment.yml</code> or <code>pixi.toml</code> and share the same setup across your team.</li>
<li class=""><strong>Lighter-weight than Docker</strong>: For local development, this approach avoids the overhead of running a container runtime.</li>
<li class=""><strong>Version control friendly</strong>: Your database dependency can be locked alongside your application dependencies.</li>
</ul>
<p>Because you can install PostgreSQL this way, it also opens up possibilities for bundling applications that use PostgreSQL with conda. If you want to extend this setup, consider adding packages like <code>postgis</code> for geospatial support or <code>psycopg2</code> for Python database connectivity—all available from conda-forge.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://conda.org/blog/2026-01-27-you-can-install-postgresql-with-conda#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.postgresql.org/docs/" target="_blank" rel="noopener noreferrer" class="">PostgreSQL Documentation</a> — official documentation for PostgreSQL</li>
<li class=""><a href="https://anaconda.org/conda-forge/postgis" target="_blank" rel="noopener noreferrer" class="">postgis on conda-forge</a> — geospatial extensions for PostgreSQL</li>
<li class=""><a href="https://anaconda.org/conda-forge/psycopg2" target="_blank" rel="noopener noreferrer" class="">psycopg2 on conda-forge</a> — Python adapter for PostgreSQL</li>
<li class=""><a href="https://conda.org/blog/2024-08-14-conda-ecosystem-explained/" target="_blank" rel="noopener noreferrer" class="">Conda Ecosystem Explained</a> — introduction to the conda ecosystem</li>
</ul>]]></content:encoded>
            <category>tutorials</category>
            <category>you-can-do-that</category>
            <category>postgresql</category>
        </item>
        <item>
            <title><![CDATA[conda-meta-mcp: Expert Conda Ecosystem Data for AI Agents]]></title>
            <link>https://conda.org/blog/conda-meta-mcp</link>
            <guid>https://conda.org/blog/conda-meta-mcp</guid>
            <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing conda-meta-mcp: an MCP server providing AI agents with real-time, authoritative conda ecosystem metadata to overcome model knowledge cutoffs and enable intelligent packaging decisions.]]></description>
            <content:encoded><![CDATA[<p>Modern AI agents like Claude, Cursor, OpenCode, and Zed can fetch web content, run shell commands, and even install packages. But they lack direct access to the rich, structured metadata embedded in conda packages. This information is essential for solving complex packaging problems. <strong>conda-meta-mcp</strong> provides that missing link.</p>
<p><em>AI agents reason well, but only with good data. conda-meta-mcp bridges the gap between frozen training data and live ecosystem metadata.</em></p>
<p>This article introduces <a href="https://github.com/conda-incubator/conda-meta-mcp" target="_blank" rel="noopener noreferrer" class="">conda-meta-mcp</a>, an MCP server that exposes authoritative, read-only conda ecosystem metadata directly to AI agents. We'll explore the problem it solves, the tools it provides, and real-world workflows that demonstrate its power.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-knowledge-cutoffs-meet-rich-metadata">The Problem: Knowledge Cutoffs Meet Rich Metadata<a href="https://conda.org/blog/conda-meta-mcp#the-problem-knowledge-cutoffs-meet-rich-metadata" class="hash-link" aria-label="Direct link to The Problem: Knowledge Cutoffs Meet Rich Metadata" title="Direct link to The Problem: Knowledge Cutoffs Meet Rich Metadata" translate="no">​</a></h2>
<p>When you ask an AI agent about conda, you hit two walls:</p>
<p><strong>Knowledge cutoffs.</strong> Models trained in mid-2024 know nothing about September releases, new conda features, or recent CVEs. They guess based on stale training data.</p>
<p><strong>Inaccessible metadata.</strong> Even with web access, agents can't efficiently query the structured data embedded in conda packages: recipes, dependency graphs, run_exports, build provenance. This information is buried in package archives, not exposed through simple web APIs.</p>
<p>Consider these questions:</p>
<ul>
<li class="">"Is <code>scikit-learn&gt;=1.5</code> available on conda-forge for linux-64?"</li>
<li class="">"What packages depend on numpy in conda-forge?"</li>
<li class="">"Which conda package provides the <code>cv2</code> Python import?"</li>
<li class="">"What run_exports does openssl declare?"</li>
<li class="">"Which package ships <code>libcuda.so</code>?"</li>
<li class="">"Which feedstock commit bumped pyspark to version v4.1.0?"</li>
</ul>
<p>These aren't reasoning failures. They're <strong>data access problems</strong>. AI agents reason well with good information. Without <strong>live, authoritative metadata</strong>, they can't solve real packaging problems reliably.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enter-conda-meta-mcp">Enter conda-meta-mcp<a href="https://conda.org/blog/conda-meta-mcp#enter-conda-meta-mcp" class="hash-link" aria-label="Direct link to Enter conda-meta-mcp" title="Direct link to Enter conda-meta-mcp" translate="no">​</a></h2>
<p><a href="https://github.com/conda-incubator/conda-meta-mcp" target="_blank" rel="noopener noreferrer" class=""><strong>conda-meta-mcp</strong></a> is an <strong>MCP (Model Context Protocol) server</strong> that exposes authoritative, read-only conda ecosystem metadata directly to AI agents. The project is currently in incubation within the conda-incubator GitHub organization.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What is MCP?</div><div class="admonitionContent_BuS1"><p>The <strong><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a></strong> is an open standard (introduced by Anthropic in 2024) for connecting AI models and agents to external data sources and tools. MCP servers can expose three types of primitives: <strong>tools</strong> (executable functions), <strong>resources</strong> (contextual data), and <strong>prompts</strong> (interaction templates). Agents invoke tools based on their descriptions, effectively a form of prompt injection that guides agent behavior.</p><p>Key benefit: agents query live data without embedding it in their training.</p></div></div>
<p>Instead of relying on stale training data, agents can now call structured tools:</p>
<!-- -->
<p>The user doesn't need to know how to call MCP tools or when to use them. <strong>The LLM selects appropriate tools based on their descriptions</strong> and synthesizes results into human-readable answers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-conda-metadata-is-uniquely-rich">Why Conda Metadata Is Uniquely Rich<a href="https://conda.org/blog/conda-meta-mcp#why-conda-metadata-is-uniquely-rich" class="hash-link" aria-label="Direct link to Why Conda Metadata Is Uniquely Rich" title="Direct link to Why Conda Metadata Is Uniquely Rich" translate="no">​</a></h2>
<p>Every conda package embeds an <code>info/</code> metadata tarball containing:</p>
<ul>
<li class=""><strong>Recipe and build scripts</strong> (<code>meta.yaml</code>/<code>recipe.yaml</code>, <code>build.sh</code>, <code>bld.bat</code>): source provenance, dependency declarations, build commands</li>
<li class=""><strong>Rendered metadata</strong> (<code>run_exports.json</code>, <code>index.json</code>, <code>about.json</code>): resolved constraints, feedstock URL and commit SHA, CI job identifiers</li>
</ul>
<p>This is far richer than what wheels or sdists provide. The embedded provenance enables <strong>auditable reproducibility</strong>: you can rebuild a binary from first principles using metadata stored in the package.</p>
<p>This same metadata powers conda-forge's migration infrastructure, the heavy machinery that builds dependency graphs and continuously rebuilds thousands of packages (as described in <a class="" href="https://conda.org/blog/conda-practical-power">Part 3 of our conda series</a>).</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Most conda-meta-mcp tools query indexed extracts of this embedded metadata: repodata indexes package specs, conda-forge indexes import mappings and PyPI names, and Quansight's API indexes file paths.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-tools">The Tools<a href="https://conda.org/blog/conda-meta-mcp#the-tools" class="hash-link" aria-label="Direct link to The Tools" title="Direct link to The Tools" translate="no">​</a></h2>
<p>conda-meta-mcp exposes ecosystem knowledge through <strong>seven composable tools</strong>. Agents chain them to answer complex questions.</p>
<p>These tools fall into two categories: <strong>package discovery</strong> (finding and inspecting packages) and <strong>ecosystem navigation</strong> (understanding relationships and mappings). All tools are read-only and designed for efficient context usage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="package-discovery">Package Discovery<a href="https://conda.org/blog/conda-meta-mcp#package-discovery" class="hash-link" aria-label="Direct link to Package Discovery" title="Direct link to Package Discovery" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="package_search-find-packages-by-spec"><code>package_search</code>: Find Packages by Spec<a href="https://conda.org/blog/conda-meta-mcp#package_search-find-packages-by-spec" class="hash-link" aria-label="Direct link to package_search-find-packages-by-spec" title="Direct link to package_search-find-packages-by-spec" translate="no">​</a></h4>
<p>Search packages by spec, channel, and platform. Results ordered by newest version.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> package_search</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"scipy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> channel</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"conda-forge"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> platform</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"linux-64"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> limit</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"results"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"version"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.16.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"url"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"...scipy-1.16.3-py314hf5b80f4_1.conda"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"total"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">472</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="package_insights-deep-package-inspection"><code>package_insights</code>: Deep Package Inspection<a href="https://conda.org/blog/conda-meta-mcp#package_insights-deep-package-inspection" class="hash-link" aria-label="Direct link to package_insights-deep-package-inspection" title="Direct link to package_insights-deep-package-inspection" translate="no">​</a></h4>
<p>Inspect a package's <code>info/</code> tarball: rendered recipe, run_exports, source provenance. Foundation for <strong>SBOM generation</strong> and <strong>CVE analysis</strong>.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> package_insights</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"...openssl-3.6.0-h26f9b46_0.conda"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">file</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"info/run_exports.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"info/run_exports.json"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"weak"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"openssl &gt;=3.6.0,&lt;4.0a0"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ecosystem-navigation">Ecosystem Navigation<a href="https://conda.org/blog/conda-meta-mcp#ecosystem-navigation" class="hash-link" aria-label="Direct link to Ecosystem Navigation" title="Direct link to Ecosystem Navigation" translate="no">​</a></h3>
<p>These tools help agents understand relationships between packages, map across ecosystems, and navigate the dependency graph.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="repoquery-dependency-graph-navigation"><code>repoquery</code>: Dependency Graph Navigation<a href="https://conda.org/blog/conda-meta-mcp#repoquery-dependency-graph-navigation" class="hash-link" aria-label="Direct link to repoquery-dependency-graph-navigation" title="Direct link to repoquery-dependency-graph-navigation" translate="no">​</a></h4>
<p>Query what depends on a package (<code>whoneeds</code>) or what a package depends on (<code>depends</code>).</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> repoquery</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"whoneeds"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"numpy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> channel</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"conda-forge"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> limit</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"query"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"total"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">286778</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli_help-conda-cli-documentation"><code>cli_help</code>: Conda CLI Documentation<a href="https://conda.org/blog/conda-meta-mcp#cli_help-conda-cli-documentation" class="hash-link" aria-label="Direct link to cli_help-conda-cli-documentation" title="Direct link to cli_help-conda-cli-documentation" translate="no">​</a></h4>
<p>Introspect conda's command-line interface dynamically. Supports regex filtering.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> cli_help</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tool</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"conda"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> grep</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> limit</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"conda create: Create a new conda environment from a list of specified packages..."</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="import_mapping-python-import-to-package"><code>import_mapping</code>: Python Import to Package<a href="https://conda.org/blog/conda-meta-mcp#import_mapping-python-import-to-package" class="hash-link" aria-label="Direct link to import_mapping-python-import-to-package" title="Direct link to import_mapping-python-import-to-package" translate="no">​</a></h4>
<p>Map Python imports to conda packages. Essential for <strong>cross-ecosystem discovery</strong>.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> import_mapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cv2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"best_package"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"opencv"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"candidate_packages"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"libopencv"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"opencv"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"opencv-python-headless"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pypi_to_conda-pypi-name-to-conda-package"><code>pypi_to_conda</code>: PyPI Name to Conda Package<a href="https://conda.org/blog/conda-meta-mcp#pypi_to_conda-pypi-name-to-conda-package" class="hash-link" aria-label="Direct link to pypi_to_conda-pypi-name-to-conda-package" title="Direct link to pypi_to_conda-pypi-name-to-conda-package" translate="no">​</a></h4>
<p>Map PyPI distribution names to conda equivalents. Handles the <strong>naming convention differences</strong> between ecosystems.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> pypi_to_conda</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"PyYAML"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"pypi_name"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PyYAML"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"conda_name"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pyyaml"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"changed"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> false</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="file_path_search-find-packages-by-file-path"><code>file_path_search</code>: Find Packages by File Path<a href="https://conda.org/blog/conda-meta-mcp#file_path_search-find-packages-by-file-path" class="hash-link" aria-label="Direct link to file_path_search-find-packages-by-file-path" title="Direct link to file_path_search-find-packages-by-file-path" translate="no">​</a></h4>
<p>Search for packages containing a specific file path. Useful for finding which package provides a specific binary or library.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> file_path_search</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bin/conda"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> limit</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"artifacts"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"cf/linux-64/conda-4.6.9-py36_0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"total"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>All tools support <code>limit</code> and <code>offset</code> for pagination. Most support <code>get_keys</code> for field filtering to protect agent context windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-workflows">Real-World Workflows<a href="https://conda.org/blog/conda-meta-mcp#real-world-workflows" class="hash-link" aria-label="Direct link to Real-World Workflows" title="Direct link to Real-World Workflows" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cross-ecosystem-package-discovery">Cross-Ecosystem Package Discovery<a href="https://conda.org/blog/conda-meta-mcp#cross-ecosystem-package-discovery" class="hash-link" aria-label="Direct link to Cross-Ecosystem Package Discovery" title="Direct link to Cross-Ecosystem Package Discovery" translate="no">​</a></h3>
<p>PyPI and conda use different naming conventions. An agent can resolve these mappings:</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-ecosystem-impact">Understanding Ecosystem Impact<a href="https://conda.org/blog/conda-meta-mcp#understanding-ecosystem-impact" class="hash-link" aria-label="Direct link to Understanding Ecosystem Impact" title="Direct link to Understanding Ecosystem Impact" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reviewing-dependency-updates">Reviewing Dependency Updates<a href="https://conda.org/blog/conda-meta-mcp#reviewing-dependency-updates" class="hash-link" aria-label="Direct link to Reviewing Dependency Updates" title="Direct link to Reviewing Dependency Updates" translate="no">​</a></h3>
<p>When Renovate proposes a version bump, you want to know what actually changed beyond the version number. Did the maintainers add patches? Change dependencies? Modify build scripts?</p>
<!-- -->
<p>The URL allows a user or agent to inspect in detail what was changed by whom.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cve-analysis-with-grype-mcp">CVE Analysis with Grype MCP<a href="https://conda.org/blog/conda-meta-mcp#cve-analysis-with-grype-mcp" class="hash-link" aria-label="Direct link to CVE Analysis with Grype MCP" title="Direct link to CVE Analysis with Grype MCP" translate="no">​</a></h3>
<p>Regulations like NIS2, DORA, and the Cyber Resiliency Act require organizations to track their software supply chain. The <a href="https://github.com/anchore/grype-mcp" target="_blank" rel="noopener noreferrer" class="">Grype MCP</a> can scan conda environments for CVEs. When combined with conda-meta-mcp, agents can perform deeper analysis to determine if a CVE actually affects your code.</p>
<p>Here's a concrete example: an agent scans its own MCP server environment:</p>
<!-- -->
<p>This deep analysis is only possible by combining multiple tools: Grype for CVE detection, conda-meta-mcp for package inspection, and code search for call graph analysis. A CVE scanner alone would flag the vulnerability without this context.</p>
<p>See also <a href="https://tech.quantco.com/blog/conda-regulation-support" target="_blank" rel="noopener noreferrer" class="">QuantCo's blog on conda regulation support</a> for how <code>syft</code> consumes <code>conda-meta/</code> files to generate SBOMs that standard CVE scanners can process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="engineering-built-on-battle-tested-foundations">Engineering: Built on Battle-Tested Foundations<a href="https://conda.org/blog/conda-meta-mcp#engineering-built-on-battle-tested-foundations" class="hash-link" aria-label="Direct link to Engineering: Built on Battle-Tested Foundations" title="Direct link to Engineering: Built on Battle-Tested Foundations" translate="no">​</a></h2>
<p>conda-meta-mcp wraps existing, proven conda ecosystem libraries with no wheel reinvention:</p>
<ul>
<li class=""><code>conda_package_streaming.url.stream_conda_info()</code>: Streams metadata from CDN (~100ms, no full download)</li>
<li class=""><code>conda.api.SubdirData.query_all()</code>: Queries repodata.json using SAT solvers</li>
<li class=""><code>conda.cli.conda_argparse.generate_parser()</code>: Exposes conda's CLI documentation dynamically</li>
<li class=""><code>conda_forge_metadata</code>: Provides PyPI to conda and import to package mappings</li>
<li class=""><code>libmambapy</code>: Powers repoquery with fast dependency graph traversal</li>
<li class=""><code>conda-forge-paths database</code>: Powers file path search via Quansight's API</li>
</ul>
<p>The server is built with <a href="https://github.com/jlowin/fastmcp" target="_blank" rel="noopener noreferrer" class="">FastMCP</a> for minimal boilerplate and uses <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a> for fast, reproducible dependency management.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-principles">Design Principles<a href="https://conda.org/blog/conda-meta-mcp#design-principles" class="hash-link" aria-label="Direct link to Design Principles" title="Direct link to Design Principles" translate="no">​</a></h3>
<ol>
<li class=""><strong>Read-only by contract</strong>: Never mutates environments. Safe to host publicly.</li>
<li class=""><strong>Context-aware</strong>: Pagination, filtering, and windowing protect agent context.</li>
<li class=""><strong>Fast startup</strong>: pixi's lockfile ensures reproducible, secure dependency fetch in seconds.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://conda.org/blog/conda-meta-mcp#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>See the <a href="https://github.com/conda-incubator/conda-meta-mcp#readme" target="_blank" rel="noopener noreferrer" class="">conda-meta-mcp README</a> for installation instructions covering Claude Desktop, Cursor, OpenCode, Zed, VSCode, and GitHub Copilot.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Composability</div><div class="admonitionContent_BuS1"><p>conda-meta-mcp can be combined with other MCP servers for cross-ecosystem queries. The MCP protocol enables this composability by design.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outlook">Outlook<a href="https://conda.org/blog/conda-meta-mcp#outlook" class="hash-link" aria-label="Direct link to Outlook" title="Direct link to Outlook" translate="no">​</a></h2>
<p>conda-meta-mcp is <strong>use case agnostic</strong>: it exposes ecosystem facts without judgment, and works with many AI agents. What will you build? CVE analysis, dependency audits, migration planning, compliance reporting? The examples in this post are starting points.</p>
<p><strong>Share your prompts and use cases with the project:</strong></p>
<ul>
<li class=""><a href="https://github.com/conda-incubator/conda-meta-mcp" target="_blank" rel="noopener noreferrer" class="">conda-meta-mcp on GitHub</a></li>
<li class="">Open an issue or discussion with your discoveries</li>
</ul>
<p>Happy experimenting!</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Disclaimer</div><div class="admonitionContent_BuS1"><p>conda-meta-mcp provides data from upstream APIs without warranty of accuracy or completeness. We make no guarantees about LLM interpretation or actions based on this data. Third-party MCP servers (such as Grype MCP) are not provided, verified, or supported by us. Don't trust, verify!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="takeaway">Takeaway<a href="https://conda.org/blog/conda-meta-mcp#takeaway" class="hash-link" aria-label="Direct link to Takeaway" title="Direct link to Takeaway" translate="no">​</a></h2>
<p><strong>conda-meta-mcp</strong> solves a fundamental problem: AI agents can reason, but they need <strong>live, authoritative data</strong> to reason correctly about packaging. By exposing conda's rich embedded metadata through the Model Context Protocol, agents can now answer questions that were previously impossible without manual investigation.</p>
<p>The seven tools, from <code>package_search</code> to <code>file_path_search</code>, are composable building blocks. Agents chain them to perform <strong>cross-ecosystem discovery</strong>, <strong>dependency impact analysis</strong>, <strong>CVE triage</strong>, and <strong>supply chain auditing</strong>. The embedded provenance in every conda package makes this level of analysis possible.</p>
<p>As AI agents become more prevalent in development workflows, conda-meta-mcp ensures they have access to the same rich metadata that powers conda-forge's migration infrastructure. The result: agents that can make <strong>intelligent packaging decisions</strong> grounded in real ecosystem data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further Reading<a href="https://conda.org/blog/conda-meta-mcp#further-reading" class="hash-link" aria-label="Direct link to Further Reading" title="Direct link to Further Reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol specification</a></li>
<li class=""><a class="" href="https://conda.org/blog/2024-08-14-conda-ecosystem-explained">Conda Ecosystem Explained</a></li>
<li class=""><a class="" href="https://conda.org/blog/conda-practical-power">Practical Power: Reproducibility, Automation, and Layering</a></li>
</ul>]]></content:encoded>
            <category>conda</category>
            <category>ai</category>
            <category>mcp</category>
            <category>agents</category>
            <category>metadata</category>
        </item>
        <item>
            <title><![CDATA[New community meetings schedule for 2026]]></title>
            <link>https://conda.org/blog/2025-12-22-new-meetings-schedule</link>
            <guid>https://conda.org/blog/2025-12-22-new-meetings-schedule</guid>
            <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Starting in 2026, conda and conda-forge will share the same time slots for their community calls.]]></description>
            <content:encoded><![CDATA[<p>Starting in 2026, the community calls for conda and conda-forge have merged in a single timeslot. Instead of alternating weeks, from now on, both communities will share the same space every Wednesday. There are two rotating timeslots:</p>
<ul>
<li class="">2PM UTC</li>
<li class="">5PM UTC</li>
</ul>
<p>The first meeting in 2026 will take place on January 7th, at 5PM UTC. For more details consult the <a class="" href="https://conda.org/community/calendar/">calendar</a>.</p>
<p>The meeting minutes will be available in both conda.org and conda-forge.org, in the usual places.</p>
<p>This is one of our first steps towards reducing the administrative duplication existing between these overlapping communities.</p>]]></content:encoded>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Sharded repodata in conda (beta): an order of magnitude faster]]></title>
            <link>https://conda.org/blog/sharded-repodata-improvements</link>
            <guid>https://conda.org/blog/sharded-repodata-improvements</guid>
            <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Conda fetches repodata much more quickly. Learn how we did it and who helped along the way.]]></description>
            <content:encoded><![CDATA[<p>We're excited to announce a new beta feature in conda called sharded repodata. This optimized repodata format makes <strong>environment solves faster</strong> by reducing the time spent fetching package metadata.
<a href="https://conda-forge.org/" target="_blank" rel="noopener noreferrer" class="">Conda-forge</a> is already serving sharded repodata, so you can try it immediately when using conda with conda-forge.
In this post, we'll show you how to enable it, explain how the work came together across the ecosystem, and share the performance improvements you can expect in everyday use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-i-try-it-out">How do I try it out?<a href="https://conda.org/blog/sharded-repodata-improvements#how-do-i-try-it-out" class="hash-link" aria-label="Direct link to How do I try it out?" title="Direct link to How do I try it out?" translate="no">​</a></h2>
<p>If you're using conda-forge with conda and would like to try out this new feature, first update
<code>conda-libmamba-solver</code> in your <code>base</code> environment and then opt in to the feature by setting
<code>plugins.use_sharded_repodata = true</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token string" style="color:#e3116c">'conda-libmamba-solver&gt;=25.11.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda config </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> plugins.use_sharded_repodata </span><span class="token boolean" style="color:#36acaa">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background-and-context">Background and context<a href="https://conda.org/blog/sharded-repodata-improvements#background-and-context" class="hash-link" aria-label="Direct link to Background and context" title="Direct link to Background and context" translate="no">​</a></h2>
<p>In this section we provide some context around why we decided to develop this feature. We
think it will help you to better understand the performance metrics, but if you already know
the ins and outs of how conda stores and uses package metadata, feel free to skip
ahead to the <a href="https://conda.org/blog/sharded-repodata-improvements#performance-improvements">Performance improvements</a> section.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-repodata">What's repodata?<a href="https://conda.org/blog/sharded-repodata-improvements#whats-repodata" class="hash-link" aria-label="Direct link to What's repodata?" title="Direct link to What's repodata?" translate="no">​</a></h3>
<p>Repodata is a conda specific term that refers to the package index that all
conda clients must
download in order to find and install available packages. The best way to think about it is as
a database containing every package file, its dependencies, and other metadata for a particular channel.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="repodata-challenge-at-scale">Repodata challenge at scale<a href="https://conda.org/blog/sharded-repodata-improvements#repodata-challenge-at-scale" class="hash-link" aria-label="Direct link to Repodata challenge at scale" title="Direct link to Repodata challenge at scale" translate="no">​</a></h3>
<p>Channels distribute repodata as a single file. As channels add more packages, that file grows.
For channels with hundreds of thousands of packages, like conda-forge, that single file repodata
becomes a bottleneck. It takes longer to download and requires more memory to parse. When
anything in the channel updates, the entire cache invalidates. Conda re-downloads the complete
file just to get the latest metadata. All of this leads to a slow experience for users.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="addressing-this-challenge">Addressing this challenge<a href="https://conda.org/blog/sharded-repodata-improvements#addressing-this-challenge" class="hash-link" aria-label="Direct link to Addressing this challenge" title="Direct link to Addressing this challenge" translate="no">​</a></h3>
<p>There have been several attempts to address this problem over the past six years, including
<a href="https://www.anaconda.com/blog/how-we-made-conda-faster-4-7" target="_blank" rel="noopener noreferrer" class="">reducing the size of repodata.json</a> and
<a href="https://conda.org/blog/2023-05-05-how-we-reduced-the-conda-index-fetch-bandwidth/#ship-repodatajlap-incremental-repodata" target="_blank" rel="noopener noreferrer" class="">incrementally updating repodata by patching</a>.
Both of these previous attempts to make repodata fetching more efficient still weren't as performant
as they could be. This led <a href="https://github.com/baszalmstra" target="_blank" rel="noopener noreferrer" class="">Bas Zalmstra</a> and
<a href="https://github.com/wolfv" target="_blank" rel="noopener noreferrer" class="">Wolf Vollprecht</a> at <a href="https://prefix.dev/" target="_blank" rel="noopener noreferrer" class="">prefix.dev</a> to design and
implement a new approach. Bas authored <a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a>, with input
from the entire conda community, defining a new mechanism for fetching repodata using a sharded approach.</p>
<p>This approach works by splitting repodata into multiple "shards". Each package has its
own shard which is much smaller than the complete repodata. So, when a package is installed, we only
need to fetch what we need. This results in a much smaller download size and a faster overall experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharded-repodata-in-the-wider-ecosystem">Sharded repodata in the wider ecosystem<a href="https://conda.org/blog/sharded-repodata-improvements#sharded-repodata-in-the-wider-ecosystem" class="hash-link" aria-label="Direct link to Sharded repodata in the wider ecosystem" title="Direct link to Sharded repodata in the wider ecosystem" translate="no">​</a></h3>
<p><a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a> was authored by <a href="https://github.com/baszalmstra" target="_blank" rel="noopener noreferrer" class="">Bas Zalmstra</a>
at prefix.dev, reviewed by the conda community, and approved by the conda Steering Council in July 2024.
For a deep dive into the technical design and motivation, see the
<a href="https://prefix.dev/blog/sharded_repodata" target="_blank" rel="noopener noreferrer" class="">prefix.dev blog post on sharded repodata</a>.</p>
<p>Since the CEP was approved, <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">Pixi</a>, <a href="https://github.com/conda/rattler" target="_blank" rel="noopener noreferrer" class="">rattler</a>,
and <a href="https://github.com/prefix-dev/rattler-build" target="_blank" rel="noopener noreferrer" class="">rattler-build</a> have all provided production-ready
implementations of sharded repodata. The <a href="https://prefix.dev/channels" target="_blank" rel="noopener noreferrer" class="">prefix.dev channels</a> have
supported CEP 16 from day one, giving Pixi and rattler users the benefits of faster metadata
fetching for over a year.</p>
<p>Now that <a href="https://anaconda.org/" target="_blank" rel="noopener noreferrer" class="">anaconda.org</a> also serves sharded repodata for conda-forge, even more
users across the ecosystem will benefit. This is also great news for conda-forge maintainers using
rattler-build: faster repodata fetching means reduced build times in CI.</p>
<p>This collaborative effort across multiple organizations, prefix.dev, Anaconda, Quansight, and the
conda-forge community, demonstrates how the conda ecosystem can work together to deliver meaningful
improvements for everyone.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bringing-sharded-repodata-to-conda">Bringing sharded repodata to conda<a href="https://conda.org/blog/sharded-repodata-improvements#bringing-sharded-repodata-to-conda" class="hash-link" aria-label="Direct link to Bringing sharded repodata to conda" title="Direct link to Bringing sharded repodata to conda" translate="no">​</a></h3>
<p>With CEP 16 already proven in production by Pixi and rattler, we've been doing the work needed to
bring the same benefits to conda users.</p>
<ul>
<li class="">Earlier this year, we updated <a href="https://github.com/conda/conda-index/blob/main/CHANGELOG.md#060-2025-03-27" target="_blank" rel="noopener noreferrer" class="">conda-index</a>
so channels can generate sharded repodata.</li>
<li class="">Most recently, we added support in <a href="https://github.com/conda/conda-libmamba-solver/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">conda-libmamba-solver</a>,
now in beta, so the conda CLI can consume the new repodata format.</li>
<li class="">The <a href="https://anaconda.org/" target="_blank" rel="noopener noreferrer" class="">anaconda.org</a> team at Anaconda, with contributions from
<a href="https://quansight.com/" target="_blank" rel="noopener noreferrer" class="">Quansight</a>, worked with the conda-forge community to enable hosting of
sharded repodata. We plan to work with other channels to add support as the beta progresses.</li>
</ul>
<p>With all this in place, conda-forge is now publishing sharded repodata, and conda will automatically find it if the feature is enabled.</p>
<p>In the next section, we share the performance improvements we've seen so far.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-improvements">Performance improvements<a href="https://conda.org/blog/sharded-repodata-improvements#performance-improvements" class="hash-link" aria-label="Direct link to Performance improvements" title="Direct link to Performance improvements" translate="no">​</a></h2>
<p>To compare performance between the sharded and non-sharded approach, we used two different
environment creation scenarios: <strong>Python</strong> and <strong>Data Science</strong>. The Python scenario fetches the package
<code>python</code> and all its dependencies, and the Data Science scenario fetches the packages, <code>pandas</code>, <code>plotly</code> and <code>scipy</code> and their dependencies. We benchmarked
just the repodata fetching itself (check out the script we used
<a href="https://github.com/travishathaway/perfpy-conda/blob/d749765e1c124fb518784a7a2d91f3748bd32c8c/scripts/sharded_repodata_fetching.py" target="_blank" rel="noopener noreferrer" class="">here</a>).</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>We used a temporary <strong>conda-forge-sharded</strong> channel because at the time of
profiling, sharded repodata was not available on conda-forge via anaconda.org.</p><p>The benchmarks were run inside a <code>linux/arm64</code> Docker container running on an Apple M1 Pro.</p></div></div>
<p>Furthermore, we ran our comparison using a <strong>cold</strong> cache where nothing was present in conda's
cache and everything was fetched via network requests, and a <strong>warm</strong> cache where very few if any
network requests were necessary.</p>
<p>To get a complete picture of how these changes affect conda, we not only measured <strong>total time</strong>
but total <strong>network bandwidth</strong> usage and <strong>maximum memory usage</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="total-time">Total time<a href="https://conda.org/blog/sharded-repodata-improvements#total-time" class="hash-link" aria-label="Direct link to Total time" title="Direct link to Total time" translate="no">​</a></h3>
<p>Below are the comparisons between non-sharded and sharded fetching measuring <strong>total time</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="total-time-with-cold-cache-seconds">Total time with cold cache (seconds)<a href="https://conda.org/blog/sharded-repodata-improvements#total-time-with-cold-cache-seconds" class="hash-link" aria-label="Direct link to Total time with cold cache (seconds)" title="Direct link to Total time with cold cache (seconds)" translate="no">​</a></h4>
<div>Loading chart...</div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="total-time-with-warm-cache-seconds">Total time with warm cache (seconds)<a href="https://conda.org/blog/sharded-repodata-improvements#total-time-with-warm-cache-seconds" class="hash-link" aria-label="Direct link to Total time with warm cache (seconds)" title="Direct link to Total time with warm cache (seconds)" translate="no">​</a></h4>
<div>Loading chart...</div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways">Key takeaways<a href="https://conda.org/blog/sharded-repodata-improvements#key-takeaways" class="hash-link" aria-label="Direct link to Key takeaways" title="Direct link to Key takeaways" translate="no">​</a></h4>
<ul>
<li class="">Under both scenarios, we see a ten times speed-up in fetching and parsing of repodata</li>
<li class="">This happens because the sharded repodata is significantly smaller</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The nature of how shards are stored also means that the cache itself is invalidated less often
(see <a href="https://conda.org/learn/ceps/cep-0016#repodata-shard" target="_blank" rel="noopener noreferrer" class="">CEP 16</a> for more information).
This means that conda-forge users will see times closer to the faster "warm" cache scenario more often and
will spend less time downloading repodata to install the packages they want.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-bandwidth">Network bandwidth<a href="https://conda.org/blog/sharded-repodata-improvements#network-bandwidth" class="hash-link" aria-label="Direct link to Network bandwidth" title="Direct link to Network bandwidth" translate="no">​</a></h3>
<p>To further illustrate the improvements, we show the total amount of megabytes downloaded
with sharded versus the non-sharded approach.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="total-network-bandwidth-mb-received">Total network bandwidth (MB received)<a href="https://conda.org/blog/sharded-repodata-improvements#total-network-bandwidth-mb-received" class="hash-link" aria-label="Direct link to Total network bandwidth (MB received)" title="Direct link to Total network bandwidth (MB received)" translate="no">​</a></h4>
<div>Loading chart...</div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways-1">Key takeaways<a href="https://conda.org/blog/sharded-repodata-improvements#key-takeaways-1" class="hash-link" aria-label="Direct link to Key takeaways" title="Direct link to Key takeaways" translate="no">​</a></h4>
<ul>
<li class="">The sharded approach reduces the amount downloaded by a factor of 35!</li>
<li class="">Non-sharded fetching always has to fetch the same sized repodata but
sharded repodata only fetches what it needs, meaning it varies based on
the requested packages as seen here.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="max-memory-usage">Max memory usage<a href="https://conda.org/blog/sharded-repodata-improvements#max-memory-usage" class="hash-link" aria-label="Direct link to Max memory usage" title="Direct link to Max memory usage" translate="no">​</a></h3>
<p>The last metric we examine is the maximum memory usage of sharded repodata fetching. Here,
we just show the "cold" cache scenario.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="max-memory-usage-in-mb">Max memory usage (in MB)<a href="https://conda.org/blog/sharded-repodata-improvements#max-memory-usage-in-mb" class="hash-link" aria-label="Direct link to Max memory usage (in MB)" title="Direct link to Max memory usage (in MB)" translate="no">​</a></h4>
<div>Loading chart...</div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways-2">Key takeaways<a href="https://conda.org/blog/sharded-repodata-improvements#key-takeaways-2" class="hash-link" aria-label="Direct link to Key takeaways" title="Direct link to Key takeaways" translate="no">​</a></h4>
<p>Both package scenarios see significant decreases in memory usage with a fifteen and
and seventeen times reduction in memory usage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://conda.org/blog/sharded-repodata-improvements#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h3>
<p>We're excited to see these numbers and think this will translate to a better overall experience
for conda users! If you've read this far, we hope you're convinced to give the beta release
a try and we welcome any feedback you may have. Please file an issue at the
<a href="https://github.com/conda/conda-libmamba-solver/issues" target="_blank" rel="noopener noreferrer" class="">conda-libmamba-solver</a> repository on GitHub
to reach out to us.</p>
<p>Finally, we want to give a big shout out to the conda-maintainers team and specifically
<a href="https://github.com/dholth" target="_blank" rel="noopener noreferrer" class="">Daniel Holth</a> for making the addition of this feature possible!</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If you're interested in how we generated the profiling data we've presented, please checkout
the <strong><a href="https://github.com/travishathaway/perfpy-conda" target="_blank" rel="noopener noreferrer" class="">perfpy-conda</a></strong> and the
<strong><a href="https://github.com/travishathaway/perfpy" target="_blank" rel="noopener noreferrer" class="">perfpy</a></strong> tool.</p></div></div>]]></content:encoded>
            <category>conda</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[November 2025 Releases]]></title>
            <link>https://conda.org/blog/2025-12-02-november-releases</link>
            <guid>https://conda.org/blog/2025-12-02-november-releases</guid>
            <pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[conda 25.11.0, conda-build 25.11.0, and conda-libmamba-solver 25.11.0 have been released! 🎉
]]></description>
            <content:encoded><![CDATA[<p>The November 2025 releases included updates to conda, conda-build, and conda-libmamba-solver! 🎉 All of these have been released to both <code>defaults</code> and <code>conda-forge</code> channels.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Special Announcement</div><div class="admonitionContent_BuS1"><p>This release includes <strong>preliminary support for fetching <a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a> sharded repodata</strong>, a substantially more efficient way of distributing the necessary metadata to install packages in your environments. Read more about it in our <a class="" href="https://conda.org/blog/sharded-repodata-improvements">sharded repodata blog post</a>.</p><p>You can try it out by following these steps:</p><ul>
<li class="">Update to <code>conda-libmamba-solver</code> 25.11.0 or later</li>
<li class="">Enable it in your settings: <code>conda config --set plugins.use_sharded_repodata true</code></li>
<li class="">Set this environment variable: <code>CONDA_PLUGINS_USE_SHARDED_REPODATA=1</code></li>
</ul><p>Note that sharded repodata requires that the target channels expose the necessary metadata, too, so it will only work with CEP-16-ready deployments. <code>conda-libmamba-solver</code> will fall back to non-sharded/monolithic repodata if not available, so you can mix sharded and non-sharded channels.</p><p>This feature is only available when using <code>conda-libmamba-solver</code> 25.11.0 and later and is not implemented in the classic solver.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-25110">Changes in conda <a href="https://github.com/conda/conda/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a><a href="https://conda.org/blog/2025-12-02-november-releases#changes-in-conda-25110" class="hash-link" aria-label="Direct link to changes-in-conda-25110" title="Direct link to changes-in-conda-25110" translate="no">​</a></h2>
<p>To update <code>conda</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">conda</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.11</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Enhanced virtual packages plugin API with new fields for controlling override behavior.</li>
<li class="">Added new <code>override_virtual_packages</code> (alias: <code>virtual_packages</code>) configuration key to <code>.condarc</code> for overriding virtual package versions and build numbers.</li>
<li class="">Added <code>created</code> and <code>last_modified</code> properties to conda environments.</li>
<li class="">Added new <code>envs_details</code> field to <code>conda info --json</code> output for inspecting properties of registered environments (also available via <code>conda info --envs --json</code> and <code>conda env list --json</code>).</li>
<li class="">Fixed various bugs related to <code>MatchSpec</code> serialization, channel URL handling, and Python 3.14 compatibility.</li>
<li class="">Improved warning for users attempting to add reserved environment variables like <code>PATH</code> to environment configurations.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-build-25110">Changes in conda-build <a href="https://github.com/conda/conda-build/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a><a href="https://conda.org/blog/2025-12-02-november-releases#changes-in-conda-build-25110" class="hash-link" aria-label="Direct link to changes-in-conda-build-25110" title="Direct link to changes-in-conda-build-25110" translate="no">​</a></h2>
<p>To update <code>conda-build</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-build</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.11</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added support for specifying a custom PyYAML loader when parsing configuration files via <code>conda_build.variants.parse_config_file</code>.</li>
<li class="">Fixed <code>BUILD</code> environment variable to properly respect the <code>cdt_name</code> variant configuration. Previously, it was hardcoded to use <code>cos6</code> or <code>cos7</code> based on architecture.</li>
<li class="">Fixed Windows MSVC version detection for Python 3.5+.</li>
<li class="">Updated CMake generator handling for CMake 4 compatibility (CMake 2 support was dropped in CMake 4).</li>
<li class="">Python 3.9 support has been removed. The minimum supported Python version is now 3.10.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-build/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-libmamba-solver-25110">Changes in conda-libmamba-solver <a href="https://github.com/conda/conda-libmamba-solver/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a><a href="https://conda.org/blog/2025-12-02-november-releases#changes-in-conda-libmamba-solver-25110" class="hash-link" aria-label="Direct link to changes-in-conda-libmamba-solver-25110" title="Direct link to changes-in-conda-libmamba-solver-25110" translate="no">​</a></h2>
<p>To update <code>conda-libmamba-solver</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-libmamba-solver</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.11</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added experimental support for <a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">CEP 16</a> sharded repodata (see announcement above).</li>
<li class="">Added support for <a href="https://conda.org/learn/ceps/cep-0017/" target="_blank" rel="noopener noreferrer" class="">CEP 17</a> <code>python_site_packages_path</code>.</li>
<li class="">Fixed the <code>cpuonly</code> mutex to correctly prevent CUDA packages from being installed, matching classic solver behavior.</li>
<li class="">Added new messaging for when <code>conda</code> is outdated, environment is <a href="https://conda.org/learn/ceps/cep-0022/" target="_blank" rel="noopener noreferrer" class="">frozen</a>, and <code>conda-self</code> is installed.</li>
<li class="">Python 3.9 support has been dropped. The minimum supported Python version is now 3.10.</li>
<li class="">Added codspeed benchmarking GitHub action and benchmarks.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-libmamba-solver/releases/tag/25.11.0" target="_blank" rel="noopener noreferrer" class="">25.11.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-️-our-community">We ❤️ Our Community<a href="https://conda.org/blog/2025-12-02-november-releases#we-%EF%B8%8F-our-community" class="hash-link" aria-label="Direct link to We ❤️ Our Community" title="Direct link to We ❤️ Our Community" translate="no">​</a></h2>
<p>Altogether, we had 7 new contributors this release cycle; thank you to all of our open source community members for helping make these improvements possible.</p>
<ul>
<li class=""><a href="https://github.com/danyeaw" target="_blank" rel="noopener noreferrer" class="">@danyeaw</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15208" target="_blank" rel="noopener noreferrer" class="">conda#15208</a></li>
<li class=""><a href="https://github.com/lang-m" target="_blank" rel="noopener noreferrer" class="">@lang-m</a> made their first contribution in <a href="https://github.com/conda/conda/pull/13165" target="_blank" rel="noopener noreferrer" class="">conda#13165</a></li>
<li class=""><a href="https://github.com/hoxbro" target="_blank" rel="noopener noreferrer" class="">@hoxbro</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15325" target="_blank" rel="noopener noreferrer" class="">conda#15325</a></li>
<li class=""><a href="https://github.com/sumanth-manchala" target="_blank" rel="noopener noreferrer" class="">@sumanth-manchala</a> made their first contribution in <a href="https://github.com/conda/conda/pull/14179" target="_blank" rel="noopener noreferrer" class="">conda#14179</a></li>
<li class=""><a href="https://github.com/shermansiu" target="_blank" rel="noopener noreferrer" class="">@shermansiu</a> made their first contribution in <a href="https://github.com/conda/conda-build/pull/5800" target="_blank" rel="noopener noreferrer" class="">conda-build#5800</a></li>
<li class=""><a href="https://github.com/agriyakhetarpal" target="_blank" rel="noopener noreferrer" class="">@agriyakhetarpal</a> made their first contribution in <a href="https://github.com/conda/conda-libmamba-solver/pull/741" target="_blank" rel="noopener noreferrer" class="">conda-libmamba-solver#741</a></li>
<li class=""><a href="https://github.com/stacynoland" target="_blank" rel="noopener noreferrer" class="">@stacynoland</a> made their first contribution in <a href="https://github.com/conda/conda-libmamba-solver/pull/766" target="_blank" rel="noopener noreferrer" class="">conda-libmamba-solver#766</a></li>
</ul>]]></content:encoded>
            <category>announcement</category>
            <category>conda</category>
            <category>conda-build</category>
            <category>conda-libmamba-solver</category>
        </item>
        <item>
            <title><![CDATA[Practical Power: Reproducibility, Automation, and Layering with Conda]]></title>
            <link>https://conda.org/blog/conda-practical-power</link>
            <guid>https://conda.org/blog/conda-practical-power</guid>
            <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Part 3 of the 'Conda Is Not PyPI' series: how conda enables reproducibility, automation, layered workflows, and rolling distribution.]]></description>
            <content:encoded><![CDATA[<p><em>Part 3 of our series "Conda Is Not PyPI: Understanding Conda as a User-Space Distribution".</em></p>
<p>In <a class="" href="https://conda.org/blog/conda-is-not-pypi">Part 1</a>, we explained why conda is not just another Python package manager.
In <a class="" href="https://conda.org/blog/conda-pip-docker-nix">Part 2</a>, we placed conda in the broader packaging spectrum, showing how it differs from pip, Docker, and Nix.</p>
<p>Now we turn to what makes conda practical and powerful: <strong>reproducibility, automation, layered workflows, and rolling distribution</strong>.</p>
<p>Understanding conda's theoretical advantages is one thing. Seeing how they translate into real-world benefits is another. In this final article, we explore how conda's design enables teams to build reliable, maintainable software environments that scale from personal projects to enterprise systems.</p>
<p>We'll cover how conda packages encode provenance, how lockfiles ensure reproducibility across time and teams, and how intelligent layering with pip/npm gives you the best of both worlds.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reproducibility-built-into-the-package-format">Reproducibility built into the package format<a href="https://conda.org/blog/conda-practical-power#reproducibility-built-into-the-package-format" class="hash-link" aria-label="Direct link to Reproducibility built into the package format" title="Direct link to Reproducibility built into the package format" translate="no">​</a></h2>
<p>Conda packages are designed for <strong>traceability and rebuildability</strong>:</p>
<ul>
<li class=""><strong>Recipes included.</strong> Each conda package embeds the <strong>rendered recipe</strong> (<code>meta.yaml</code> or the newer <code>recipe.yaml</code> format) and build scripts under <code>info/recipe</code>. You can trace exactly how a binary was produced.</li>
<li class=""><strong>Source provenance.</strong> Packages include upstream source URLs paired with either a SHA256 checksum (for releases) or the exact Git commit SHA (for git sources).</li>
<li class=""><strong>Build environments captured.</strong> Unlike <code>sdist</code> or wheels, conda recipes describe not just Python dependencies, but the <strong>entire build environment</strong>: compilers, linkers, BLAS, CUDA, etc.</li>
<li class=""><strong>Cross-platform parity.</strong> The same recipe can target Linux, macOS, and Windows, with platform-appropriate builds.</li>
</ul>
<p>This level of transparency means you can always answer a critical question that's often impossible with traditional package registries:</p>
<blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-did-this-binary-come-from-and-how-was-it-built">"Where did this binary come from, and how was it built?"<a href="https://conda.org/blog/conda-practical-power#where-did-this-binary-come-from-and-how-was-it-built" class="hash-link" aria-label="Direct link to &quot;Where did this binary come from, and how was it built?&quot;" title="Direct link to &quot;Where did this binary come from, and how was it built?&quot;" translate="no">​</a></h3>
</blockquote>
<p>Most library registries give you a compiled artifact and little else. Conda packages give you a complete provenance chain from source to binary, making them uniquely suited for auditing, compliance, and reproducible science.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-info-metadata-tarball-provenance-in-every-package">The <code>info/</code> metadata tarball: provenance in every package<a href="https://conda.org/blog/conda-practical-power#the-info-metadata-tarball-provenance-in-every-package" class="hash-link" aria-label="Direct link to the-info-metadata-tarball-provenance-in-every-package" title="Direct link to the-info-metadata-tarball-provenance-in-every-package" translate="no">​</a></h3>
<p>Every <strong>conda package</strong> includes an <strong><code>info/</code> sub-archive</strong> with rich metadata:</p>
<ul>
<li class=""><strong>Original recipe files</strong> (<code>meta.yaml</code> or <code>recipe.yaml</code>, build/host/run sections, scripts)</li>
<li class=""><strong>Rendered recipe</strong> → concrete versions + variants actually used in the build</li>
<li class=""><strong>Source details</strong> → upstream URLs, checksums, commit SHAs</li>
<li class=""><strong>Channel configuration</strong> (<code>conda_build_config.yaml</code> values in effect)</li>
<li class=""><strong>CI/build references</strong> → build number, timestamps, feedstock (=recipe repository) URL and commit, and CI workflow run identifier</li>
</ul>
<p>This means you can answer, for any binary:</p>
<ul>
<li class="">Which sources was it built from?</li>
<li class="">Which toolchain, flags, and variants were active?</li>
<li class="">Which CI job produced it?</li>
</ul>
<p>Compared to a PyPI sdist or wheel, this is <strong>night and day</strong>. A wheel might tell you the package version. But a <strong>conda package</strong> lets you <strong>rebuild the binary from first principles</strong> using the embedded recipe and source reference.</p>
<p>That provenance is what enables <strong>conda packages'</strong> <strong>auditable reproducibility</strong>, critical for regulated industries, long-lived research, and enterprise compliance.</p>
<p><strong>Why embedded metadata matters for security.</strong> Because this metadata lives <strong>within</strong> every package and isn't stored externally, it becomes immutable when combined with lockfiles. Locking a package hash in a lockfile cryptographically binds that specific package's entire metadata (recipe, sources, build details, checksums) to that hash.</p>
<p>This creates a <strong>tamper-evident record</strong>: if a supply chain attack or data manipulation occurs, the package hash would change, immediately alerting you to the compromise.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automation-with-lockfiles-and-dependency-update-bots">Automation with lockfiles and dependency update bots<a href="https://conda.org/blog/conda-practical-power#automation-with-lockfiles-and-dependency-update-bots" class="hash-link" aria-label="Direct link to Automation with lockfiles and dependency update bots" title="Direct link to Automation with lockfiles and dependency update bots" translate="no">​</a></h2>
<p>Reproducibility is only half the story: you also need <strong>automation</strong> to keep environments fresh.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lockfiles-the-foundation-for-reliability-and-reproducibility">Lockfiles: the foundation for reliability and reproducibility<a href="https://conda.org/blog/conda-practical-power#lockfiles-the-foundation-for-reliability-and-reproducibility" class="hash-link" aria-label="Direct link to Lockfiles: the foundation for reliability and reproducibility" title="Direct link to Lockfiles: the foundation for reliability and reproducibility" translate="no">​</a></h3>
<p>A conda lockfile captures exact versions of your entire runtime stack:</p>
<ul>
<li class="">Python/R interpreters</li>
<li class="">Compilers</li>
<li class="">BLAS, CUDA</li>
<li class="">System libraries</li>
<li class="">All packages (not just Python packages like poetry or uv.lock do)</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>What is a lockfile?</div><div class="admonitionContent_BuS1"><p>A <strong>lockfile</strong> is a machine-generated record that pins every dependency to a specific version and cryptographic hash.</p><p>Unlike <code>environment.yml</code> (which specifies version ranges and allows flexibility), a lockfile records the exact versions that were resolved and verified to work together.</p><p>When you commit a lockfile to version control, you're capturing a reproducible snapshot of your entire environment at a point in time.</p><p>Lockfiles enable reproducibility, auditing, and forensic security investigations because every package's provenance is locked immutably.</p></div></div>
<p>This means you can rebuild your environment bit-for-bit years later, protecting against supply chain changes. Lockfiles provide three critical benefits:</p>
<ol>
<li class=""><strong>Reproducibility</strong>: Rebuild identical environments across time, teams, and machines.</li>
<li class=""><strong>Supply chain security</strong>: Locked hashes verify package integrity and bind all embedded metadata (recipes, sources, build info) immutably to each package. If a supply chain attack occurs or metadata is manipulated, the hash changes immediately, providing forensic detection. You know exactly what you installed and can trace its provenance.</li>
<li class=""><strong>Reliability</strong>: No surprises from solver changes or package updates. Your environment stays stable until you explicitly update it.</li>
</ol>
<p>For scientific projects, this is essential. Lockfiles preserve your computational environment over time: as long as the locked packages remain available on their channels, you can recreate the exact environment years later. Because the entire runtime is locked (not just application code), your 2024 research environment can be faithfully reconstructed in 2027 or beyond.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lockfiles-and-conda">Lockfiles and conda<a href="https://conda.org/blog/conda-practical-power#lockfiles-and-conda" class="hash-link" aria-label="Direct link to Lockfiles and conda" title="Direct link to Lockfiles and conda" translate="no">​</a></h3>
<p>While conda already has basic lockfile support, the ecosystem is actively standardizing lockfile formats via <a href="https://github.com/conda/ceps" target="_blank" rel="noopener noreferrer" class="">Conda Enhancement Proposals (CEPs)</a>. This ongoing effort enables different tools to support interoperable, standardized lockfile formats aligned across the entire ecosystem:</p>
<ul>
<li class=""><strong><code>conda-lock</code></strong> was the original lockfile implementation for conda, generating platform-specific lockfiles from <code>environment.yml</code> specs. It continues to play an important role for existing projects where migration effort isn't justified.</li>
<li class=""><strong><code>pixi</code></strong>  automatically updates the <code>pixi.lock</code> file, making lockfile-first workflows the default. With a dedicated team driving development, pixi is actively innovating with new lockfile formats and best practices, and is bringing these standards back to the broader conda ecosystem via CEPs.</li>
<li class=""><strong><a href="https://github.com/conda-incubator/conda-lockfiles" target="_blank" rel="noopener noreferrer" class=""><code>conda-lockfiles</code> plugin</a></strong> (work-in-progress, coming to conda core soon) will provide enhanced native lockfile support directly in conda, supporting the newer standardized formats. This represents pixi's innovations being integrated into conda itself.</li>
</ul>
<p>The goal is interoperability between clients: lockfiles created by one tool can be used by another. While this is already true for some formats (e.g., <code>pixi-lock-v6</code>), full standardization across all tools is still being defined and implemented through the CEP process.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="renovate-integration-automated-dependency-updates-with-safety-nets">Renovate integration: automated dependency updates with safety nets<a href="https://conda.org/blog/conda-practical-power#renovate-integration-automated-dependency-updates-with-safety-nets" class="hash-link" aria-label="Direct link to Renovate integration: automated dependency updates with safety nets" title="Direct link to Renovate integration: automated dependency updates with safety nets" translate="no">​</a></h3>
<p><a href="https://www.renovatebot.com/" target="_blank" rel="noopener noreferrer" class="">Renovate</a> understands conda specs and lockfiles, enabling automated PRs to bump dependencies and regenerate lockfiles.</p>
<ul>
<li class="">
<p><strong>Pixi:</strong> <a href="https://docs.renovatebot.com/modules/manager/pixi/" target="_blank" rel="noopener noreferrer" class="">Full native support</a>. Renovate automatically detects <code>pixi.toml</code> and <code>pixi.lock</code>, regenerating lockfiles on updates.</p>
</li>
<li class="">
<p><strong>Conda:</strong> Datasource support via the <a href="https://docs.renovatebot.com/modules/datasource/conda/" target="_blank" rel="noopener noreferrer" class="">conda datasource</a>. Teams can add custom regex patterns to their Renovate config to manage conda dependencies in <code>environment.yml</code> files (requires annotations like <code># renovate: datasource=conda depName=conda-forge/numpy</code>). See <a href="https://github.com/anaconda/renovate-config/blob/main/default.json" target="_blank" rel="noopener noreferrer" class="">Anaconda's Renovate config</a> for a production-ready example of how to set this up.</p>
<p><strong>Important</strong>: When Renovate updates <code>environment.yml</code>, you'll need a workflow to regenerate the lockfile using <code>conda-lock</code> or similar tools so that CI/CD picks up the resolved dependencies.</p>
</li>
</ul>
<p>Together, lockfiles and dependency update bots like Renovate enable <strong>iterative development with safety nets</strong>. Each pull request represents a small, testable change to your dependencies. As continuous integration systems typically run your full test suite on every update, they are proving in small steps that changes don't break anything.</p>
<p>Over time, this generates a constant stream of feedback about which dependencies are stable, which introduce subtle incompatibilities, and where your application is brittle. Combined with good tests, you learn more about your ecosystem, harden your app against breaking changes, and maintain confidence that your project evolves safely.</p>
<p>This is how teams build resilient, maintainable systems.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conda-as-a-rolling-distribution-continuous-evolution-with-stability">Conda as a rolling distribution: continuous evolution with stability<a href="https://conda.org/blog/conda-practical-power#conda-as-a-rolling-distribution-continuous-evolution-with-stability" class="hash-link" aria-label="Direct link to Conda as a rolling distribution: continuous evolution with stability" title="Direct link to Conda as a rolling distribution: continuous evolution with stability" translate="no">​</a></h2>
<p>Most operating system distributions (Debian, Ubuntu, Fedora) use a fixed-version model: each release has a defined lifecycle, and packages within that version remain largely unchanged (except for security patches). This provides stability but means users must perform major version upgrades to get newer software.</p>
<p>Conda takes a fundamentally different approach: it functions as a <strong>rolling distribution</strong> across all platforms (Linux, macOS, Windows) with constantly updated binary packages. New versions of libraries are released continuously, and the entire ecosystem evolves without waiting for major version releases.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Two distribution models</div><div class="admonitionContent_BuS1"><p><strong>Fixed-release</strong> (like Ubuntu 24.04): stable but requires major upgrades to stay current.</p><p><strong>Rolling</strong>: up-to-date but unpredictable without tooling.</p><p><strong>Conda combines both</strong>: lockfiles ensure predictability while migration infrastructure keeps the entire ecosystem current and safe.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-infrastructure-coordinated-rebuilds-at-scale">Migration infrastructure: coordinated rebuilds at scale<a href="https://conda.org/blog/conda-practical-power#migration-infrastructure-coordinated-rebuilds-at-scale" class="hash-link" aria-label="Direct link to Migration infrastructure: coordinated rebuilds at scale" title="Direct link to Migration infrastructure: coordinated rebuilds at scale" translate="no">​</a></h3>
<p>When a new, binary-incompatible version of a core library is released (like OpenSSL v4.0.0 expected in April 2026), channels like conda-forge automatically rebuild all dependent packages in the correct order.</p>
<p>This creates a gradual transition through the entire dependency graph by replacing one "plank" at a time. As one community member describes it, like an "<a href="https://en.wikipedia.org/wiki/Ship_of_Theseus" target="_blank" rel="noopener noreferrer" class="">ultimate Ship of Theseus</a>", where bots constantly rebuild related packages, one dependency at a time. At scale, conda-forge, the largest community channel, manages 20+ independent migrations across its 26,000+ packages at <a href="https://conda-forge.org/status/" target="_blank" rel="noopener noreferrer" class="">any given time</a>, making this orchestration industrial in scope.</p>
<p>This continuous rebuilding as new versions of core libraries are released enables conda environments to maintain <a href="https://pypackaging-native.github.io/background/binary_interface" target="_blank" rel="noopener noreferrer" class="">ABI</a> compatibility as dependencies evolve across Linux, macOS, and Windows, something traditional distros can't easily do. For a deeper exploration of the binary compatibility challenges that conda's model solves, see <a href="https://pypackaging-native.github.io/" target="_blank" rel="noopener noreferrer" class="">PyPackaging Native</a>, which contrasts these issues with PyPI's approach.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="industrial-grade-solvers">Industrial-grade solvers<a href="https://conda.org/blog/conda-practical-power#industrial-grade-solvers" class="hash-link" aria-label="Direct link to Industrial-grade solvers" title="Direct link to Industrial-grade solvers" translate="no">​</a></h3>
<p>This continuous rolling model is why conda needs powerful constraint resolvers like <a href="https://conda.org/blog/2023-07-05-conda-libmamba-solver-rollout" target="_blank" rel="noopener noreferrer" class="">libmamba</a> or <a href="https://github.com/prefix-dev/resolvo" target="_blank" rel="noopener noreferrer" class="">resolvo</a>. Every install must query extensive package metadata spanning multiple versions and build variants to determine which combinations satisfy all constraints using <a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem" target="_blank" rel="noopener noreferrer" class="">SAT-based</a> algorithms.</p>
<p>Early conda users remember this as the primary complaint: installation took a long time. These concerns have substantially improved with modern solvers, and further improvements (like sharded repodata to reduce metadata downloads) are coming soon.</p>
<p>This rolling distribution model is one of conda's core strengths. You'll get the stability and coherence of a curated distribution system combined with the ability to stay current with upstream innovations. It's how conda environments can evolve safely over years while keeping dependencies fresh and secure.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="footprint-and-velocity-in-continuous-integration-and-high-performance-computing">Footprint and velocity in Continuous Integration and High-Performance Computing<a href="https://conda.org/blog/conda-practical-power#footprint-and-velocity-in-continuous-integration-and-high-performance-computing" class="hash-link" aria-label="Direct link to Footprint and velocity in Continuous Integration and High-Performance Computing" title="Direct link to Footprint and velocity in Continuous Integration and High-Performance Computing" translate="no">​</a></h3>
<p>Not shipping <code>glibc</code> and friends lowers <strong>cold-start cost</strong>: creating, caching, and syncing environments is faster (and cheaper).</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Where conda shines</div><div class="admonitionContent_BuS1"><p><strong>Continuous Integration (CI)</strong>: Automated testing pipelines (GitHub Actions, GitLab CI, Jenkins) where fast environment setup means quicker feedback on pull requests.</p><p><strong>High-Performance Computing (HPC)</strong>: Supercomputers and research clusters where users need reproducible environments without administrator privileges.</p><p><strong>Local development</strong>: Individual developers who want consistent environments across projects without heavyweight containers.</p></div></div>
<p>In these environments, conda provides:</p>
<ul>
<li class="">Smaller artifacts → quicker cache restores and less network churn</li>
<li class="">Faster solves/installs → shorter feedback loops enabling rapid testing</li>
<li class="">Easy per-project environments without admin rights → delightful user experience</li>
</ul>
<p>This speed matters. In Continuous Integration, you want test feedback in minutes, not hours. In HPC, researchers need to spin up project environments quickly without waiting for administrators. In local development, fast environment creation means less context switching and more flow. Combined with lockfiles for reproducibility, conda delivers <strong>deterministic yet nimble</strong> environments that keep up with your workflow without heavyweight overhead.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-layering-model-os-conda-and-language-registries">The layering model: OS, conda, and language registries<a href="https://conda.org/blog/conda-practical-power#the-layering-model-os-conda-and-language-registries" class="hash-link" aria-label="Direct link to The layering model: OS, conda, and language registries" title="Direct link to The layering model: OS, conda, and language registries" translate="no">​</a></h2>
<p>Conda fits into a complete 3-layer packaging stack:</p>
<ol>
<li class="">
<p><strong>OS layer: System package managers (apt, yum, etc.)</strong>
Managed via base operating system or container base images (e.g., the <code>ubuntu:24.04</code> base image). Provides the kernel, core C library (<code>glibc</code> on Linux), and fundamental system utilities. This layer is fixed when you choose your base image.</p>
</li>
<li class="">
<p><strong>Distribution layer: Conda packages</strong>
Provides Python, R, C/C++ libraries, GPU runtimes, compilers, and system-level tools, all solved together via a SAT-based solver. Built against the oldest supported OS runtime for forward compatibility. This is where the "distribution" concept from Parts 1 and 2 comes into practice.</p>
</li>
<li class="">
<p><strong>Language registry layer: pip/npm</strong>
Use pip (Python) or npm (JavaScript) on top to install application-level libraries, especially pure-language packages that don't introduce new compiled dependencies. Fast iteration for the final mile of your app.</p>
</li>
</ol>
<p><strong>Conda environments</strong> leverage all three layers intelligently:</p>
<ul>
<li class=""><strong>Container/VM</strong> provides the fixed OS baseline (layer 1)</li>
<li class=""><strong>Conda</strong> solves for multi-language coherence and system dependencies (layer 2)</li>
<li class=""><strong>pip/npm</strong> handles language-specific, pure-library iteration (layer 3)</li>
</ul>
<p>This layering model gives you the best of all worlds:</p>
<ul>
<li class="">The <strong>stability and platform guarantees</strong> of a pinned base OS</li>
<li class="">The <strong>robust, multi-language solving</strong> of the conda distribution system</li>
<li class="">The <strong>fast iteration and ecosystem breadth</strong> of language registries</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Related reading</div><div class="admonitionContent_BuS1"><p>See <a href="https://uwekorn.com/2021/03/01/deploying-conda-environments-in-docker-how-to-do-it-right.html" target="_blank" rel="noopener noreferrer" class="">"Deploying Conda Environments in (Docker) Containers: How to do it Right"</a> by Uwe Korn, or the equivalent for pixi users, <a href="https://tech.quantco.com/blog/pixi-production" target="_blank" rel="noopener noreferrer" class="">"Shipping conda environments to production using pixi"</a> by Pavel Zwerschke.</p><p>Both show best practices for using lockfiles, optimizing container size with lean OS images, and maintaining reproducibility across conda and pixi workflows.</p><p>These container-based workflows demonstrate the three-layer model in practice: a minimal OS base image provides <code>glibc</code> and system utilities (layer 1), <strong>conda packages</strong> provide the application runtime and dependencies (layer 2), and optionally pip/npm add pure-Python packages (layer 3).</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-advantages-for-teams">Real-world advantages for teams<a href="https://conda.org/blog/conda-practical-power#real-world-advantages-for-teams" class="hash-link" aria-label="Direct link to Real-world advantages for teams" title="Direct link to Real-world advantages for teams" translate="no">​</a></h2>
<p>Conda’s design yields practical benefits across domains:</p>
<ul>
<li class="">
<p><strong>Data science &amp; ML.</strong></p>
<ul>
<li class="">Install GPU-enabled packages (<code>tensorflow-gpu</code>, <code>pytorch</code>) with the correct CUDA and cuDNN versions.</li>
<li class="">Combine them with Python packages (<code>scikit-learn</code>, <code>transformers</code>) and system tools (<code>ffmpeg</code>, <code>graphviz</code>) in one environment.</li>
</ul>
</li>
<li class="">
<p><strong>Reproducible science.</strong></p>
<ul>
<li class="">Pin environment specs, generate lockfiles, and publish them alongside papers or datasets.</li>
<li class="">Ensure results can be replicated years later, even on newer operating systems.</li>
</ul>
</li>
<li class="">
<p><strong>Enterprise automation.</strong></p>
<ul>
<li class="">Use dependency update bots (like Renovate) and lockfiles to enable iterative dependency updates with full test validation.</li>
<li class="">Each PR tests a small change. Over time, you build confidence that updates are safe and learn which dependencies are stable.</li>
<li class="">Run the same environment locally, in CI/CD, and in production.</li>
</ul>
</li>
<li class="">
<p><strong>Developer onboarding.</strong></p>
<ul>
<li class="">New teammates run <code>conda env create -f environment.yml</code> (or similar command with mamba and pixi) and get a complete toolchain, not just a Python <code>venv</code>.</li>
<li class="">No system administrator required, no root permissions needed.</li>
</ul>
</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-data-science-devops-with-conda">Beyond data science: DevOps with conda<a href="https://conda.org/blog/conda-practical-power#beyond-data-science-devops-with-conda" class="hash-link" aria-label="Direct link to Beyond data science: DevOps with conda" title="Direct link to Beyond data science: DevOps with conda" translate="no">​</a></h3>
<p>Conda environments aren’t just for scientific Python. The same distribution model also covers <strong>DevOps and platform engineering tools</strong>, e.g.:</p>
<ul>
<li class=""><strong>Kubernetes / Helm ecosystem:</strong> <code>k3d</code>, <code>helm</code>, <code>helm-docs</code>, <code>chart-testing</code></li>
<li class=""><strong>Infrastructure as Code:</strong> <code>terraform</code>, <code>opentofu</code>, <code>packer</code></li>
<li class=""><strong>CLI tools:</strong> <code>ripgrep</code>, <code>fd-find</code>, <code>fzf</code>, <code>bat</code>, <code>eza</code>, <code>gitui</code>, <code>lazygit</code>, <code>jq</code>, <code>yq</code>, <code>just</code>, <code>htop</code></li>
</ul>
<p>This means teams can manage <strong>application runtimes and infrastructure tooling with the same solver and reproducibility guarantees</strong>. Infrastructure updates follow the same iterative, tested workflow you'd use for application dependencies.</p>
<p>Automated PRs propose terraform updates, CI validates them thoroughly, and you learn incrementally which tool versions are stable. Instead of scattering scripts across system package managers or ad-hoc binaries, everything can be versioned and locked with conda, making DevOps workflows reproducible, portable, and CI-friendly.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="condas-unique-position-revisited">Conda's unique position, revisited<a href="https://conda.org/blog/conda-practical-power#condas-unique-position-revisited" class="hash-link" aria-label="Direct link to Conda's unique position, revisited" title="Direct link to Conda's unique position, revisited" translate="no">​</a></h2>
<p>To summarize the series:</p>
<ul>
<li class=""><strong><a class="" href="https://conda.org/blog/conda-is-not-pypi">Part 1</a>:</strong> Conda ≠ PyPI: it's not a library registry, but a user-space distribution.</li>
<li class=""><strong><a class="" href="https://conda.org/blog/conda-pip-docker-nix">Part 2</a>:</strong> Conda's middle path: more powerful than pip/npm, lighter than Docker/Nix, and uniquely portable thanks to the libc boundary.</li>
<li class=""><strong>Part 3:</strong> Practical power: reproducibility, automation, rolling distribution, and layered workflows that enable safe, iterative evolution over time.</li>
</ul>
<p><strong>The conda ecosystem</strong> is <strong>versatile, reproducible, and cross-platform</strong>. It actively evolves through community-driven innovation: newer tools like pixi experiment with new approaches, successful ideas are formalized via CEPs, and innovations flow back into core infrastructure. Migration infrastructure continuously rebuilds the entire ecosystem as core libraries evolve, maintaining stability while staying current. The ecosystem includes:</p>
<ul>
<li class="">Multiple tools (<a href="https://docs.conda.io/projects/conda/en/stable/" target="_blank" rel="noopener noreferrer" class="">conda</a>, <a href="https://mamba.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">mamba</a>, <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a>) supporting interoperable workflows</li>
<li class="">Standardized lockfile formats being actively defined across tools via CEPs</li>
<li class="">Innovation flowing from newer tools back into core infrastructure</li>
<li class="">Linux, macOS, Windows support</li>
<li class="">CPU and GPU stacks</li>
<li class="">Multi-language environments</li>
<li class="">All without root permissions</li>
</ul>
<p>No other packaging system combines this breadth with this ecosystem maturity and innovation velocity.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-takeaway">Final takeaway<a href="https://conda.org/blog/conda-practical-power#final-takeaway" class="hash-link" aria-label="Direct link to Final takeaway" title="Direct link to Final takeaway" translate="no">​</a></h2>
<p><strong>The conda ecosystem</strong> is not just a package manager. It is a <strong>user-space distribution</strong> with rich metadata, a powerful solver, and a vibrant, evolving community.</p>
<p>By combining reproducibility, automation, rolling distribution infrastructure, and layering, the conda ecosystem (with tools like <a href="https://docs.conda.io/projects/conda/en/stable/" target="_blank" rel="noopener noreferrer" class="">conda</a>, <a href="https://mamba.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">mamba</a>, and <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a>) empowers individuals and teams to build, share, and maintain reliable software environments.</p>
<p>Through lockfiles and automated testing, you can evolve your dependencies safely. Small steps, validated by Continuous Integration, accumulate into resilient systems. The continuous migration and rebuilding of core libraries means your environments stay current without major version jumps. This frees teams to focus on what matters: building great software, not managing dependency logistics.</p>
<p><strong>The conda ecosystem isn't pip. It isn't Docker. It's something better</strong>: a rolling distribution system designed for long-term stability through constant, tested change. Where traditional distros force you to choose between staying current or staying stable, conda gives you both: continuous evolution with coherence. It's how modern teams manage complexity across languages, platforms, and time.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://conda.org/blog/conda-practical-power#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<p>This series dives deep into conda's concepts and architecture for readers familiar with packaging. For an introduction to the conda ecosystem, including the tools, channels, governance, and how to get started, see <a href="https://conda.org/blog/2024-08-14-conda-ecosystem-explained/" target="_blank" rel="noopener noreferrer" class="">Conda Ecosystem Explained</a>. It provides ecosystem context that complements the practices and patterns explored in this series.</p>]]></content:encoded>
            <category>conda</category>
            <category>reproducibility</category>
            <category>automation</category>
            <category>distribution</category>
        </item>
        <item>
            <title><![CDATA[Conda in the Packaging Spectrum: From pip to Docker to Nix]]></title>
            <link>https://conda.org/blog/conda-pip-docker-nix</link>
            <guid>https://conda.org/blog/conda-pip-docker-nix</guid>
            <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Part 2 of the 'Conda Is Not PyPI' series, placing conda among pip, Docker, and Nix and explaining its middle-path design.]]></description>
            <content:encoded><![CDATA[<p><em>This is Part 2 of our series "Conda Is Not PyPI: Understanding Conda as a User-Space Distribution".</em></p>
<p>In <a href="https://conda.org/blog/conda-is-not-pypi/" target="_blank" rel="noopener noreferrer" class="">Part 1</a>, we explained why conda is not just another Python package manager. Conda packages are <strong>distribution units</strong>, not libraries. Environments are essentially <strong>mini distributions in user-space</strong>.</p>
<hr>
<blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="if-conda-is-a-distribution-where-does-it-fit-alongside-other-packaging-systems-like-pip-docker-and-nix">“If conda is a distribution, where does it fit alongside other packaging systems like pip, Docker, and Nix?”<a href="https://conda.org/blog/conda-pip-docker-nix#if-conda-is-a-distribution-where-does-it-fit-alongside-other-packaging-systems-like-pip-docker-and-nix" class="hash-link" aria-label="Direct link to “If conda is a distribution, where does it fit alongside other packaging systems like pip, Docker, and Nix?”" title="Direct link to “If conda is a distribution, where does it fit alongside other packaging systems like pip, Docker, and Nix?”" translate="no">​</a></h3>
</blockquote>
<p>This article places conda on the packaging spectrum, explains the concept of a <strong>distribution</strong>, and shows how conda’s design strikes a unique balance between flexibility, reproducibility, and accessibility.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-makes-something-a-distribution">What makes something a “distribution”?<a href="https://conda.org/blog/conda-pip-docker-nix#what-makes-something-a-distribution" class="hash-link" aria-label="Direct link to What makes something a “distribution”?" title="Direct link to What makes something a “distribution”?" translate="no">​</a></h2>
<p>A <strong>distribution</strong> is more than a registry of libraries. It is a curated, versioned, and consistent <strong>collection of software packages</strong> designed to work together. A true distribution provides:</p>
<ol>
<li class=""><strong>Completeness at build and runtime.</strong> Not just libraries, but compilers, headers, linkers, and runtime dependencies.</li>
<li class=""><strong>Policy and provenance.</strong> Standardized build flags, ABI compatibility guarantees, and source traceability.</li>
<li class=""><strong>A structured package format.</strong> Metadata that allows a solver to resolve complex dependencies.</li>
<li class=""><strong>Repackaging.</strong> Sources from many upstreams (PyPI, npm, GNU Savannah, GitHub, SourceForge, etc.) are rebuilt and normalized into the distro’s format.</li>
</ol>
<p>This is what Debian, Fedora, and other OS distributions do and it’s also what conda does in user-space.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-libc-boundary">The <code>libc</code> boundary<a href="https://conda.org/blog/conda-pip-docker-nix#the-libc-boundary" class="hash-link" aria-label="Direct link to the-libc-boundary" title="Direct link to the-libc-boundary" translate="no">​</a></h2>
<p>Here's a critical difference in how these systems treat the platform C runtime:</p>
<ul>
<li class="">
<p><strong>Conda</strong>, depending on the operating system:</p>
<ul>
<li class="">
<p><strong>Linux:</strong> Ships nearly the entire user‑space stack (interpreters, libraries, toolchains) but intentionally reuses the host's <code>glibc</code> for forward compatibility.</p>
</li>
<li class="">
<p><strong>Windows:</strong> Packages the MSVC runtime (<code>vs2015_runtime</code>, etc.).</p>
</li>
<li class="">
<p><strong>macOS:</strong> Relies on system <code>libSystem</code> and frameworks.</p>
</li>
</ul>
</li>
<li class="">
<p><strong>Containers (Docker/Podman):</strong> Typical base images bundle a userspace (including <code>glibc</code> or <code>musl</code>). Minimal images can start from <code>scratch</code>, but most workflows inherit a <code>libc</code> from the base layer.</p>
</li>
<li class="">
<p><strong>Nix:</strong> Provides its own <code>glibc</code> in the Linux <code>/nix/store</code>; on macOS it integrates with the platform <code>libc</code> while still isolating other dependencies.</p>
</li>
<li class="">
<p><strong>pip/npm:</strong> Distribute language-scoped artifacts only; assume system toolchains and the C runtime are already present.</p>
</li>
</ul>
<p><strong>Conda packages'</strong> approach keeps environments lighter while ensuring compatibility via conservative build baselines and virtual packages that encode host facts.</p>
<p>To ensure portability, conda packages are built against the <strong>oldest supported <code>libc</code>/OS runtime baselines</strong>, making them forward compatible across a wide range of newer systems.</p>
<p>Other user-space package managers, like <a href="https://spack.io/" target="_blank" rel="noopener noreferrer" class="">spack</a> and <a href="https://brew.sh/" target="_blank" rel="noopener noreferrer" class="">homebrew</a>, also make their own decisions on packaging <code>glibc</code> depending on the platform, etc. And thus incur similar tradeoffs with respect to environment sizes.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Definition</div><div class="admonitionContent_BuS1"><p><strong>Forward compatibility</strong> means software built against an older version of a library (like <code>glibc 2.17</code>) will continue to work on systems with newer versions (like <code>glibc 2.35</code>). This is the opposite of backward compatibility. By building conda packages against the oldest supported <code>glibc</code>, they remain portable across a wide range of modern Linux distributions without recompilation.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Why does the <code>libc</code> boundary matter?</div><div class="admonitionContent_BuS1"><p>The C runtime library (<code>glibc</code> on Linux, <code>libSystem</code> on macOS, MSVC runtime on Windows) is the bridge between user-space software and the OS kernel. How a packaging system handles it determines portability, size, and host integration.</p></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-techniques-with-nix-prefix-relocatability-and-patching">Shared techniques with Nix: prefix-relocatability and patching<a href="https://conda.org/blog/conda-pip-docker-nix#shared-techniques-with-nix-prefix-relocatability-and-patching" class="hash-link" aria-label="Direct link to Shared techniques with Nix: prefix-relocatability and patching" title="Direct link to Shared techniques with Nix: prefix-relocatability and patching" translate="no">​</a></h3>
<p>Both <strong>conda packages</strong> and <strong>Nix</strong> instrument builds so binaries are <strong>prefix-aware</strong> and (in different ways) relocated:</p>
<ul>
<li class=""><strong><a href="https://en.wikipedia.org/wiki/Rpath" target="_blank" rel="noopener noreferrer" class="">RPATH</a>/<a href="https://en.wikipedia.org/wiki/Rpath" target="_blank" rel="noopener noreferrer" class="">RUNPATH</a> patching</strong> so <a href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format" target="_blank" rel="noopener noreferrer" class="">ELF</a> binaries load from <code>$PREFIX/lib</code></li>
<li class=""><strong><a href="https://en.wikipedia.org/wiki/Shebang_(Unix)" target="_blank" rel="noopener noreferrer" class="">Shebang</a> rewriting</strong> so scripts execute with the environment's interpreters</li>
<li class=""><strong><a href="https://en.wikipedia.org/wiki/Mach-O" target="_blank" rel="noopener noreferrer" class="">Mach-O</a> (macOS) fix-ups</strong> (<code>install_name_tool</code>) for <code>LC_LOAD_DYLIB</code>/<code>LC_ID_DYLIB</code></li>
<li class=""><strong><a href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format" target="_blank" rel="noopener noreferrer" class="">ELF</a> surgery via <a href="https://github.com/NixOS/patchelf" target="_blank" rel="noopener noreferrer" class=""><code>patchelf</code></a></strong>, which originated in the Nix ecosystem and is widely used by <code>conda-build</code> and <code>rattler-build</code>.</li>
</ul>
<p>The result is the same idea in both worlds: build products that <strong>bind to their own prefix</strong>. In Nix, binaries are patched once to live under fixed, hash-addressed store paths like <code>/nix/store/...</code> (typically hashes of the derivation inputs and locked dependency graph, with pure content hashes used mainly for fetched sources) and are not meant to be moved afterwards, since changing the prefix effectively creates a new package identity and bypasses existing binary caches. In conda, binaries are typically built with a placeholder and relocated dynamically at install time into the environment prefix, so relocatable prefixes are a design objective there.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-not-shipping-glibc-keeps-environments-small-and-portable">Why not shipping <code>glibc</code> keeps environments small (and portable)<a href="https://conda.org/blog/conda-pip-docker-nix#why-not-shipping-glibc-keeps-environments-small-and-portable" class="hash-link" aria-label="Direct link to why-not-shipping-glibc-keeps-environments-small-and-portable" title="Direct link to why-not-shipping-glibc-keeps-environments-small-and-portable" translate="no">​</a></h3>
<p><strong>Conda's design philosophy of not shipping <code>glibc</code></strong> (or the OS C runtime on Linux) has big consequences:</p>
<ol>
<li class="">
<p><strong>No base OS duplication.</strong> Containers and Nix closures ship <code>libc</code>, <code>ld-linux</code>, locales/NSS, and friends. That's tens to hundreds of megabytes before your app starts. <strong>Conda packages</strong> reuse the host <code>libc</code>, so that layer is never duplicated inside conda environments.</p>
</li>
<li class="">
<p><strong>Fewer cascading dependencies.</strong> Pulling in <code>glibc</code> drags a constellation of tightly-coupled runtime pieces (dynamic loader, NSS, timezone/locale data). Leaving that to the host avoids pulling those into the conda user-space layer at all.</p>
</li>
<li class="">
<p><strong>Security &amp; updates.</strong> Host OS updates to <code>glibc</code> apply automatically across conda environments.</p>
<p><strong>The conda package managers</strong> (<a href="https://docs.conda.io/projects/conda/en/stable/" target="_blank" rel="noopener noreferrer" class="">conda</a>, <a href="https://mamba.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">mamba</a>, <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a>) enforce compatibility using <strong>virtual packages</strong> (e.g., <code>__glibc&gt;=2.17</code>) and by <strong>building against the oldest supported <code>glibc</code></strong> for forward compatibility.</p>
</li>
<li class="">
<p><strong>Still safe and predictable.</strong> The solver includes the host fact (<code>__glibc</code>, <code>__osx</code>, <code>__win</code>) so you cannot accidentally solve to an incompatible set.</p>
</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Net effect</div><div class="admonitionContent_BuS1"><p>Environments that are typically <strong>hundreds of megabytes smaller</strong> than container images with equivalent stacks, and far faster to create, copy, and cache, without giving up ABI coherence.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conda-vs-pip-docker-and-nix">Conda vs. Pip, Docker, and Nix<a href="https://conda.org/blog/conda-pip-docker-nix#conda-vs-pip-docker-and-nix" class="hash-link" aria-label="Direct link to Conda vs. Pip, Docker, and Nix" title="Direct link to Conda vs. Pip, Docker, and Nix" translate="no">​</a></h2>
<p>Let’s place them side by side:</p>
<table><thead><tr><th>Aspect</th><th>pip/npm</th><th>Conda</th><th>Docker</th><th>Nix</th></tr></thead><tbody><tr><td><strong>Scope</strong></td><td>Language-specific libraries</td><td>Multi-language user-space distribution</td><td>Full OS filesystem image</td><td>Whole-system deterministic distribution</td></tr><tr><td><strong>Unit of publication</strong></td><td>Wheel/sdist (library)</td><td>Distribution package (build + run metadata)</td><td>Layered image</td><td>Derivation output (hashed closure)</td></tr><tr><td><strong>Binary compatibility</strong></td><td>Assumes host system dependencies</td><td>Ships user-space dependencies (except libc on Linux)</td><td>Bundles its own libc/base userspace</td><td>Ships its own <code>glibc</code> (Linux) + all dependencies (macOS uses system <code>libc</code>)</td></tr><tr><td><strong>Solver</strong></td><td>Python dependency resolver (backtracking)</td><td>Cross-language SAT-based solver (resolvo/libmamba/libsolv)</td><td>No dependency solver (layer composition)</td><td>Deterministic functional evaluation (derivation closure)</td></tr><tr><td><strong>Provenance</strong></td><td>sdist + wheel metadata</td><td>Recipe, config, rendered metadata (<code>info/</code>)</td><td><code>Dockerfile</code> + image history</td><td>Declarative recipes (derivations)</td></tr><tr><td><strong>Install permissions</strong></td><td>User-level (may need system headers)</td><td>User-level (shared package cache)</td><td>Root or rootless modes</td><td>Single-user or multi-user</td></tr><tr><td><strong>Forward compatibility</strong></td><td>Not guaranteed</td><td>Built against oldest supported libc baseline</td><td>Depends on base image refresh cadence</td><td>Immutable reproducible closure (no forward compatibility promise)</td></tr></tbody></table>
<p><strong>The conda ecosystem's</strong> scope is not limited to scientific computing. Channels also package <strong>systems and DevOps tooling</strong> (e.g. <code>ripgrep</code>, <code>terraform</code>, <code>helm</code>) alongside Python/R/C++ stacks, as we'll explore in Part 3. This breadth is part of what makes conda a true multi-language distribution.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>One subtle but important distinction</div><div class="admonitionContent_BuS1"><p>Each conda package archive contains an <code>info/</code> directory with rich metadata (index metadata, rendered recipe, build inputs, hashes). That embedded provenance exceeds what a wheel or an image layer stores inline. We’ll explore how tooling leverages this in Part 3.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="condas-middle-path">Conda’s “middle path”<a href="https://conda.org/blog/conda-pip-docker-nix#condas-middle-path" class="hash-link" aria-label="Direct link to Conda’s “middle path”" title="Direct link to Conda’s “middle path”" translate="no">​</a></h2>
<p><strong>The conda ecosystem</strong> occupies a <strong>sweet spot</strong> in the packaging spectrum:</p>
<ul>
<li class="">Compared to <strong>pip/npm</strong>: <strong>conda packages</strong> handle <strong>native dependencies</strong> (BLAS, CUDA, compilers, system libs) and multi-language stacks. Pip/npm cannot.</li>
<li class="">Compared to <strong>Docker</strong>: <strong>conda environments</strong> are <strong>lighter, faster to create, and usable without root privileges</strong>, while still providing consistency. You can still put a conda environment inside a Docker container when you need isolation.</li>
<li class="">Compared to <strong>Nix</strong>: <strong>the conda ecosystem</strong> is <strong>more approachable and cross-platform</strong>. Nix provides stronger whole-system reproducibility, but the typical multi-user setup involves an initial system-level installation step (e.g. creating <code>/nix</code> and configuring the store/daemon) and comes with a steeper learning curve. Conda works out of the box on Linux, macOS, and Windows entirely in user space.</li>
</ul>
<p><strong>The conda ecosystem</strong> is thus best seen as a <strong>user-space distribution that balances power and accessibility</strong>. This balance is exemplified by its approach to portability through <strong>virtual packages</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="portability-via-virtual-packages">Portability via virtual packages<a href="https://conda.org/blog/conda-pip-docker-nix#portability-via-virtual-packages" class="hash-link" aria-label="Direct link to Portability via virtual packages" title="Direct link to Portability via virtual packages" translate="no">​</a></h2>
<p><strong>The conda package managers</strong> (<a href="https://docs.conda.io/projects/conda/en/stable/" target="_blank" rel="noopener noreferrer" class="">conda</a>, <a href="https://mamba.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">mamba</a>, <a href="https://pixi.sh/" target="_blank" rel="noopener noreferrer" class="">pixi</a>) also have a unique mechanism: <strong>virtual packages</strong>. These reflect facts about your host machine and influence the solve.</p>
<ul>
<li class=""><code>__glibc</code> → <code>glibc</code> version (Linux)</li>
<li class=""><code>__osx</code> / <code>__win</code> → macOS or Windows versions</li>
<li class=""><code>__cuda</code> → <a href="https://en.wikipedia.org/wiki/CUDA" target="_blank" rel="noopener noreferrer" class="">CUDA</a> GPU driver version</li>
<li class=""><code>__archspec</code> → <a href="https://en.wikipedia.org/wiki/Microarchitecture" target="_blank" rel="noopener noreferrer" class="">CPU microarchitecture</a> details for optimization</li>
<li class=""><code>__linux</code> / <code>__unix</code> → platform family indicators</li>
</ul>
<p>These aren’t installed files, they’re <strong>ephemeral host facts injected into the solver</strong>. They constrain solutions for compatibility while keeping prefixes relocatable across machines that share the same baseline characteristics.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="takeaway">Takeaway<a href="https://conda.org/blog/conda-pip-docker-nix#takeaway" class="hash-link" aria-label="Direct link to Takeaway" title="Direct link to Takeaway" translate="no">​</a></h2>
<p><strong>The conda ecosystem</strong> sits in the <strong>middle of the packaging spectrum</strong>, not a language registry like PyPI/npm, not a container runtime like Docker, and not a full system package manager like Nix, but something uniquely useful in between.</p>
<p>Here's why:</p>
<ul>
<li class=""><strong>Lighter</strong> than Docker and Nix</li>
<li class=""><strong>More powerful</strong> than pip/npm</li>
<li class=""><strong>Portable and forward compatible</strong> thanks to careful build policies and the libc boundary</li>
</ul>
<p>That's why conda feels like a distribution, because it is one, in user-space.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="up-next-part-3--practical-power-reproducibility-automation-and-layering">Up Next: <em>Part 3 — Practical Power: Reproducibility, Automation, and Layering</em><a href="https://conda.org/blog/conda-pip-docker-nix#up-next-part-3--practical-power-reproducibility-automation-and-layering" class="hash-link" aria-label="Direct link to up-next-part-3--practical-power-reproducibility-automation-and-layering" title="Direct link to up-next-part-3--practical-power-reproducibility-automation-and-layering" translate="no">​</a></h3>
<p>In the <a href="https://conda.org/blog/conda-practical-power/" target="_blank" rel="noopener noreferrer" class="">final article</a>, we'll dive into how conda's model translates into <strong>real-world advantages</strong>: reproducibility, provenance, automation with lockfiles and automated updates with <a href="https://github.com/renovatebot/renovate" target="_blank" rel="noopener noreferrer" class="">Renovate</a>, and the layered workflow of combining conda with pip/npm.</p>]]></content:encoded>
            <category>conda</category>
            <category>packaging</category>
            <category>distribution</category>
            <category>comparison</category>
        </item>
        <item>
            <title><![CDATA[Conda ≠ PyPI: Why Conda Is More Than a Package Manager]]></title>
            <link>https://conda.org/blog/conda-is-not-pypi</link>
            <guid>https://conda.org/blog/conda-is-not-pypi</guid>
            <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Part 1 of the 'Conda Is Not PyPI' series—why conda is a multi-language user-space distribution, not just a Python package manager.]]></description>
            <content:encoded><![CDATA[<p><em>Part 1 of our series "Conda Is Not PyPI: Understanding Conda as a User-Space Distribution".</em></p>
<p>This is the first article in a three-part series exploring the fundamental differences between conda and PyPI, and why understanding these differences matters for your development workflow. Conda is not just another Python package manager—it's a multi-language, user-space distribution system. In this series, we'll unpack what that means, explore where conda fits in the broader packaging landscape (alongside pip, Docker, and Nix), and show you how to think about conda's role in your toolchain.</p>
<p><strong>Part 1</strong> (this article) clarifies why conda is a distribution, not a package registry, and what that distinction means in practice.</p>
<hr>
<p>When people first encounter conda, the most common misconception is:</p>
<blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="isnt-conda-just-another-python-package-manager-like-pip">“Isn’t conda just another Python package manager, like pip?”<a href="https://conda.org/blog/conda-is-not-pypi#isnt-conda-just-another-python-package-manager-like-pip" class="hash-link" aria-label="Direct link to “Isn’t conda just another Python package manager, like pip?”" title="Direct link to “Isn’t conda just another Python package manager, like pip?”" translate="no">​</a></h3>
</blockquote>
<p>The short answer: <strong>no</strong>.</p>
<p>The differences start with the package collections that these tools draw from. PyPI (and npm, RubyGems, Cargo, etc.) are <strong>language-specific library registries</strong>.</p>
<p>The conda package ecosystem (installable with tools like conda, mamba, micromamba, or pixi), on the other hand, functions as a <strong>multi-language, user-space distribution</strong> that can assemble coherent runtime and build environments across programming languages, system libraries, compilers, and tools.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Definition</div><div class="admonitionContent_BuS1"><p>A <strong>user-space distribution</strong> is a curated, relocatable filesystem prefix containing interpreters, libraries, headers, data, and tooling that runs entirely without needing privileged installation into system directories. It complements—rather than replaces—the host kernel and core C library.</p></div></div>
<p>This first article sets the stage by exploring the difference between <strong>library registries</strong> and <strong>distributions</strong>.</p>
<p>To use an analogy: <strong>pip is like a car stereo</strong>—it requires a system to plug into—whereas <strong>conda is like the whole car</strong>, a complete, self-contained system.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-a-language-scoped-package-registry">What is a language-scoped package registry?<a href="https://conda.org/blog/conda-is-not-pypi#what-is-a-language-scoped-package-registry" class="hash-link" aria-label="Direct link to What is a language-scoped package registry?" title="Direct link to What is a language-scoped package registry?" translate="no">​</a></h2>
<p>A <strong>language-scoped package registry</strong> is a centralized catalog of packages for a single language ecosystem. Examples include:</p>
<ul>
<li class=""><strong>PyPI</strong> (Python Package Index): source distributions (<code>sdist</code>) and binary wheels (<code>.whl</code>) for Python packages.</li>
<li class=""><strong>npm</strong>: registry of JavaScript/Node.js packages.</li>
<li class=""><strong>RubyGems</strong>, <strong>CPAN</strong>, <strong>Cargo</strong>, and others.</li>
</ul>
<p>These registries share common traits:</p>
<ul>
<li class="">They distribute <strong>language-scoped packages</strong> (source dists and wheels). Wheels can bundle compiled extensions and some native libraries, but they don’t attempt to model an entire multi-language runtime or toolchain.</li>
<li class="">They rely on the <strong>host system</strong> to provide compilers, headers, and native dependencies.</li>
<li class="">Their metadata is scoped to one language (e.g., <code>install_requires</code> in Python).</li>
<li class="">They don’t aim to describe a full build environment.</li>
</ul>
<p>This works well for pure libraries. Installing a package like <code>requests</code> from PyPI via pip is trivial, as it has no system-level dependencies.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>A note on wheels</div><div class="admonitionContent_BuS1"><p>Wheels (<code>.whl</code>) can bundle compiled extensions and some native libraries, but remain Python‑scoped: they don’t model a full multi‑language runtime, compilers, or cross‑language/system dependency metadata.</p><p>Community work (e.g. <a href="https://wheelnext.dev/" target="_blank" rel="noopener noreferrer" class="">WheelNext</a>) is adding capabilities (better hardware/microarchitecture tags, symlink support, richer native metadata)—complementary to, not a replacement for, the broader environment modeling of conda packages.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-conda">What is conda?<a href="https://conda.org/blog/conda-is-not-pypi#what-is-conda" class="hash-link" aria-label="Direct link to What is conda?" title="Direct link to What is conda?" translate="no">​</a></h2>
<p>Conda is fundamentally different. It is better understood as a <strong>user-space distribution</strong>, not just a package manager:</p>
<ul>
<li class="">
<p><strong>Multi-language scope.</strong> Conda packages include Python, R, C, C++, Fortran libraries, GPU runtimes, CLI tools, and even compilers.</p>
</li>
<li class="">
<p><strong>Prefix replacement.</strong> Binaries and shared libraries inside a conda environment resolve against the environment’s prefix (<code>$PREFIX/...</code>), not <code>/usr/...</code> from the host.</p>
<p>This is achieved through relocation (e.g. <code>rpath</code> / <code>runpath</code> settings, patched shebangs, and text/binary rewriting performed during build).</p>
</li>
<li class="">
<p><strong>Solver-driven consistency.</strong> Conda package managers use SAT-based dependency solvers (e.g. <code>libmamba</code>, <code>rattler</code>) to ensure all dependencies—across languages, <strong>ABIs</strong> (<a href="https://en.wikipedia.org/wiki/Application_binary_interface" target="_blank" rel="noopener noreferrer" class="">Application Binary Interface</a>), and platforms—work together coherently (see also <a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem" target="_blank" rel="noopener noreferrer" class="">Boolean satisfiability</a>).</p>
</li>
<li class="">
<p><strong>Build + runtime.</strong> Recipes declare build/host/run phases so resulting packages accurately encode runtime and (when relevant) linked toolchain requirements.</p>
</li>
<li class="">
<p><strong>Portability.</strong> By convention, Conda packages are built against the <strong>oldest supported <code>glibc</code></strong> (<a href="https://www.gnu.org/software/libc/" target="_blank" rel="noopener noreferrer" class="">GNU C Library</a>) or corresponding macOS/Windows baselines so they remain <strong>forward compatible</strong> with newer OS versions.</p>
</li>
</ul>
<p>Put simply: conda packages model <strong>distribution units</strong> (self-contained, relocatable bundles of binaries, libraries, headers, data, and metadata), not just language-scoped libraries.</p>
<p>It is more like a system package manager, such as apt, yum, or dnf, except that you don't need root to administer or run conda packages, and many different package configurations can be used simultaneously in different environments.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-just-binaries-fhs-like-user-space-inside-environments">Not just binaries: FHS-like user space inside environments<a href="https://conda.org/blog/conda-is-not-pypi#not-just-binaries-fhs-like-user-space-inside-environments" class="hash-link" aria-label="Direct link to Not just binaries: FHS-like user space inside environments" title="Direct link to Not just binaries: FHS-like user space inside environments" translate="no">​</a></h3>
<p>Conda environments aren’t only <code>bin/</code> and <code>lib/</code>. Because the prefix behaves like a chroot-style, <a href="https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard" target="_blank" rel="noopener noreferrer" class="">FHS</a>-inspired root (subset only; no <code>/dev</code>, <code>/proc</code>, etc.), packages can also install:</p>
<ul>
<li class=""><code>bin/</code> → Executable entry points (interpreters, CLIs, entry-point shims)</li>
<li class=""><code>conda-meta/</code> → Per‑package JSON records (exact provenance + reproducibility)</li>
<li class=""><code>etc/bash_completion.d...</code> &amp; <code>share/zsh/site-functions/...</code> → <strong>shell completions</strong></li>
<li class=""><code>fonts/...</code> → <strong>fonts</strong> (useful for plotting, LaTeX, GUI stacks)</li>
<li class=""><code>include/</code> → headers for <strong>C/C++/Fortran</strong> development</li>
<li class=""><code>lib/</code> → Shared libraries, Python stdlib + <code>site-packages/</code>, compiled extensions, BLAS (<a href="https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms" target="_blank" rel="noopener noreferrer" class="">Basic Linear Algebra Subprograms</a>), compression, crypto, etc.</li>
<li class=""><code>lib/pkgconfig/*.pc</code> → <strong>pkg-config</strong> metadata (<a href="https://en.wikipedia.org/wiki/Pkg-config" target="_blank" rel="noopener noreferrer" class="">pkg-config</a>)</li>
<li class=""><code>share/</code> → Arch‑independent data: licenses, terminfo, locales, Jupyter kernelspecs</li>
<li class=""><code>share/man/...</code> → <strong>manpages</strong> for CLI tools</li>
<li class=""><code>ssl/</code> → (Sometimes) CA cert bundle + OpenSSL config</li>
<li class=""><code>sbin/</code> → Ancillary / admin-style utilities (often sparse)</li>
</ul>
<p>This is what “user-space distro” means in practice: <strong>complete developer and runtime assets live inside the environment</strong>, not scattered across <code>/usr</code>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-core-distinction-libraries-vs-distributions">The core distinction: libraries vs. distributions<a href="https://conda.org/blog/conda-is-not-pypi#the-core-distinction-libraries-vs-distributions" class="hash-link" aria-label="Direct link to The core distinction: libraries vs. distributions" title="Direct link to The core distinction: libraries vs. distributions" translate="no">​</a></h2>
<p>Think of it this way:</p>
<ul>
<li class="">A <strong>library registry</strong> (like PyPI/npm) is about sharing <strong>code libraries</strong> within one programming language.</li>
<li class="">A <strong>distribution</strong> (like Debian, Fedora, or conda) is about building <strong>coherent systems of software</strong> that interoperate reliably.</li>
</ul>
<p>Conda environments are essentially <strong>miniature user-space distros</strong>, tailored to your workload. They carry everything needed for reproducible builds and executions—except for the platform’s core C library layer:</p>
<ul>
<li class="">On Linux, purposefully relies on the host’s <code>glibc</code> baseline for forward compatibility while shipping most other critical runtime components (<code>libstdc++</code>, compression libs, math libs, etc.).</li>
<li class="">On Windows, the MSVC runtime is provided as conda packages (e.g. <code>vs2015_runtime</code>).</li>
<li class="">On macOS, system frameworks and the platform libc are used.</li>
</ul>
<p>This approach predates and inspired Python's manylinux wheel strategy. In fact, the <a href="https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/#manylinux" target="_blank" rel="noopener noreferrer" class="">manylinux policy</a> was <a href="https://peps.python.org/pep-0513/#id16" target="_blank" rel="noopener noreferrer" class="">based on practices pioneered by conda through Enthought Canopy and Anaconda</a>—both build against a conservative baseline so binaries function on newer systems.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-forward-compatibility-matters">Why forward compatibility matters<a href="https://conda.org/blog/conda-is-not-pypi#why-forward-compatibility-matters" class="hash-link" aria-label="Direct link to Why forward compatibility matters" title="Direct link to Why forward compatibility matters" translate="no">​</a></h2>
<p>One of conda’s design principles is <strong>building for the future</strong>:</p>
<ul>
<li class="">Packages are compiled against the <strong>oldest still-supported <code>glibc</code> (or macOS / Windows runtime versions)</strong>.</li>
<li class="">This ensures that binaries remain forward compatible with newer OS versions.</li>
<li class="">For example: a package built against <code>glibc 2.17</code> (from CentOS 7) will run on modern Linux distributions with newer glibc versions.</li>
</ul>
<p>This forward-compatibility strategy is why conda environments are portable across diverse systems (within the same CPU architecture and compatible driver/toolchain constraints), from HPC clusters to modern laptops.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-confusion-persists">Why the confusion persists<a href="https://conda.org/blog/conda-is-not-pypi#why-the-confusion-persists" class="hash-link" aria-label="Direct link to Why the confusion persists" title="Direct link to Why the confusion persists" translate="no">​</a></h2>
<p>Conda is popular in the <strong>Python ecosystem</strong>, so many users encounter it as “that thing for installing numpy faster than pip.” But that framing hides its true nature:</p>
<ul>
<li class=""><strong>pip</strong> (the Python package installer, defaulting to the PyPI index) installs <strong>Python packages (sdists or wheels)</strong>.</li>
<li class=""><strong>Conda</strong> installs <strong>multi-language distro packages</strong>—some of which happen to be Python libraries.</li>
</ul>
<p>The distinction matters: compilers, BLAS, and system-level dependencies are crucial to environment consistency, even when users don't directly think about them. pip and npm hope these dependencies are already available on your system.</p>
<p>Conda ensures they're present, compatible, and consistent across your entire environment. This distinction becomes most obvious when you need explicit control—such as choosing a specific BLAS implementation or building cross-language stacks—where pip/npm simply can't help you.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="takeaway">Takeaway<a href="https://conda.org/blog/conda-is-not-pypi#takeaway" class="hash-link" aria-label="Direct link to Takeaway" title="Direct link to Takeaway" translate="no">​</a></h2>
<p>The conda ecosystem (its package collections, formats, and installer tools) is fundamentally <strong>not PyPI</strong>, and it's not trying to be.</p>
<p>Where PyPI and npm are focused on <strong>sharing libraries within a single language</strong>, conda is about <strong>assembling complete, reproducible user-space distributions</strong> across languages, compilers, and platforms using a SAT-based dependency solver.</p>
<p>That’s why conda environments can run complex stacks like <code>numpy + scipy + ffmpeg + graphviz + CUDA</code>, all solved together, without relying on your system administrator or distro package manager.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="up-next-part-2--conda-in-the-packaging-spectrum-from-pip-to-docker-to-nix">Up Next: <em>Part 2 — Conda in the Packaging Spectrum: From Pip to Docker to Nix</em><a href="https://conda.org/blog/conda-is-not-pypi#up-next-part-2--conda-in-the-packaging-spectrum-from-pip-to-docker-to-nix" class="hash-link" aria-label="Direct link to up-next-part-2--conda-in-the-packaging-spectrum-from-pip-to-docker-to-nix" title="Direct link to up-next-part-2--conda-in-the-packaging-spectrum-from-pip-to-docker-to-nix" translate="no">​</a></h3>
<p>In the <a href="https://conda.org/blog/conda-pip-docker-nix" target="_blank" rel="noopener noreferrer" class="">next article</a>, we’ll explore where conda fits in the broader packaging world—how it compares to pip, Docker, and Nix, and why its unique approach makes it the “middle path” between language registries and containers.</p>]]></content:encoded>
            <category>conda</category>
            <category>packaging</category>
            <category>distribution</category>
        </item>
        <item>
            <title><![CDATA[Conda CLI Roadmap Updates: Q4, 2025]]></title>
            <link>https://conda.org/blog/conda-roadmap-q4-2025</link>
            <guid>https://conda.org/blog/conda-roadmap-q4-2025</guid>
            <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The Q4 2025 conda CLI roadmap highlights improvements coming next year, including sharded repodata support, and improving integration with PyPI.
]]></description>
            <content:encoded><![CDATA[<p><em>The Q4 2025 conda CLI roadmap highlights improvements coming soon, including sharded repodata support for faster installs, and work to improve integration with PyPI ecosystem.</em></p>
<hr>
<p>With any large open source project, dozens of pull requests and issues are always in flight, which can make it hard to see the bigger picture. Starting this quarter, we will publish regular roadmap updates to give you a clear view of what the <a href="https://github.com/conda/conda" target="_blank" rel="noopener noreferrer" class="">conda maintainers</a> team from Anaconda and Quansight, together with the broader community, is building and what you can expect.</p>
<p>The <a href="https://github.com/orgs/conda/projects/22" target="_blank" rel="noopener noreferrer" class="">Q4 2025 roadmap</a> highlights the features we are focused on delivering this quarter and early next year. These priorities came directly from community feedback across GitHub, forums, and events, and the roadmap will continue to evolve as new needs emerge.</p>
<p>Don’t see something specific on the roadmap? Let us know by <a href="https://github.com/conda/conda/issues" target="_blank" rel="noopener noreferrer" class="">opening an issue</a>, or help us out by <a href="https://github.com/conda/conda/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">submitting a contribution</a> via a pull request!</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="q4-2025-roadmap-priorities">Q4 2025 Roadmap Priorities<a href="https://conda.org/blog/conda-roadmap-q4-2025#q4-2025-roadmap-priorities" class="hash-link" aria-label="Direct link to Q4 2025 Roadmap Priorities" title="Direct link to Q4 2025 Roadmap Priorities" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="faster-performance-with-sharded-repodata-support">Faster Performance with Sharded Repodata Support<a href="https://conda.org/blog/conda-roadmap-q4-2025#faster-performance-with-sharded-repodata-support" class="hash-link" aria-label="Direct link to Faster Performance with Sharded Repodata Support" title="Direct link to Faster Performance with Sharded Repodata Support" translate="no">​</a></h3>
<p><strong>What we heard:</strong> Installing or updating packages can be slow because conda downloads a single large index of all available packages, even if you only need a small part. This affects users of <a href="https://conda-forge.org/" target="_blank" rel="noopener noreferrer" class="">conda-forge</a> even more because that package index is especially large . This leads to delays in local workflows, CI pipelines, and on slower networks.</p>
<p><strong>What we are working on:</strong> We are implementing support for <strong>sharded repodata</strong>, as proposed and accepted in <a href="https://conda.org/learn/ceps/cep-0016" target="_blank" rel="noopener noreferrer" class="">Conda Enhancement Proposal (CEP) 16</a>. Instead of fetching one massive file, conda will be able to download smaller, targeted shards of metadata. This type of repodata fetching has already been implemented in the pixi package manager, and you can view the compelling improvements they have delivered in <a href="https://prefix.dev/blog/sharded_repodata" target="_blank" rel="noopener noreferrer" class="">this blog post</a>.</p>
<p><strong>How you will benefit:</strong> Package installs and updates will complete faster, conda will feel more responsive in daily use, and automated workflows like CI will run more efficiently with reduced bandwidth costs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-integration-with-the-pypi-ecosystem">Better Integration with the PyPI Ecosystem<a href="https://conda.org/blog/conda-roadmap-q4-2025#better-integration-with-the-pypi-ecosystem" class="hash-link" aria-label="Direct link to Better Integration with the PyPI Ecosystem" title="Direct link to Better Integration with the PyPI Ecosystem" translate="no">​</a></h3>
<p><strong>What we heard:</strong> Sometimes the package you need exists only on PyPI. Many users fall back on <code>pip install</code> inside a conda environment, but this approach often leads to dependency conflicts or broken environments that can take hours to fix.</p>
<p><strong>What we are working on:</strong> We are working on better integration with the PyPI ecosystem through the <a href="https://github.com/conda-incubator/conda-pypi" target="_blank" rel="noopener noreferrer" class="">conda-pypi</a> plugin. This work focuses on providing a safer way to use conda to access and install pure Python packages distributed as wheels within conda environments, while laying the foundation for broader and more native integration in the future.</p>
<p><strong>How you will benefit:</strong> This plugin will offer a safer path than mixing pip and conda directly, reducing environment breakage and making it easier to try packages that are not yet available on conda channels.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-consistent-handling-of-dependency-definition-files-stretch-goal">More Consistent Handling of Dependency Definition Files [stretch goal]<a href="https://conda.org/blog/conda-roadmap-q4-2025#more-consistent-handling-of-dependency-definition-files-stretch-goal" class="hash-link" aria-label="Direct link to More Consistent Handling of Dependency Definition Files [stretch goal]" title="Direct link to More Consistent Handling of Dependency Definition Files [stretch goal]" translate="no">​</a></h3>
<p><strong>What we heard:</strong> Conda can create environments from files such as <code>environment.yml</code> and <code>requirements.txt</code>, but the current handling of these formats has grown inconsistent over time. For example, <code>conda create --file requirements.txt</code> and <code>conda env create -f environment.yml</code> behave differently. While both commands work, the overall experience isn’t optimized for the variety of input formats users rely on today.</p>
<p><strong>What we are working on:</strong> As a stretch goal for Q4, we plan to continue the refactor of how conda reads and processes environment definition files under a plugin-based system. This work aims to make file-based environment creation more consistent and to establish a cleaner foundation for supporting multiple input formats.</p>
<p><strong>How you will benefit:</strong> The refactor will make environment creation feel more predictable across commands and file types. For contributors, the plugin architecture will make it easier to extend conda with new environment specification formats, such as support for defining dependencies with <code>pyproject.toml</code> in the future.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-ahead">Looking Ahead<a href="https://conda.org/blog/conda-roadmap-q4-2025#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no">​</a></h2>
<p>We will continue posting roadmap updates each quarter and will expand the horizon to cover 6–12 months as our planning process matures. Our goal is to make conda development more predictable and transparent. Each update will show progress on current priorities and preview what is next, shaped by your feedback and contributions.</p>
<p>You can track progress live on the <a href="https://github.com/orgs/conda/projects/22" target="_blank" rel="noopener noreferrer" class="">GitHub roadmap board</a>, where you will find current status, upcoming milestones, and discussions on specific features.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="shape-condas-future-with-us">Shape Conda’s Future With Us<a href="https://conda.org/blog/conda-roadmap-q4-2025#shape-condas-future-with-us" class="hash-link" aria-label="Direct link to Shape Conda’s Future With Us" title="Direct link to Shape Conda’s Future With Us" translate="no">​</a></h2>
<p>Conda is a community project, and these roadmap priorities reflect your input. Here are ways to influence what comes next:</p>
<ul>
<li class=""><strong>Share your feedback:</strong> File <a href="https://github.com/conda/conda/issues" target="_blank" rel="noopener noreferrer" class="">GitHub issues</a> when conda does not work as expected or you have an idea for improvement</li>
<li class=""><strong>Join the conversation:</strong> <a href="https://conda.org/community/calendar" target="_blank" rel="noopener noreferrer" class="">Conda community calls</a> are where we discuss priorities, propose solutions, and decide what matters most</li>
<li class=""><strong>Connect with maintainers:</strong> Find us on <a href="https://conda.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">Zulip</a> and the <a href="https://conda.discourse.group/" target="_blank" rel="noopener noreferrer" class="">Discourse forum</a> to troubleshoot, suggest features, or just learn more about our thinking</li>
<li class=""><strong>Take the <a href="https://anaconda.surveymonkey.com/r/py-package-2025" target="_blank" rel="noopener noreferrer" class="">Python packaging survey</a>:</strong> Every response helps us better understand your needs</li>
<li class=""><strong><a href="https://docs.conda.io/projects/conda/en/latest/dev-guide/contributing.html" target="_blank" rel="noopener noreferrer" class="">Contribute to conda</a></strong> or even become a maintainer yourself!</li>
</ul>
<p>Thank you for choosing conda and being part of the community.❤️ Your feedback helps us build an ecosystem that fits your needs.</p>]]></content:encoded>
            <category>conda</category>
            <category>roadmap</category>
        </item>
        <item>
            <title><![CDATA[Our Discourse instance is now read-only]]></title>
            <link>https://conda.org/blog/2025-10-05-discourse-read-only</link>
            <guid>https://conda.org/blog/2025-10-05-discourse-read-only</guid>
            <pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The conda steering council has decided to archive the conda Discourse forum.
]]></description>
            <content:encoded><![CDATA[<p>The conda steering council has decided to archive the <a href="https://conda.discourse.group/" target="_blank" rel="noopener noreferrer" class="">conda Discourse forum</a>. Users should refer to our <a href="https://conda.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">Zulip chat</a> instance instead.</p>
<p>The main reasons are inactivity and the required maintenance efforts to moderate spam messages.
The forums will still be available for consultation, but no new messages will be posted. See you in Zulip!</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[September 2025 Releases]]></title>
            <link>https://conda.org/blog/2025-10-01-september-releases</link>
            <guid>https://conda.org/blog/2025-10-01-september-releases</guid>
            <pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[conda 25.9.0 and conda-build 25.9.0 have been released! 🎉
]]></description>
            <content:encoded><![CDATA[<p>The September 2025 releases included updates to conda and conda-build! 🎉 Both have been released to <code>defaults</code> and <code>conda-forge</code> channels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-2590">Changes in conda <a href="https://github.com/conda/conda/releases/tag/25.9.0" target="_blank" rel="noopener noreferrer" class="">25.9.0</a><a href="https://conda.org/blog/2025-10-01-september-releases#changes-in-conda-2590" class="hash-link" aria-label="Direct link to changes-in-conda-2590" title="Direct link to changes-in-conda-2590" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Special Announcement</div><div class="admonitionContent_BuS1"><p>Following feedback from conda users last year about the pre-configuration of the conda code base to favor channels from Anaconda Inc., we <a href="https://github.com/conda/conda/issues/14178" target="_blank" rel="noopener noreferrer" class="">finished removing</a> the hardcoding of Anaconda's channels as the default set of channels in the conda source code.</p><p>It is now up to providers of the conda distributions, such as <a href="https://github.com/conda-forge/miniforge" target="_blank" rel="noopener noreferrer" class="">miniforge</a> or Anaconda (including miniconda), to pre-configure their preferred channels, e.g. by running the necessary <code>conda config --set channels</code> command.</p></div></div>
<p>To update <code>conda</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">conda</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.9</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added two new health checks to <code>conda doctor</code>:
<ul>
<li class="">Check for ill-formed pinned file.</li>
<li class="">Check whether file locking is supported.</li>
</ul>
</li>
<li class="">Prevented renaming an environment currently listed as the <code>default_activation_env</code>.</li>
<li class="">Added a new environment specifier, <code>cep-24</code>. This is a stricter version of the <code>environment.yml</code> format that enforces <a class="" href="https://conda.org/learn/ceps/cep-0024">specific requirements</a> and can be used when creating an environment from a file, e.g., <code>conda env create --file FILE --environment-specifier cep-24</code>.</li>
<li class="">Updated environment model to support multiple platforms. This allows <code>conda export --format FORMAT</code> to support exporting multiple platforms at once.</li>
<li class="">Annotated frozen environments in <code>conda env list</code>.</li>
<li class="">Various deprecations were made.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda/releases/tag/25.9.0" target="_blank" rel="noopener noreferrer" class="">25.9.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-build-2590">Changes in conda-build <a href="https://github.com/conda/conda-build/releases/tag/25.9.0" target="_blank" rel="noopener noreferrer" class="">25.9.0</a><a href="https://conda.org/blog/2025-10-01-september-releases#changes-in-conda-build-2590" class="hash-link" aria-label="Direct link to changes-in-conda-build-2590" title="Direct link to changes-in-conda-build-2590" translate="no">​</a></h2>
<p>To update <code>conda-build</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> base conda-build</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.9</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<p>No major changes to report. We just removed some deprecated code according to our deprecation schedule and made corrections to documentation.</p>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-build/releases/tag/25.9.0" target="_blank" rel="noopener noreferrer" class="">25.9.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-️-our-community">We ❤️ Our Community<a href="https://conda.org/blog/2025-10-01-september-releases#we-%EF%B8%8F-our-community" class="hash-link" aria-label="Direct link to We ❤️ Our Community" title="Direct link to We ❤️ Our Community" translate="no">​</a></h2>
<p>Altogether, we had 7 new contributors this release cycle; thank you to all of our open source community members for helping make these improvements possible.</p>
<ul>
<li class=""><a href="https://github.com/zeyugao" target="_blank" rel="noopener noreferrer" class="">@zeyugao</a> made their first contribution in <a href="https://github.com/conda/conda/pull/14660" target="_blank" rel="noopener noreferrer" class="">conda#14660</a></li>
<li class=""><a href="https://github.com/jcazevedo" target="_blank" rel="noopener noreferrer" class="">@jcazevedo</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15140" target="_blank" rel="noopener noreferrer" class="">conda#15140</a></li>
<li class=""><a href="https://github.com/nblair" target="_blank" rel="noopener noreferrer" class="">@nblair</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15037" target="_blank" rel="noopener noreferrer" class="">conda#15037</a></li>
<li class=""><a href="https://github.com/lrandersson" target="_blank" rel="noopener noreferrer" class="">@lrandersson</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15249" target="_blank" rel="noopener noreferrer" class="">conda#15249</a></li>
<li class=""><a href="https://github.com/ColemanTom" target="_blank" rel="noopener noreferrer" class="">@ColemanTom</a> made their first contribution in <a href="https://github.com/conda/conda-build/pull/5774" target="_blank" rel="noopener noreferrer" class="">conda-build#5774</a></li>
<li class=""><a href="https://github.com/jsmolic" target="_blank" rel="noopener noreferrer" class="">@jsmolic</a> made their first contribution in <a href="https://github.com/conda/conda-build/pull/5792" target="_blank" rel="noopener noreferrer" class="">conda-build#5792</a></li>
<li class=""><a href="https://github.com/roryyorke" target="_blank" rel="noopener noreferrer" class="">@roryyorke</a> made their first contribution in <a href="https://github.com/conda/conda-build/pull/5772" target="_blank" rel="noopener noreferrer" class="">conda-build#5772</a></li>
</ul>]]></content:encoded>
            <category>announcement</category>
            <category>conda</category>
            <category>conda-build</category>
        </item>
        <item>
            <title><![CDATA[July 2025 Releases]]></title>
            <link>https://conda.org/blog/2025-08-05-july-releases</link>
            <guid>https://conda.org/blog/2025-08-05-july-releases</guid>
            <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[conda 25.7.0, conda-build 25.7.0, constructor 3.12.2 and menuinst 2.3.1 have been released! 🎉
]]></description>
            <content:encoded><![CDATA[<p>The July 2025 releases included updates to conda, conda-build, constructor, and menuinst! 🎉 All of these have been released to both <code>defaults</code> and <code>conda-forge</code> channels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-2570">Changes in conda <a href="https://github.com/conda/conda/releases/tag/25.7.0" target="_blank" rel="noopener noreferrer" class="">25.7.0</a><a href="https://conda.org/blog/2025-08-05-july-releases#changes-in-conda-2570" class="hash-link" aria-label="Direct link to changes-in-conda-2570" title="Direct link to changes-in-conda-2570" translate="no">​</a></h2>
<p>To update <code>conda</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">conda</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.7</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Enhanced <code>conda export</code> command now supports plugin-based architecture with multiple output formats: <code>yaml</code>, <code>json</code>, and <code>txt</code>.</li>
<li class="">Add automatic export format detection based on filename patterns (e.g., <code>environment.yaml</code>, <code>explicit.txt</code>, <code>requirements.txt</code>)</li>
<li class="">Add "environment consistency" health check to <code>conda doctor</code>.</li>
</ul>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda/releases/tag/25.7.0" target="_blank" rel="noopener noreferrer" class="">25.7.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-conda-build-2570">Changes in conda-build <a href="https://github.com/conda/conda-build/releases/tag/25.7.0" target="_blank" rel="noopener noreferrer" class="">25.7.0</a><a href="https://conda.org/blog/2025-08-05-july-releases#changes-in-conda-build-2570" class="hash-link" aria-label="Direct link to changes-in-conda-build-2570" title="Direct link to changes-in-conda-build-2570" translate="no">​</a></h2>
<p>To update <code>conda-build</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> base conda-build</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">25.7</span><span class="token plain">.0</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<p>No major changes to report. We just removed some deprecated code according to our deprecation schedule.</p>
<p>Check out the full changelog for more: <a href="https://github.com/conda/conda-build/releases/tag/25.7.0" target="_blank" rel="noopener noreferrer" class="">25.7.0</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-constructor-3122">Changes in constructor <a href="https://github.com/conda/constructor/releases/tag/3.12.2" target="_blank" rel="noopener noreferrer" class="">3.12.2</a><a href="https://conda.org/blog/2025-08-05-july-releases#changes-in-constructor-3122" class="hash-link" aria-label="Direct link to changes-in-constructor-3122" title="Direct link to changes-in-constructor-3122" translate="no">​</a></h2>
<p>To update <code>constructor</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">constructor</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3.12</span><span class="token plain">.2</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Added support for <code>conda init --condabin</code>, <code>mamba</code>'s mirrored channels, and the faster <code>onedir</code> variant of <code>conda-standalone</code>.</li>
<li class="">EXE installers: fixed a permission issue for all-user installations for noarch package entry points.</li>
</ul>
<p>Check out the full changelog for more:</p>
<ul>
<li class=""><a href="https://github.com/conda/constructor/releases/tag/3.12.0" target="_blank" rel="noopener noreferrer" class="">3.12.0</a></li>
<li class=""><a href="https://github.com/conda/constructor/releases/tag/3.12.1" target="_blank" rel="noopener noreferrer" class="">3.12.1</a></li>
<li class=""><a href="https://github.com/conda/constructor/releases/tag/3.12.2" target="_blank" rel="noopener noreferrer" class="">3.12.2</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-in-menuinst-231">Changes in menuinst <a href="https://github.com/conda/menuinst/releases/tag/2.3.1" target="_blank" rel="noopener noreferrer" class="">2.3.1</a><a href="https://conda.org/blog/2025-08-05-july-releases#changes-in-menuinst-231" class="hash-link" aria-label="Direct link to changes-in-menuinst-231" title="Direct link to changes-in-menuinst-231" translate="no">​</a></h2>
<p>To update <code>menuinst</code> to the latest version, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> base </span><span class="token assign-left variable" style="color:#36acaa">menuinst</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2.3</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<p><strong>Notable Changes:</strong></p>
<ul>
<li class="">Bug fix: shortcuts are now only created for platforms explicitly enabled in the metadata.</li>
<li class="">Added support for the new activation behavior of <code>conda</code> on Windows.</li>
</ul>
<p>Check out the full changelog for more:</p>
<ul>
<li class=""><a href="https://github.com/conda/menuinst/releases/tag/2.3.0" target="_blank" rel="noopener noreferrer" class="">2.3.0</a> (full release notes with new features)</li>
<li class=""><a href="https://github.com/conda/menuinst/releases/tag/2.3.1" target="_blank" rel="noopener noreferrer" class="">2.3.1</a> (patch release)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-️-our-community">We ❤️ Our Community<a href="https://conda.org/blog/2025-08-05-july-releases#we-%EF%B8%8F-our-community" class="hash-link" aria-label="Direct link to We ❤️ Our Community" title="Direct link to We ❤️ Our Community" translate="no">​</a></h2>
<p>Altogether, we had 2 new contributors this release cycle; thank you to all of our open source community members for helping making these improvements possible.</p>
<ul>
<li class=""><a href="https://github.com/IsabelParedes" target="_blank" rel="noopener noreferrer" class="">@IsabelParedes</a> made their first contribution in <a href="https://github.com/conda/constructor/pull/1008" target="_blank" rel="noopener noreferrer" class="">constructor#1008</a></li>
<li class=""><a href="https://github.com/mmc1718" target="_blank" rel="noopener noreferrer" class="">@mmc1718</a> made their first contribution in <a href="https://github.com/conda/conda/pull/15025" target="_blank" rel="noopener noreferrer" class="">conda#15025</a></li>
</ul>]]></content:encoded>
            <category>announcement</category>
            <category>conda</category>
            <category>conda-build</category>
            <category>constructor</category>
            <category>menuinst</category>
        </item>
    </channel>
</rss>