A new way to publish R packages


Will Landau

Publishing

Central publishers


Chapman & Hall

CRC Press

Penguin

Oxford UP

Nature

PLOS

JASA

JSS

CRAN

Bioconductor

rOpenSci


✅ Pros: visibility for readers

❌ Cons: editorial review

Self-publishing


Kindle Direct

Apple Books

GitHub Pages

arXiv

OSF Preprints

GitHub Pages

R-universe

GitHub

GitLab


✅ Pros: authors control publishing.

❌ Cons: obscurity, lack of oversight

GitHub development silos


pak::pkg_install("wlandau/crew")


pak::pkg_install("stan-dev/cmdstanr")

R-universe development silos


install.packages(
  "crew",
  repos = "https://wlandau.r-universe.dev"
)


install.packages(
  "cmdstanr",
  repos = "https://stan-dev.r-universe.dev"
)

A compromise: dual publishing

✅ A centralized location for self-published releases

✅ Fully automated quality control for production

R-multiverse

A dual repository

  1. Community: an R-universe repository with latest releases.
  2. Production: quarterly snapshots of healthy releases.

Community repository

Community repository

An R-universe repository: community.r-multiverse.org

Latest GitHub/GitLab releases of all registered packages.

Community repository

Middle ground between development and production.

The “QA” (quality assurance) of R packages.

Minimalist submission requirements


Boils down to:


  1. R package with a GitHub/GitLab release.
  2. No malicious activity.
  3. Free open-source license.


Policies are modeled after GitHub Terms of Service.

One-time registration on GitHub


https://github.com/r-multiverse/contributions/pulls

Automated review



Manual review, if required, is minimalist.

Community manifest

packages.json:

[
  ...,
  {
    "package": "webchem",
    "url": "https://github.com/ropensci/webchem",
    "branch": "*release"
  },
  ...
]

New releases direct from maintainers

Installing from Community


install.packages(
  "webchem",
  repos = c(
    "https://community.r-multiverse.org",
    getOption("repos")
  )
)

Production repository

Quarterly snapshots

Production is deployed 4 snapshots each year.

Healthy releases from Community.

Gradually build each snapshot from the ground up.

Production requirements


Community requirements, plus:


R CMD check passes

✅ Version number etiquette

✅ No Remotes field in the DESCRIPTION file

✅ Healthy dependencies

Goal: a solid, stable snapshot

Start with a fluid ecosystem.

Month 1: dependency freeze

Month 2: candidate freeze

Month 3: Production snapshot

Installing from Production


install.packages(
  "polars",
  repos = c(
    "https://production.r-multiverse.org/2025-03-15",
    "https://packagemanager.posit.co/cran/2025-01-15"
  )
)

Recap

Summary


Users can access quality packages from one place.


Maintainers control publishing.


We are inviting new packages submissions.


We are recruiting new packages moderators.

Thanks!

r-multiverse.org

  • R-multiverse co-administrators
    • Jeroen Ooms
    • Maëlle Salmon
    • Charlie Gao
  • rOpenSci: https://ropensci.org/about/
  • R-universe: Jeroen Ooms and rOpenSci.
  • R Consortium:
    • R Repositories Working Group
    • ISC grant 24-ISC-1-05 (2024 H1)

Image credit