SECOND MEASUREMENT SM-022

conda-forge’s documentation says a new package can be installed “around 15 minutes” after upload. In a week, 624 of 634 single-file packages took longer just to be listed by the CDN’s sync, median 36 minutes, and none reached the index conda reads in under 28

Markovian ProtocolMeasured 2026-10-17 to 2026-10-24Status: draft; advance copy sent to conda-forge 24 October; publication 31 OctoberDOI: 10.5281/zenodo.23676393

The claim: conda-forge availability: the docs say “around 15 minutes” after upload; in a week, 624 of 634 single-file versions took longer just to be listed by the CDN’s sync, median 36 minutes

What we found: 634 single-file versions uploaded 17–24 Oct: median 36 minutes from upload to the sync that listed them, 624 (98.4%) over 15, 27 over an hour, longest 136. Syncs a median 38.4 minutes apart. None reached the repodata conda reads in under 28 minutes (317 timed, median 49).

Status: Published 31 Oct; checked against the exhibits before publication; advance copy sent to conda-forge (Matthew Becker) 24 Oct

conda-forge is the community library most scientific Python users install packages from. A maintainer’s build uploads the new version to anaconda.org, and users’ conda install reads it from a content delivery network (CDN) that Anaconda copies the channel to in periodic syncs. conda-forge’s documentation gives the time this takes in four places: “around 15 minutes” twice, “ideally around 15 minutes” with longer delays “possible” once, and “about 10 minutes” in its FAQ. For a week we timed every new package version from the upload time anaconda.org records to the CDN sync that first listed it. Of the 634 versions with a single file, 624 (98.4%) took more than 15 minutes, median 36, and none less than 13. Measured to the moment the index conda install reads was updated, none of 317 took under 28 minutes; the median was 49.

The short version

Disclosure: Markovian Protocol holds no financial position in Anaconda, was paid by no one for this work, and showed it to no one before publication except Matthew R. Becker of conda-forge core, who opened issue 1280; we sent him a copy on 24 October, seven days before publication. How we work.

Day by day

Sync timestamp (UTC)Single-file versionsMedian waitOver 15 minutes
Sat 17 Oct (from 18:16)2338 min91.3%
Sun 18 Oct4930 min95.9%
Mon 19 Oct7539 min97.3%
Tue 20 Oct13734 min99.3%
Wed 21 Oct13534 min100%
Thu 22 Oct10241 min100%
Fri 23 Oct10339 min98.1%
Sat 24 Oct (to 04:04)1050 min90.0%
All63436 min98.4%
Recheck, 25–31 Oct (21 left out after polling gaps)66237 min99.2%

Wait = the lastBuildDate of the first rss.xml that lists the version, minus the anaconda.org upload_time (main label) of its file. The first poll, at 18:24 UTC on 17 October, listed 100 versions of unknown age and is left out; so is one version whose files were relabelled from September 2025. 611 of the 634 are noarch (built once for every platform); the 23 single-platform ones had a median of 41 minutes. Quartiles for the 634: 27 and 47 minutes; 90th percentile 54. All 1,417 versions, timed from their last file: median 32 minutes, 89.6% over 15.

Where the time goes

StepMedianMiddle halfMeasured over
Upload on anaconda.org → timestamp of the sync that lists it36 min27–47 min634 single-file versions, 17–24 Oct
Timestamp → the version’s repodata.json changes13 min12–21 min631 versions, 21–24 Oct
Timestamp → rss.xml is written21 min20–22 min234 syncs
Upload → repodata changed49 min40–59 min317 single-file versions, 21–24 Oct
Feed written → our poll, through Cloudflare, sees it2.4 min1.7–3.2 min233 syncs; at most 4.5
Between sync timestamps38.4 min36.6–40.2 min233 intervals

Repodata changes are from the Last-Modified header of each platform’s repodata.json on conda.anaconda.org, read every 3 minutes from 05:23 UTC on 21 October. A version’s end is the first change at or after its sync’s timestamp, in every platform it was built for. Of 789 versions listed from then on, 631 are counted: 123 were built for a platform we did not read (win-arm64, linux-riscv64, win-32), and 35 were in syncs that followed a stall of over an hour, when repodata can be written before the timestamp (on 23 October two platforms’ repodata was written 17 and 20 minutes before the 04:52 timestamp of the sync it belonged to). The timestamp is the sync’s own; the feed and the repodata are written after it, but its copy of the channel is taken before it, which is why uploads just before it miss it.

Who said what, and when

The CDN’s timing has been discussed in public since 2021, and conda-forge runs a status page that shows the CDN cloning.3 The estimates, in order:

