Repository practices
Overview
When a package points to a public source repository, we look inside it for the everyday tooling a maintainer sets up and leaves in the open, and we list what we find. Continuous integration, a linter config, a container or environment file, citation metadata, a code of conduct: each is a file we can either see or not see.
Repository practices
6 development-tooling and community-health practices detected across 5 families in the upstream repository
Checks run against github.com/example/textutils on 2026-07-20.
Show all practices
Every item is something present in the repository. The order carries no ranking, and the list is never turned into a score.
Why the repository, not the tarball
None of this survives the trip to CRAN. When a package is built for release, R CMD build reads .Rbuildignore and drops the development scaffolding along the way: the .github/ directory, .lintr, renv/, the Dockerfile, cran-comments.md, a README.qmd, and more.
Someone reading only the source tarball never sees any of it. The upstream repository is the one place these files are still visible, which is why the signal reads from there.
Practices we detect
The files fall into a handful of families, and most packages touch only some of them.
- Continuous integration
- Build and check workflows, whether that is GitHub Actions, GitLab CI, Travis, AppVeyor, or one of the others.
- Reproducibility and environment
- An renv lockfile, a Dockerfile or dev container, a Makefile, a Nix or Binder setup.
- CRAN release process
- cran-comments.md, a revdep/ directory, a CRAN-SUBMISSION record.
- Documentation source
- A Quarto or R Markdown README that the plain README is rendered from.
- Research and citation
- A CITATION.cff, codemeta.json, a JOSS paper, a Zenodo record.
- Automation and maintenance
- Dependabot, Renovate, pre-commit hooks.
- Lint, format, and editor
- A .lintr, an Air or EditorConfig file, VS Code settings.
Reading an absence
A blank spot is not a bad mark, so the page keeps a few situations apart rather than collapsing them into one empty result.
The scan covers GitHub for now. A package hosted somewhere else is left unassessed instead of shown as empty. Each one is checked again once a week, and the section always reflects the most recent pass, with the date it ran shown alongside it.
The limits
Each item is a check that a file exists. It tells you a maintainer set the tool up, not that it is configured well or run on every commit.
An empty result is just as limited. Many maintainers lint, test, and pin their dependencies with tools that live outside the repository, or under a personal account, where this scan never sees them.
So read the list as a place to start looking, not a grade.