Highlights from Shiny in Production (2025)

This October, Jumping Rivers hosted the fourth installment of our conference “Shiny In Production”. This year, speakers from around the world joined us in Newcastle to see how Shiny, in both Python and R, has solved real data problems for them.
Workshops
An important part of “Shiny In Production” is the afternoon of hands-on workshops. Whether you want your app to look nice, behave correctly, or treat all your users fairly, there was something for you. If only we could attend all of the workshops in parallel, too…
Colin Fay - “Production-Proof Shiny - End-to-end testing with Playwright and {golem}”
Colin Fay from ThinkR presented a workshop on the, now industry-standard tool “Playwright”, for end-to-end testing. Playwright can be used against any browser-based application, so by learning this tool our attendees could go away and test apps whether they are written with Shiny in R or Python, or using any other dashboard framework.
Russ Hyde - “Asynchronous Shiny”
Poor Shiny. 13 years old is practically middle-aged for a web framework, and like many a tech wunderkind, it’s decided that it’s time for a change. Here at Jumping Rivers, we wish Shiny great success as it embarks on a new life as a chef. But as it juggles the multiple orders that come in, and the many different recipes on the menu, Chef Shiny has realised that its years training on the futures, promises, and ExtendedTasks of the data world were the perfect apprenticeship for this brave leap.
Russ, one of our Data Scientists from Jumping Rivers, explained to our workshop attendees how to work with asynchronous programming in R. And how Shiny can make use of this approach to build apps that can serve multiple users without blocking.
Pedro Silva - “Figma and User-Interface Design”
Yes Shiny, you are beautiful, but are you really pairing that typeface with those buttons?
Figma, like Playwright above, is another widely-used tool from the wider world of web development. It can be used to create user interface designs in collaboration with clients and colleagues.
Our Data Scientist Pedro Silva, ably-assisted by Tim Brock and Keith Newman, treated the workshop attendees to an introductory session on Figma. They worked through hands-on exercises to design components of an app and saw how thinking about the user-interface design from outside of your normal IDE can help when you are building applications in Shiny.
Talks
On Day 2 we enjoyed talks from some fabulous speakers across a range of industries!
Colin Fay - “After {shiny} — Bringing R to Mobile with webR”
R evolved from a command-line tool to include GUIs and IDEs. In 2012, Shiny emerged, enabling web app development purely in R, connecting statisticians with users. However, mobile usage wasn’t prioritised initially.
As mobile devices became ubiquitous, new requirements arose. Shiny’s mobile approaches proved limited, leading to the development of {shinymobile}. Despite improvements, it still required internet connectivity, couldn’t be distributed through app stores, and lacked access to native phone APIs.
To address these limitations, the team developed {R-linguo}, a proof-of-concept native app using webR. It offers offline functionality, native performance, mobile-friendly UX, native API access, and app store distribution.
The way the app works is by loading a JavaScript runtime, which loads webR, which then loads R functions as R object proxies that JavaScript can call.
This innovation serves scientists in remote areas, students, and educators who need offline R capabilities beyond what Shiny apps can provide.
Charlie Gao - “Advances in the Shiny Ecosystem”
This talk explores two key advances in the Shiny ecosystem: async programming and OpenTelemetry tracing.
The async section focuses on Promises and the mirai package. Mirai offers a modern foundation with NNG, IPC/TCP/secure TLS support, and cross-language data formats like Arrow. It delivers extreme performance, scaling to millions of tasks, with a production-first approach featuring 100% reliable evaluation and minimal complexity. It deploys everywhere, from local to remote systems and clusters including Slurm, SGE, LSF, and PBC.
OpenTelemetry provides observability at scale through distributed tracing across services, databases, and API gateways. It enables performance optimisation by reducing span length and nesting, real-time error detection, centralised monitoring across processes and machines, and production monitoring. Implementation requires installing {otel} and {otelsdk} packages and configuring environment variables.
The recommended performance workflow involves enabling OpenTelemetry to identify slow spans, using profvis for detailed analysis, then optimising through moving work outside Shiny servers, improving code efficiency, implementing caching, and sometimes utilising non-blocking reactivity.
Colin Gillespie - “Validating Shiny Apps in Regulated Environments”
Colin explored how to validate Shiny apps and what makes them trustworthy. Using audience input, he concluded that professional Shiny apps need tests, documentation, and a good user experience.
He covered the Jumping Rivers Litmusverse suite, which validates R packages, and explained that Shiny apps are harder to validate due to user interaction and variable outputs. Combining Litmus tools with Shiny-specific assessments can produce a validation score.
Colin also covered challenges such as logging user actions, validating downloads, and restricting inputs. He stressed using {renv} or Docker to manage environments, performing end-to-end testing, and separating logic from the app for easier testing. The talk ended with best practices around documentation, validation, workflows, and automation.
Jack Anderson - [“Transforming the reporting of national patient outcomes with Shiny”]
(https://digital.nhs.uk/ndrs/data/data-outputs/cancer-data-hub/30-day-mortality-after-sact)
The Shiny era may be in full swing, but our battle against inadequate Excel spreadsheets wages on.
The National Disease Registration Service (NDRS) reports 30-day mortality post-Systemic Anti-Cancer Therapy (SACT) Case-Mix Adjusted Rates (CMAR) to NHS trusts in England each year. For the first three years, these were shared as Excel files with an accompanying pair of instructions in PDF files. But this leaves you with a number of problems, such as time-consuming admin to prepare and email the results to over 350 trusts around the country, and limited capacity for QA checks.
Replacing this system with a Shiny alternative provided a more intuitive user interface, plots that now make sense when copied into external reports, and the ability for trusts to easily compare against neighbouring regions. Jack guides us through the many benefits—not just for the end-user—but also the NDRS benefitting from drastically reduced admin requirements in publishing results each year.
Spurred on from the success of this application, the NDRS now has a custom Shiny starter template to support the creation of future Shiny applications among the team.
Gabriella De Lima Marin - [“A collaborative initiative for mapping and georeferencing public schools in Brazil”]
(https://gabrielamarin.quarto.pub/shiny-in-production/)
With a goal of identifying digital inequality around Brazil, Gabriela lays out the problem of ensuring schools across Brazil can get a good connection to fibre internet networks. But that can be difficult when 3 in every 10 schools on the list have no geolocation data. It’s even worse when some schools with location data have coordinates that lie in the ocean.
Pulling in data from other sources—such as Google and OpenStreetMap—can help, but even these sources can be missing data or have incorrect entries. So why not allow locals to provide the missing pieces of the puzzle? Gabriela takes us through the creation of a Shiny application containing a {leaflet} map, where users can submit location data for schools.
There are of course challenges which Gabriela had to face: How do you decide which data source to trust? How do you decide who submitted the most accurate location marker? Challenges aside, this remains a cost-effective way to collect the vital information from those with local knowledge. And with this information, you can make impactful improvements to educational services across Brazil.
Cam Race - [“shinyGovstyle: A ‘Shiny’ Secret Weapon for Production-Ready Government Public Services”]
(https://drive.google.com/file/d/1hCbMEZjxq_hoSBWXomj9bw1p_WSQ9Nxx/view?usp=sharing)
The vast majority of UK government service websites use the GOV.UK Design System—an award-winning framework for consistent styling and components on websites.
Cam showcased {shinyGovstyle}, an R package that applies the GOV.UK design system on your Shiny app, and explained the benefits of having a consistent theming package for your applications. While the biggest effect from the package is to apply the standardised CSS to the application, additional functions are added to provide more accessible formats to hyperlinks and widgets. This means some of the styling requirements needed to meet WCAG 2.2 AA are handled automatically, which is a legal requirement for UK government web services to meet. But as Cam points out, while a surprisingly large percentage of users will have some form of accessibility needs, improved accessibility benefits everyone.
Thanks to this common design system in a package, it’s much easier for developers to have their Shiny applications accepted for publication on government sites.
Laura Mawer - [“Duck, Duck, …, Dashboard”](Duck, Duck,… Dashboard! video.mp4)
I write this while seeking cover. As Laura pelts another questioneer with rubber ducks, I’ll try to summarise her talk…
The second Shiny app that Laura (from Datacove) ever built, shows off some super cool stuff. Interactive graphics of duck-related data are one thing. But the artificial intelligence embedded in this app was awesome.
If you haven’t seen the AI tutorials for “Shiny for Python” that Posit have written, they are strongly recommended. But you need a good idea before including AI in an app. Here, Laura included a text-query box that allows users to ask questions about the dataset that is presented in the app. You can ask questions about ducks in general, or about the dataset itself. The idea worked really well.
That’s right. Her second ever app…
If you are learning Data Science in Python, Laura hosts a YouTube series “Pretty Powerful Pandas”. Hopefully she won’t be throwing pandas at us next time…
Nic Crane & Charlotte Hadley - “htmlwidgets are a secret sauce in R - can LLMs make them the perfect condiment?”
The final talk of the day was a duet. If you blend one htmlwidgets enthusiast, and one LLM enthusiast, this interactive session is the result.
{htmlwidgets} powers much of the connection between R and JavaScript widgets. Think DT, leaflet, plotly and profvis: their use in R and Shiny is held together by htmlwidgets. Many of the audience have made use of these tools at one time or another. It’s much less common to meet someone who has created an htmlwidget-based package that wraps up a JavaScript library for use in R.
This talk by Nic and Charlotte, showed us how simple it is to make an htmlwidget.
But it didn’t just do that. There’s already tutorials and books that can explain that process. Here, they showed us how simple it is to get GitHub Co-pilot to make an htmlwidget. Using prompts in VS-Code, they built an initial widget and then refined it and refined it with further prompting, until the resulting R code could create a timeline from an input data-frame.
Sure, there was a bit of manual tweaking required to polish off the code, but the package created by Co-pilot was usable. So it still takes an expert like Nic or Charlotte to temper some of the decisions made by code-generating tools.
Lightning Talks
Like last year the lightning talks had the added challenge of the slides auto-rolling with 10 seconds for each one! We also had a vote for the best talk with the prize being a £100 book voucher donated by the CRC Press. David Carayon from INRAE claimed the prize, avenging his second place finish last year!
David Carayon - “Rescuelog: a Shiny-Based Monitoring System for Lifeguards: Insights from Southwest France”
David started with showing the beautiful beaches of south west France with the caveat that they are some of the most dangerous in the world with thousands of rescues per year. He then outlined his project equipping life guards with tools and knowledge for reporting these rescues, allowing the collection of data to be used in a predictive analytics Shiny app. The project has been a great success with over 15,000 submissions each year and over 80 beaches signed up.
Rhian Davies - “The Accidental Engineers: Managing Shiny Apps, Pipelines, and Tech Debt in the NHS”
Rhian started with outlining the challenge of hospital planning, in terms variables impacting demand like population growth, patient expectations or waiting lists. She then presented a project using Shiny to explore outputs from a Python model.
The struggle of losing a core member of the team and the app going into production. This resulted in a huge surge in demand for the developers time with bugs, feature requests flying in. They have developed a mechanism to treat the model like a software project with sprints including development, quality assurance and launch. She finished with detailing some of the best practices they’ve implemented and important lessons learnt.
Andrie de Vries - “Working with Inforsec to get to production”
Andrie spoke about the importance of the three pillars of Infosec: availability, integrity and confidentiality. He also covered the risks of data leakage, not testing adequately and exposure to the LLM provider. He moved on the some solutions to these problems like authorisation, data security and scoped permissions.
Russ Hyde - “Discoverability and the Data Product”
This talk by our own Russ Hyde spoke about the importance of discoverability of tools and apps, this is often an overlooked part of development. Moving on to Shiny apps specifically there is aspects of metadata you can add like descriptions, tags and documentation.
Russ spoke about helping users by making it easy to find and use products and contact developers. He pointed to the Jumping Rivers dashboard gallery, with some helpful examples of features you can include in Shiny dashboards.
Kia Mack & Euan McKenzie - “Building the Kent BNG Register: Shiny for UI-First Development in a Small Charity Tech Team”
Kia started off with a brief background on something called Biodiversity Net Gain, a government initiative where land developers have to increase biodiversity and a popular way of doing this is by buying biodiversity credits. The Kent Wildlife Trust wanted a way to add visibility to local habitat banks (where the credits can be purchased) to ensure that local developers are investing in local biodiversity. She introduced the Shiny app that they had designed for land developers to see what listings are available from habitat banks and enquire with them.
Euan then detailed the tools used within the app like Bbs4Dash for the layout, leaflet for the open source maps and DT for interactive tables. He also spoke about the auth0 package for in app authentication, with email verification. Having a secure database was a key part of the project so they used the glue_sql and inputValidator functions to prevent SQL injection by sanitising queries. The Golem framework was also very helpful for structuring the app and allowed them to create a separate R package containing the business logic with tests.
Natalia Petersen - [“Hackathon to Streamline the National Disease Registration Service Cancer Treatments Shiny App”](NHSE-NDRS/shiny-app-cancer-treatments: This repository is for the production of the NDRS Cancer Treatments R Shiny app)
Natalia from the National Disease Registration Service spoke about how her team used a hackathon day to develop a shiny app. She started with a background of the project, a publicly available dashboard which presents treatment data for various forms of cancer treatment. She displayed the previous iteration of the dashboards (one for demographics and one for alliance) with a “retro” UI.
She spoke about areas of improvement they targeted for the dashboards like combining the dashboards, removing repeated code and simplification of over-complicated logic. They had 4 tasks, 4 hours and 4 analysts to tackle the issues. She spoke about successes of the session and also what could have improved it, like dedicated “mop-up” time. To finish Natalia showed what the new app looked like and gave an overview of the improvements made.
Andreas Wolfsbauer - “Enhancing Epidemiological Surveillance with a Shiny Application for Standardized Data Analysis”
Andreas, a data scientist at the Austrian Agency for Health and Food Safety in the Institute for Surveillance & Infectious Disease Epidemiology. He showed the Shiny application he has developed for standardised data analysis. The app has two components, the first is a dashboard where users can load the disease data then filter on year, state and age group. The second part of the app is an analysis page where they can filter the data and download or visualise the data.
Andreas spoke about issues with the app like a reliance on excel for the data so he ran a scheduled job each morning to preload the data. He spoke about constraints within the organisation with policies limiting access to tools like Docker and shinyproxy. So he turned to Shiny Server and deployed 3 instances of the app and wrote a gateway app which handles load balancing across the instances. He closed his talk with a list of features he would like to experiment with / add to the app in the future.
What happens next?
Next year, we’re excited to host the very first AI In Production! Join us on June 4th and 5th in Newcastle Upon Tyne for an inspiring lineup of industry-leading speakers and hands-on workshops. Grab your tickets now on Eventbrite to take advantage of the Super Early Bird discount before it’s gone.
Sponsors








