A fast R package manager,
written in Rust.

Manage R packages, lockfiles, and R versions with one tool. Works with CRAN, Bioconductor, and GitHub.

Install benchmarks

Parallel downloads, global package cache with CoW cloning, no R process for binary installs. macOS arm64, R 4.5, P3M binaries. Median of 5 runs, index caches warm. First-install comparison: uvr pre-resolves deps via uvr lock (separate step) and only uvr sync (install) is timed; install.packages/pak/renv resolve + install inline. For a like-for-like lockfile-restore comparison, see pak::lockfile_install() and renv::restore().

ggplot2
17 packages
uvr
0.21s
renv
0.54s
install.pkgs
4.4s
pak
5.6s
21x faster than install.packages() (first install)
tidyverse
99 packages
uvr
0.27s
renv
0.82s
pak
8.1s
install.pkgs
11.8s
44x faster than install.packages() (first install)

What it does

Package resolution, lockfiles, R version management, and isolated project libraries.

Fast installs

Parallel downloads, native tar extraction, no R process for binary packages.

🔒

Reproducible

uvr.lock pins exact versions and checksums. Commit it, and everyone gets the same environment.

📦

Project-isolated

Each project gets its own library in .uvr/library/. No cross-project version conflicts.

🅐

R version management

Install and switch R versions with uvr r install and uvr r use. Pin per-project via .r-version.

🚀

CRAN + Bioconductor + GitHub

Install from any registry. Specify GitHub packages directly in your manifest.

CI-ready

--frozen mode ensures CI uses exactly the locked versions. No surprises in production.

🌐

Cross-platform

Works on macOS, Linux, and Windows. Same workflow everywhere your code runs.

💾

Single static binary

One ~8 MB binary with zero dependencies. Download it and you're done.

Up and running in seconds

1

Initialize a project

Creates a uvr.toml manifest with your R version and empty dependency list.

2

Add packages

Resolves dependencies, writes the lockfile, and installs everything in one step.

3

Sync the environment

Installs exactly what the lockfile says. Idempotent and fast on repeat runs.

4

Run your script

Executes R with the project library on the search path. No library() preamble needed.

# Initialize a project $ uvr init analysis Created uvr.toml and .Rprofile   # Add packages — resolve, lock, install in one step $ uvr add ggplot2 dplyr Resolving dependencies + ggplot2 3.5.1 + dplyr 1.1.4 · 14 transitive deps resolved Locked 16 packages in 0.8s Installed 16 packages in 2.1s   # Run a script in the isolated env — no library() needed $ uvr run analysis.R

Feature comparison

How uvr compares to renv, pak, rv, rig, and pixi.

Feature uvr renv pak rv rig pixi
Declarative manifest ✓† ✓†
Lockfile
R version management
Run scripts in isolated env
CRAN packages ✓*
Bioconductor packages ✓*
GitHub packages
System dep detection (Linux)
CI mode (--frozen)
No admin rights required
Standalone CLI (no R required)
Windows support

* Via conda-forge channel, not native CRAN/Bioconductor integration.   † Via DESCRIPTION-based workflow, not a dedicated manifest format.

Install

Single binary, no dependencies. Pick your method.

Quick install

macOS and Linux — downloads the latest release

$ curl -fsSL https://raw.githubusercontent.com/nbafrank/uvr/main/install.sh | sh

Arch Linux (AUR)

Install via your favorite AUR helper

$ yay -S uvr

From R

Install via the companion R package

> pak::pak("nbafrank/uvr-r")
> uvr::install_uvr()

From source

Build with Cargo (requires Rust toolchain)

$ cargo install --git https://github.com/nbafrank/uvr

Use uvr from R

The companion R package lets you manage your project without leaving the R console. Initialize projects, add packages, sync environments, and manage R versions — all from familiar R syntax.

View uvr-r on GitHub →
# Install the companion package > pak::pak("nbafrank/uvr-r") > library(uvr)   # Manage your project from R > init() Created uvr.toml > add("ggplot2") + ggplot2 3.5.1 (+ 8 deps) Installed 9 packages in 1.4s > sync() Environment up to date