Changes in version 0.3.0 Bug fixes - manifest() no longer leaks the parent R session's library/home environment into the target R subprocess. Previously processx inherited R_LIBS_USER (and R_HOME) from the R running courieR, so every probed installation reported the parent's library — making distinct R versions appear to share one library and compare as 100% identical. The subprocess now strips R_LIBS_USER, R_LIBS, R_LIBS_SITE, and R_HOME while still reading the target R's own .Renviron/.Rprofile. - Dashboard: fixed "Operation not allowed without an active reactive context" on startup, caused by reading a reactiveVal outside a reactive consumer in the sync log helper (now wrapped in isolate()). Dashboard UX - Renamed the core actions to match courieR's shipping vocabulary: Scout (detect installations), Inventory (compare libraries), and Ship (transfer packages). The main tab is now Dispatch, and the Advanced tabs are Restock, Depot, Delivery Receipt, Route, and Manifest. - Detection is no longer automatic on startup; click Scout to scan. A Scout → Inventory → Ship workflow note appears in the control panel, and the result is shared across tabs. - The logo twinkles while the app is busy (tied to Shiny's busy/idle events). - Comparison table: per-column filters (search boxes for package/versions, a dropdown for status), pagination grouped compactly below the table, and the global search box removed. The log panel sits beside the comparison, spanning its full height. - Transfer mode options shortened (Online reinstall / Offline copy / Preserve version) with a live description of the selected mode. - find_routes() is called once per scan and shared across modules instead of being re-run by each, reducing startup/detection time. Changes in version 0.2.3 New features - ship() and migrate() gain a mode argument: - "online" (default) — reinstall packages via pak from CRAN/GitHub/Bioconductor. - "offline" — copy package directories by file; packages with no valid source path are skipped and reported. - "preserve" — copy first to keep exact versions; fall back to a pinned pak spec (pkg@version) for packages that cannot be copied. The dashboard Sync tab exposes the same three options as a dropdown. - migrate(from, to) — one-call CLI migration. Pass version strings ("4.5.2", "4.6.0") or full Rscript paths; courieR resolves the installations and runs ship() automatically. - hub() — short alias for open_hub(). Run hub() to launch the dashboard with less typing. - library(courieR) now prints the version number and a reminder to run hub() or see ?ship. - ship() gains a log_callback argument for real-time progress messages from the pak subprocess, including a notice when first-time metadata loading may take 1–2 minutes. Bug fixes - manifest() now reliably excludes base and recommended packages on Windows. The previous path comparison was case-sensitive and could let packages like translations slip through into a sync plan, causing a pak error. The filter now uses case-insensitive path comparison and a name-based guard via installed.packages(priority = c("base", "recommended")). Performance & UX - find_routes() per-candidate subprocess timeout reduced from 5 s to 3 s, shortening detection time when multiple R versions are installed. - Sync dashboard: replaced the floating withProgress() modal with an inline Bootstrap progress bar inside the log pane. Log lines now append to the DOM immediately, removing the need for shiny:::flushReact(). - Sync dashboard: detection phase shows a Bootstrap info alert while scanning and records "Detection complete: found N installation(s)." in the sync log. Changes in version 0.2.2 (2026-06-04) - CRAN resubmission addressing reviewer feedback. Changes in version 0.2.1 - Fixed correctness bugs identified during CRAN review. - Added centralised error reporting in the Shiny module. Changes in version 0.2.0 (2026-05-30) - CRAN readiness: hardened documentation, CRAN-safe examples, and CI workflow. - ship() gains a @section Safety: block documenting subprocess and library write behavior. - manifest() now uses deparse() for library path quoting, fixing edge cases with special characters. - manifest() CSV fallback parsing now handles multi-line CSV output correctly. - Added cran-comments.md and .github/workflows/R-CMD-check.yaml. - DESCRIPTION title simplified; version bumped. Changes in version 0.1.0 - Initial release. - find_routes() detects R installations on Windows, macOS, and Linux, including user-local installs. - manifest() scans installed packages from any R installation via subprocess. - inventory() compares two package libraries and reports missing, outdated, and newer packages. - ship() migrates packages from one R installation to another using pak. - open_hub() launches a Shiny dashboard for point-and-click migration.