Conda Channel Standards
RepoForge.io Conda channels work with conda, mamba, micromamba and pixi / rattler without extra configuration.
Conda has no single formal channel standard. repodata.json is defined by its reference implementation, conda-index, and conda's documentation, with later additions in Conda Enhancement Proposals (CEPs). Channels follow those, plus the HTTP specifications below. Behavior that clients depend on but no specification defines is listed separately, under ecosystem conventions.
Repository Format
| Standard | Specification |
|---|---|
repodata.json | Conda channel structure and repodata and conda-index |
| Package formats | Conda package specification |
| CEP-17 | python_site_packages_path in info/index.json |
.tar.bz2packages are listed underpackagesand.condapackages underpackages.conda, andrepodata_versionis1, so clients can prefer.condaand de-duplicate builds that exist in both formats.- Each repodata record is a copy of the package's
info/index.json, includingconstrainsandtrack_features. Fields that RepoForge.io doesn't model itself, such aspython_site_packages_pathfrom CEP-17, are passed through. timestampis optional, as ininfo/index.json. Packages without one are accepted, and it's left out of their record.- Packages are served from per-platform subdirectories, including
noarch. - Uploads must be named
{name}-{version}-{build}.condaor.tar.bz2, matching the package'sinfo/index.json. Other extensions and mismatched names are rejected with400 Bad Request.
HTTP
| Standard | Specification |
|---|---|
| RFC 9110 | HTTP Semantics |
| RFC 9111 | HTTP Caching |
| RFC 7617 | The "Basic" HTTP Authentication Scheme |
| RFC 6750 | The OAuth 2.0 Bearer Token Usage |
HEADworks on package downloads and onrepodata.json.repodata.jsoncarriesETag,Last-ModifiedandCache-Control: max-age, and conditional requests get304 Not Modified, so clients only download repodata when it changes.- Authenticate with an access token as the password of HTTP Basic auth, or send it as
Authorization: Bearer <token>, as rattler and pixi do.
Ecosystem Conventions
These aren't in a specification. They match anaconda.org and the way conda clients behave:
repodata.json.zst. A zstd-compressed copy of eachrepodata.jsonis served with the same authentication and caching headers. conda 23 and later request it first./t/<token>/channel URLs. A token can go in the channel URL, as on anaconda.org, for examplehttps://api.repoforge.io/conda/t/<token>/unique-hash-id/my-channel. This lets you useconda config --add channelsandpixi auth login --conda-tokenwithout a username.- No overwriting. Uploading a filename that already exists in the channel and platform returns
409 Conflict, as on anaconda.org. Clients check downloads against the sha256 in their cached repodata, so a replaced file would fail to install. - Private channels protect repodata. The
repodata.jsonof a private channel needs credentials with the Conda - Read only role (or package level permission), so package names, versions and dependencies aren't public. Public channels stay anonymous. - Channel names. Names can contain letters, numbers,
.,_and-, and can't start with..
For uploading and installing, see Using Conda with RepoForge.io.