courieR syncs installed R packages between R versions on the same machine — migrate from old to new, keep multiple versions in parity, or selectively copy packages in either direction. No manual reinstalling, no lost libraries.
Install from GitHub (CRAN submission pending):
# install.packages("remotes")
remotes::install_github("lennon-li/courieR")library(courieR)
open_hub() # launches the Shiny dashboardThe dashboard detects all R installations on your machine, displays them in a header bar, and lets you compare and sync packages between any two.
courieR detects every R installation on your system, scans their package libraries, and lets you push packages between them — one-way or bidirectionally — using pak under the hood.
R 4.4.1 ──▶ compare() ──▶ missing / outdated packages found
──▶ ship() installs or upgrades into target R
find_routes() searches multiple sources per platform so
it finds installs regardless of whether admin rights were used:
| Platform | Sources searched |
|---|---|
| Windows | HKLM registry (admin installs), HKCU registry (non-admin installs),
%ProgramFiles%\R, %LOCALAPPDATA%\Programs\R,
%USERPROFILE%\Documents\R, rig-managed versions |
| macOS | System R framework (/Library/Frameworks), user
framework (~/Library/Frameworks), Homebrew
(/opt/homebrew, /usr/local), rig-managed
versions |
| Linux | /opt/R (rig system), ~/.local/share/rig/R
(rig user), conda environments, custom paths |
| Function | What it does |
|---|---|
open_hub() |
Launch the Shiny dashboard |
find_routes() |
Detect all R installations on the system |
manifest() |
List packages installed in an R version |
inventory() |
Compare two package libraries |
ship() |
Copy packages from one R to another (CLI) |
The Sync tab is the main workflow:
Prefer scripting? Use ship() directly:
library(courieR)
routes <- find_routes()
print(routes[, c("version", "rscript_path")])
# dry run first
result <- ship(
source_path = routes$rscript_path[1],
target_path = routes$rscript_path[2],
dry_run = TRUE
)
print(result$plan)
# for real (upgrade = TRUE ensures outdated packages are also updated)
result <- ship(
source_path = routes$rscript_path[1],
target_path = routes$rscript_path[2],
upgrade = TRUE
)