Sign in

James Balamuta

@coatless.bsky.social
1.2K followers 16 following 510 posts

omnipresent explorer of the unknown, fashionably caffeinated informatics phd, amorous cavalier. design, build, analyze. #rstats on #macos + #webr and #python with #pyodide

PostsRepliesMedia
James Balamuta @coatless.bsky.social · 3h
On iPad: File, Code, Run and View menus (hold Command to see them), plus Projects and History in the four-pane view. Everywhere: VoiceOver reads results and errors aloud, and the app respects larger text, reduced motion and higher contrast.
Headline: “Four panes at once on iPad.” Below it, an iPad running webRios with four panes on one screen: a ggplot2 script about fuel economy top left, the console with a scatter plot and a red trend line bottom left, the list of variables top right, and a gallery of six chart thumbnails bottom right. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
R can reach the web now. Fetch live data with httr2 and chart it with ggplot2, right on your phone. By default that traffic goes through a small helper running on your own device, not through anyone else's server.
Headline: “Live data from the web, with httr2.” Below it, an iPhone showing a script named paris-weather.R in the webRios Editor. The script loads httr2 and ggplot2 and asks api.open-meteo.com for an hourly temperature forecast for Paris. The Output panel under it shows the first three rows that came back, each a time and a temperature near 18.8 degrees. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
Big tables open quickly and you can filter, sort and search them. The package list tells you what each package does, and your saved packages load several times faster.
Headline: “Browse any data frame.” Below it, an iPhone showing the mtcars table in the webRios data viewer. A “Filter rows” box sits above a grid of cars such as Mazda RX4, Datsun 710 and Hornet 4 Drive, with columns for mpg, cyl and disp. The footer reads “Rows 1-32 of 32”. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.Headline: “See what every package does.” Below it, an iPhone showing the Packages screen in webRios, on the Installed tab beside a Browse tab. Each package has a short description under its name, such as “R6: Encapsulated Classes with Reference Semantics”, “RColorBrewer: ColorBrewer Palettes” and “cli: Helpers for Developing Command Line Interfaces”. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
Got an R script in your email? It opens straight into webRios now, from Mail, Files and other apps. CSV files too. The editor also stays quick on long scripts, with text sizes up to 30 pt.
Headline: “Write a whole script, then run it.” Below it, a close-up of the webRios script editor on an iPhone, with colored code and line numbers. The script starts with the comment “Fuel economy — does weight explain mileage?”, loads ggplot2, fits a model, and builds a labeled scatter plot. Undo, redo, search and a green Run button sit in the toolbar. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.Headline: “Open a CSV from Mail or Files.” Below it, an iPhone showing the Import Data wizard in webRios at step 3 of 4. A grid previews sample_data, 10 rows by 5 columns, with the columns name, age, score and grade. Under it an R Code box shows the read.csv call that will run, and Back and Import buttons sit at the bottom. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
Charts you can touch. Interactive plots now open in the app, so you can tap, zoom and pan. Plots you pin stay pinned, even after you close the app.
Headline: “Charts you can tap, zoom and pan.” Below it, an iPhone showing an interactive chart in webRios, titled “Fuel economy by weight”. Miles per gallon is plotted against car weight, with dots colored blue, green and red for 4, 6 and 8 cylinders. Heavier cars sit lower. One green point has been tapped: a ring marks the touch, and a label beside it reads (3.215, 21.4), Hornet 4 Drive. A Done button and a share button are at the top. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
Plots can show up right in the Console now, under the code that drew them. Fit a model, plot it, and the chart sits beside the numbers.
Headline: “Every result, right in the console.” Below it, a close-up of the webRios console on an iPhone. The commands load the mtcars data, fit a line predicting miles per gallon from weight, and print the result: intercept 37.285, slope -5.344. A plot command follows, and right below it the chart appears in the console: a scatter plot titled “Fuel economy vs. weight” with blue dots and a red line sloping down. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
The big one: a Stop button. Started a loop that never ends? Tap Stop, or press Command-period on a keyboard, and R stops right where it is. Your variables stay put. The old advice, "restart the app", is officially retired.
Headline: “A Stop button for runaway loops.” Below it, an iPhone showing the webRios Console. A random walk is plotted as a line chart, and under it a loop that never ends, while (TRUE) i <- i + 1, is running. A red Stop square sits beside the input field, and a banner above the tab bar reads “R has been running for over 30 seconds” with Restart R and Stop buttons. Along the top: the webRios icon and name with a v1.2.0 tag, webrios.caffeinatedmath.com, and a Download on the App Store badge.
110
James Balamuta @coatless.bsky.social · 3h
What's new in webRios 1.2.0, the app that puts R on your iPhone and iPad (and works offline)? A quick tour. #rstats Take a look: webrios.caffeinatedmath.com Download on the App Store: apps.apple.com/app/id675807...
Promo image on a deep blue background with faint spider webs in the corners. On the left: the webRios name with a small v1.2.0 tag, then “R, right on your iPhone and iPad. Even offline.”, the address webrios.caffeinatedmath.com and a Download on the App Store badge. On the right, an iPad and an iPhone running webRios. The iPad shows an R script about car fuel economy, the model's results, a list of variables and a grid of six charts. The iPhone in front shows a scatter plot with a red trend line.
131
James Balamuta @coatless.bsky.social · 07/10/2026
webRios 1.2.0 is off to the App Store for review! It's an R editor for iPhone and iPad, built on webR. Now with: R 4.6, a Stop button for runaway loops, plotly and leaflet widgets, and httr2 on the device. Fashionably late to the party, but on its way. webrios.caffeinatedmath.com
Screenshot showing v1.2.0 of webRios queued for review on Apple's App Store.
1133
James Balamuta @coatless.bsky.social · 04/10/2026
No compute server sits behind the site. A static host hands out the files and the reader's browser does the computing, so GitHub Pages, Netlify, Cloudflare Pages or your own web server can publish it.
A card for the R package webrarian. Very large text reads "R in the browser". Under it, a red stamp tilted like a library date stamp reads "NO COMPUTE SERVER". A line says "A static host hands out the files. The reader's browser does the computing." Four dark labels name places to publish: GitHub Pages, Netlify, Cloudflare Pages and your own server. The webrarian hex logo, a brick-red library shelf, sits on the right.
191
James Balamuta @coatless.bsky.social · 04/10/2026
The page is a small workspace, with an editor, an R console, your files and your plots. Visitors run your script, change it, and share their version as a link. Their edits stay in their own browser. There is a live demo to try. coatless-wasm.github.io/webrarian/de...
A card for the R package webrarian. Text reads "An editor, a console, your files and your plots. Readers run your script, change it, and share their version as a link." Beside it, a browser window shows the workspace: a script named lab.R in an editor with Run, Run All and Share buttons, an R console under it with a summary table, an Environment panel listing a data frame named cars, and a scatterplot in the Plots tab.
143
James Balamuta @coatless.bsky.social · 04/10/2026
Five steps take a folder to a site. catalog() starts a collection, acquire_package() and acquire_file() fill it, bind() builds the site, reading_room() previews it, and circulate_via_github() sets up publishing on GitHub Pages. Watch it in 100 seconds. youtu.be/Ujoa-zBFKpY
A card for the R package webrarian. Large text reads "Five steps from folder to site". Under it, a dark R console lists the calls in order. Step 1, catalog(), starts a collection. Step 2, acquire_package(c("dplyr", "ggplot2")) and acquire_file(c("data/", "scripts/*.R")), adds packages and files. Step 3, bind(), builds the site. Step 4, reading_room(), previews it. Step 5, circulate_via_github(), sets up publishing.
150
James Balamuta @coatless.bsky.social · 04/10/2026
webrarian is a new R package. It turns a folder of R scripts and data into a static website where R runs in the visitor's browser, with no compute server and nothing to install. blog.thecoatlessprofessor.com/posts/introd... #rstats #webr #webassembly
A card for the R package webrarian. Large text reads "A folder in. A website out." On the left, a small card lists a folder named lab-01 holding lab.R, setup.R and a data folder. A red arrow points from it to a browser window that shows a scatterplot of car weight against miles per gallon with brick-red points. The address coatless-wasm.github.io/webrarian is on the card.
516166
James Balamuta @coatless.bsky.social · 27/09/2026
Lastly, for the tablet users out there, we've greatly improved the classic four-pane Workspace layout. If you haven't yet, try out webRoid on your Android 15 or later Phone or Tablet! Google Play: play.google.com/store/apps/d... Release write-up: blog.thecoatlessprofessor.com/posts/webroi...
Promotional card for webRoid, headed "See your code and its results side by side", with the line "The Workspace shows your script, the console, your variables and a plot at once." A tablet in light mode shows four panes: an R script about study time and exam scores, the Console with a fitted model, the Environment with a function and values, and three plot thumbnails.
020
James Balamuta @coatless.bsky.social · 27/09/2026
webRoid also now allows you to request a "Copy Files Back from R" to sync files to your folders. Plus, you can now tap an excel file opens Import Dataset, which reads Excel once readxl is installed.
The Files screen on a phone in light mode, after Copy Files Back from R. The project lists analysis.R, cars.rds, mtcars.csv, sample_data.csv and scatter_plot.R, with cars.rds the file R just wrote, and a message at the bottom reads "Copied 1 file from R."
100
James Balamuta @coatless.bsky.social · 27/09/2026
Starting in webRoid v1.1.1, you can restart R instead of restarting the app! After a minute, a banner says R is still working and offers a fresh session. Your variables in the current session will go away though and need to be redefined!
The top of webRoid's Console on a phone in light mode, after running Sys.sleep(120), a command that waits two minutes. A pink banner titled "R Session Unresponsive" says R is still running a command past the time limit, with Check Again and a red Restart R button. A red line below says R did not finish within 60 seconds and is still running.
100
James Balamuta @coatless.bsky.social · 27/09/2026
One heads-up before you update... The new R version can’t load R packages installed by the old one. So, the app clears them the first time it opens. A notice lists them, and one tap on Reinstall brings back each one the webR repository has. R on PC requires the same when going from 4.5 to 4.6.
The top of webRoid's Console on a phone in light mode. A purple notice, "Packages removed by the update", says the app now runs webR 0.6.0, which can't load packages from the previous version, so 15 were removed, including ggplot2, lme4 and mice. It offers Show All, Dismiss and Reinstall. Below, library(ggplot2) fails with "there is no package called ggplot2".The top of webRoid's Packages screen on a phone in light mode, after tapping Reinstall. A notice reads "Reinstall finished. 2 packages are installed again. 1 is no longer in the webR repository: waffle." Below it, the Installed tab lists base, datasets, grDevices and graphics, each loaded at version 4.6.0.
100
James Balamuta @coatless.bsky.social · 27/09/2026
webRoid 1.1.1 is on Google Play. The app that runs R on your Android phone or tablet moves up to R 4.6.0, and its charts are now the kind you’re allowed to poke. App: play.google.com/store/apps/d... Docs: webroid.caffeinatedmath.com #rstats #webr #android #webassembly
Promotional card for webRoid on a dark navy background, headed "Make interactive charts", with the line "Open a plotly chart from your Workspace, then zoom and pan it with your fingers." A tilted tablet in dark mode shows a plotly scatter plot titled Weight vs mileage, its points colored pink, green and blue for cars with 4, 6 and 8 cylinders.
161
James Balamuta @coatless.bsky.social · 08/09/2026
Responses will be delayed for a couple of weeks.
Carriage waiting for green lightView out from the RockiesView out from the Rockies
030
James Balamuta @coatless.bsky.social · 01/09/2026
Install at the gate, write Python at cruising altitude without worrying about plane wifi. Pyodios 1.1.0 makes it happen with #Python 3.14 via #Pyodide (#WebAssembly) on #iOS 26+. apps.apple.com/us/app/pyodi...
Two iPhones side by side: matplotlib code and its chart in a notebook on the left, six finished charts in the Plots gallery on the right.
030
James Balamuta @coatless.bsky.social · 10/08/2026
Nothing says your niche R Observatory project has made it like a hosting provider gently asking if you are aware you are being attacked. Happy Monday!
Screenshot of an email from a hosting provider that reads: "Hello, This email is being sent to inform you that your site r-observatory.thecoatlessprofessor.com is currently receiving an unusually high volume of traffic from a large number of IP addresses simultaneously. This pattern is consistent with a distributed denial-of-service (DDoS) attack or aggressive bot/crawler activity, and it is generating" (text cuts off).
270
James Balamuta @coatless.bsky.social · 08/08/2026
Every painter has a gpaint_*() twin that returns a real ggplot, so it works with ggsave() and patchwork() like other ggplot2 extension packages. Thus, you get the same drawing either way, in four palettes.
A four-up comparison showing one data frame drawn by paintr in each of its four palettes. Three modern cards, mint, slate, and warm, share the refined look: a tinted header band, bold column names over lighter type tags, hairline borders, and softly rounded corners, each in its own colour family of cool green, cool grey, and warm amber. The fourth, classic, shows the original flat look with a hard black grid and square corners. All four draw the identical structure and the same labels, so only the styling differs. Both the base graphics and ggplot2 backends produce these identical cards because the style travels as data on the cell table.
100
James Balamuta @coatless.bsky.social · 08/08/2026
Formatting further aims to emphasize magnitude by showing significant figures, but the digits it drops go grey rather than vanishing, so 123456.789 still reads as a bold 123 with a faded 457 with decimals rounded if its a large number. NA is red. Inf is blue.
The vector 123456.789, one third, NA, Inf, and e drawn by paintr's paint_vector() as a horizontal row of five boxes in the mint palette, chosen to show how the package handles values that are awkward to print. The first box reads 123457 with the leading 123 in solid black and the trailing 457 in light grey, so the three significant figures stand out while the dropped digits stay visible and the magnitude is never hidden. One third shows as 0.333 and e as 2.72. NA is drawn in red and Inf in blue, so missing and infinite values are recognisable at a glance rather than blending into the numbers around them.
100
James Balamuta @coatless.bsky.social · 08/08/2026
show_indices = 'cell' stamps every matrix cell with the [row, column] that reaches it. Useful when the thing you are explaining is not the values but the addressing.
A matrix of the numbers 1 through 20, laid out in four rows and five columns and drawn by paintr's paint_matrix() with show_indices set to cell, in the mint palette. Every cell carries two things, the value itself and the bracketed row and column subscript that reaches it, running from bracket 1 comma 1 in the top left corner to bracket 4 comma 5 in the bottom right. Reading the picture and reading the code are the same act, so m[2, 4] stops being an incantation and becomes a box you can point at.
100
James Balamuta @coatless.bsky.social · 08/08/2026
You already know a data frame is a list whose elements happen to share a length. Your students do not. paint_list() and paint_data_frame() draw the same card until one element changes length and the bottom edge goes ragged. That is the lesson, drawn.
A list of three numeric elements named mpg, cyl, and gear, drawn by paintr's paint_list() in the mint palette. Each element becomes a column of boxed values under its own bold name and a grey dbl type tag, and every cell carries the double-bracket accessor that reaches it, such as bracket bracket 1 bracket bracket bracket 1. The mpg and gear columns run four rows deep, but cyl holds only three values, so its fourth cell is missing and the bottom edge of the card is ragged rather than square. That ragged edge is the whole difference between a list and a data frame, since a data frame is a list whose elements happen to share a length.
100
James Balamuta @coatless.bsky.social · 08/08/2026
Every R course has the whiteboard moment where you draw a vector as a row of boxes. {paintr} draws it and writes the accessor in each cell, so the diagram and the code are one object. Now on CRAN. #rstats blog.thecoatlessprofessor.com/software-rel...
The numeric vector 10, 20, 30, 40, 50 drawn by paintr's paint_vector() as a single horizontal row of five boxes in the mint palette. Each box holds its value in large type with the bracketed position it answers to underneath, running from bracket 1 through bracket 5. The third box, holding 30, is filled with a soft mint highlight, so the picture shows what x[3] selects rather than describing it. A caption above reads that the vector has 5 elements and is numeric.
1171
James Balamuta @coatless.bsky.social · 24/07/2026
Now on CRAN: {livelink}. Hand it a string, a file path, or your clipboard and get back a URL that opens a live R session in the browser, code already loaded. CRAN: cran.r-project.org/web/packages... Release notes: blog.thecoatlessprofessor.com/software-rel... #rstats
Three-panel diagram showing how livelink works. Panel 1, "You write R": a code block wrapping a short script in webr_repl_link(), where the script loads the mtcars dataset and plots mpg against weight with steelblue points. A caption notes that a string, a file path, or the clipboard work too. Panel 2, "You get a URL": a long webr.r-wasm.org link with the code encoded in the fragment. Panel 3, "They get a live R session": a browser window with four panes, an editor holding script.R, a file browser showing home/web_user/script.R, a terminal where source('script.R') and mean(mtcars$mpg) return 20.09062, and a pane displaying the resulting scatter plot.
0183
James Balamuta @coatless.bsky.social · 21/07/2026
{livelink} will also soon be expanded over to Python just after Pyodidarian launches as the later comes with a Pyodide powered Python enhanced 4-panel editor based off of webR's. #pyodide #livelink #python
Screenshot of the Pyodide REPL, a browser-based Python environment. The left pane shows example code using pandas and matplotlib; the right pane shows an Environment panel of variables and a Plots tab with a line chart titled "n squared."
023
James Balamuta @coatless.bsky.social · 21/07/2026
#webR and #Shinylive already share browser-runnable links from their editors. livelink is a small #Rstats wrapper around that idea: build those links from R (scripts & projects) and decode any of them back into files. GH github.com/coatless-rpk... Post blog.thecoatlessprofessor.com/programming/...
A split comparison of two ways to share an R project. The top path, 'send the instructions,' runs through install steps to a laptop marked 'runs, if it installs.' The bottom path, 'send a link,' goes straight to a browser already running the plot.A loop showing encode and decode as inverse steps. Three project files flow along webr_repl_project() into a single URL, then back along decode_webr_link() into the same three files.
092
James Balamuta @coatless.bsky.social · 12/07/2026
I know I'm sleeping, 'cause this dream's too amazin'
Screenshot showing Apptrope Data Science fixed with a Shiny for Python app open along with 10 other app frameworks.
052
James Balamuta @coatless.bsky.social · 10/07/2026
It was part of the underlying rule set in addition to the CRAN cookbook. blog.thecoatlessprofessor.com/programming/...
Screenshot showing part of the ruleset from different R sources regarding CRAN checks that needed a home inside of checktor.
100
James Balamuta @coatless.bsky.social · 10/07/2026
After 2 years collecting dust on GH, peeky has finally peeked out onto CRAN and kept its own release quiet for a week. It downloads & rebuilds the source behind any published #Shinylive app, in #Rstats | #Python CRAN: cran.r-project.org/package=peeky blog.thecoatlessprofessor.com/programming/...
peeky hex logo: cartoon eyes peek over an app whose corner peels back to reveal source code
041
James Balamuta @coatless.bsky.social · 10/07/2026
The best part of getting on CRAN wasn't the acceptance email. It was the PS. This made my whole week.
Screenshot of a Gmail message from a CRAN maintainer, dated Thursday, July 2. The sender's name and address are blacked out. The message reads: "Thanks, on its way to CRAN. Best, [name redacted]. PS: I hope your package will be used a lot!" Below it, the quoted original email shows it was submitted via the CRAN Package Submission Form on 26/06/2026.
010
James Balamuta @coatless.bsky.social · 10/07/2026
R CMD check comes back clean. Then CRAN emails you about title case and a missing @ return tag. checktor is in. It catches those before you submit. On CRAN as of last week 7/2! CRAN: cran.r-project.org/package=chec... Blog: blog.thecoatlessprofessor.com/programming/... #rstats
Dark terminal screenshot of a checktor() run on a demo package: the Package Doctor diagnosis summary listing five check categories with an overall verdict of "NEEDS ATTENTION (10 issues)."checktor hex logo: a stethoscope whose chestpiece is a green check mark
4256
James Balamuta @coatless.bsky.social · 09/07/2026
Yes, yes it was a #quarto playground I spied back in the day. Confirmed by @shikokuchuo.net 's #user2026 talk. Quarto levels up via: quarto-hub.com
Screenshot of Charlie's talk posted on Linkedin showing the playground and it's home over at quarto-hub.com
061
James Balamuta @coatless.bsky.social · 08/07/2026
Thanks, we were overprotective regarding periods. data.table and other packages with periods should now show up on search now.
Screenshot of the R Observatory package search page showing results for the query "data.table." The interface lists 133 matching CRAN packages, each shown as a card with the package name, version, download rank, short description, maintainer, and 30-day download count.
020
James Balamuta @coatless.bsky.social · 08/07/2026
That's a slice of it. It's free and works for decently well for many of the 25K packages on CRAN as well as having some Bioconductor support (still improving!), so go look up one you maintain or rely on. r-observatory.thecoatlessprofessor.com



