George Stagg's Avatar

George Stagg

@gws.phd

Software Engineer @ Posit working on webR & WebAssembly. Maths. Physics. I like making things.

2,278
Followers
224
Following
13
Posts
15.11.2023
Joined
Posts Following

Latest posts by George Stagg @gws.phd

Super excited for the new release of #rstats V8 which now also works in WebR by running js/wasm natively in web worker (thanks to @gws.phd). Will release some cool new packages soon to show the potential of WASM in R ✨

27.09.2025 08:40 πŸ‘ 20 πŸ” 2 πŸ’¬ 1 πŸ“Œ 0
Preview
webR - R in the browser Interactive R environment running in your browser. Execute R code, create plots, and analyze data without installing anything.

PSA for anyone beginning to use #wasm #webR to share R code snippets: We have a new short URL for the webR app: webr.sh!

14.08.2025 11:42 πŸ‘ 53 πŸ” 16 πŸ’¬ 3 πŸ“Œ 1

That’s correct, unfortunately. It’s a fundamental limitation of running the Shiny server under Wasm in the user’s browser. Everything is visible in the browser dev tools.

07.08.2025 14:09 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

The webR changes haven’t filtered down into Shinylive yet. Once we cut a new release, and Shinylive is updated, we’re hoping curl and friends should work well!

07.08.2025 11:50 πŸ‘ 6 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Even ellmer works! Here using a provider that does not require auth: webr.r-wasm.org/latest/#code...

Of course, the usual rules about API keys in webR still apply: *ALL* R source is visible client-side, so *NEVER* publish anything that actually includes any secret keys. This is just a neat demo!

30.07.2025 15:29 πŸ‘ 5 πŸ” 1 πŸ’¬ 0 πŸ“Œ 1
Preview
Making libcurl work in webassembly We explain how to make libcurl based applications work in webassembly without changes by tunneling all traffic over a websocket proxy.

You can read more about how this all works in Jeroen's blog post: jeroen.github.io/notes/webass...

30.07.2025 15:29 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Here's an example using an R package that relies on {httr2} to query a Hacker News API: webr.r-wasm.org/latest/#code...

30.07.2025 15:29 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Thanks to some joint work with @jeroenooms.bsky.social the latest dev build of webR now supports the {curl} package, along with many other packages that rely on it! πŸŽ‰ If you're able to use a WebSocket SOCKS proxy (outside of the browser), you can now use {curl} to make HTTP requests in webR.

30.07.2025 15:29 πŸ‘ 18 πŸ” 4 πŸ’¬ 3 πŸ“Œ 0
Preview
Making libcurl work in webassembly We explain how to make libcurl based applications work in webassembly without changes by tunneling all traffic over a websocket proxy.

Making libcurl work in webassembly

https://jeroen.github.io/notes/webassembly-curl/

30.07.2025 12:01 πŸ‘ 26 πŸ” 11 πŸ’¬ 0 πŸ“Œ 0
Preview
Tidyverse developer day 2025 Join us in Atlanta for tidyverse developer day on September 19, 2025!

We're happy to announce that there will be another #rstats Tidy Development Day after the 2025 posit::conf in Atlanta!

www.tidyverse.org/blog/2025/07...

21.07.2025 13:02 πŸ‘ 29 πŸ” 10 πŸ’¬ 1 πŸ“Œ 2
Preview
webR 0.5.4 webR 0.5.4 brings the latest version of R to the browser, with sharing URLs, an upgraded Emscripten runtime, and filesystem support for JupyterLite.

webR 0.5.4 has been released! Some new updates include sharing URLs for the webR app, filesystem support for JupyterLite 0.6, and an upgrade to the Emscripten runtime. Read all about it in my latest post on the tidyverse blog: www.tidyverse.org/blog/2025/07...

14.07.2025 12:08 πŸ‘ 22 πŸ” 5 πŸ’¬ 0 πŸ“Œ 0
Preview
Quarto Live: WebAssembly powered data science learning | pyOpenSci πŸš€ How Quarto Live Brings Code to Life in the Browser! 🌍✨Quarto Live takes interactive coding & publishing to the next level with WebAssembly-powered execut...

πŸš€Quarto Live developer @gws.phd shows how to make interactive, explorable, & reproducible docs. #Python & R in the browserβ€”no setup, no servers!

βœ… Live coding exercises & auto-checking
βœ… Works on mobile!

πŸ“Ί Watch now β†’ buff.ly/41BnAsT
#Quarto #DataScience #WebAssembly

04.03.2025 17:20 πŸ‘ 20 πŸ” 8 πŸ’¬ 0 πŸ“Œ 0