Dec 2021conda/infrastructure discussion 13: “Packages take a long time to become visible to conda search after upload.”
2022conda-forge.github.io issue 1735, “Docs out of date regarding CDN time”, opened in April. June: “This week, a change is being pushed that will have the CDN update time at ~8 minutes instead of several hours.” November: “The channel clone job runs every ~2 minutes, and it takes about 6 minutes to complete.” Closed.
Apr 2023conda/infrastructure issue 740, “CDN sync seems to be slower than usual this week”; in May: “The cron job used to take 6-7 minutes.”
Oct 2023Issue 829: “Most packages are available through the CDN in 15-20min, but osx often takes much longer, like 1-2h.” Issue 836: packages missing from the CDN two hours after upload.
Mar 2024Issue 892, “Slow CDN mirroring”; in April: “Approaching the 500min mark.” Closed November 2024.
Aug 2024The life-cycle page with “around 15 minutes” is added (pull request 2167, 13 August). conda-forge.github.io issue 2272, on new cloning infrastructure, 29 August: “it now takes 13-14 minutes for each run.”
Jan 2026conda/infrastructure issue 1280: cloning times “increased to ~30-40 minutes”; two days later: “Seeing times over 1h right now.” Open.
Oct 2026This measurement: sync timestamps 38 minutes apart; single-file versions a median 36 minutes from upload to the sync that lists them, 49 to their repodata.

Saved copies of every thread, with comments, and the life-cycle page’s commit history, are in sm-022/exhibits/.

Why the wait matters

The documentation is what a maintainer goes by after merging a release: when to expect the package, when to start the next build that depends on it, when to tell users it is out. The FAQ tells users who see a version on anaconda.org that it will be installable in about 10 minutes; from 21 to 24 October the median from upload to repodata was 49. A wait of 30 to 60 minutes breaks nothing on its own. A pipeline that waits 15 minutes for a new dependency would not have found 628 of the 631 versions we could time to repodata.

How this ends

Either side can close it. conda-forge owns the four sentences and can change them to what the sync does now; the infrastructure page already says “ideally” and points to the status page, but the life-cycle page and the FAQ do not. Anaconda runs the sync, and the investigation from January can bring it back near 15 minutes. We keep polling and recheck weekly; the day table gets a new row each week.

Our questions

To be sent to the conda-forge core team and Anaconda’s infrastructure team on conda/infrastructure issue 1280. Answers will be printed here as written.

  1. Will the life-cycle page’s “around 15 minutes” and the FAQ’s “about 10 minutes” be updated to the current sync, or is a return to about 15 minutes expected, and when?
  2. What did the investigation from January find, and is there a target for the time between syncs?
  3. What moment does the lastBuildDate in rss.xml mark? The feed and repodata are written after it, and single-file versions uploaded in the 15 minutes before it are almost never in that sync (10 of 255).

Their reply, scored

Not yet sent. When replies come, each question gets marked answered, partly answered or not answered, and the replies go here in full.
17 Oct 2026Polling began.
21 Oct 2026A review of prior work found the threads above; per-platform repodata polling added.
24 Oct 2026A week measured. An independent check of every number and quote against the exhibits before publication corrected the mechanism: versions with several files are timed from their last file, so the headline is now the single-file versions. Draft; nobody outside has seen it.

What we can’t be sure of

Run it yourself

python3 cf_poll.py            # every 3 minutes: rss.xml + anaconda.org upload times  -> versions.jsonl, feeds.jsonl
python3 cf_subdir_lm.py       # every 3 minutes: Last-Modified of each repodata.json   -> subdir_lm.jsonl
gunzip -k exhibits/*.jsonl.gz
python3 -I analyze.py exhibits summary_2026-10-24.json
python3 -I check_start.py exhibits/versions.jsonl 60 20261024 check_start.json   # needs the GitHub CLI

Standard-library Python 3; the pollers ran from cron on one machine. Scripts and exhibits: sm-022/.

References

  1. conda-forge documentation: Life cycle of a package (conda-forge.org), Infrastructure, Maintainer FAQ; source at conda-forge/conda-forge.github.io commit e28b9c5 (23 October 2026). Saved copies life_cycle, infrastructure, maintainer_faq, the life-cycle page’s commits.
  2. conda/infrastructure issue 1280, CDN cloning times increased to 30-40 minutes, 28 January 2026. github.com, saved copy conda_infrastructure_issue_1280_2026-10-24.json; its author’s GitHub profile (“@conda-forge core”), github_user_beckermr_2026-10-24.json.
  3. conda-forge status page, conda-forge.org/status; conda/infrastructure discussion 13 and issues 740, 829, 836, 892; conda-forge/conda-forge.github.io issues 1735 and 2272. Saved copies in sm-022/exhibits/.
  4. The CDN: https://conda.anaconda.org/conda-forge/rss.xml and /<platform>/repodata.json; anaconda.org file API, https://api.anaconda.org/package/conda-forge/<name>/files; GitHub Actions and Azure Pipelines (dev.azure.com/conda-forge/feedstock-builds) run records.