One command clones aphrody-labs/bun, installs everything the build needs and ends with a debug build that prints its version (bun bd --version).
curl -fsSL https://aphrody.app/bun/setup.sh | bash
irm https://aphrody.app/bun/setup.ps1 | iex
The same launchers live in the repository and can be fetched from GitHub directly:
curl -fsSL https://raw.githubusercontent.com/aphrody-labs/bun/main/scripts/aphrody/install-dev.sh | bash
irm https://raw.githubusercontent.com/aphrody-labs/bun/main/scripts/aphrody/install-dev.ps1 | iex
Plan for about 30 GB of free disk space. The first run takes 30 minutes on 10 cores (a fresh Ubuntu 26.04 container), longer on smaller machines; most of it is the first build.
What it does
install-dev.sh (Ubuntu/Debian, Alpine, macOS) and install-dev.ps1 (Windows) install the Aphrody runtime's bun when the machine has none or has an upstream one (scripts/aphrody/install.sh / install.ps1, verified against the release's SHA256SUMS.txt). They then run scripts/aphrody/setup.ts, which takes these steps in order:
| Step | Linux | macOS | Windows |
|---|---|---|---|
| Clone | git clone --filter=blob:none into ~/bun | ~/bun | C:\bun |
| System packages | apt or apk: compiler, CMake, NASM, ccache, git | Xcode Command Line Tools, Homebrew: CMake, NASM, ccache | winget: Git, CMake, NASM, PowerShell 7 |
LLVM, at the series of pins.llvm | apt.llvm.org (Debian/Ubuntu), edge/main (Alpine) | brew install llvm@23 | release tarball, verified against the sha256 digest GitHub publishes for it, in %LOCALAPPDATA%\bun\toolchain, with BUN_TOOLCHAIN_LLVM set |
| Rust | rustup-init, verified against its .sha256, then rustup toolchain install for rust-toolchain.toml | same | same |
| MSVC and the Windows SDK | bun msvc setup --toolset 14.44 | ||
| JS dependencies | bun install | same | same |
| Native dependencies | every clone-* target of the build: vendor/* at their pinned commits, the WebKit prebuilt, Node.js headers | same | same |
| First build | bun bd --version | same | same |
Every step checks its own result first. A second run, or a run after a failure, only does what is missing. Downloads are cached in ~/.bun/setup-cache under their sha256.
Options
Options go after bash -s -- on Linux and macOS, or in APHRODY_BUN_SETUP_ARGS on Windows. In a checkout, pass them to the script itself:
curl -fsSL https://aphrody.app/bun/setup.sh | bash -s -- --dry-run
bun scripts/aphrody/setup.ts --no-build
$env:APHRODY_BUN_SETUP_ARGS = "--dry-run"; irm https://aphrody.app/bun/setup.ps1 | iex
| Option | Effect |
|---|---|
--dry-run | Print each step with its state and the commands it would run. Nothing is changed. Add --json to get the plan as JSON. |
--dir <path> | Checkout to use or create. APHRODY_BUN_CHECKOUT sets the default. |
--ref <ref> | Branch or tag to clone. Defaults to main. |
--no-build | Stop before bun bd --version. |
--no-system | Skip the system packages, for machines where you manage them yourself. |
--no-update | Leave an existing checkout as it is. By default, a clean checkout on a branch is fast-forwarded. |
--packages | Also fetch the Cargo git dependencies of packages/* (the aphrody-labs forks of Oxc, PyO3 and wry). |
APHRODY_BUN_REPO points the launchers and the clone at another repository. GITHUB_TOKEN or GH_TOKEN, when set, is sent with the GitHub API requests.
Dependencies
scripts/aphrody/deps.json lists every dependency of the build: the vendored C/C++ libraries and their commits, the WebKit prebuilt, the Cargo git dependencies of packages/*, our forks (aphrody-labs/*) and the toolchains, each with its pinned ref and GitHub visibility. It is generated from the sources, and a test fails when they pin something else:
bun scripts/aphrody/setup.ts deps --write # regenerate, visibility from `gh repo view`
bun scripts/aphrody/setup.ts deps --check # what test/internal/aphrody-setup.test.ts checks
The build fetches the native dependencies itself as GitHub archives at pinned commits. Committed vendor sources, optional checkouts (bun run vendor:setup) and the remaining submodules are listed in vendor.md. npm dependencies, including tailwindcss, come from the registry through bun.lock.
Manual setup
To install the toolchains yourself, see Contributing and Building Windows, then run bun scripts/aphrody/setup.ts --no-system to check what is still missing.