---
title: What changed in 2.0
description: Migrating from C++ salmon (≤ 1.12.0) to the Rust salmon 2.0.
---

salmon 2.0 is a from-scratch Rust rewrite. It keeps the same core workflow
(`salmon index` → `salmon quant` → `quant.sf`) and the same output formats
downstream tools consume, but it is a new major version and makes some breaking
changes. This page maps C++ options and behavior to 2.0.

## Breaking change: rebuild your index

:::caution[Rebuild required]
**2.0 uses a new index format and cannot read C++ (pufferfish) indices.** Rebuild
with `salmon index` from 2.0. Loading a C++ index — or pointing C++ salmon at a
2.0 index — is detected and rejected with a clear error.
:::

`quant.sf` is unchanged (drop-in for tximport/tximeta). Inferential replicates
(`aux_info/bootstrap/…` for both `--numBootstraps` and `--numGibbsSamples`) are
written in the same format C++ salmon used, so tximport/fishpond/swish keep
working. The bias-model diagnostic dumps in `aux_info/` are in a documented Rust
format (see the [output format specification](../../reference/output-formats/));
they are not consumed by the standard downstream R packages.

## Removed subcommands

| C++ | 2.0 |
| --- | --- |
| `salmon alevin` | Removed. Use the [alevin-fry](https://github.com/COMBINE-lab/alevin-fry) ecosystem for single-cell. `salmon alevin …` prints a redirect and exits. |

## Removed options

Passing any of these errors out with a pointer to this guide. They are gone
because the underlying feature was removed or has no equivalent in 2.0.

| Option | Subcommand | Why / alternative |
| --- | --- | --- |
| `--features` | index | Index-feature dump not supported by the cf1-rs/piscem-rs index builder. |
| `--mimicBT2`, `--mimicStrictBT2` | quant | bowtie2-mimicking presets removed; selective alignment is the single supported mode. |
| `--minAssignedFrags` | quant | The "zero the output below N assigned fragments" guard was removed; 2.0 reports what it quantifies. |
| `--alternativeInitMode`, `--bootstrapReproject`, `--noGammaDraw` | quant | Inference-internal toggles not present in the 2.0 optimizer/Gibbs implementation. |
| `--numBiasSamples` | quant | 2.0 collects bias samples online (abundance-aware, dual-phase), so a fixed sample budget no longer applies. |
| `--auxTargetFile`, `--writeOrphanLinks` | quant -a | Removed alignment-mode features. |

## Accepted but ignored

These still parse so existing scripts run; 2.0 logs a warning and ignores them
(the behavior is either the default now or handled differently).

- **index:** `--filterSize`
- **quant:** `--eqclasses`, `--noFragLengthDist`, `--noSingleFragProb`,
  `--mismatchSeedSkip`, `--disableChainingHeuristic`, `--hitFilterPolicy`,
  `--maxRecoverReadOcc`, `--validateMappings` (selective alignment is the default)
- **quant -a:** `--mappingCacheMemoryLimit`, `-s/--sampleOut`,
  `-u/--sampleUnaligned`, `--writeQualities`

## New in 2.0

- **`--sketch`** — alignment-free pseudoalignment mode (faster). See
  [mapping modes](../../guides/mapping-modes/).
- **`--sketchStrictOrphans`** — in `--sketch`, only orphan a pair when the other
  mate had no matching k-mers at all (the conservative rule). The default is the
  relaxed rule, which tracks selective alignment more closely.
- **`--allowDovetail`** — now honored in `--sketch` as well.
- **`--ignoreTxVersion`** — compare `-g/--geneMap` identifiers without their
  trailing `.N` version suffix, as tximport's option of the same name does. Off
  by default. See [Ensembl cDNA + GTF](../../reference/cli/#ensembl-cdna--gtf).

## Behavior differences to be aware of

- **Sketch orphan rule** defaults to the relaxed policy (see
  `--sketchStrictOrphans`).
- **`-g/--geneMap`: unmatched transcripts are reported differently, not
  aggregated differently.** As in C++ salmon's `aggregateEstimatesToGeneLevel`, a
  transcript with no gene-map entry is emitted as its own single-transcript gene,
  named after the transcript, so nothing quantified is dropped on the way to gene
  level and `tximport` can apply its own transcript-to-gene policy to the whole
  file. What changed is the reporting: C++ warned once *per unmatched transcript*
  (half a million lines on a failed join), while 2.x warns once with the count
  and writes the names to `aux_info/genemap_unmatched_txps.json`, under an
  `unmatched_transcripts` key.
  That file is removed when nothing is unmatched, so its presence always refers
  to the current run. 2.x additionally warns when the match rate is at or below
  50%, says how many transcripts would match without the version suffix, and
  names `--ignoreTxVersion`. A `quant.genes.sf` whose rows are mostly stand-ins
  is transcript-level output under a gene-level file name; the run's closing line
  says so explicitly when any row is a stand-in.
- **Selective-alignment chain pruning:** 2.0 defaults `--orphanChainSubThresh`
  and `--postMergeChainSubThresh` to `0.0` (off) — it aligns every candidate,
  marginally more sensitive than C++ (`0.95` / `0.9`). Quantification is
  essentially unaffected (per-transcript Pearson ≈ 0.999); pass
  `--orphanChainSubThresh 0.95 --postMergeChainSubThresh 0.9` to reproduce C++
  mapping counts exactly.

## `-p` on compressed input

`-p` is accepted unchanged, but from 2.5.0 it names one execution-slot budget
shared between mapping and gzip decompression, rather than a mapping-thread
count with decompression taken on top. C++ salmon (and 2.x before 2.5.0) could
run more total threads than `-p` on compressed input; 2.5.0 stays within the
budget and divides it from live measurement. Totals and results are unaffected;
wall time on compressed input may differ from what the old accounting produced
at the same `-p`. See
[threads and compressed input](../../reference/cli/#threads-and-compressed-input).

## Unchanged

Index/quant basics, `quant.sf`, `cmd_info.json`, `lib_format_counts.json`,
`aux_info/meta_info.json`, `--libType/-l`, `--seqBias`,
`--gcBias`, `--posBias`, `--numBootstraps`, `--numGibbsSamples`, `--useEM`,
`--dumpEq`, decoys, and `salmon quantmerge`.