As far as I’m concerned, #webr and #shinylive is indistinguishable from magic.

I can’t believe that since first installing #quarto-webr a few hours ago till now, I’ve gotten a relatively complicated #shinyapp exported, deployed, and running serverless.

This is magic. #rstats

21.12.2024 18:41 πŸ‘ 88 πŸ” 10 πŸ’¬ 2 πŸ“Œ 0
Video thumbnail

I have now also ported the color vision deficiency simulation app to Shiny live. Advantage is this runs entirely in your browser, even though you "upload" the image it never leaves your computer.

10.01.2025 05:15 πŸ‘ 65 πŸ” 20 πŸ’¬ 1 πŸ“Œ 1
A screenshot of a Pyodide REPL executing Polars code:

import polars as pl
import requests
r = requests.get("https://raw.githubusercontent.com/pola-rs/polars/refs/heads/main/examples/datasets/foods2.csv")
pl.read_csv(r.content).group_by("category").mean()

A screenshot of a Pyodide REPL executing Polars code: import polars as pl import requests r = requests.get("https://raw.githubusercontent.com/pola-rs/polars/refs/heads/main/examples/datasets/foods2.csv") pl.read_csv(r.content).group_by("category").mean()

A screenshot of a Quarto Live code cell executing Polars code:

import polars as pl
import requests
r = requests.get("https://raw.githubusercontent.com/pola-rs/polars/refs/heads/main/examples/datasets/foods2.csv")
pl.read_csv(r.content).group_by("category").mean()

A screenshot of a Quarto Live code cell executing Polars code: import polars as pl import requests r = requests.get("https://raw.githubusercontent.com/pola-rs/polars/refs/heads/main/examples/datasets/foods2.csv") pl.read_csv(r.content).group_by("category").mean()

A screenshot of a Shinylive app using Polars code:

from shiny import App, render, ui
import polars as pl
from pathlib import Path

app_ui = ui.page_fluid(
    ui.input_select("cyl", "Select Cylinders", choices=["4", "6", "8"]),
    ui.output_data_frame("filtered_data")
)

def server(input, output, session):
    df = pl.read_csv(Path(__file__).parent / "mtcars.csv")
    
    @output
    @render.data_frame
    def filtered_data():
        return (df
                .filter(pl.col("cyl") == int(input.cyl()))
                .select(["mpg", "cyl", "hp"]))

app = App(app_ui, server)

A screenshot of a Shinylive app using Polars code: from shiny import App, render, ui import polars as pl from pathlib import Path app_ui = ui.page_fluid( ui.input_select("cyl", "Select Cylinders", choices=["4", "6", "8"]), ui.output_data_frame("filtered_data") ) def server(input, output, session): df = pl.read_csv(Path(__file__).parent / "mtcars.csv") @output @render.data_frame def filtered_data(): return (df .filter(pl.col("cyl") == int(input.cyl())) .select(["mpg", "cyl", "hp"])) app = App(app_ui, server)

Recently I've been working on getting #polars running in #pyodide. This was a fun one, even requiring patches to LLVM's #wasm writer! Everything has now been upstreamed and earlier this week Pyodide v0.27.0 released, including a Wasm build of Polars usable in Pyodide, Shinylive and Quarto Live πŸŽ‰

04.01.2025 11:59 πŸ‘ 49 πŸ” 9 πŸ’¬ 0 πŸ“Œ 0

Ooooooh this looks super fun!

01.12.2024 17:22 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Preview
Changelog

πŸ“¦ usethis 3.1.0 πŸ“¦ is released. `use_vignette()` and `use_article()` can now help you initiate a Quarto (.qmd) vignette or article. #rstats

usethis.r-lib.org/news/index.h...

26.11.2024 15:55 πŸ‘ 115 πŸ” 31 πŸ’¬ 3 πŸ“Œ 0
Post image Post image Post image

#RStats I'm so happy to finally share what we've been experimenting on at ThinkR for the past couple of weeks β€” A native mobile app that can run R code through #webR

Read more at πŸ‘‰ rtask.thinkr.fr/youve-been-w...

19.11.2024 12:44 πŸ‘ 115 πŸ” 30 πŸ’¬ 6 πŸ“Œ 7

Slides on how R-universe uses @cloudflare.social to get fast global routing and caching: jeroen.github.io/technotes2024

19.11.2024 12:57 πŸ‘ 12 πŸ” 6 πŸ’¬ 0 πŸ“Œ 0

