History of conda-forge, adding your recipes, and how to get involved
(a.k.a. pretty chill guy)
From compiling everything by hand to 30,000+ packages
easy_install/eggs to pip, but there was no easy way to ship pre-compiled packagesmanylinux wheels didn't exist until PEP 513 in 2016numpy 1.7.0 on PyPI (Feb 2013): source tarball + six 32-bit Windows .exe installers. Nothing for macOS or Linux.
manylinux1 (1.11.0)Until then, pip install numpy on Linux meant a C compiler, gfortran, and a BLAS/LAPACK you had to find yourself.
conda 1.0 ships as a cross-platform, language-agnostic package manager for pre-compiled artifactsconda gets a SAT solver, conda build ships, Miniconda and Binstar.org (hosting for user-built conda packages) launch…at the first PyData meetup at Google HQ, where several of us asked Guido what we can do to fix Python packaging for the NumPy stack. Guido's answer was to ‘solve the problem ourselves.’ We at Continuum took him at his word… and created the conda package manager and conda environments.
Travis Oliphant, Why I promote conda (2013)
ContinuumIO/conda-recipes became the central place to contribute conda recipes — but quality varied, most recipes only worked on 1–2 platforms, and there was no CIconda-build-all); Filipe Fernandes (IOOS) borrowed it — lots of cross-pollination, but duplicated recipes and unpredictable compatibility when mixing channelsconda-forge is registered as a GitHub organization and an Anaconda.org channel
packages
maintainers
years old (since 2015)
core team members
enhancement proposals (CFEPs)
countries & territories
of maintainers are outside the US
maintainers list a location
Your package's front door: conda-forge/staged-recipes
flowchart TB A["Fork and branch off main"] --> C["Add recipes/#lt;package#gt;/"] C --> D["Open a PR"] D --> E["CI builds on<br/>Linux, macOS, Windows"] E --> F["Review"] F --> G["Merge"] class G done
staged-recipes is an entry point for recipes destined to become their own feedstock
grayskull pypi --use-v1-format <package>
grayskull cran --use-v1-format <package>
Anything else — copy recipes/example-v1/recipe.yaml and edit by hand, following the section order and removing the explainer comments.
context:
name: zensus2pgsql
version: 0.2.1
python_min: "3.10"
package:
name: ${{ name|lower }}
version: ${{ version }}
source:
url: https://pypi.org/packages/source/${{ name[0] }}/${{ name }}/zensus2pgsql-${{ version }}.tar.gz
sha256: 00517129cf7747e7580f57c680e143de5e5accca928407cd79bc88c114502ec5
build:
number: 0
noarch: python
script: ${{ PYTHON }} -m pip install . -vv --no-deps --no-build-isolation
python:
entry_points:
- zensus2pgsql = zensus2pgsql.cli:app
- zpg = zensus2pgsql.cli:app
requirements:
host:
- python ==${{ python_min }}
- hatchling >=1.27.0
- pip
run:
- python >=${{ python_min }}
- aiocsv >=1.4.0
- aiofiles >=25.1.0
- asyncpg >=0.30.0
- httpx >=0.28.1
- platformdirs >=4.5.0
- rich >=14.2.0
- typer >=0.15.1
- types-aiofiles >=25.1.0.20251011
tests:
- python:
imports:
- zensus2pgsql
- zensus2pgsql.commands.create
- zensus2pgsql.commands.cache
- zensus2pgsql.commands.drop
- zensus2pgsql.commands.list
- zensus2pgsql.cache
- zensus2pgsql.constants
- zensus2pgsql.errors
- zensus2pgsql.logging
- zensus2pgsql.retry
pip_check: true
- requirements:
run:
- python ==${{ python_min }}
script:
- zensus2pgsql --help
- zpg --help
about:
summary: A Python CLI program that collects Zensus GIS data from Germany and imports it into PostgreSQL
license: GPL-3.0-only
license_file: COPYING
homepage: https://travishathaway.github.io/zensus2pgsql
extra:
recipe-maintainers:
- travishathaway
| Section | What goes here | Typical examples |
|---|---|---|
build |
Tools needed only while building, not on the host | Compilers, cmake, make, pkg-config |
host |
Present alongside the package at build time | Shared C/C++ libraries, python/r-base, pip, setuptools |
run |
Needed only when the package runs | Most Python/R runtime libraries |
context:
version: 2.3.1
recipe:
name: osm2pgsql
version: ${{ version }}
source:
- url: https://github.com/osm2pgsql-dev/osm2pgsql/archive/refs/tags/${{ version }}.tar.gz
sha256: e90461bd78787fd5cf82f73ac4bc0cfccbc4f498f35dce59eb4d168a380d6ac0
build:
number: 1
package:
name: osm2pgsql
version: ${{ version }}
build:
number: 1
script:
- if: unix
then: build.sh
else: build.bat
requirements:
build:
- ${{ compiler('cxx') }}
- ${{ stdlib('c') }}
- cmake
- ninja
- pkg-config
host:
- expat
- proj
- bzip2
- zlib
- postgresql
- lua
- protozero
- libosmium
- cli11
- fmt <12
- nlohmann_json
- libboost-devel
run:
- lua
- osm2pgsql-replication
tests:
- files:
recipe:
- test.sh
- liechtenstein-2013-08-03.osm.pbf
requirements:
run:
- postgresql
- if: unix
then: postgis
script:
- osm2pgsql --version
- osm2pgsql --help
- if: unix
then: bash test.sh
about:
homepage: https://osm2pgsql.org
license: GPL-2.0-only
license_file:
- COPYING
summary: Import OpenStreetMap data into a PostgreSQL/PostGIS database
description: osm2pgsql is a tool for loading OpenStreetMap data into a PostgreSQL / PostGIS database suitable for applications like rendering into a map, geocoding with Nominatim, or general analysis.
documentation: https://osm2pgsql.org
repository: https://github.com/osm2pgsql-dev/osm2pgsql
extra:
recipe-maintainers:
- travishathaway
package_contents in v1)python: test with imports: + automatic pip_check: truer: test with libraries:<tool> --help to prove it's on PATH and executableApache-2.0, not APACHE 2.0)license_file is included, unless the upstream tarball already ships oneurl:), never git_url: — tarballs are checksummable and smallerrecipes/example-v1/ folder itself untouchedMention the appropriate language team (e.g. @conda-forge/help-python) in a PR comment; first-time contributors can ask a bot to ping the team for them.
CI creates <package>-feedstock automatically, triggers the first build, uploads to anaconda.org/conda-forge, and invites you to the conda-forge GitHub org with commit rights on your new feedstock.
requirements accurate as the package's dependencies change
The community that keeps the front door open
| Language | GitHub team | Open Pull Requests |
|---|---|---|
| Python | @conda-forge/help-python |
167 |
| Rust | @conda-forge/help-rust |
38 |
| Python/C hybrid | @conda-forge/help-python-c |
37 |
| C/C++ | @conda-forge/help-c-cpp |
33 |
| R | @conda-forge/help-r |
19 |
| NodeJS | @conda-forge/help-nodejs |
11 |
| Java | @conda-forge/help-java |
7 |
@conda-forge/core