What this is
This is an opinionated package taking bioinformatics and computational biology workflows from R and Python, reimplementing them in Rust and exposing them through thin R wrappers. Gene set enrichment, co-expression modules, biomedical ontologies, graph and diffusion methods, differential expression, and a full single cell suite that goes from raw h5 to annotated clusters, plus a huge number of analysis methods for single cell. Result? Blazingly fast performance with low memory usage, making large-scale analysis feasible without any cloud compute.
Every exported function validates its inputs on the R side. The heavy numerics live in the standalone bixverse-rs crate, so the R layer stays a wrapper and nothing more.
Atlas scale on a laptop

The 1 million cell PBMC data set from Parse Biosciences, end to end, on a MacBook Air M3 with 24 GB. Parse’s own guide for that same data set recommends you move to the cloud and pick an instance with at least 8 threads and 160 GB of RAM.
| Step | CPU | GPU |
|---|---|---|
| Stream and process to disk the 24 samples | ~3.5 min | |
| HVG selection (2k genes) | ~10 s | |
| PCA (32 components) | ~25 s | 15 s |
| kNN graph | ~90 s (NNDescent) | <30 s (CAGRA) |
Nothing here loads the full matrix into memory at any point. Counts sit on disk in a Rust binary format, metadata sits in DuckDB, and the analysis streams data in small chunks to not blow up your memory. You can even write pipelines like this here:
pipeline <- sc_pipeline() %>>%
step_hvg_sc(hvg_no = 2000L) %>>%
step_pca_sc(no_pcs = 20L) %>>%
step_harmony_sc(batch_column = "plate") %>>%
step_neighbours_sc() %>>%
step_clusters_sc(res = 0.5)
sc_object <- apply_pipeline(pipeline, sc_object)Pipelines are inert. Nothing runs until you apply one, and the same chain works on a SingleCells, on a SingleCellsSubset, or once per group via apply_pipeline_per_group() (useful for sub cell type analysis).
Full walk-through: scaling to millions of cells. What changed in each release: the changelog.
What’s in it
| Domain | What’s in there | Read more |
|---|---|---|
| Gene set enrichment | Hypergeometric tests, fgsea, GSVA, ssGSEA, singscore, mitch, plus GO-aware elim methods | GSE methods, pathway activity |
| (Single cell) Regulons | SCENIC, CisTarget motif enrichment, regulon binarisation | bag of genes |
| Bulk co-expression | CoReMo, stabilised ICA, contrastive PCA, NMF and consensus NMF, DGRDL | co-expression modules, contrastive PCA |
| Bulk DGE | limma-voom via edge-rs (no limma or edgeR needed), Hedges’ g effect sizes, batch correction, TPM and RPKM, structured handling of many contrasts | bulk DGE |
| Ontologies | Resnik, Lin and Wang semantic similarities over disease, phenotype and gene ontologies | semantic similarities |
| Graphs | Network diffusion, constrained page rank, reciprocal best hit graphs, similarity network fusion, community detection | diffusions and communities |
| Single cell | Streaming i/o, QC, doublet detection, HVG, PCA, Harmony, fastMNN, BBKNN, LISI and ASW integration metrics, kNN and clustering, markers, pseudobulk DGE, AUCell, hotspot, VISION, NMF, LDA | start here, then the Single Cells menu |
| Single cell, counts | CellSweep ambient RNA removal, analytic Pearson residuals and scTransform v2 for HVG selection and PCA. Fit and HVG stream; residual PCA is dense, so it caps out before atlas scale | CellSweep, residuals |
| Single cell, advanced | Symphony reference mapping, NicheNet ligand receptor, DIALOGUE multicellular programmes, Palantir and PAGA trajectories | Symphony, NicheNet, DIALOGUE, trajectories |
| Meta cells | Generation, purity and entropy diagnostics, the full downstream analysis surface | meta cells |
| Multi-modal | ADT counts, DSB normalisation, WNN graphs | multi-modal analysis |
The “bixverse ecosystem”
- bixverse.plots for, you guessed it, plotting. Especially a large number of plotting helpers for single cell.
- bixverse.gpu for GPU-accelerated methods, built on cubecl/Burn with wgpu backends, so it works on (theoretically) any GPU. If you do single cell stuff, have a look. Some of the implementations in there make everything substantially faster.
- manifoldsR for manifold learning: UMAP, tSNE, diffusion maps, and a cool clustering method called EVoC. Every 2D visualisation in the single cell suite goes through it.
- genewalkR is the graph-heavy one. Ships a database of gene to gene interaction and regulatory networks. Useful across a lot of computational biology workflows.
Installation
The easy route is r-universe. You get a pre-built binary, so no Rust toolchain and no compile:
install.packages(
"bixverse",
repos = c("https://gregorlueg.r-universe.dev", "https://cloud.r-project.org")
)From source
Building from source needs Rust on your system. Install guide here, and the rextendr guys have written a lot of further help on the Rust set up here. (bixverse uses rextendr to interface with Rust.)
- In the terminal, install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- In R, install rextendr:
install.packages("rextendr")
- Install bixverse. Keep the r-universe repo in the list:
manifoldsRandbixverse.plotslive there, not on CRAN.
Windows
Windows works. It used to not, and the reason turned out to be dull: nothing to do with the Rust toolchain or the h5 cross-compile I blamed for a long time. R CMD INSTALL builds in a deep temp directory, and the HDF5 C library that gets compiled for h5ad support pushed the CMake object paths to 265 characters against a 260 character MAX_PATH. The object file silently never lands, and CMake then reports gcc as “not able to compile a simple test program”. The build now puts the cargo target directory in ~/.bixverse-cargo, which is short enough to stay clear of it.
Where to start
The package website is the main entry point. Three routes depending on what you’re after:
- Why Rust is here. A show case of how much faster Rust makes a lot of basic functions. If you want to integrate any of this into your own package, please feel free. MIT licence for the win.
- Design choices for single cell. Read this before touching the single cell suite. It explains the on-disk layout, the trade-offs and why things are the way they are.
- The PBMC3k walkthrough for a first end-to-end run on a small data set.
Working with an LLM coding agent? install_agent_skill() drops a bixverse skill into your agent set up so it stops guessing at the API.
Roadmap
Cross integration
Tighter integration with bixverse.gpu and bixverse.plots, both in active development.
For developers
If you wish to contribute, please read the Code Style.
