Installation¶
Bioconda¶
fqxv is packaged on Bioconda, which is the
easiest way to get it into a project environment.
With pixi:
pixi add bioconda::fqxv
With conda (or mamba/micromamba) — Bioconda needs the conda-forge
channel alongside it:
conda install -c conda-forge -c bioconda fqxv
Pin the version for reproducibility:
pixi add "bioconda::fqxv==0.7.0"
Or declare it in a pixi.toml / environment.yml:
# pixi.toml
[dependencies]
fqxv = { version = "==0.7.0", channel = "bioconda" }
# environment.yml
channels: [conda-forge, bioconda]
dependencies:
- fqxv=0.7.0
The recipe carries a run_exports pin on the minor version, so while fqxv is
pre-1.0 an environment solved against it stays on the minor series it was built
with. That pin is about the CLI surface, which is still 0.x — the on-disk
format is stable at 1.0 and archives stay readable across releases regardless.
Containers¶
Because fqxv is on Bioconda, BioContainers automatically publishes a Docker/Singularity image for every release — no local build required.
# Docker / Podman
docker run --rm -v "$PWD:/data" -w /data \
quay.io/biocontainers/fqxv:0.7.0--hfa8f182_0 fqxv compress reads.fastq.gz
# Singularity / Apptainer
singularity run \
https://depot.galaxyproject.org/singularity/fqxv:0.7.0--hfa8f182_0 fqxv --help
quay.io publishes no latest tag for Bioconda-derived images, so a tag has to
name a concrete <version>--<build> that really exists. The pins here track the
current Bioconda release and are refreshed weekly by a CI job
(.github/workflows/bioconda-sync.yml). BioContainers builds an image a day or
two behind a new release, so just after a release the tag here may still name
the previous version — see
quay.io for every
published <version>--<build> tag.
The image carries only the fqxv CLI. Mount your working directory (the -v
above) so fqxv can read the FASTQ and write the archive back out; Singularity
bind-mounts $PWD by default.
Nextflow¶
In Nextflow, point a process at the image directly
or let the conda directive resolve it:
process FQXV_COMPRESS {
container 'quay.io/biocontainers/fqxv:0.7.0--hfa8f182_0'
// or: conda 'bioconda::fqxv=0.7.0'
input:
tuple val(meta), path(reads)
output:
tuple val(meta), path("${meta.id}.fqxv")
script:
"""
fqxv compress ${reads} -o ${meta.id}.fqxv --verify --threads ${task.cpus}
"""
}
Pin the version for reproducibility, as above. Dropping the version from the
conda directive (conda 'bioconda::fqxv') resolves to whatever is current in
Bioconda instead, which is convenient for ad-hoc runs but makes the pipeline
non-reproducible.
Pass --threads ${task.cpus} so fqxv respects the executor's allocation
rather than its default of 16 workers. Output is deterministic regardless of
thread count, so the same input still produces a byte-identical archive when the
allocation changes. --verify re-decodes the fresh archive and only commits it
on a clean round-trip, which is worth the time in a pipeline that deletes its
FASTQ afterwards.
The same shape works for Snakemake (conda: / container: directives) and for
WDL/CWL (docker: runtime).
Prebuilt binaries¶
Every release attaches a static fqxv binary per platform to its GitHub
Release, plus a SHA256SUMS.txt:
| Asset | Platform |
|---|---|
fqxv-vX.Y.Z-x86_64-unknown-linux-musl.tar.gz |
Linux x86-64 (static, any distro) |
fqxv-vX.Y.Z-aarch64-unknown-linux-musl.tar.gz |
Linux arm64 (static) |
fqxv-vX.Y.Z-x86_64-apple-darwin.tar.gz |
macOS Intel |
fqxv-vX.Y.Z-aarch64-apple-darwin.tar.gz |
macOS Apple silicon |
fqxv-vX.Y.Z-x86_64-pc-windows-msvc.zip |
Windows x86-64 |
VER=v0.7.0 # the latest release tag
curl -LO https://github.com/rnabioco/fqxv/releases/download/$VER/fqxv-$VER-x86_64-unknown-linux-musl.tar.gz
tar xzf fqxv-$VER-x86_64-unknown-linux-musl.tar.gz
mv fqxv ~/.local/bin/
The binaries are built for each target's generic baseline; fqxv-rans picks its
AVX2/AVX-512 paths at runtime, so one binary runs on old and new CPUs alike.
Reach for these when you want a single static file with no environment manager
around it — Windows is binary-only, since Bioconda does not target it.
Prerequisites (building from source)¶
- Rust 1.95 or later (the workspace MSRV)
- Cargo (comes with Rust)
Building the CLI¶
git clone https://github.com/rnabioco/fqxv.git
cd fqxv
cargo build --release
The binary is at target/release/fqxv. Copy it onto your PATH:
cp target/release/fqxv ~/.local/bin/
Or install it into ~/.cargo/bin without keeping a checkout:
cargo install --git https://github.com/rnabioco/fqxv fqxv-cli
Verify:
fqxv --version
fqxv --help
Using the crates¶
fqxv is a Cargo workspace of one-crate-per-algorithm codecs plus the fqxv
container library. Depend on whichever layer you need:
[dependencies]
# the whole archiver (container + all codecs)
fqxv = { git = "https://github.com/rnabioco/fqxv.git" }
# or an individual codec
fqxv-rans = { git = "https://github.com/rnabioco/fqxv.git" } # rANS Nx16
fqxv-range = { git = "https://github.com/rnabioco/fqxv.git" } # range coder
fqxv-fqzcomp = { git = "https://github.com/rnabioco/fqxv.git" } # quality model
fqxv-seq = { git = "https://github.com/rnabioco/fqxv.git" } # sequence model
fqxv-tokenizer= { git = "https://github.com/rnabioco/fqxv.git" } # read-name tokenizer
fqxv-reorder = { git = "https://github.com/rnabioco/fqxv.git" } # read clustering
fqxv-lroverlap= { git = "https://github.com/rnabioco/fqxv.git" } # long-read overlap codec
fqxv-align = { git = "https://github.com/rnabioco/fqxv.git" } # banded alignment / WFA
fqxv-bytes = { git = "https://github.com/rnabioco/fqxv.git" } # shared byte primitives
fqxv-dna = { git = "https://github.com/rnabioco/fqxv.git" } # shared nucleotide primitives
(fqxv-bytes and fqxv-dna are leaf crates of the LEB128/zig-zag and 2-bit
ACGT/revcomp primitives the codec crates share; the codecs pull them in
transitively, so you rarely depend on them directly.)
The crates are not published to crates.io — distribution is the CLI binaries above and the Python package below — so depend on them by git.
Every crate is dual-licensed MIT OR Apache-2.0.
Python¶
A read-only Python package reads .fqxv archives directly — see the
Python API:
uv pip install fqxv
It ships abi3 wheels on PyPI and is separate from the Bioconda CLI package: install both if you want to compress from the shell and read archives from Python.
Development¶
cargo nextest run --workspace # unit + property tests (CI uses --profile ci)
cargo test --doc --workspace # doctests (nextest does not run these)
cargo clippy --workspace --all-targets --features fqxv-rans/bench
cargo fmt --all
CI runs the same set with RUSTFLAGS=-Dwarnings, plus a build against the 1.95
MSRV.
Benchmarks (against gzip / zstd / xz / fqz_comp / fqzcomp5 / SPRING / CoLoRd)
live under bench/ and run in the bench pixi environment
declared in the root pixi.toml (pixi install -e bench); see the repository
bench/README.md.