Deploying simple Streamlit apps

MP 81: It's straightforward, but there are some things to be aware of.

In a recent post, I showed how to make a simple dashboard using Streamlit. The example dashboard had several inputs that let you choose what kind of dice to use, how many dice to roll, and how many rolls to include in the simulation.

In this post we’ll see how to deploy a simple project like this to Streamlit’s Community Cloud hosting service. It’s a fairly straightforward process, but there are a couple privacy issues you might want to be aware of.

What is Community Cloud?

Streamlit refers to projects as apps, because once you have a working project it functions like an app. I’ve been talking about dashboards, but Streamlit is flexible enough that what you create doesn’t have to look like a dashboard.

Streamlit’s Community Cloud has a gallery of representative projects. When you visit any of these projects, the code is one click away.

When you’ve built a functioning app with Streamlit, you’ll almost certainly want to deploy it somewhere so others can use it as well. Because Streamlit is an open source project that can be installed with pip, it can be deployed in the same way you deploy any Python code: on a physical server, on a VPS such as Digital Ocean or Linode, or on a managed Platform like Heroku.

If your app is hosted in a public repository on GitHub, you can deploy it for free to Streamlit’s Community Cloud service. There are a variety of reasons companies offer free hosting for public projects. For one thing, having a collection of open projects helps people learn how to use the underlying framework. The code for every project hosted on Community Cloud is one click away; if you see an app or feature you like, you can see exactly how its developers implemented the project using Streamlit.

You can make an account on Community Cloud using Google, GitHub, or through email-based authentication. If you don’t already have an account, I encourage you to read through the rest of this post before making one. Streamlit asks for more permissions than you probably want to grant, and there’s a way to avoid some of the permissions that isn’t very obvious.

Connecting a GitHub repository

I pushed the code for the Rolling Dice project to a GitHub repository, so it’s ready to deploy to Community Cloud. Make sure your project has a requirements file, so Streamlit will know what packages it needs for deployment. To deploy a public project, go to https://share.streamlit.io.

I already have a Community Cloud account, but I disconnected my GitHub account in order to walk through the process again. Without a connected GitHub account, this is what the share.streamlit.io dashboard looks like:

Streamlit’s Community Cloud dashboard.

Notice the caution symbol next to Settings. Streamlit really seems to want access to your GitHub repositories, and if you limit the access in any way you’ll see that symbol.

If you click New app and you haven’t already connected your GitHub account, you’ll see a button labeled Connect to GitHub:

popup on community cloud dashboard warning about the need to connect to GitHub
Community Cloud pulls code from GitHub repositories, so you have to connect your GitHub account.

There’s no way to avoid this connection, so click that button.

You’ll arrive at a GitHub page where you can authorize Streamlit to access your public repositories:

GitHub permissions page, showing that Streamlit is asking for full read/write and admin permissions over all public repos
Streamlit wants all the permissions on all the repositories, regardless of which features you plan to use.

I don’t particularly like the permissions that Streamlit asks for. They want full admin and read/write access to all your public repositories. I think this is because they offer an in-browser editor where you can work on your Streamlit projects. But they don’t give the option to opt in to that specific service; if you want to deploy a public project to Community Cloud, you have to grant all these permissions.

Public repositories are part of the open source supply chain, and asking for full access to all of a user’s repositories seems a little inappropriate in 2024. Streamlit says they don’t want to have to ask for permission more than once, but most developers I know are perfectly fine granting permissions on a per-repo, as-needed basis.

I believe you can grant these permissions, deploy your project, and then revoke permissions. You’ll lose access to some services through Streamlit until you grant permissions again, but your projects appear to continue running.

If you see a request for access to your private repositories as well, you can bypass that request by going directly to the URL https://share.streamlit.io/deploy. I believe with a new account Streamlit tries to get access to private repositories. I bypassed that once, and it doesn’t seem to prompt for private access on subsequent deployments.

Deploying your project

After dealing with permissions, you’ll arrive at a page where you can tell Streamlit which repository you want to deploy from:

Streamlit form labeled "Deploy an app"
Deploying a project is really simple: provide the repository’s URL, specify the branch that should be deployed, and give the name of the main .py file that should be run.

You can fill this page out with your repository’s URL, the name of the branch you want to deploy from, and the name of the .py file that you’ve been calling with streamlit run. Streamlit will generate a unique URL for your project, and you’re free to enter a simpler name that hasn’t already been taken. For this project, I chose sl-roller.streamlit.app.

When you click Deploy, you’ll see a message that “Your app is in the oven.” In a moment, you should see a deployed version of your app that behaves just like the one you’ve been running locally. Here’s what the Rolling Dice demo looks like immediately after deployment:

The live version of the Rolling Dice demo.

When you’re logged in to Community Cloud, you’ll see a sidebar that lets you manage your app. You can view the log, see how many people have visited your app, reboot it as needed, and more.

A little more about private repos

Streamlit really seems to want access to our private GitHub repositories. I bypassed the popup that demands access to private repositories as described above, but I still have a caution symbol next to my Settings link. Here’s what I see if I click on Settings:

Warning dialog with button labelled "Allow access"
Even if you’re not planning to deploy from a private repo, Streamlit continues to show a “Warning”. They really seem to want access to those private repos.

Streamlit’s justification for this warning is that they allow you to deploy one app from a private repository. But if you click Allow access, this is what you see:

GitHub list of permissions Streamlit is requesting
They want all the permissions on all the private repos, too!

For the possibility of deploying from one private repository, Streamlit wants read and write access to all of your private repositories. In an issue on the streamlit repository, staff have suggested that people can make a new GitHub account if they dislike Streamlit’s approach to handling permissions. This is not a very satisfying response, as it shifts all the responsibility for appropriate access onto developers.

I’m only using Community Cloud because it’s possible to bypass the demand for private repository access. If you decide to use it as well, I encourage you to keep that caution symbol next to your Settings link as well.

Pushing changes

When you connect a GitHub repository to a Community Cloud deployment, Streamlit sets a web hook on the repository. Any time you push changes to the branch that the deployment is pulling from, Streamlit gets a notification and automatically updates the deployed project.

Streamlit sets a webhook that notifies them when the deployed project has been updated.

This means when you push updates to your repository’s main branch, or merge changes into the main branch, your deployment will pick up those same changes.1

Conclusions

Streamlit is fairly easy to get started with, and if you’re already familiar with Git and GitHub it’s quite easy to deploy your public projects as well.

Be aware that projects hosted on Community Cloud have about 1GB of resources available, and they rate-limit requests to prevent abuse. I shared a project that got several requests a minute for a while, and the app handled it perfectly fine. I shared that same project to a larger audience, and everyone started getting 429 errors. If you have a project that’s going to see many concurrent users, Community Cloud is probably not an appropriate deployment solution.

I’ll follow this up with a couple more posts about using Streamlit over the next month or two. I’ll share a real-world dashboard I developed, and discuss a variety of issues involved with making performant deployments of your Streamlit apps. If you have questions or observations from your own experiences, please share them!

Resources

You can find the code files from this post in the roller_demo GitHub repository.


  1. I’m using the word “main” loosely here. You can tell Streamlit to watch any branch on your respository. So you could have a main branch, a dev branch, and a streamlit_cc branch if you want. If you tell Streamlit to deploy from the streamlit_cc branch, that’s the only one it will pick up changes from.