---
title: Installation
description: Install salmon 2.0 via the install script, cargo, conda, Docker, or from source.
---

import { Tabs, TabItem } from '@astrojs/starlight/components';

salmon 2.0 is a single self-contained binary. Pick whichever method fits your
environment.

<Tabs>
  <TabItem label="Install script">
The release [install script](https://github.com/COMBINE-lab/salmon/releases)
downloads the right prebuilt binary for your OS/architecture and puts it on your
`PATH`:

```sh
curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/COMBINE-lab/salmon/releases/latest/download/salmon-cli-installer.sh | sh
```

Prebuilt binaries are provided for Linux and macOS on both x86-64 and aarch64.
The x86-64 build targets a broad SIMD floor (SSE4.2-era) and selects AVX2 at
runtime where available, so one binary runs on essentially any modern CPU.
  </TabItem>

  <TabItem label="cargo">
If you have a Rust toolchain (≥ 1.91):

```sh
cargo install salmon-cli
```

This builds and installs the `salmon` binary from crates.io.
  </TabItem>

  <TabItem label="conda">
```sh
conda install -c bioconda -c conda-forge salmon
```

The `salmon` package tracks the 2.0 (Rust) line. The final C++ release remains
available as `salmon-cpp` for reproducibility.
  </TabItem>

  <TabItem label="Docker">
Multi-arch images (`linux/amd64` + `linux/arm64`) are published on every release
to Docker Hub and GHCR:

```sh
docker pull combinelab/salmon:latest          # or pin a version: :2.2.1
# mirror on GHCR:
docker pull ghcr.io/combine-lab/salmon:latest
```

The image's entrypoint **is** `salmon`, so arguments go straight to it (don't
repeat `salmon`):

```sh
docker run --rm combinelab/salmon:latest --version
```

Mount your data and run as usual — the first argument is the salmon subcommand:

```sh
# build an index
docker run --rm -v "$PWD:/data" -w /data combinelab/salmon:latest \
  index -t transcripts.fa -i salmon_index

# quantify
docker run --rm -v "$PWD:/data" -w /data combinelab/salmon:latest \
  quant -i salmon_index -l A -1 r1.fq.gz -2 r2.fq.gz -p 8 -o out
```

Tags: `latest` (newest release), `X.Y` (e.g. `2.2`), and exact `X.Y.Z` (e.g.
`2.2.1`) — pin `X.Y.Z` for reproducible pipelines.

#### Use with Nextflow and other workflow managers

The image ships `procps`, so `ps` is available and
[Nextflow's container requirements](https://www.nextflow.io/docs/latest/container.html)
are met — without it, every task fails with *"Command `ps` required by nextflow
to collect task metrics cannot be found"*.

One thing to be aware of: this image's entrypoint is `salmon`, which is what lets
you run `docker run combinelab/salmon quant ...` above. A workflow manager
instead supplies its own command, which the entrypoint would swallow:

```console
$ docker run --rm combinelab/salmon:latest /bin/bash -ue -c 'echo hi'
error: unrecognized subcommand '/bin/bash'
```

So point the entrypoint at a shell for those runs. In Nextflow:

```groovy
docker {
    enabled = true
    entrypointOverride = true
}
```
  </TabItem>

  <TabItem label="From source">
```sh
git clone https://github.com/COMBINE-lab/salmon
cd salmon
cargo build --release
# binary at target/release/salmon
```

The repository ships a `.cargo/config.toml` that pins the portable SIMD floor;
release builds use it automatically.
  </TabItem>
</Tabs>

## Verify

```sh
salmon --version
salmon --help
```
