CRANberries

CRANberries aggregates information about new, updated and removed packages from the CRAN network for R available as this html version and a corresponding RSS feed.

Created and provided by Dirk Eddelbuettel.

Why?

Part Why not and part Because it's there.... I had grown tired of manually refreshing the directory view at CRAN at regular intervals. And this seemed like a classic example of where a scripted solution, combined with a static html / rss generator would help.

So upon returning from useR! 2007 in Ames, IA, I sat down and built it. It has been running ever since, initially twice a day but now runs every two hours.

How?

There is not much to it. R already gives us a function available.packages(). So I call this function, and essentially record the values (in a small SQL database). The next time this runs, it compares the current return from available.packages() with the stored result---and the difference is set comprised of either a new package, an updated package or (when computed the other way) a removed package. R even does this for use via setdiff().

And those are three main categories. By also storing when new and updated packages are noticed, we can report the change in version (as in new version 1.2.3 replacing version 1.2.2 dated x.y.z). For removed packages, we can report what versions existed etc.

The minimal changes are written out to small standardized text files which are read by a static blog compiler. I use blosxom as that is what my existing blog used, and I had no issues with it. It is small and simple, but was already dead upstream and written in a language I don't really use anymore. But hey, it works. And it has a nice and simple templating system.

So blosxom takes these text files, and (very reliably) creates a tree of html and rss files.

A few years in we usual started to post to a once-popular but now disgraced social media site which since also turned its API off. We then switched to posting on the @CRANberriesFeed Mastodon account and more recently, thanks to an assist by Johannes B. Gruber, added the @cranberriesfeed.bsky.social account.

What?

There are top-level output directories for each of the input directories, as well as dated directories in the yyyy/mm/ format.

So you either browse, or subscribe to the rss, at each of

  • cran for everything from CRAN
  • cran/new for new packages at CRAN
  • cran/updated for updated packages at CRAN
  • cran/removed for updated packages at CRAN
  • 20xx/ for everything from the year 20xx at CRAN
  • 20xx/yy/ for everything from the month yy in the year 20xx at CRAN
  • 20xx/yy/zz/ for everything from the day zz in the month yy and year 20xx at CRAN
Again, you can subscribe to the RSS syndication at each of these levels. This format is what I wrote this for.

And additional distributions mechanism was provided for years via the Twitter CRANberriesFeed handle which now lives on via the @CRANberriesFeed Mastodon account and, thanks to an assist by Johannes B. Gruber, the @cranberriesfeed.bsky.social account.

Looks

Initially, the pure html version looked uglier than a wet poodle. I didn't care too much as I consumed only the RSS feed. As the web logs showed that people did in fact come here, I dressed the site up minimally with a little CSS.

More recently, I worked with Bootstrap for another site and liked how it combines easy styling, responsive design on large screens as well as mobiles and tablet and decided to redo this. Because, hey, the mobile web is the future, right :)

The excellent Bootstrap toolkit is used for general layout and its infrastrucure. The theme is a modified version of one of the Bootswatch themes. Lastly, we use two symbols from Font Awesome.

Thanks

This site would not exist if it weren't for R and the CRAN project. So thanks to all of R Core, and especially the subset of R Core looking after CRAN. It is a treasure.

Thanks also to all who provided the tools used here, and not just those I mentioned but really the entire open source stacks and distributions. This includes the tools we use to toot and skeet, and the bsky account kindly created by Johannes B. Gruber.


Built and running on Debian GNU/Linux using R, littler and blosxom. Styled with Bootstrap.