
How to deploy Shiny apps in 2026 | Alex Chisholm | Data Science Lab
The Data Science Lab is a live weekly call. Register at pos.it/dslab! Discord invites go out each week on lives calls. We'd love to have you! The Lab is an open, messy space for learning and asking questions. Think of it like pair coding with a friend or two. Learn something new, and share what you know to help others grow. On this call, Libby Heeren is joined by Posit product manager Alex Chisholm as he walks through the evolution of shiny app deployment over the years, how to deploy shiny apps in the modern era, and peeks into Posit's roadmap for future development. Do you call it "deployment" or "publishing" when it comes to Shiny apps? 🤔 This is a super friendly and conversational space, and being there live in the Discord chat can't be beat!! We hope you get to join us sometime soon. Hosting crew from Posit: Libby Heeren, Isabella Velasquez, Daniel Chen, Alex Chisholm Alex Chisholm's LinkedIn: http://www.linkedin.com/in/chisholm1 Resources from the hosts and chat: Posit Connect Cloud for deploying Shiny apps in the modern era: https://connect.posit.cloud/ Install Positron: https://positron.posit.co/ Simon Couch's blog post on local LLMs not being good enough yet: https://www.simonpcouch.com/blog/2025-12-04-local-agents/ Blue-Green Shiny App Deployments using Posit Connect posit::conf(2025) talk by Ryszard Szymański: https://youtu.be/QEEGLWj0nas Digital Ocean: https://www.digitalocean.com/ Ollama local LLM: https://ollama.com/ py-sidebot app template: https://shiny.posit.co/py/templates/sidebot/ querychat app template: https://shiny.posit.co/py/templates/querychat/ Dan Chen mentioned Render in the chat as an alternative to Digital Ocean: https://render.com/ Alex Chisholm's AB testing GitHub repo example: https://github.com/alex-chisholm/shiny-r-abtesting Edward in the chat shared a GitHub repo for using GitHub actions to execute remote SSH commands: https://github.com/appleboy/ssh-action Abu in the chat shared blue-green vs. canary deployments: https://octopus.com/devops/software-deployments/blue-green-vs-canary-deployments/ Frank in the chat mentioned Simon's blog on using local LLMs with the chores package: https://www.simonpcouch.com/blog/2025-12-10-chores-0-3-0/ ► Subscribe to Our Channel Here: https://bit.ly/2TzgcOu Follow Us Here: Website: https://www.posit.co The Lab: https://pos.it/dslab Hangout: https://pos.it/dsh LinkedIn: https://www.linkedin.com/company/posit-software Bluesky: https://bsky.app/profile/posit.co Thanks for learning with us! Timestamps 00:00 Introduction 03:03 Meaningful applications and value creation 05:31 The evolution of Shinyapps.io and Posit Connect 08:12 DigitalOcean and Droplets 09:36 DigitalOcean vs. commercial cloud providers, 11:48 Comparisons: DigitalOcean, Azure, and AWS 14:47 Replicating local environments with Docker 16:51 The open-source Shiny Server 18:20 Use case: University of Illinois CITL 20:02 Key considerations for deployment decisions 21:53 GitHub Actions and version control 23:31 Addressing single points of failure and maintainability 24:38 Posit Connect Cloud features and portfolio 26:01 Beyond Shiny: Quarto, Streamlit, and Dash 27:07 Handling secrets and database credentials 28:56 Custom vanity links vs. UUIDs 30:04 Blue-Green deployment strategies 31:55 "Is it easy to set up a developer workflow?" 34:46 Guardrails for AI powered apps and token usage 37:32 Small language models and Ollama 38:29 Sidebot AI demo and LLM integration 39:41 Understanding manifest.json and dependencies 45:00 Automatic publish on GitHub push 46:51 The future of Shinyapps.io and migration 48:33 "Did you just build a custom agent for that specific dashboard?" 51:43 Publishing from RStudio IDE to Connect Cloud 54:16 Preview: Inspecting website APIs for data harvesting
image: thumbnail.jpg
Transcript#
This transcript was generated automatically and may contain errors.
We are super excited to introduce you to Alex Chisholm. If you have not already met him, Alex, would you like to introduce yourself, say hello, and something you'd like to do for fun?
I would love to. Nice to see everybody today. I recognize a few names actually already from people we've talked to about Connect Cloud over the years. I'm Alex Chisholm. I'm a data scientist turned into a product manager based in Pittsburgh, Pennsylvania now. And something I'd like to do for fun is try to get AI to help me become a better musician, not like write music for me, but to have it be able to coach me and evaluate what I'm doing at a piano or an instrument. So that's one fun side project I'm up to these days.
Nice. There's so many data musicians. Me too, me included. I'm a vocalist. If you are a data musician, please tell me in the Discord chat what instrument you play, because I really like to construct all of our imaginary bands that we could possibly have.
So Alex is going to be walking through publishing Shiny Apps in 2026, in the modern era. And we have all been publishing Shiny Apps in various ways for the past decade. Sometimes it's self-hosting. Sometimes it's like containerizing. A lot of times it's shinyapps.io. And we now have Posit Connect Cloud, which is what I am now using.
Alex, I would love it if you could give us a brief intro. Feel free to share your screen about what we'll be talking about today. And then we will dive into screen sharing. And I want everybody to know that this is a super good place to stop us and ask questions. And Alex can pause and answer questions. This is not like a conference presentation where you can't raise your hand and then say, hey, wait, I want to know what you clicked or what keyboard shortcut you used. This is the place to do that.
Sure. Yeah. Feel free to interrupt whatsoever. I know this is only the second one of these. So the ground rules are not as strict. I've heard that the data science hangout, there's a no slide policy. You can't show any slides at any point. But because I'm able to share my screen here and I can share code and I can share platforms and IDEs, I do have a few slides just to ground the session because there's a very clear question, I think, in terms of what we're talking about, right? It's like, where should I be deploying Shiny apps in 2026? So there's some real recommendations there and some real trade-offs that I'm sure some of you have been kind of like struggling with for years.
A brief history of Shiny deployment
Oh, and you're a product manager for Connect Cloud, which means you can talk about roadmap questions and stuff like that. So if anybody wants to peek behind the curtain of like, what are they planning over at Posit? You're our guy, right?
So thinking ahead, though, like, what really are the options? Like, one thing that I thought was neat was yesterday, Libby posted this on LinkedIn and she mentioned, you know, how she got kind of started using these things to create value. And other people chimed in and said the same type of thing. Like, I remember my first Shiny application. So I started just like reminiscing, like the ones that in my career and life have been kind of meaningful for me.
And one was like teaching on the side, just like helping students be able to look at statistical distributions, right? And like be able to change some of those input parameters, something as simple as standard deviation and see those curves kind of change in real time. Also being able to like then step up for a type of application that's not just based upon like taking an input, but like taking now something from the user and then changing what's being shown on the screen. So we had an application that could process job applications from a link and then use natural language processing because this was seven, eight years ago before LLMs would have just done it for us.
And like Shiny came to the rescue for me in all of these situations. But in each of the situations, we also had to find out where we're going to like host and put these things. And that was the hardest part, right? So like we had this application. I remember being pulled into meetings and I'd bring my laptop and like share it on the big screen in front of the room.
And like in the modern time, it's like Zoom and stuff. Or I'd even take screenshots and then be asked to put these in PDFs or PowerPoint presentations or at the lowest form, which I thought was always unique. And I'm very curious if others have done this as well. Like you download RStudio, you take my script and just run it on your own machine. Like what hacky ways and not hacking in a good way.
But the real thing to me at least was like, there's something wrong going on here. Like something doesn't feel right. And the problem was like, I considered myself a data person or a data professional, but I'm not an engineer. And it was really hard to tell, well, where can I put this out?
And in 2015, shinyapps.io made this a lot easier, right? So like you don't need to manage any infrastructure whatsoever. We're just going on to a website. We're syncing it with our ID and being able to deploy. A couple of years later, RStudio now Posit, put out Posit Connect, which has sort of like more full-fledged. You can do a bunch of different applications or documents. You can have more control over everything. So these options were super easy and they were super easy because, right? Like we went straight from the IDE empowering individual data scientists. The button is right there. You click the button, you find out one of these destinations, voila, you have something online. You have something that you can share.
Deployment options: DigitalOcean, AWS, and self-hosting
So really just to wrap this up before getting into questions and examples, like I don't want to make it seem like, only shinyapps.io or Connect Cloud are the places where you can deploy things. And we hear from a lot of people and I'd love to hear your experience today about going out and spinning up your own infrastructure, whether it's looking at EC2 on Amazon, like essentially giving yourself a server, which you do need to install the things that are needed to support the deployments or DigitalOcean, which makes it a little bit easier. And then the ones that we'll get into when we hopefully do some examples today on Connect Cloud.
So I'm not an expert on this side of things, but my understanding is you get into AWS and like you create like an EC2 instance and it's kind of on you to do the installation of everything you need within that environment to then go ahead and support the deployment where I think what DigitalOcean here and maybe others like Vercel make it a little bit easier is they have some like handholding for you to spin up the right environment in a way that AWS makes it a little bit- you need a little bit more context. I think a little bit more understanding, my guess would be on the AWS side.
I think the other big consideration is, do you have one or two applications that you're trying to optimize and that they're stable? Like I know I've got these few things, they're limited in number, I just want them to scale as best and as cheaply as possible. And you have the technical skills to be able to set something up in AWS or something like DigitalOcean, then I think those are really good solutions. If you don't have those skills or if you have a bunch of applications that you want to maintain, they're constantly changing, you want to put new ones up there and iterate and share with broader people, I think that's where tools like Connect Cloud and Connect make the lives of both data people and administrators much, much easier.
If you don't have those skills or if you have a bunch of applications that you want to maintain, they're constantly changing, you want to put new ones up there and iterate and share with broader people, I think that's where tools like Connect Cloud and Connect make the lives of both data people and administrators much, much easier.
So if you go into GitHub, this is the repo that's powering one of my DigitalOcean deployments. And you can see like the thing that is needed here, like the thing that tells DigitalOcean how this works is this notion of a Docker file. And I definitely needed LLM support to get this up and running and working because when you're thinking about taking what's working on your local machine and putting it anywhere, that anywhere needs to understand what's working locally to sort of replicate that, right?
So like this Docker file saying like the type of image it's trying to use to get Shiny in the first place, the specific packages needed to manage this, like there's a dependency issue as well, and then a bunch of other things in terms of setting up that environment. So you can, right now, like if you want to do experiment with DigitalOcean, you've never done it before, you can probably come here and borrow this Docker file and have similar success that I have in terms of getting it set up. But it does require, again, like a little bit more technical understanding for what's going on.
And if I go back into, lastly on DigitalOcean here, coming up into the specific thing that I've deployed, you can see that I have a deployment. I click on my app, and then here's the thing that I'm able to share. And any of you could go to this right now because it is publicly available. Like that was the effort to get there.
And then on the flip side of this, right, like that was like one specific, more technical way to do it. And what we think we've developed on deposit products is making it a lot easier for people who don't want to think about that stuff at all to be able to deploy and to share. And that's what really worked well with shinyapps.io.
Yeah, so the one way on that DigitalOcean example or AWS is like you would probably install the open source version of Shiny server to be able to back your deployment in the first place. So that definitely comes into use there.
I think the other big consideration is, do you have one or two applications that you're trying to optimize and that they're stable? Where people start getting headaches is if I have permissions for many people to be able to see something specific, or if I want to share it with the world for some people, but not for others. Like these are all rules and sort of additional layers of complexity you have to put up on there. And I think when you go down that route, like you start hearing words like Shiny proxy and NGINX to be able to do some, like the load balancing and the authentication layers for this. And that's when it gets kind of above my head.
And there was one other thing I wanted to call out, which is Nick Drew said, another question for this slide that would be good is who is going to support this when I'm out? And if you go through this complicated process in AWS or DigitalOcean, nobody else knows how to do. You are the single point of failure. You stop being able to go on vacation or get sick. And I, as a contractor, as a freelancer who did Shiny Freelance, I saw this happen a lot where people were looking for a contractor to come pick up the pieces of something that someone had left unexpectedly that no one could run.
Deploying to Posit Connect Cloud
First, I'm going to go over to Connect Cloud. And Connect Cloud, it's similar to some of our other publishing services in the sense that it is a freemium model where you can get on and create a free account right now and you can deploy it a bunch of different ways. I skirted over it quickly on that slide, but you can do it through code on GitHub. You can do it through Positron or VS Code with Publisher extension. And you can do it from any IDE, including RStudio now, using the RS Connect library for our deployments specifically.
If you do create an account, this is an individual one here, you essentially get a little portfolio which showcases everything that you deployed before. So here's one of the examples that we can deploy again, but you can see I've got a bunch of things going over time. And right now, again, on that free account, if you wanted to use this for a place that you're showing off a portfolio, maybe your GitHub account is linking to live applications, it's a great way to be able to say, here's what I've made before, here's a live working example of that code.
It's not just Shiny. Put anything on there. Quarto, Youbit, Streamlit, Dash, all kinds of stuff. Yes, and for those using Shiny, absolutely. This is one reason why Connect Cloud is our next generation publishing platform. Yes, it does Shiny really, really well, but we know that most people, 80% of the people signing up for Connect Cloud do applications and they do documents. And having to use multiple services for all these is kind of annoying. And even on the free plan on Connect Cloud, you have unlimited documents. So as much Quarto as you want to put up there, you can get onto Connect Cloud.
And then what that deployment flow looks like for those, again, on that GitHub side. So I click the framework that I want. If I'm going in through GitHub, I go out. I can do any of these, but let's keep with this A-B testing example since we shared the repo. It's going to go out and it's going to find that main branch. It's got that app.r that is in.
There's this notion of automatic publish on push. This gets to one of Nathan's workflows. I'm like, I need to keep things up and running. And now if this is turned on, when I do make changes to that repo, it will automatically update on Connect Cloud. And a big update from shinyapps.io is this idea of putting in secret variables at the time of deployment. So for those that have done anything in shinyapps.io with database credentials, username or password, or LLM keys, right, you're putting them probably like in some kind of RN file, like within your project, and just putting it up into the cloud, which is still, you know, it's still there in the bundle, right, which is not a great way to keep a lot of your things, especially when you're going out to other systems. So what you can do here is you could put in your database credentials. Once you store them, we can never see them again. You can never see them again, but they can power your applications in a more secure way.
So I'm just going to take all those defaults and just publish this. And like in real time, we're going out to that repo, we're grabbing everything that needs to support this. That is based on a manifest.json file, which you can generate with the RSConnect package. And then bam, like we have that same A-B test calculator here. If I got 500 conversions on the A side of my test, we're going to be able to tell like, did this thing do anything or did it hurt us? And what our level of confidence is for that.
But like now this is a publicly available, because I'm on an enhanced plan, it defaults to private, but I can make it publicly available. And now any people that follow this link can now interact with this application. Oh, and the link names. Like I like being able to have my Shiny apps at nicer link names. They're not like full customizable vanity links at this time, but it's pretty nice to have like share.connectcloud slash like my name and then just the app name, which makes it so much cleaner.
And this is like a good place to talk about the possibility, even with a free account of Blue-Green deployment, where like you could just, if you had an extra slot in your free account, right? Like you could just create another app with an update that is a big change for your app and don't tell anybody about it. Just switch your URLs. I think that that would work. Like just take the ending that you put on that URL, remove it from your old app and put it on your new app. And then you have that same URL pointing to a new app.
I think eventually we're going to build that in as a feature to the tool, but right now you could do it exactly in that way, especially when you're using GitHub, right? So you can have your initial deployment for something you're confident in. That is a single deployment tied to that custom name and then have that point to your main branch. But if you're working like on a development branch, you could do another deployment from that dev branch and then share that out and like, you know, get feedback. Like, is this ready to go? Are we good?
Yes, I think we talked about the way that you can make it work for you right now with a few extra steps. But on the roadmap, yeah. Like the idea of having a staging and a production environment for the same deployment is definitely something that we want to look into. My guess is not going to happen for another year or so, but it's on the roadmap for sure.
AI-powered Shiny apps and querychat
Why don't we circle back to the AI question from earlier? It was from Edward and it was, when creating AI-powered Shiny apps, what guardrails do you put in to stop token overuse and have you experimented with hosting your own small language models for use in apps?
Yeah, so guardrails in terms of token usage, which sounds more like cost control, right, for what I'm working on. So a couple of things come to mind. You know, one is depending on your provider, you might be able to have sort of max amount of usage per month. Like that's like the hard way to do it. I believe, you know, if I'm using the API on Claude, I can go and then turn it off at a certain level. I think the other way that I thought about this in products before for friends of mine who I've been helping out, one of them is, you know, stopping usage at a certain point, which isn't a great user experience, but like you have control through code when someone's interacting with your, you know, AI powered Shiny application to say, okay, you've done enough now for like this period, or now you need to log in and create an account. So that type of gating.
The other one that comes to mind also now is, you know, the model that you're using. Of course, there's a range of different models out there, some of which are more expensive to run, some of which are cheaper, validating that what your application is doing needs to be on a more expensive model, or if what the task it's doing can be accomplished in a good, in the right way by a cheaper model, that's another way to sort of guard you from a cost perspective.
So another link I think we shared with you is called querychat AI. And I don't know if you've seen this tool already. Yeah, it's, it's, it's kind of cool. Joe Chang, you know, worked on this earlier this year or maybe last year. And I just, I just did a clone of his demo, but essentially we're going to, we're going to deploy an application that has just a typical analytics view that you'd expect. And then we're going to add to it an AI key, an LLM key that's going to be able to power it and do different things. So you can play around with this. This one is a Shiny for Python application, but in essence, we're just going out, we're building a typical Shiny application and then we're having an LLM provider, be able to go in and manipulate some things.
So this is the, this is the app that we deployed and you can see, we've got data on tipping. We've got average bill size, average percentage. So this looks like a fairly normal dashboard that somebody might put together. What was different about this is there's this little sidebar here where we have AI functionality. And because I didn't provide a AI key, I think this would fail.
And then I think because of the length of my API key, I'm safe to put this next one into. So I'm going to save this. And now again, it's saved. You're not going to be able to see this again. Connect Cloud will not be able to see it. And you won't, if you need to update it, you have to, we do need to republish this because the changes are going to go into effect for the next deployment. So now as we're doing the deployment, it knows to look for this thing that we just saved to power the application.
So first off show me only weekday tipping. Actually, it's kind of neat though. See what this did here. Like this is actually a kind of, this is a pretty cool application in the sense that you gave the user the ability to drill down on the data and that all of your tables and charts and call-outs are now reflective of the data they chose, which is kind of, which is kind of interesting. So there's, that's one of the AI features within this. The other neat one, I think is the ability to read a plot and try to have some idea about what's going on.
But as you can see, AI, AI LLM key, excuse me. By us being able to store securely this LLM API key, now we can have applications that are powered by AI on something like Connect Cloud fairly easily.
Yeah, I mean, I think it's all similar work, right? It's like having context from your environment, from your data sets and seeing what can happen like data bot. And its current version is just like in your ID, helping you there with more context. So it's just like a limited version of that type of interaction for what's included in that, that small scale application.
did you just build a custom agent for that specific dashboard or was that like a, did you build it with like a plugin prototype in mind to interact with just any kind of Shiny object and then translate to SQL? Yeah, you can, you can check out the prompt that was in that repo that we shared, like just prompt MDs essentially setting it up. So that's how, that's all we're doing is moving it around. I think it gave access to just the one data table that was in there. And then they said, don't use anything else. And then manipulating it was pretty much, you're going to generate SQL to change what's in the table. And then DuckDB is involved to make everything kind of update on the fly.
And we talk a lot about like, can Connect Cloud support AI deployments. And as you all are well aware, like AI can be used in so many different ways within your applications, either power, automation itself faster or better, or having your users get more out of it. So of course it can. And as long as we're able to make secure handshakes to databases or external data and API providers, Connect Cloud can support a lot of that.
Just real quick corollary to that question. I built an app that was similar to this for census data. And I found that using like really small local models was totally like fine for that level of like SQL natural language, like SQL generation. Have you guys experimented at all with just plunking like a, you know, three gigabyte model into your web server? Yeah, I've definitely messed around with local models and like everything else they're getting better each time. I went out and got a 48 gigabyte laptop the other year just to test them. But now I don't think you even need that for some of the stuff that you're working on. I think what everybody is pivoting to now is like evaluation, right? Is what I've deployed working for the intended use and whether that smaller model can help you, it depends on your intended use and how it's performing.
shinyapps.io legacy and the path forward
As I mentioned earlier, like at this stage it's a ten year old platform. And to be honest, we haven't done a lot of development work for probably the last five years on it. And all of our engineering efforts at the moment are centered around Connect Cloud, which is really a big part of our complexity, which is a lot of the things we want to do. And making it both be a viable alternative to Connect self-managed for those companies who are able to operate in the cloud, but be like the one place where you can share all of your data work in a very simple way. So, you know, I, we, we haven't set anything in stone yet. I might guess is it's still more than a year away, but I would imagine in the long run that Connect Cloud and Connect are really our only recommended publishing platforms for, for anything that, that you're working on. And if we do some kind of migration, we'll do everything we can to make that as smooth as possible and get plenty of notice for that.
The last thing that I wanted to show quickly is just last month, we added support for RS Connect to go from RStudio IDE to Connect Cloud. So before this, right? So I've got my application file. This is the same, maybe testing one that we had before you would use kind of like the, the publish button here and would take you to shinyapps.io in the next two or three months. I think that in that push button flow, you will also see Connect Cloud. So like that will get there eventually, but before then you can also go out and use RS Connect to do this.
So now that we've kind of registered it, I can do deploy app. And this is going up. To Connect Cloud, making sure we're on Connect Cloud. Perfect. And it's publishing content. And then it's already transferred me back over to, to my screen where I can see that we deployed another version of this AB testing app. So for those of you who are on RStudio and you're not yet, or you don't want to make the switch to Positron, you can deploy directly to Connect Cloud now from that RS Connect package. And very soon we'll also be adding it into that push button flow that so many of you have come to know and love.
Sweet. This has been fantastic. Alex, thank you so much for hanging out with us today and giving us all of your wisdom. Thank you everybody in the chat for hanging out. When you leave this call, you're going to have a survey that asks you like how we did, but there's also a place that you can put in what you want. In a format like this, where we are like sharing screens and we're being messy and we're learning out loud together because we would love to put more valuable stuff together and have cool people from the community or inside Posit share what they know.
Everybody, this does get recorded and you don't need to save a chat file because it is in the chat. We will see you next week. We're going to be joined by Marcos Huerto from the data science community here, who's going to be walking through digging through APIs that are just in like inspecting websites in your browser so that you can then use those APIs to like put in posts, man and use them or just harvest JSON objects and use those. This is something that I do all the time, as opposed to like using a scraping package, like Beautiful Soup, rvest or Selenium. I hope you'll join us. It's going to be a lot of fun. I will see you next week and on the server, I'll see you on the Discord server. Bye everybody.


