Version 1.64.0

Release date: September 15, 2026

Highlights

  • :sparkles: Introducing st.echarts_chart, a new command that renders Apache ECharts options with Streamlit theming, and accepts dicts, JSON strings, or pyecharts charts (#16785).
  • :shuffle_tracks_button: Streamlit now supports async/await in app code, so you can use async libraries like httpx, aiohttp, and asyncpg directly (#16167, #744).
  • :new_button: 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: 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).
  • :butterfly: 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).
  • :beetle: Bug fix: Widgets after st.rerun keep the values the user selected, instead of resetting to their defaults (#16762, #3533).
  • :ant: Bug fix: Altair mark_geoshape charts render on first view, instead of showing an empty plot (#16886, #2910).
  • :honeybee: Bug fix: st.pydeck_chart honors pydeck views, so OrbitView, GlobeView, and map_provider=None render as specified (#16819, #2590, #2302, #9933).
  • :lady_beetle: Bug fix: st.pydeck_chart renders layers that declare deck.gl extensions, instead of showing an error box (#16823).
  • :spider: Bug fix: Altair binding_radio and binding_select stay a single widget when on_select is enabled (#16809, #8765).
  • :cockroach: Bug fix: Vega and Altair bind= controls use Streamlit fonts, colors, and focus rings (#16813).
  • :fly: Bug fix: Vega-Lite legend titles get more padding under the Streamlit theme, so the title is not stuck to the first entry (#16818).
  • :microbe: Bug fix: Elements stay dimmed after you press Stop, until the run actually finishes (#16839, #9904).
  • :mosquito: 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).
  • :scorpion: Bug fix: Custom Components v2 keep in-flight trigger values, so the value reaches Python instead of the script rerunning without it (#16833, #16732).
  • :cricket: Bug fix: st.download_button encodes filenames that a quoted Content-Disposition header cannot hold, so the browser saves the full name (#16646, #16631).
  • :spider_web: 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).
  • :snail: Bug fix: st.number_input raises a clear error when min_value is greater than max_value (#16895).
  • :lizard: Bug fix: Widgets raise an actionable error for an on_change mode they do not support (#16889).
  • :crab: 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: Bug fix: The error for a nested url_path names the invalid path and links to the issue you can upvote (#16896).
  • :butterfly: Bug fix: Exception traces in the browser hide Streamlit package frames, keep your st.* call site, and show chained exceptions (#16718).
  • :beetle: Bug fix: Coalesced reruns dispatch only the callbacks that have not run yet (#16765).
  • :ant: 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).
  • :honeybee: Bug fix: st.radio exposes option captions as descriptions, so assistive tech reads the option text as the name (#16811).
  • :lady_beetle: Bug fix: st.cache_resource rejects async validate and on_release callbacks, instead of discarding the awaitable they return (#16860).
  • :spider: Bug fix: AppTest treats unknown element subtypes as UnknownElement, so .run() finishes against a newer Streamlit (#16835).
  • :cockroach: Bug fix: AppTest raises AppTestError when you call set_value() or click() on an element with no typed wrapper (#16837).
  • :fly: 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).
  • :microbe: 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).
  • :mosquito: Bug fix: streamlit skills installs the bundled agent skills where Claude Code reads them, and reports an incomplete install instead of success (#16394).

The async support and live text input updates caught my attention. Being able to use libraries like aiohttp directly should make some Streamlit apps much easier to build, especially for apps that need live data.