The Compare downloads view on R Observatory, showing daily downloads for dplyr, ggplot2, tidyr, and tidyverse, each in its own color. An "Add a package" box with suggestions sits above a "Split Stream" row of source pills (CRAN, r2u, autoCRAN, conda-forge, bioconda, c2d4u) that breaks the comparison out by download source. Two stacked line charts plot the series over the past year, one for CRAN and one for conda-forge, with a hover tooltip listing each package's downloads on a given day and dashed markers for releases and R versions.
020
James Balamuta @coatless.bsky.social · 08/07/2026
R Observatory has pages for authors, not just packages: your published packages, their check results, your overall impact, and a collaborator network graph. Go look up your own. r-observatory.thecoatlessprofessor.com/authors/
An author page on R Observatory for Kurt Hornik. A header notes 85 packages, time on CRAN and Bioconductor, and an ORCID link. Cards show downloads (4M in 30 days, 13.4M in 90 days, 53.9M in a year), a Roles breakdown (maintains, co-authors, contributes), and an Impact panel: 4.9K packages depend on their work, a dependency h-index of 27, and the most-depended-on packages. Further panels list top packages by downloads, an aggregate Portfolio Check Status across maintained packages (error, note, and OK counts, plus packages needing attention), frequent collaborators with a link to the collaborator network, and recent package activity.The Collaborator network page on R Observatory for Kurt Hornik, described as a co-authorship graph across 35 collaborators. An interactive node-link diagram places Hornik at the center, connected to co-authors such as Brian Ripley, Friedrich Leisch, Achim Zeileis, Uwe Ligges, and Dirk Eddelbuettel; each line connects people who co-authored a package, and thicker lines mean more shared packages. A hover card for Uwe Ligges shows four shared packages (dendextend, fortunes, gap, signal) and a link to his profile. Controls allow zoom, pan, and clicking a name to open that person's page.
130
James Balamuta @coatless.bsky.social · 08/07/2026
ggplot2's license quietly moved from GPL-2 to MIT. R Observatory's version diff catches that, plus minimum R, download size, contributors added or dropped, and how code, tests, and docs grew. r-observatory.thecoatlessprofessor.com/packages/ggp...
A version comparison on R Observatory for ggplot2, set to 3.0.0 versus 4.0.0. From and To version selectors sit at the top. A Metadata panel summarizes what changed between the releases: the dates (flagged a major bump), a license change (from GPL-2 to MIT), a higher minimum R version, a larger download size, and contributors added and removed (four new, one removed, with roles shown). A Structure table then compares counts side by side with a change column, for exported and internal functions, total and R lines, compiled lines, and test lines (for example, exported functions 451 to 643, test lines 5,221 to 17,565). A Documentation table does the same for doc lines, roxygen coverage, and references coverage.
110
James Balamuta @coatless.bsky.social · 08/07/2026
Then there's the license side. You add one small package, it brings a few of its own, and now a GPL dependency is sitting under your MIT project. RObs walks the whole install tree so you can see the license picture instead of guessing at it. r-observatory.thecoatlessprofessor.com/packages/ggp...
The Dependency licenses page for ggplot2 on R Observatory. A green verdict reads that all 16 installed dependencies are permissively licensed, with no copyleft obligations in the install tree. A make-up bar shows 15 MIT and 1 Apache, plus 6 base or recommended packages that ship with R. Below, an "Explore the dependency graph" panel walks the tree with toggles for view (by dependency or by license family), which kinds to include (Depends, Imports, LinkingTo, Suggests), and depth (one level through all levels), followed by an indented, license-tagged listing of the imports and their own dependencies.
120
James Balamuta @coatless.bsky.social · 08/07/2026
On each package page, the call graph is tinted by test coverage: functions green where tests reach them, red where they don't. That needs the package to have tests. covr measures your own coverage; here you can see it for other packages too. r-observatory.thecoatlessprofessor.com/packages/Rcp...
The Rcpp call graph on R Observatory. An interactive network plots the package's 411 functions as nodes tinted by test coverage on a red-to-green scale, with node shape marking language and rings marking exported functions; edges show calls, including dashed edges from R into compiled code. A side panel shows per-function detail on hover, here the exported sourceCpp function with its line count, cyclomatic complexity, 100% line coverage, and call list. Below the graph, summaries break coverage down by type and by file, tally the structure (411 functions, 18 exported, 291 compiled, 497 call edges), and rank functions by lowest coverage.
120
James Balamuta @coatless.bsky.social · 08/07/2026
The download number everyone cites is a single CRAN mirror. R Observatory also counts conda-forge, Bioconductor, bioconda, r2u, & more, so you see much more of where a package actually gets installed. Still not every source, but well past one mirror. r-observatory.thecoatlessprofessor.com/downloads
The Downloads overview on R Observatory, titled "Package download activity across every data source we track." A row of source filters includes CRAN, r2u, Bioconductor, autoCRAN, conda-forge, bioconda, and c2d4u, with Posit P3M and Fedora COPR marked "soon." A headline reads 277.1M downloads in the last 30 days, combined across 7 active sources, broken down by a stacked bar (CRAN 84.7%, conda-forge 10.3%, Bioconductor 2.7%, and smaller shares from the rest). An ecosystem-trend chart runs from 2012 to 2026, and a "Top packages, combined" table lists the most-downloaded packages with per-source columns.
221
James Balamuta @coatless.bsky.social · 08/07/2026
Checking on an R package usually takes five open tabs: CRAN, GitHub, download counts, reverse deps, check results. R Observatory collects all of that on one page, for every CRAN and Bioconductor package. r-observatory.thecoatlessprofessor.com #rstats
The ggplot2 package page on R Observatory. A header gives the name, version 4.0.3, and tagline, with four headline numbers: 6,665 packages depend on it, 26.4M downloads a year, 81.1% test coverage, and 13 of 13 CRAN checks passing. Sections below cover an Overview (maintainer, first-published date, description), install commands in tabs (CRAN, pak, Ubuntu r2u, Fedora COPR, openSUSE OBS), Health (CRAN check result, code-health facts, and a dated check history), and the start of Downloads. A Vital Signs sidebar summarizes health, coverage, docs, downloads, reverse dependencies (6,665 direct and 1,909 indirect), release, license, and links to reference docs.
5329
James Balamuta @coatless.bsky.social · 02/07/2026
Signing desktop apps is per developer, per platform: macOS needs Apple Developer credentials ($99/yr), Windows a certificate ($100+/yr). We cover Apple but do not develop on Windows, so the demos there trip SmartScreen. Click More info → Run anyway to launch.
Windows Defender SmartScreen dialog for demo-r-app-suite-shinylive-win-x64.exe,  "Unknown publisher," showing the "More info" link you click first.The same SmartScreen dialog after expanding, with Run anyway and Don't run buttons.
000
James Balamuta @coatless.bsky.social · 02/07/2026
Five runtime strategies to pick from: offline shinylive (WebR/Pyodide), a bundled interpreter, the system install, auto-download on first launch, or a container. One export() call converts the app and builds the installer for each platform.
A three-stage pipeline diagram. A Shiny app (app.R or app.py, R or Python) flows through shinyelectron, which converts and packages it with electron-builder via an export() call, into a desktop app shipped as .app, .exe, or AppImage.
110
James Balamuta @coatless.bsky.social · 02/07/2026
Try the demos, read the write-up, or browse the code: Demos + docs: r-pkg.thecoatlessprofessor.com/shinyelectron Write-up: blog.thecoatlessprofessor.com/posts/reintr... Source: github.com/coatless-rpk...
The shinyelectron README: hex logo, the tagline "Turn any Shiny app (R or Python) into a standalone desktop application for macOS, Windows, and Linux," a pipeline diagram (Shiny app in R or Python, to shinyelectron which converts and packages with electron-builder, to a desktop app shipped as .app, .exe, or AppImage), and install plus quick-start code using pak::pak and a single export() call.
130
James Balamuta @coatless.bsky.social · 02/07/2026
Turn a Shiny app into a desktop app your users just double-click. shinyelectron wraps #rstats or #Python Shiny in Electron and builds a native installer for macOS, Windows, and Linux, with a runtime of your choice (including a fully offline build). Build locally or in CI. #rshiny #pyshiny
macOS drag-to-install window for demo-r-app-suite: the app icon with an arrow pointing to the Applications folder.The app's About panel showing the r-shinylive (WebR) backend, R 4.6.0, 37 packages, platform wasm32-unknown-emscripten, inside the desktop app.shinyelectron launcher listing three R Shiny apps as cards (Dashboard, Data Explorer, About), with an "Apps → Back to Launcher" menu open.GitHub Actions run "Build demo installers" for shinyelectron 0.2.0, matrix building 73 of 76 jobs across macOS, Windows, and Linux.
3729
James Balamuta @coatless.bsky.social · 02/07/2026
73/76. The desktop is coming for your Shiny apps. Or your Shiny apps are coming for the desktop. Hard to tell from in here. Either way, the machines have been at it for an hour and they're almost done. #rshiny #pyshiny #rstats #python
A GitHub Actions workflow run for the coatless-rpkg/shinyelectron repository, titled "shinyelectron 0.2.0 #22" under the "Build demo installers" workflow. Status reads "In progress," triggered via a release one hour ago when user coatless published v0.2.0. The build-demos.yml workflow shows a completed "setup" job (59 seconds) connected to a "Matrix: build" stage reading "73/76 jobs completed." A left sidebar lists individual jobs for demo-py-app-suite across multiple platforms, including auto-download builds for linux-x64, mac-arm64, mac-x64, and win-x64, plus a bundled linux-x64 build, each marked with a green checkmark.
1111
James Balamuta @coatless.bsky.social · 30/06/2026
Apparently I shipped Mac versions of my iPhone/iPad apps by leaving a checkbox on. Pyodios #python and webRios #rstats run on macOS now. #WebAssembly really does go anywhere. TIL.

