We created Streamlit to give the Python data community a new superpower: the ability to create beautiful apps as easily as writing Python scripts. We launched a minimal version of Streamlit in October with only basic output and interaction primitives. Despite these limitations, the response has been overwhelming: almost 7,000 Github stars and 13,000 monthly active users in less than four months! Most exciting has been to see the emergence of an intricate archipelago of Streamlit apps, from simple, fun demos of open-source projects, to community-spanning infrastructure and complex internal tooling at major companies used in production by hundreds of employees.
Inspired by your energy and creativity, we’re devoting 2020 to giving the Streamlit community a vastly expanded new set of superpowers. Our goal is to make Streamlit not only the most productive (and fun!) app building experience in the Python ecosystem, but also the most powerful by adding:
- Improved caching that’s easier to use and understand
- A custom component system to extend Streamlit’s capabilities in the browser
- Layout primitives to customize layout and other visual elements
- User-programmable state, especially for multi-page apps
- Enabling you to easily deploy apps from Streamlit (closed source)
A detailed feature list is on GitHub, and it’s really just a distillation of the ideas coming from Streamlit’s amazingly smart and creative community. Please help us understand what to build by submitting issues and pull requests, and by sharing your thoughts in the comments below.
Caching enables you to reuse data and computation in your apps, allowing scripts to run quickly by saving the results of expensive functions. We recently released hash_funcs so that you can set your own hash function for specific data types like TensorFlow sessions or live database connections. And we added more documentation on basic and advanced caching. Coming up are even more improvements to caching for other function types and some added magic to make everything around caching even more straightforward. Please share thoughts here about how you’d like to see caching work.
Our community has already created some great style and layout resources (and we have no plans to deprecate html, unsafe_allow_html=True!), but Streamlit in its current form doesn’t make layout nearly as easy as we think it should be. We’ll be adding style and customization options to Streamlit, and also building new layout primitives: horizontal, grid, scroll views, and more. This is a tricky one to get right because layouts make up some of the most complex parts of display logic like CSS, not to mention it’s really easy to make these layouts look ugly. What are your thoughts? What are your favorite layout systems in other languages? Please share thoughts here about how you’d like to see layout work.
Right now, getting a Streamlit app to store internal state, like information a user entered in a form, is simply too tricky. There are some workarounds for session state, but we want to give you a baked-in and elegant version of programmable state so you can build apps with sequential logic, apps with multiple pages, apps that incrementally ask users for input, and so on. Please share thoughts here about the use cases you’d like to see supported.
We know that building a great app is only half of the equation. You also want to deploy and share your app with others. We want Streamlit’s deployment workflow to be as elegant and awesome as its app-building workflow. That’s why we’re creating Streamlit for Teams: a single-click deployment solution for Streamlit apps with built-in enterprise-grade features like auth, logging, and auto-scaling. The first version of this will be rolled out for free to the community in a few months (and we’re expanding the beta soon, apologies if we haven’t gotten back to you yet!).
We’ve been tinkering with and refining these features over at Streamlit HQ. We’re so excited to share these new superpowers and iterate on them with the community!
Thank you for your part in the Streamlit journey and here’s to a great 2020