Release notes

This page lists highlights, bug fixes, and known issues for the latest release of Streamlit. If you're looking for information about nightly releases or experimental features, see Pre-release features.

star

Tip

To upgrade to the latest version of Streamlit, run:

Terminal
pip install --upgrade streamlit

Release date: September 15, 2026

Highlights

  • ✨ Introducing st.echarts_chart, a new command that renders Apache ECharts options with Streamlit theming, and accepts dicts, JSON strings, or pyecharts charts (#16785).
  • πŸ”€ Streamlit now supports async/await in app code, so you can use async libraries like httpx, aiohttp, and asyncpg directly (#16167, #744).
  • πŸ†• Announcing live updates for st.text_input: set live=True and the widget commits while the user types, after a short pause (#16662, #4553).

Notable Changes

Other Changes

  • πŸ› Bug fix: st.dialog hides a leftover dialog as soon as the next full-app run starts, so st.rerun() closes the modal before later blocking work (#16901, #9405).
  • πŸ¦‹ Bug fix: st.dataframe and st.data_editor convert list columns that PyArrow cannot serialize to strings, instead of raising when the nesting levels differ (#16838, #9380).
  • πŸͺ² Bug fix: Widgets after st.rerun keep the values the user selected, instead of resetting to their defaults (#16762, #3533).
  • 🐜 Bug fix: Altair mark_geoshape charts render on first view, instead of showing an empty plot (#16886, #2910).
  • 🐝 Bug fix: st.pydeck_chart honors pydeck views, so OrbitView, GlobeView, and map_provider=None render as specified (#16819, #2590, #2302, #9933).
  • 🐞 Bug fix: st.pydeck_chart renders layers that declare deck.gl extensions, instead of showing an error box (#16823).
  • πŸ•·οΈ Bug fix: Altair binding_radio and binding_select stay a single widget when on_select is enabled (#16809, #8765).
  • πŸͺ³ Bug fix: Vega and Altair bind= controls use Streamlit fonts, colors, and focus rings (#16813).
  • πŸͺ° Bug fix: Vega-Lite legend titles get more padding under the Streamlit theme, so the title is not stuck to the first entry (#16818).
  • 🦠 Bug fix: Elements stay dimmed after you press Stop, until the run actually finishes (#16839, #9904).
  • 🦟 Bug fix: st.query_params skips a browser history entry when the query string does not change, so the Back button leaves the app (#16831, #9878).
  • πŸ¦‚ Bug fix: Custom Components v2 keep in-flight trigger values, so the value reaches Python instead of the script rerunning without it (#16833, #16732).
  • πŸ¦— Bug fix: st.download_button encodes filenames that a quoted Content-Disposition header cannot hold, so the browser saves the full name (#16646, #16631).
  • πŸ•ΈοΈ Bug fix: st.slider swaps reversed min_value and max_value bounds, instead of truncating the range or raising an error about numbers you never passed (#16716, #16675).
  • 🐌 Bug fix: st.number_input raises a clear error when min_value is greater than max_value (#16895).
  • 🦎 Bug fix: Widgets raise an actionable error for an on_change mode they do not support (#16889).
  • πŸ¦€ Bug fix: Streamlit classifies invalid icon= values more precisely, so an empty value means no icon and a URL raises an image error (#16900).
  • πŸ› Bug fix: The error for a nested url_path names the invalid path and links to the issue you can upvote (#16896).
  • πŸ¦‹ Bug fix: Exception traces in the browser hide Streamlit package frames, keep your st.* call site, and show chained exceptions (#16718).
  • πŸͺ² Bug fix: Coalesced reruns dispatch only the callbacks that have not run yet (#16765).
  • 🐜 Bug fix: st.button and similar controls wait 500ms before they show a help tooltip on hover, so a pointer that crosses a control does not open one (#16794, #8686).
  • 🐝 Bug fix: st.radio exposes option captions as descriptions, so assistive tech reads the option text as the name (#16811).
  • 🐞 Bug fix: st.cache_resource rejects async validate and on_release callbacks, instead of discarding the awaitable they return (#16860).
  • πŸ•·οΈ Bug fix: AppTest treats unknown element subtypes as UnknownElement, so .run() finishes against a newer Streamlit (#16835).
  • πŸͺ³ Bug fix: AppTest raises AppTestError when you call set_value() or click() on an element with no typed wrapper (#16837).
  • πŸͺ° Bug fix: AppTest treats an empty st.chat_input submit as a real value, and prints ChatInputValue without an error when accept_file=True (#16857).
  • 🦠 Bug fix: AppTest.session_state supports the same dict methods as st.session_state, which are get, keys, items, values, to_dict, len, and iteration (#16897).
  • 🦟 Bug fix: streamlit skills installs the bundled agent skills where Claude Code reads them, and reports an incomplete install instead of success (#16394).
forum

Still have questions?

Our forums are full of helpful information and Streamlit experts.