When people ask this, the answer is always “it depends”. The free tier isn’t limited by the number of public users per se, just by the amount of resources the deployment container has. So for an app that did nothing but a single st.markdown("hello, world!"), I’d expect it to easily scale into the thousands of users simultaneously.
In the free tier, unless Streamlit employees go in under-the-hood, you’ll generally have a single container instance running your app. So multiple people hit the same container, and the Tornado server we use at the core of Python will make new threads.
For the paid tiers, we have the option of both scaling horizontally and vertically. So if your app needs a lot of CPU and RAM resources for a few users, the containers can be made bigger. Or if you expect massive traffic but each container doesn’t need a ton of resources, we can make several replicas. And of course, the third choice of lots of resources and lots of users is why the Enterprise tier is ‘call for pricing’.