We’ve been working hard on next quarto version and it is coming out soon. It is already available so if you are ok to try it please do ! Feedback welcome to find the remaining bugs that could still be hidden. Thanks !

17.11.2024 08:21 πŸ‘ 26 πŸ” 6 πŸ’¬ 0 πŸ“Œ 0

I made a starter pack with #Shiny for #RStats and #Python devs and friends! And if you're a Shiny person and want to be included, let me know.
go.bsky.app/BFEQ1HY

08.11.2024 19:33 πŸ‘ 99 πŸ” 21 πŸ’¬ 21 πŸ“Œ 4

{rayshader} one day! Maybe we could it hook up with webGL/webGPU πŸ€”

06.11.2024 15:53 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
WebAssembly roundup part 1: webR 0.4.2 - Tidyverse First in a series of blog posts about what's new in R for WebAssembly. The latest release of webR 0.4.2 is now available, with updates to the viewer mechanism, support for displaying htmlwidgets, an I...

I've written a series of blog posts about what I've been up to over the last few months! πŸ“

In the posts I talk about webR, R Shinylive, and a new Quarto extension for interactive code exercises.

Take a look if you're interested in the latest for R for WebAssembly.
www.tidyverse.org/blog/2024/10...

06.11.2024 15:12 πŸ‘ 45 πŸ” 12 πŸ’¬ 3 πŸ“Œ 1
posit conf 2024 talk recordings and workshop materials

posit conf 2024 talk recordings and workshop materials

No trick, all treats - posit::conf(2024) talks are now on YouTube! 🍬

Over a thousand people gathered in Seattle and online to dive into all things open-source data science. With 100+ talks, there's a lot to explore!

Check out the playlist: www.youtube.com/playlist?lis...

#RStats #Python

31.10.2024 14:00 πŸ‘ 82 πŸ” 33 πŸ’¬ 0 πŸ“Œ 3
R in Production

R in Production, r-in-production.org, is a new book that will help you put R into production, coupled with (in the near future) new tools to make the process less painful. I'm working on this with @thomasp85.com , @gaborcsardi.bsky.social, and @hfrick.bsky.social.

29.10.2024 22:15 πŸ‘ 197 πŸ” 47 πŸ’¬ 3 πŸ“Œ 6
Screenshot of the next generation of data science education website talk.

Screenshot of the next generation of data science education website talk.

πŸŽ“ Excited to speak at @pyopensci.bsky.social 's Fall Festival! Join me for insights on the future of #DataScience education using #WebAssembly tools like #Pyodide & #webR with #Quarto.

πŸ“… Nov 1st, Workshop: "Reproducible reports and presentations"

🧡 Thread below!

29.10.2024 05:38 πŸ‘ 11 πŸ” 4 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

‼️ New blog post! I discuss the benefits of developing C/C++ code for R with the new #Positron IDE (from @posit.co) and provide functions to add to your user profile to automate some current pain points away!

Developing C/C++ code for R with Positron
Link: www.tylermw.com/posts/coding...

#RStats

26.10.2024 18:31 πŸ‘ 37 πŸ” 14 πŸ’¬ 2 πŸ“Œ 1
Preview
Winners of the 2024 Shiny Contest - Posit

Winners of the 2024 Shiny Contest
posit.co/blog/winners...
#posit #rstats #shiny #python #pydata

22.10.2024 17:30 πŸ‘ 21 πŸ” 7 πŸ’¬ 1 πŸ“Œ 5

I made an #RSats starter pack. Includes a touch of Linux, Python, and dataviz but mostly R. go.bsky.app/Ki7PjpS

20.10.2024 13:16 πŸ‘ 203 πŸ” 94 πŸ’¬ 23 πŸ“Œ 12
A screenshot of a demo app consisting of a box on the left and a histogram on the right.

The digit 4 has been hand-written into the box on the left (e.g. with a mouse or touchscreen).

The histogram shows a probability distribution over the digits 0-9, attempting to classify which digit has been drawn. In this case, the bar for the digit "4" is the highest.

A screenshot of a demo app consisting of a box on the left and a histogram on the right. The digit 4 has been hand-written into the box on the left (e.g. with a mouse or touchscreen). The histogram shows a probability distribution over the digits 0-9, attempting to classify which digit has been drawn. In this case, the bar for the digit "4" is the highest.

I recently wrote a deep-dive post discussing the patches we make to LLVM Flang to cross-compile #wasm objects from Fortran source for #webR. It's at gws.phd/posts/fortra..., do take a look if you're interested. There are also some fun little interactive BLAS & LAPACK demos near the end of the post.

14.03.2024 12:14 πŸ‘ 2 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0