# conda changelog > A cross-platform package and environment manager. - Vendor: Anaconda - Category: Developer Tools - Official site: https://docs.conda.io - Tracked by: What's New (https://whatsnew.fyi/product/conda) - Harvested from: GitHub (conda/conda) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### 26.7.0 - Date: 2026-07-31 - Version: 26.7.0 - Original notes: https://github.com/conda/conda/releases/tag/26.7.0 - Permalink: https://whatsnew.fyi/product/conda/releases/26.7.0 - **changed** — Replace runtime dependency on zstandard with compression.zstd (Python >=3.14) and backports.zstd (Python 3.10–3.13) for repodata and sharded repodata decompression - **changed** — Defer concurrent.futures and threading imports in common/io.py so they only load when executor classes are first accessed - **changed** — Defer heavy imports in exceptions.py to function level so they only load on error paths - **changed** — Defer importing conda.plugins.types until it is imported explicitly or one of its deprecated re-exports is accessed - **changed** — Defer ruamel.yaml import in common/serialize/yaml.py so it only loads when YAML parsing/writing is first needed - **changed** — Cache context.root_writable for the lifetime of the Context instance to avoid opening a file on every access - **changed** — Skip plugin loading for shell activation commands, avoiding ~430 imports when the plugin manager has not already been initialized - **added** — Add conda.common.terminal module centralizing TTY detection and terminal output-mode logic with helpers is_tty(), no_color(), force_color(), and should_use_color() - **changed** — Suppress progress-bar and spinner animations in the console reporter backend when the output is not a TTY or TERM=dumb/TERM=unknown is set - **changed** — Replace the quadratic position scan in diff_for_unlink_link_precs() with linear order restoration for improved performance - **changed** — Build a per-name candidate index in PrefixGraph.__init__() to accelerate graph construction for large prefixes - **changed** — Extract built-in .conda and .tar.bz2 package archives with a process pool so zstd decompression can run outside the GIL - **changed** — Batch per-file codesign invocations on osx-arm64 into one end-of-transaction call, reducing process launches - **added** — Add structured error guidance to CondaError, including actionable terminal hints, a guidance field in --json output, and initial guidance for RemoveError, PackagesNotFoundError, and UnsatisfiableError - **added** — Add search support for sharded repodata while disallowing conda search * to avoid downloading every shard - **changed** — Improve conflicting plugin errors to list each provider by distribution name and version when available - **added** — Add support for aliases on plugin-provided subcommands - **added** — Make conda env create an alias of conda create - **added** — Support displaying plugin parameter values with conda config --show-sources - **added** — Add a conda_error_hints plugin hook for appending structured guidance hints to CondaError output ###### Enhancements * Replace runtime dependency on `zstandard` with `compression.zstd` (Python >=3.14) and `backports.zstd` (Python 3.10–3.13) for repodata and sharded repodata decompression. (#15486 via #16191) * Defer `concurrent.futures` and `threading` imports in `common/io.py` so they only load when executor classes (`DummyExecutor`, `ThreadLimitedThreadPoolExecutor`) are first accessed. (#15867 via #15881) * Defer heavy imports in `exceptions.py` (`models.channel`, `auxlib.logz`, `common.io`, `common.iterators`, `serialize.json`) to function level so they only load on error paths. (#15867 via #15880) * Defer importing `conda.plugins.types` until it is imported explicitly or one of its deprecated re-exports is accessed. (#15867 via #15893) * Defer `ruamel.yaml` import in `common/serialize/yaml.py` so it only loads when YAML parsing/writing is first needed. (#15867 via #15882) * Cache `context.root_writable` for the lifetime of the `Context` instance to avoid opening a file on every access. (#15867 via #15887) * Skip plugin loading for shell activation commands (`conda shell.* activate | deactivate | reactivate | hook`), avoiding ~430 imports when the plugin manager has not already been initialized. Plugin authors should not rely on `pre_commands` / `post_commands` hooks running for these commands. (#15867 via #15877) * Add `conda.common.terminal` module centralizing TTY detection and terminal output-mode logic with helpers `is_tty()`, `no_color()`, `force_color()`, and `should_use_color()` that respect the `NO_COLOR`, `FORCE_COLOR`, and `TERM=dumb`/`TERM=unknown` environment variables. (#15943 via #15982) * Suppress progress-bar and spinner animations in the console reporter backend when the output is not a TTY or `TERM=dumb`/`TERM=unknown` is set. (#15943 via #15982) * Replace the quadratic position scan in `diff_for_unlink_link_precs()` with linear order restoration. A focused synthetic benchmark with a 50,000-record prefix improved this function by about 780x. (#15969 via #15970) * Build a per-name candidate index in `PrefixGraph.__init__()` to accelerate graph construction for large prefixes. (#15969 via #15971) * Extract built-in `.conda` and `.tar.bz2` package archives with a process pool so zstd decompression can run outside the GIL, while keeping package-cache metadata updates in the parent process. (#15969 via #15974) * Batch per-file `codesign` invocations on osx-arm64 into one end-of-transaction call, reducing process launches for packages with many prefix-replaced binaries. This does not affect other platforms. (#15969 via #15975) * Add structured error guidance to `CondaError`, including actionable terminal hints, a `guidance` field in `--json` output, and initial guidance for `RemoveError`, `PackagesNotFoundError`, and `UnsatisfiableError`. (#16036 via #16160) * Add search support for sharded repodata while disallowing `conda search *` to avoid downloading every shard. (#16134 via #16149) * Improve conflicting plugin errors to list each provider by distribution name and version when available. (#16166) * Add support for aliases on plugin-provided subcommands. (#16187 via #16188) * Make `conda env create` an alias of `conda create`. (#15576 via #16210) * Support displaying plugin parameter values with `conda config --show-sources`. (#16238 via #16246) * Rework `InvalidInstaller` as a `CondaError` with structured guidance, removing redundant CLI try/except wrappers. (#16276) * Add a `conda_error_hints` plugin hook for appending structured guidance hints to `CondaError` output. (#16290 via #16305) * Introduce `conda.core.solve.BaseSolver` as the solver plugin base class. (#16320) * Add channel notices cache directory to `conda info` output. (#16374) * Suggest `conda self update` when the `conda-self` plugin is installed. (#16319 via #16414) * Validate `--console` values against available reporter backends and reject unknown values with a clear error. (#16418 via #16420) #### _[Truncated at 4000 characters — full notes: https://github.com/conda/conda/releases/tag/26.7.0]_ ### 26.5.3 - Date: 2026-06-16 - Version: 26.5.3 - Original notes: https://github.com/conda/conda/releases/tag/26.5.3 - Permalink: https://whatsnew.fyi/product/conda/releases/26.5.3 - **fixed** — If shards were not found on a channel, conda would cache the not-found response, which can break shards-only channels. Instead, always check for sharded repodata if classic repodata has not been cached. - **fixed** — Fix get_shortcut_dir() test helper to use the supplied prefix when detecting .nonadmin on Windows, aligning with menuinst 2.5 shortcut path behavior. ###### Bug fixes * If shards were not found on a channel, conda would cache the not-found response, which can break shards-only channels. Instead, always check for sharded repodata if classic repodata has not been cached. (#16183) ###### Other * Fix `get_shortcut_dir()` test helper to use the supplied prefix when detecting `.nonadmin` on Windows, aligning with menuinst 2.5 shortcut path behavior. (#16207) ###### Contributors * @danyeaw * @jezdez **Full Changelog**: https://github.com/conda/conda/compare/26.5.2...26.5.3 ### 26.5.2 - Date: 2026-06-01 - Version: 26.5.2 - Original notes: https://github.com/conda/conda/releases/tag/26.5.2 - Permalink: https://whatsnew.fyi/product/conda/releases/26.5.2 - **fixed** — Validate Python entry point definitions before generating entry point scripts ###### Bug fixes * Validate Python entry point definitions before generating entry point scripts. (#16168) ###### Contributors * @jaimergp **Full Changelog**: https://github.com/conda/conda/compare/26.5.1...26.5.2 ### 26.5.1 - Date: 2026-05-26 - Version: 26.5.1 - Original notes: https://github.com/conda/conda/releases/tag/26.5.1 - Permalink: https://whatsnew.fyi/product/conda/releases/26.5.1 - **fixed** — Fix channel notices display failing with ImportError when a decorated command replaces base python while conda is still running on the previous interpreter by pre-importing conda.notices.views before the command - **fixed** — Fix crash in UnavailableInvalidChannel and CondaHTTPError when simplejson is installed and a non-JSON HTTP error response is received ###### Bug fixes * Fix channel notices display failing with `ImportError` when a decorated command replaces base `python` while conda is still running on the previous interpreter. Pre-import `conda.notices.views` before the command so post-command display does not load modules from rewritten `site-packages`. (#16126 via #16142) * Fix crash in `UnavailableInvalidChannel` and `CondaHTTPError` when `simplejson` is installed and a non-JSON HTTP error response is received. (#16136) ###### Contributors * @jezdez * @kenodegard **Full Changelog**: https://github.com/conda/conda/compare/26.5.0...26.5.1 ### 26.5.0 - Date: 2026-05-15 - Version: 26.5.0 - Original notes: https://github.com/conda/conda/releases/tag/26.5.0 - Permalink: https://whatsnew.fyi/product/conda/releases/26.5.0 - **added** — Add parsing and storage support for conditional dependencies, optional dependency groups, and variant flags in MatchSpec expressions - **added** — Add --clobber flag to conda create, matching existing support in conda install and conda update - **added** — Display a warning when exporting lockfiles from environments containing packages installed with pip, uv, or other 3rd party Python package managers - **changed** — Speed up condarc search path expansion on every reset_context() by ~5x via cheaper custom_expandvars() and os.scandir()-based directory traversal - **changed** — Drop the ChannelType metaclass from conda.models.channel.Channel and move single-argument Channel(value) construction to Channel.__new__ - **changed** — Remove redundant context.__init__() call in main_subshell() - **changed** — ContextStack now allocates a single slot on construction instead of three - **changed** — Resolve._get_reduced_index() no longer uses copy.deepcopy() to snapshot specs_by_name - **changed** — Defer heavy imports in notices/core.py and cli/main_env.py to reduce module cost of loading individual subcommand modules - **added** — Add fast path for conda --version and conda -V that prints the version and exits without loading the argument parser, context, or plugin system - **changed** — Replace f-string log calls with %-style lazy formatting across the codebase - **changed** — context.category_map is now a @memoizedproperty instead of being rebuilt on every access - **changed** — Hot-path regexes in conda/models/match_spec.py and conda/activate.py are now compiled once at module load time - **changed** — PrefixData._load_single_record() now reads conda-meta JSON files with Path.read_bytes() and json.loads() instead of opening a text file handle - **added** — Port sharded repodata implementation from conda-libmamba-solver - **added** — Add conda_exception_observers plugin hook for observational callbacks on any exception conda encounters - **added** — Add default-implemented available_platforms and env_for(platform) on EnvironmentSpecBase for multi-platform environment specifiers - **added** — Add PlatformMismatchError exception and checks in conda env create and conda env update for platform coverage validation - **added** — Add context.preview configuration parameter via CONDA_PREVIEW env var or preview: in .condarc for opt-in feature previews - **changed** — Rewrite help text for conda create, conda export, conda env create, and conda env export to make lockfile workflows discoverable ##### 26.5.0 (2026-05-15) ###### Enhancements * Add parsing and storage support for conditional dependencies, optional dependency groups, and variant flags in `MatchSpec` expressions (introduced in [conda/ceps#164](https://github.com/conda/ceps/pull/164), [conda/ceps#165](https://github.com/conda/ceps/pull/165), and [conda/ceps#166](https://github.com/conda/ceps/pull/166)). (#15443) * Add `--clobber` flag to `conda create`, matching existing support in `conda install` and `conda update`. (#15584 via #15801) * Display a Warning when exporting lockfiles from environments containing packages installed with pip, uv, or other 3rd party Python package managers. (#15581 via #15838) * Speed up condarc search path expansion on every `reset_context()` by ~5x (~1.35 ms/call to ~0.27 ms/call on a 27-entry path), via cheaper `custom_expandvars()` and `os.scandir()`-based directory traversal in `Configuration._expand_search_path()`. (#15867) * Drop the `ChannelType` metaclass from `conda.models.channel.Channel`. Single-argument `Channel(value)` construction and `MultiChannel` dispatch have moved to `Channel.__new__`, and the per-value cache is now `@functools.cache` on `Channel.from_value`. (#15867) * Remove a redundant `context.__init__()` call in `main_subshell()`. The first initialization with `pre_args` was immediately repeated after the `no_plugins` check without any change in arguments. (#15867) * `ContextStack` now allocates a single slot on construction instead of three. Slots are still doubled on demand, so deep nesting works identically. Eliminates two unnecessary `ContextStackObject` allocations at import time. (#15867) * `Resolve._get_reduced_index()` no longer uses `copy.deepcopy()` to snapshot `specs_by_name`. A dict comprehension with slice copies (`v[:]`) is sufficient because `MatchSpec` objects are immutable. Removes the `import copy` from `resolve.py`. (#15867) * Defer heavy imports in `notices/core.py` and `cli/main_env.py` to reduce the module cost of loading individual subcommand modules. (#15867) * Add fast path for `conda --version` / `conda -V` that prints the version and exits without loading the argument parser, context, or plugin system. (#15867) * Replace f-string log calls with `%`-style lazy formatting across the codebase. String interpolation is now deferred until the log record is actually emitted. Enable the ruff `G004` rule to enforce this going forward. (#15867) * `context.category_map` is now a `@memoizedproperty`. The large static dict was rebuilt on every access; it is now constructed once and cached for the lifetime of the `Context` instance. (#15867) * Hot-path regexes in `conda/models/match_spec.py` and `conda/activate.py` are now compiled once at module load time instead of on every call. Removes repeated `re.compile()` overhead from the `MatchSpec` parser and the shell activation path resolver. (#15867) * `PrefixData._load_single_record()` now reads the conda-meta JSON file with `Path.read_bytes()` + `json.loads()` instead of opening a text file handle and calling `json.load()`. For the small files typical of conda-meta records, a single read syscall followed by an in-memory parse is faster than the incremental read performed by `json.load()`. (#15867) * Add Ruff `TID253` rule to ban module-level imports of `requests` on the startup path, preventing accidental re-introduction of heavy import chains (e.g. the A1 regression fixed in #15866). Files in `conda/gateways/` and other non-startup-path locations that legitimately import `requests` are annotated with `# noqa: TID253`. * Port sharded repodata implementation from conda-libmamba-solver. (#15906) * Add `conda_exception_observers` plugin hook for observational callbacks on any exception conda encounters (filterable per observer via `watch_for`). (#15910) * Bump `conda-incubator/setup-miniconda` to v4.0.0 across `.github/workflows/tests.yml`. v4.0.0 ships the perf w _[Truncated at 4000 characters — full notes: https://github.com/conda/conda/releases/tag/26.5.0]_ ### 26.3.2 - Date: 2026-04-10 - Version: 26.3.2 - Original notes: https://github.com/conda/conda/releases/tag/26.3.2 - Permalink: https://whatsnew.fyi/product/conda/releases/26.3.2 - **fixed** — Revert inline environment activation for and subsequent optimizations to conda run due to regressions with post-link scripts ###### Bug fixes * Revert inline environment activation for and subsequent optimizations to `conda run` (#15534, #15672), due to regressions with post-link scripts. (#15896) ###### Contributors * @agriyakhetarpal **Full Changelog**: https://github.com/conda/conda/compare/26.3.1...26.3.2 ### 26.3.1 - Date: 2026-04-03 - Version: 26.3.1 - Original notes: https://github.com/conda/conda/releases/tag/26.3.1 - Permalink: https://whatsnew.fyi/product/conda/releases/26.3.1 - **added** — Record the originating hook for each plugin, enabling conda info and diagnostics to show where plugins were registered from - **deprecated** — No longer search for conda-* executables on PATH when building the CLI parser - **deprecated** — Mark conda.cli.find_commands as pending deprecation for removal in 27.3 - **deprecated** — Mark conda.utils.sys_prefix_unfollowed as pending deprecation for removal in 27.3 - **deprecated** — Mark conda.exceptions.CommandNotFoundError as pending deprecation for removal in 27.3 ###### Enhancements * Record the originating hook for each plugin, enabling `conda info` and diagnostics to show where plugins were registered from. (#15840) ###### Deprecations * No longer search for `conda-*` executables on `PATH` when building the CLI parser. (#15840) * Mark `conda.cli.find_commands` as pending deprecation for removal in 27.3. (#15840) * Mark `conda.utils.sys_prefix_unfollowed` as pending deprecation for removal in 27.3. (#15840) * Mark `conda.exceptions.CommandNotFoundError` as pending deprecation for removal in 27.3. (#15840) ###### Contributors * @kenodegard **Full Changelog**: https://github.com/conda/conda/compare/26.3.0...26.3.1 ### 26.3.0 - Date: 2026-03-31 - Version: 26.3.0 - Original notes: https://github.com/conda/conda/releases/tag/26.3.0 - Permalink: https://whatsnew.fyi/product/conda/releases/26.3.0 - **changed** — Improve handling of Windows CMD.EXE activation for environment paths that contain the caret (^) character - **added** — Add support for PackageRecord.requested_specs to store all MatchSpec objects involved in requesting a package - **added** — Add unmerged_specs_to_add and unmerged_specs_to_remove attributes to conda.core.solve.Solver - **changed** — Pass unmerged MatchSpec objects to pre-solve plugins instead of pre-merged - **added** — Add option to disable redefining Fish shell prompt functions in conda init - **changed** — conda create --file now supports environment.yaml files and automatically detects name and prefix - **added** — Add description and environment_format metadata fields to environment plugin types - **changed** — Optimize S3 downloads to avoid an extra file copy through a temporary buffer - **added** — Add PackagesNotFoundInChannelsError and PackagesNotFoundInPrefixError as specialized cases of PackagesNotFoundError - **changed** — Always include conda-meta manifest file size in PrefixRecord.package_size() so metapackages display non-zero size - **changed** — Speed up conda run by dropping the shell hook subprocess and relying on inline activators - **changed** — conda remove with the classic solver now exits early if the spec to be removed does not exist - **changed** — conda search --envs now raises an error when the package is not found in any environment - **added** — Add support for defining aliases of environment spec plugins - **added** — Add pattern matching support to environment specifier and exporter plugins via default_filenames field - **added** — conda create|install -f is now recognized as an alias to conda create|install --file - **changed** — Improve log messages when conda auto-detects the applicable environment file format - **fixed** — Fix conda config --show-sources displaying frozendict.frozendict(...) instead of readable dict format - **fixed** — Do not include pip-installed packages in the list of explicit packages when building an environment from prefix - **fixed** — Use bundled Windows stub executables for creating entry points instead of relying on Scripts/conda.exe - **fixed** — Use case-insensitive matching when finding Python metadata files on Windows - **fixed** — Always include the dependencies field when exporting an environment.yaml-style environment for CEP-24 compliance - **fixed** — Fix package resolution regression for custom multichannels - **fixed** — Allow conda search --offline to use the local channel cache - **fixed** — Fix win-arm64 subdir detection on native Windows ARM64 by matching uppercase ARM64 - **fixed** — Ignore JSON metadata paths beginning with ._ when loading prefix data ###### Enhancements * Improve handling of Windows CMD.EXE activation for environment paths that contain the `^` (caret) character. (#12558 via #15628) * Add support for `PackageRecord.requested_specs`. This will store all the MatchSpec objects that were involved in requesting a package (instead of a single, pre-merged object). To that end, two new attributes in `conda.core.solve.Solver`, `unmerged_specs_to_add` and `unmerged_specs_to_remove`, store the list of input specs as received, instead of always attempting to merge them. (#15111 via #15110) * Pass unmerged MatchSpec objects to `pre-solve` plugins (instead of pre-merged). (#15110) * Add option to disable redefining Fish shell prompt functions in conda init. (#15545 via #15549) * `conda create --file ` now supports environment.yaml files as well as requirements.txt and explicit environment exports, and detects name and prefix automatically when `--name` / `--prefix` are omitted. (#15573 via #15770) * Add `description` and `environment_format` metadata fields to environment plugin types (`CondaEnvironmentSpecifier` and `CondaEnvironmentExporter`). (#15577 via #15763) * Optimize S3 downloads to avoid an extra file copy through a temporary buffer. (#15636) * Add path customization parameters to `tmp_env` fixture (`name`, `path_prefix`, `path_infix`, `path_suffix`) that pass through to `path_factory`. Add "parts mode" to `path_factory` where specifying `prefix`, `infix`, or `suffix` triggers UUID defaults for unspecified parts, enabling easier special character path testing. (#15650) * Add `PackagesNotFoundInChannelsError` and `PackagesNotFoundInPrefixError` as specialized cases of `PackagesNotFoundError`, to distinguish between packages missing from configured channels and packages missing from a specific environment prefix. (#12197 via #15653) * Always include conda-meta manifest file size in `PrefixRecord.package_size()`, so packages with no files (such as metapackages, mutex packages) display a non-zero size instead of "0 B" in `conda list --size`. (#15681 via #15656) * Speed up `conda run` by dropping the shell hook subprocess and relying on inline activators. (#14993 via #15672) * `conda remove ` with the classic solver now exits early if the spec to be removed does not exist in the environment. (#15697) * `conda search --envs ` now raises an error when the package is not found in any environment. (#15698) * Add support for defining aliases of environment spec plugins. (#15701) * Add pattern matching support to environment specifier and exporter plugins via `default_filenames` field. Plugins can now use wildcards (e.g., `*.conda-lock.yml`) for filename-based detection. (#15717 via #15719) * `conda create|install -f` is now recognized as an alias to `conda create|install --file`. (#15790) * Improve log messages when conda auto-detects the applicable environment file format. (#15736) ###### Bug fixes * Fix `conda config --show-sources` displaying `frozendict.frozendict(...)` for `channel_settings` entries instead of readable dict format. (#15505 via #15789) * Do not include pip-installed packages in the list of explicit packages when building a `conda.models.Environment` with `conda.models.Environment.from_prefix`. (#15619) * Use bundled Windows stub executables (`conda/shell/cli-32.exe`, `conda/shell/cli-64.exe`) for creating entry points instead of relying on `Scripts/conda.exe` so that entry point creation works when conda is not installed as a conda package (e.g. tests via `python -m pytest`). Select the correct exe for the target env via a platform-to-stub mapping; for win-arm64 use `cli-64.exe` (relying on Windows x64-on-ARM64 emulation). Use target platform for `conda init` as well, fixing cross-architecture installs (e.g. win-32 host creating a win-64 env). (#15678) * Use case-insensitive matching when finding Python metadata files on Windows to make sure they are correctly identified as conda packages. (#15153 _[Truncated at 4000 characters — full notes: https://github.com/conda/conda/releases/tag/26.3.0]_ ### 26.1.1 - Date: 2026-02-17 - Version: 26.1.1 - Original notes: https://github.com/conda/conda/releases/tag/26.1.1 - Permalink: https://whatsnew.fyi/product/conda/releases/26.1.1 - **fixed** — Fix conda doctor --fix failing with install() missing 1 required positional argument: 'parser' when attempting to fix packages with missing files ###### Bug fixes * Fix `conda doctor --fix` failing with `install() missing 1 required positional argument: 'parser'` when attempting to fix packages with missing files. (#15669) ###### Contributors * @jezdez **Full Changelog**: https://github.com/conda/conda/compare/26.1.0...26.1.1 ### 26.1.0 - Date: 2026-01-30 - Version: 26.1.0 - Original notes: https://github.com/conda/conda/releases/tag/26.1.0 - Permalink: https://whatsnew.fyi/product/conda/releases/26.1.0 - **added** — Allow `custom_multichannels.defaults` to override `default_channels` - **changed** — Defer `PrefixData` record instantiation until they are accessed for faster query performance - **added** — Add support for Python 3.14 - **changed** — Speed up the context initialization process by caching condarc file reads - **added** — Raise a `NoChannelsConfiguredError` when attempting to solve an environment with no channels configured - **added** — Add `conda.cli.condarc.ConfigurationFile` class to expose configuration file manipulation interface programmatically - **added** — Add `-s` as a shorthand alias for `conda run --no-capture-output` - **changed** — `conda run` now deactivates the environment on exiting the command - **changed** — Rename `conda.models.enums.PathType` enum to `conda.models.enums.PathEnum` - **security** — Validate plugin-provided HTTP headers and raise `PluginError` if forbidden headers are detected - **added** — Add `conda_package_extractors` plugin hook to allow plugins to register custom package archive extractors - **added** — Add `-O` as a flag alias for `--override-channels` - **added** — Add reusable `http_test_server` fixture to `conda.testing` module for serving mock conda channels and remote files in tests - **changed** — Speed up `conda run` by inlining environment activation instead of using a subprocess - **added** — Add a `--size` flag to the `conda info --envs` and `conda env list` commands to display disk usage for each environment - **added** — Add `PrefixRecord.package_size()` and `PrefixData.size` for programmatic access to conda-managed disk usage - **added** — Add `--size` flag to `conda list` to show environment size and package sizes - **changed** — Improve error messages for HTTP 403 (Forbidden) responses with context-aware guidance on authentication and permissions - **changed** — Improve error message when `conda activate` fails on Windows due to unwritable `%TEMP%` directory - **changed** — Package extension detection is now dynamic based on registered `conda_package_extractors` plugins ###### Enhancements * Allow `custom_multichannels.defaults` to override `default_channels`. Continuation of effort to devendor conda and remove hardcoded "defaults" channel. (#14661) * Defer `PrefixData` record instantiation until they are accessed for faster query performance. (#14811) * Add support for Python 3.14. (#15080, #15618) * Speed up the context initialization process by caching condarc file reads. (#15150) * Raise a `NoChannelsConfiguredError` when attempting to solve an environment with no channels configured, and provide a helpful message to guide users in adding channels. (#15262 via #15345) * Add `conda.cli.condarc.ConfigurationFile` class to expose configuration file manipulation interface programmatically. This allows other Python interfaces to read and modify conda configuration files without shelling out to `conda config` commands. (#15238 via #15376) * Add `-s` as a shorthand alias for `conda run --no-capture-output`. (#15426) * `conda run` now deactivates the environment on exiting the command. (#15427) * Rename `conda.models.enums.PathType` enum to `conda.models.enums.PathEnum` to resolve a naming conflict with the `PathType` type annotation. This change follows modern Python conventions and establishes the `*Enum` suffix as the pattern for enums in the codebase. (#15428) * Validate plugin-provided HTTP headers and raise `PluginError` if forbidden headers are detected, preventing plugins from compromising conda's network stack. (#15405 via #15436) * Add `conda_package_extractors` plugin hook to allow plugins to register custom package archive extractors. (#15524 via #15441) * Add `-O` as a flag alias for `--override-channels`. (#15499) * Add reusable `http_test_server` fixture to `conda.testing` module for serving mock conda channels and remote files in tests. Fixture uses standard `@pytest.mark.parametrize()` with `indirect=True` for configuring directories, supporting both pre-existing directories and dynamic content generation. Provides clean API with `get_url()` helper method and `directory` attribute. (#15528 via #15529) * Speed up `conda run` by inlining environment activation instead of using a subprocess. (#15534) * Add a `--size` flag to the `conda info --envs` and `conda env list` commands to display disk usage for each environment. (#8040 and #15544) * Add `PrefixRecord.package_size()` and `PrefixData.size` for programmatic access to conda-managed disk usage. (#15544) * Add `--size` flag to `conda list` to show environment size and package sizes. (#15544) * Improve error messages for HTTP 403 (Forbidden) responses with context-aware guidance on authentication and permissions. (#15594) * Improve error message when `conda activate` fails on Windows due to unwritable `%TEMP%` directory. (#15601 via #15602) * Package extension detection is now dynamic based on registered `conda_package_extractors` plugins. (#15629) * Allow `conda create --download-only` to run without specifying `-n/--name` or `-p/--prefix`, similar to `--dry-run`. (#15633) * Add `--fix` flag to `conda doctor` with health check fix capabilities. (#15530) * Improve error message when `conda env export` is invoked with an invalid platform. (#15561) ###### Bug fixes * Stop `conda run` from adding an additional new line after printing to `stdout` or `stderr`. (#11763 via #15539) * Non-conda installed Python packages now show up in `conda list` in free-threading environments. (#14674) * Fix Python packages not being listed as from the `pypi` channel if the `site-packages` directory includes a symlink. (#14674) * Replace deprecated `codecs.open()` with built-in `open()` for Python 3.14 compatibility. (#15080) * Fix parallel conda command failures on Windows (e.g., `start /b`) by using GUIDs for unique temp filenames instead of `%RANDOM%`. (#15169 via #15598) * Sanitize channel config input to remove null values. (#15268 via #15323) * Fix `conda list --fields dist_str` representation. (#15420) * Add _[Truncated at 4000 characters — full notes: https://github.com/conda/conda/releases/tag/26.1.0]_