posit-dev / r-cran-status
Look up an R package's live status on cran.r-project.org - submission/review state (queue, human review, waiting, archived, past version's fate) or R CMD check results (OK/NOTE/WARN/ERROR per platform). Use for "what's the CRAN status of X", "did X get accepted/rejected", "is X passing CRAN checks", "when was version Y archived".
CRAN Package Status
Check a package's submission/review state, a specific historical version's
fate (e.g. {package} {version}, as in btw v1.4.0), or its currentR CMD check results across CRAN's test platforms.
"CRAN status" is ambiguous between two questions:
Submission status: is/was this package (or version) in review,
published, archived, or rejected? See "Submission Status".Check results: is the published version passing
R CMD checkon all
platforms, or does it have WARN/ERROR/NOTE flags risking removal? See
"Check Results".
CRAN's servers are a shared, unpaid resource. Never issue requests in
parallel or in a tight loop — pause briefly (e.g. sleep 1) between
requests, stop looping as soon as a match is found, and avoid re-fetching a
page you've already checked in this session.
Workflow
Ask for the package name if not provided. A version may also be given
(e.g.btw v1.4.0orbtw 1.4.0); strip any leadingv.Decide which question is being asked:
Version given, or request mentions submission, review, the queue, or
rejection/archival → Submission Status.Request mentions checks,
R CMD check, WARN/ERROR/NOTE, or
platforms/flavors → Check Results.If genuinely ambiguous (e.g. just "check the CRAN status of x"), ask
which is meant, or check both and report both.
- Follow the relevant section below and report the result.
Submission Status
- Check the currently published version first (see below).
If no version was requested, or it matches the current version: report it
as the current, published release. Skip to step 5 unless it's absent fromPACKAGES, in which case continue to step 3.If a prior check this conversation already located the package in a
stage or reviewer folder, check that folder first, then forward from it
in the pipeline order (see "CRAN Review Stages") — don't re-sweep from
the start. Otherwise, sweep all stage and reviewer folders.- Search the
incoming/stage folders (see below). - Search the reviewer-assigned folders (see below).
If a specific version was requested and doesn't match the current
published version (or the package isn't published at all), check the
CRAN Archive for that version (see below).- Report the result (see "Reporting Submission Status Results").
CRAN Review Stages
Listed in typical pipeline order — a package usually moves top to bottom,
though not every package passes through every stage:
inspect/newbies: awaiting initial manual inspection (newbiesis for
first-time submitters)pending: awaiting closer reviewhuman/<initials>: assigned to a CRAN reviewerpretest: automated checks (re)runningwaiting: CRAN is waiting for a maintainer response (loops back topretestonce the maintainer responds)recheck: reverse-dependency checkspublish: approved and awaiting publicationarchive: rejected
Checking Incoming Stage Folders
Replace {package} with the actual package name. Start at the last-known
stage if one exists (see Submission Status step 3), else at inspect:
for stage in inspect newbies pending pretest waiting recheck publish archive; do
curl -Ls "https://cran.r-project.org/incoming/$stage/" |
grep -Eio '[^"]*{package}[^"]*' &&
echo "Stage: $stage" && break
sleep 1
doneChecking Reviewer-Assigned Folders
Reviewer-initials folders (e.g. human/KH) change as CRAN's team changes,
so discover them from the incoming/ listing instead of a fixed set: any
folder there that isn't one of the stage names above is a reviewer folder.
reviewer_folders=$(
curl -Ls "https://cran.r-project.org/incoming/" |
grep -Eio '<a href="[^"]+/">' |
sed -E 's/<a href="([^"]+)\/">/\1/' |
grep -Ev '^(inspect|newbies|pending|pretest|publish|recheck|archive|waiting|special)$'
)
for stage in $reviewer_folders; do
curl -Ls "https://cran.r-project.org/incoming/$stage/" |
grep -Eio '[^"]*{package}[^"]*' &&
echo "Stage: human/$stage" && break
sleep 1
doneChecking Whether the Package Is Already Published
curl -Ls https://cran.r-project.org/src/contrib/PACKAGES |
awk -v pkg="{package}" '
$0 == "Package: " pkg { found=1 }
found && /^Version:/ { print; exit }
'A printed Version: line is the current CRAN version. Remember it — needed
later to say whether a requested older version was "superseded by" it.
Checking a Specific Version in the CRAN Archive
Superseded versions move out of src/contrib/ into a per-package archive
folder. This Archive is unrelated to the archive incoming/ stage above
(that means "rejected"; this means "an older version, since superseded").
curl -Ls "https://cran.r-project.org/src/contrib/Archive/{package}/" |
grep -Eio '[^"]*{package}_{version}\.tar\.gz[^"]*'A matching .tar.gz filename means that exact version was published and has
since been superseded.
Reporting Submission Status Results
No version requested:
- Present in
PACKAGES: report as published, with current version. Else found in an
incoming/or reviewer folder: report the folder name
and meaning from the stage list above.- Else: report it wasn't found in CRAN's submission queue or index.
- Present in
Specific version requested:
- Matches current version in
PACKAGES: report as the current release. Else found in the CRAN Archive: report it was published and has been
superseded by the current version (fromPACKAGES), e.g. "available in
the archive, superseded by v1.5.0".Else the package (any version) is found in an
incoming/or reviewer
folder: report that stage, noting the requested version wasn't a past
release.Else: report the requested version wasn't found (current, archived, or
in-review).
- Matches current version in
Check Results
CRAN publishes per-platform R CMD check results for every published
package at https://cran.r-project.org/web/checks/check_results_{package}.html.
WARN or ERROR results persisting more than ~2-4 weeks risk archival by CRAN.
Fetch and simplify the results table:
curl -Ls "https://cran.r-project.org/web/checks/check_results_{package}.html" |
grep '<tr> <td>' |
sed -E 's/<[^>]+>/ /g' |
awk '{print $1": "$NF}'Prints one flavor: STATUS line per row, e.g.:
r-devel-linux-x86_64-debian-clang: OK
r-oldrel-windows-x86_64: ERRORStatus is OK, NOTE, WARN, or ERROR. For any non-OK flavor, full
failure output is further down the same page under "Check Details" — fetch
again without stripping tags and read the <pre>-formatted section after
the failing flavor's Version: / Check: / Result: lines.
A 404 means no CRAN check history — likely not currently published. Check
submission status instead.
Reporting Check Results
- Every flavor
OK: report the package passes checks on all platforms. Any flavor
NOTE/WARN/ERROR: list affected flavors and status,
summarize failure reason(s) from "Check Details", and note that
persistent WARN/ERROR can lead to archival.Page 404s: report no check results exist; check/report submission status
instead.