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, no R process for binary installs. Cold install — empty library, empty caches — in the pinned benchmark container (Linux x86_64, R 4.5.3), with P3M's Linux binary endpoint configured for every tool. Median of 3 runs, CI-reproducible. 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().

tidyverse
99 packages
uvr
10.4s
renv
60.1s
pak
19.3s
install.pkgs
29.2s
2.8x faster than install.packages(), 5.8x faster than renv
ggplot2
17 packages
uvr
2.2s
renv
12.4s
pak
9.5s
install.pkgs
6.3s
2.9x faster than install.packages(), 5.7x faster than renv

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 ~12 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 selection / pinning
Installs R itself
Run scripts in isolated env
CRAN packages ✓*
Bioconductor packages ✓*
GitHub packages
System dep detection (Linux) ✓‡
CI mode (fail on stale lock)
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.   ‡ Per rv sysdeps’ own help, coverage is currently Ubuntu/Debian.

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