---
title: "Install prebuilt packages and toolchains"
description: "Download compatible prebuilt dependencies instead of compiling the same toolchain or package during every CI run."
url: https://starsling.dev/ci-playbooks/techniques/prebuilt-toolchains
canonicalUrl: https://starsling.dev/ci-playbooks/techniques/prebuilt-toolchains
---

# Install prebuilt packages and toolchains

Download compatible prebuilt dependencies instead of compiling the same toolchain or package during every CI run.

## How to choose an approach

Compare the examples by repository setup, prerequisites, and risks before adopting one. Each company implemented this in its own environment; measure each change against your own baseline.

- **[OpenAI](https://starsling.dev/ci-playbooks/openai#prebuilt-packages)**: Use it when Install logs show a source build for a dependency that also ships compatible binaries. Check before adopting: Check interpreter, platform and dependency compatibility for every version in the matrix before pinning.
- **[Uber](https://starsling.dev/ci-playbooks/uber#prebuilt-toolchain)**: Use it when Cold runs spend substantial time compiling an upstream tool that has a compatible, trusted binary release. Check before adopting: Verify platform support, compiler compatibility, checksums and generated output, and keep a source build for platforms without a binary release.

## Apply this technique

````text
Evaluate and apply this CI technique to my repository: Install prebuilt packages and toolchains.

Download compatible prebuilt dependencies instead of compiling the same toolchain or package during every CI run.

Read the technique and its source-backed company examples: https://starsling.dev/ci-playbooks/techniques/prebuilt-toolchains.md

Inspect this repository’s CI workflows, build and test commands, dependencies, and recent run timings. Identify where this technique applies and explain the expected benefit using this repository’s evidence.
Measure a baseline from recent comparable runs: elapsed time, queue time, runner minutes and failures where available. If data is unavailable, say what cannot be measured.
Compare relevant company approaches, checking prerequisites, platform differences and tradeoffs. Rank applicable options by evidence, fit and measurable opportunity; do not present company results as predictions for this repo.
Recommend the smallest safe change, show what checks and fallback paths remain, and ASK ME WHICH CHANGE TO APPROVE BEFORE EDITING ANY FILES.
Only after approval, work on a new feature branch, make one reversible change, and open a reviewable pull request. Never merge or push to a default or protected branch.
Keep required checks, test coverage, deployment and release behavior intact. Validate the change and compare equivalent runs where possible; report limitations and what should be monitored after merge.
````

## How companies used this technique

Read what each company changed and follow the original sources.

### OpenAI: Install prebuilt packages

The Python SDK selected NumPy versions that ship wheels for every supported interpreter, so installs download a binary. The same PR restored environment caching and ran only the HTTPX 2 suite in the HTTPX 2 job; the job timings cover all three changes. OpenAI later moved the repository to uv (openai/openai-python#3653).

Evidence: Source PR/commit evidence

HTTPX 2 job 10m42s to 2m12s; Python 3.14 job 8m37s to 1m53s ([Source](https://github.com/openai/openai-python/pull/3573))

Repository moved to uv; the NumPy wheel selection carried into uv.lock ([Source](https://github.com/openai/openai-python/pull/3653))

Use it when: Install logs show a source build for a dependency that also ships compatible binaries.

Before applying it: Check interpreter, platform and dependency compatibility for every version in the matrix before pinning.

[Read more in the OpenAI playbook](https://starsling.dev/ci-playbooks/openai#prebuilt-packages)

[Primary source](https://github.com/openai/openai-python/pull/3573)

### Uber: Download the compiler your build depends on

SubmitQueue registered a prebuilt protoc toolchain, so cold builds no longer compile protoc and its C++ dependencies. The same 35 tests passed before and after.

Evidence: Source PR/commit evidence

On the author's machine, a cold make test after bazel clean took about 84s before and about 11s after, with the same 35 tests passing. ([Source](https://github.com/uber/submitqueue/pull/165))

Use it when: Cold runs spend substantial time compiling an upstream tool that has a compatible, trusted binary release.

Before applying it: Verify platform support, compiler compatibility, checksums and generated output, and keep a source build for platforms without a binary release.

[Read more in the Uber playbook](https://starsling.dev/ci-playbooks/uber#prebuilt-toolchain)

[Primary source](https://github.com/uber/submitqueue/pull/165)

## CI optimization is continuous work.

Apply this technique yourself, or use StarSling Runners for faster GitHub Actions and optional agent-driven optimization PRs, which teams on eligible paid plans can turn on.

[Get self-improving CI](https://starsling.dev/products/runners)

## Related techniques

### [Bake stable dependencies into runner images](https://starsling.dev/ci-playbooks/techniques/prebuild-runner-images)

Prepare versioned system dependencies and build downloads once in the runner image instead of installing them on every job.

2 implementations · 2 companies (Anthropic, Linear)

### [Cache package downloads and dependency stores](https://starsling.dev/ci-playbooks/techniques/reuse-package-downloads)

Restore package-manager downloads or dependency stores while keeping a locked install that validates the requested dependency graph.

7 implementations · 6 companies (DoorDash, Linear, Shopify, Spotify, Stripe, Uber)

### [Cache the directories the build actually uses](https://starsling.dev/ci-playbooks/techniques/cache-real-output-paths)

Align restored and saved cache paths with the tool’s real output directories so the next run can use the cached work.

2 implementations · 2 companies (OpenAI, Uber)

## Company Playbooks

### [Anthropic](https://starsling.dev/ci-playbooks/anthropic)

Run only affected tests

### [DoorDash](https://starsling.dev/ci-playbooks/doordash)

Run build and test in parallel, sharded across CI agents

### [Linear](https://starsling.dev/ci-playbooks/linear)

Benchmark the same job on faster hardware

### [Mastra](https://starsling.dev/ci-playbooks/mastra)

StarSling runners for the slowest test workflow

### [OpenAI](https://starsling.dev/ci-playbooks/openai)

Rank CI fixes by the minutes they save

### [Ramp](https://starsling.dev/ci-playbooks/ramp)

Move a CPU-bound test suite to a faster CPU

### [Shopify](https://starsling.dev/ci-playbooks/shopify)

Let an agent iterate against one CI metric

### [Spotify](https://starsling.dev/ci-playbooks/spotify)

Build arm64 on native arm64 runners

### [Stripe](https://starsling.dev/ci-playbooks/stripe)

Run only the tests a change can reach

### [Uber](https://starsling.dev/ci-playbooks/uber)

Build the merge-queue speculations most likely to be needed

## Related guides

Implementation guides for this technique.

### [Cache workflow dependencies](https://starsling.dev/best-practices/github-actions/cache-dependencies)

Choose dependency cache paths and keys for your package manager.

### [Cut repeated test setup](https://starsling.dev/best-practices/github-actions/cut-repeated-test-setup)

Share expensive setup at the scope your tests need.

### [Share setup steps across jobs](https://starsling.dev/github-actions/optimizations/avoid-duplicated-setup)

Centralize repeated setup definitions and remove duplicate or unused steps.

### [Optimize npm installs](https://starsling.dev/github-actions/optimizations/optimize-npm-install)

Cache npm dependencies and large downloads and remove unused tool installs.

### [Optimize pnpm installs](https://starsling.dev/github-actions/optimizations/optimize-pnpm-install)

Set up the pnpm store cache in the right order and scope recursive commands.
