Changelog#

Changelog#

0.13.0 (2026-09-28)#

Enhancements#

  • Derive conda pypi convert build numbers from the wheel filename build tag and add --build-number to override them. (#315 via #529)

Bug fixes#

  • Write subdir, noarch, depends, and extra_depends to info/index.json when extracting a wheel, so environments restored from explicit files or lockfiles keep the noarch subdir and are not relabelled as pypi in conda list. (#527 via #536)

  • Fix Pixi dependency locking with recent conda releases by installing the development checkout after the dependency solve.

Docs#

  • Document that explicit exports cannot carry channel information for wheels and recommend pixi.lock exports via conda-lockfiles instead. (#527 via #536)

  • Remove beta status from the conda-pypi documentation. Drop the Anaconda.org web UI limitation notes now that the channel is listed there, recommend conda 26.9 or later via conda self update, reframe the conda search troubleshooting entry as a conda 26.7.0 version requirement, and describe the EXTERNALLY-MANAGED placement as intended behavior rather than a beta limitation. (#531 via #534)

  • Document editable development setup, use Python 3.14 in general testing examples, and explain the Anaconda channel used for Python 3.10 environments.

Other#

  • Switch the recipe back to Python noarch since the EXTERNALLY_MANAGED file isn’t currently being used. (#518)

  • Track benchmarks with Bencher instead of CodSpeed, comparing base and PR revisions on the same Ubuntu 24.04 runner with fixed local wheel fixtures. (#525)

  • Rename the pip notification from the “conda-pypi beta tip” to the “conda-pypi tip” in user-facing strings and in the post-transaction action name. (#531 via #534)

  • Require conda-index 0.13.0 or newer and refresh the development lock file while retaining Python 3.10 support.

  • Expect the two wheel-channel installation failures caused by conda#16676 only on conda builds that drop v3 records.

  • Publish the noarch conda-canary package from one build job to avoid concurrent upload conflicts.

Contributors#

  • @agriyakhetarpal

  • @bingliscodes made their first contribution in conda/conda-pypi#534

  • @danyeaw

  • @jezdez

  • @ForgottenProgramme

  • @conda-bot

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.12.0 (2026-09-03)#

Enhancements#

  • In conda pypi index, store wheel files in the ‘md’ stage of the conda-index database, avoiding potential conflict with the non-wheel parts of conda-index. (#403)

  • Defer imports of heavy dependencies (unearth, build, installer, conda_index) in conda_pypi.plugin, the install/convert/index CLI subcommands, and the external-packages health check until they are actually needed. (#446)

  • Add a Ruff TID253 rule banning module-level imports of unearth, build, installer, and conda_index to prevent this class of startup-time regression from being reintroduced. Files whose sole purpose is wrapping these libraries are annotated with # noqa: TID253; files under tests/ are exempted via per-file-ignores. (#446)

  • Mark conda pypi install as PendingDeprecation. (#463)

  • Translate PEP 508 dependency extras in wheel repodata to MatchSpec extras=[…] form (CEP 44). (#469)

  • Add pixi run news task to create news fragments via CLI. (#476)

  • Show the conda-pypi tip only when a conda transaction newly installs pip, not when pip is already present or is being upgraded. (#484)

Bug fixes#

  • Fixed .conda package metadata to emit extra_depends instead of extras in info/index.json, matching CEP 44 and the conda-pypi channel. (#453)

  • Ignore invalid Requires-Python values instead of emitting unparseable python … depends; warn during convert/install, stay silent for shard traversal. (#474)

  • Drop the legacy extras suffix from console_scripts entry points during conversion (e.g. mod:func [extra] → mod:func). Previously it was copied verbatim into info/link.json, making the resulting package fail to install with ValueError: '<func> [<extra>]' is not a valid Python function identifier at link time. (#477)

  • Respect --prefix and --name when selecting the environment for conda pypi install. (#465)

Docs#

  • Correct marker-conversion docs for MatchSpec [when=…] support and link CEP 43. (#472)

  • Document that the conda_pypi_pip_warning tip is triggered by a new pip install, not by pip merely being present. (#484)

  • Clarify terminology for distribution packages, package indexes, distribution formats, and package installers. (#516)

Other#

  • Remove unused runtime dependency on pip and orphaned helpers that shelled out to pip for the old explicit lockfile and wheel-unpack paths. (#483)

  • Upgrade the test suite to pytest 9 and isolate tests from collection order. (#465)

Contributors#

  • @abdul-050 made their first commit in conda/conda-pypi#479

  • @danyeaw

  • @dholth

  • @jezdez

  • @kenodegard

  • @ForgottenProgramme

  • @conda-bot

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.11.0 (2026-07-03)#

Enhancements#

  • Add a conda pypi index <dir> subcommand that creates a conda channel from a collection of local wheel files. (#410)

  • Add wheels_local_channel pytest fixture that builds and serves a fully offline conda wheel channel from tests/pypi_local_index/ using conda pypi index. (#433)

Bug fixes#

  • Fix direct .whl install info/index.json metadata: fn is the wheel basename on disk and build is derived from WHEEL tags (normalizing noarch tags to py3_none_any_0 to match repodata v3), fixing lockfile restore mismatches. (#417 via #420)

  • Restore visibility of the conda-pypi beta tip at default conda verbosity by logging it at WARNING instead of INFO. (#442 via #443)

Docs#

  • Switch to using the new on-demand release process, based on the release process that was being used for conda-pypi. (#414)

  • Document installed wheel index.json fn and build fields in the wheel channels guide. (#420)

  • Add documentation for the new conda pypi index command. (#430)

Other#

  • Enable infrastructure-managed Dependabot configuration via conda/infrastructure templates. (#418)

Contributors#

  • @danyeaw

  • @jezdez

  • @ForgottenProgramme

  • @ryanskeith

  • @conda-bot

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.10.1 (2026-06-12)#

Docs#

  • Update the docs landing page to focus on conda install workflows. (#398 via #405)

Other#

  • Remove conda-pypi-post-install-create post install plugin. (#408)

Contributors#

  • @kathatherine

  • @soapy1

  • @pre-commit-ci[bot]

0.10.0 (2026-06-09)#

Enhancements#

  • Populate additional info/about.json fields (home, dev_url, doc_url, channels, extra.recipe, extra.generator) when converting PyPI projects, and truncate description to the first paragraph to avoid embedding the full README + CHANGELOG. (#343)

  • Add external-packages health check for conda doctor to detect packages installed from PyPI and offer conda doctor --fix to reinstall eligible packages from configured conda channels. (conda/conda#15582 via #347)

  • Add descriptions to Pixi tasks for development. (#368)

  • Remove the CLI entry point because a CLI doesn’t make sense for a plugin. (#327 via #370)

  • Add conda_pypi_pip_warning conda setting to enable or disable the warning shown when pip appears in conda environments. (#375 via #376)

  • Refocus the pip warning into a short conda-pypi beta tip. (#385)

  • Add --dry-run, --yes, and repeated --editable support to editable installs. (#392 via #401)

Docs#

  • Clarify that the conda-pypi channel may not appear in the Anaconda.org web UI and that conda search can fail during the beta because it requests classic repodata.json metadata. (#382 via #384)

  • Add Zulip instead of Element and Discourse links (#311 via #369).

  • Update command line help text, documentation to clarify that conda pypi install --editable PROJECT creates and installs a .conda package with the contents of a PEP 660 “editable wheel”, linking PROJECT into the target conda environment. (#390 via #391)

  • Add conda-pypi platypus logo. (#394)

Contributors#

  • @danyeaw

  • @dholth

  • @jaimergp

  • @jezdez

  • @ForgottenProgramme

  • @pya made their first contribution in conda/conda-pypi#368

  • @travishathaway

  • @conda-bot

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.9.0 (2026-05-14)#

Enhancements#

  • Add upload timestamps to PyPI metadata conversion to repodata. (#341 and #360)

  • Disable EXTERNALLY-MANAGED file placement during the community beta period. Instead, log an informational notice about upcoming pip protection when environments with pip are created or updated. (#353 via #352)

Bug fixes#

  • Add trailing newline in dist-info INSTALLER. (#338)

  • Fix store_pypi_metadata causes re-extraction of all virtual wheel packages. (#340 via #341)

  • Fix pypi_to_repodata using wrong source for fn field. The wheel filename is now taken from the URL entry instead of the package info dict. (#355 and #360)

Deprecations#

  • The EXTERNALLY-MANAGED file will be re-enabled in a future release once migration tooling is available. (#353 via #352)

Docs#

  • Update documentation to include information on the conda-pypi channel. (#356)

  • Update documentation formatting for consistency. (#356)

Other#

  • Drop the direct conda-rattler-solver dependency and use context.plugin_manager.get_cached_solver_backend() to delegate to whatever solver backend is configured. (#350)

Contributors#

  • @danyeaw

  • @dholth

  • @jezdez

  • @kathatherine made their first contribution in conda/conda-pypi#356

  • @conda-bot

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.8.0 (2026-04-21)#

Enhancements#

  • Add function to store pypi metadata in the conda-index cache. This will allow to seed the conda-index cache with PyPI packages to include in repodata. (#276 via #306)

  • Bump conda-index to >=0.11.0 and regenerate the wheel test channel using ChannelIndex.index(...) with repodata_v3=True. (#306)

  • Convert wheel->conda directly without extracting the wheel to the temporary directory. Stricter separation of elements between pkg- and info- elements of the .conda archive. (#324)

Bug fixes#

  • Fix license metadata extraction from wheel METADATA files. The code was using underscore keys (license_expression, license) but email.message.Message requires hyphen keys matching the actual METADATA headers (License-Expression, License). (#318)

  • Fix nested license directory issue where license files ended up at info/licenses/licenses/LICENSE instead of info/licenses/LICENSE when wheels use the PEP 639 layout. (#322)

  • Fix converted conda packages contain a root path. (#317 via #324)

Other#

  • Enable “sort imports” lint. (#325)

Contributors#

  • @agriyakhetarpal

  • @danyeaw

  • @dholth

  • @jezdez

  • @soapy1

  • @conda-bot

  • @danpetry

  • @pre-commit-ci[bot]

0.7.1 (2026-04-16)#

Bug fixes#

  • Fix hardcoded Python paths in entry point scripts from conda pypi convert. Entry-point scripts are now handled exclusively via info/link.json (CEP-34), so conda generates them at install time with the correct prefix. (#310)

Other#

  • Refactor wheel installation to use PyPA installer destination APIs directly (no custom subclass) and require installer>=1. (#307)

Contributors#

  • @agriyakhetarpal

  • @danyeaw

  • @jezdez

  • @pre-commit-ci[bot]

0.7.0 (2026-04-10)#

Enhancements#

  • Copy wheel files listed in PEP 639 License-File metadata into info/licenses/ when building conda packages. (#300)

Bug fixes#

  • Improve missing dependency builder.get_requires_for_build(distribution) detection, installation when building Python packages. (#281)

  • Drop redundant per-wheel record_version from repodata package records. (#289)

Docs#

  • Clarify that conda pypi install -e is for local project paths only, not pip-style VCS requirement URLs. (#295)

Other#

  • Fix test workflow change detection on push and tag events by checking out the repo for paths-filter. (#287)

  • Drop skipped tests that targeted git+https editable installs. (#295)

Contributors#

  • @danyeaw

  • @dholth

  • @dependabot[bot]

  • @pre-commit-ci[bot]

0.6.0 (2026-03-30)#

Enhancements#

  • Update local wheel-channel test repodata to v3.whl, extra_depends, and normalized when conditions. (#273)

  • Add PEP 508 marker conversion for repodata (v3.whl) entries with [when=…]. (#279)

Bug fixes#

  • Fix missing dependency on conda-package-streaming. (#272)

Contributors#

  • @agriyakhetarpal

  • @danyeaw

  • @kenodegard

  • @pre-commit-ci[bot]

0.5.0 (2026-03-02)#

Enhancements#

  • Add support for injecting tests for conda pypi convert (#242)

  • Add --name-mapping option to supply a custom PyPI-to-conda name mapping file, overriding the built-in mapping (#253)

  • Add tests for extra dependency specifiers in repodata (#259)

Bug fixes#

  • Fix installing wheels that use the headers data scheme (#246)

  • Fix wheel hashes stored in conda metadata being base64-encoded instead of hex, which caused errors with conda-rattler-solver (#250)

  • Fix installing wheels that include data and scripts schemes (#256)

Docs#

  • Add release process at RELEASE.md (#239)

  • Add docs for conda install with a channel containing wheels (#259)

Contributors#

[0.4.0] - 2026-02-04#

Added#

  • Support converting wheels to conda packages from the CLI (#215)

  • Add conda pypi install --editable <path> and conda pypi convert commands (#145)

  • Add codspeed benchmarks for performance tracking (#163)

  • Support Python 3.10, 3.11, 3.12, 3.13, and 3.14 (#148, #237)

  • Add canary testing with conda development builds (#237)

  • Add assertions for the absence of .pyc files in converted packages (#216)

  • Add CODEOWNERS file for automatic team assignment (#172)

  • Add test repodata server for testing installations with repodata v3 (#207)

Changed#

  • Use rattler solver for faster dependency resolution (#176)

  • Use CondaPackageExtractor plugin hook for wheel extraction (#217)

  • Adopt code from anaconda/conda-whl-support into conda-pypi (#154)

  • Replace pip subprocess with installer library for wheel unpacking (#149)

  • Extend installer to also install data files from wheels (#153)

  • Rename --override-channels to --ignore-channels for clarity (#178)

  • Update URLs from conda-incubator to conda organization (#225)

  • Call add_whl_support on its own, without a plugin (#165)

  • Respect conda JSON output setting (#206)

  • Require conda >=26.1.0 (#230)

Fixed#

  • Fix FileNotFoundError during environment creation (#219)

  • Fix install errors for packages requiring hyphen normalization e.g. huggingface-hub -> huggingface_hub .(#212)

  • Fix conda-meta JSON filename format for wheel packages (#170)

  • Fix “conda-index not found” error. Drop pypi-simple dependency. (#136)

  • Fail fast when no compatible wheels are available (#157)

  • Fix some deprecation warnings (#162)

Removed#

  • Drop Python 3.9 support (#148)

  • Remove list hook (#146)

  • Remove unused dependencies (#196)

  • Remove monkeypatched PrefixData._load_single_record (#177)

[0.3.0] - 2025-10-07#

See GitHub Release for details.

[0.2.0] - 2024-05-15#

See GitHub Release for details.

[0.1.1] - 2024-03-20#

See GitHub Release for details.

[0.1.0] - 2024-03-15#

Initial release.