A Mac screen split between two windows. On the left, the Mac App Store shows an account page with Pyodios (displaying a download button) and webRios (with an Open button), both marked "Designed for iPad. Not verified for macOS." On the right, the webRios app is open to a "Welcome to webRios" onboarding screen reading "Run R on your iOS device," explaining that webRios brings R statistical computing to iPhone and iPad through webR, a WebAssembly distribution of R. A sidebar lists Console, Editor, Plots, Environment, File Browser, Projects, Packages, History, R Help, and Settings.A Mac screen split between two windows. On the left, the Mac App Store shows an account page with an "iPhone & iPad Apps" section listing Pyodios and webRios, both marked "Designed for iPad. Not verified for macOS" with Open buttons. On the right, the Pyodios app runs a Jupyter-style Python notebook called ExampleNotebook.ipynb locally through Pyodide. Code cells demonstrate basic arithmetic, f-strings, and list comprehensions with their printed output below. A right-hand panel shows environment variables, loaded modules, and two small plot thumbnails.
080
James Balamuta @coatless.bsky.social · 27/06/2026
@posit.co any chance #P3M download stats could be published like cran-logs.rstudio.com? cran-logs only logs CRAN-mirror source pulls, so the Linux binaries P3M serves (CI, Docker, etc.) are invisible to authors. The API has a downloads field but returns count: 0. #rstats
Terminal session running a curl POST request to https://packagemanager.posit.co/__api__/filter/packages with header Content-Type: application/json and body {"repo":"cran","names":["ggplot2"],"omit_downloads":false}. The server returns a JSON error: {"code":6,"error":"downloads are not available because usage data is disabled; set omit_downloads to true or enable Server.UsageDataEnabled","payload":null}.Browser showing the JSON response from https://packagemanager.posit.co/__api__/repos/cran/packages/ggplot2. It lists metadata for the ggplot2 package: source "cran", version 4.0.3, repository "RSPM", license "MIT + file LICENSE", maintainer Thomas Lin Pedersen, publication date 2026-04-22, plus depends, imports, and suggests fields. The "downloads" field is highlighted and reads { count: 0 }, showing no download counts are exposed on the public instance.
240