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: August 4, 2026

Highlights

  • ⚑ Introducing lazy loading for st.dataframe: large dataframes now load their rows on demand automatically, so the browser stays responsive. A new lazy parameter lets you turn this on or off explicitly, and Polars LazyFrame objects are supported natively (#15756).
  • 🍿 st.cache_data and st.cache_resource have a new refresh_mode="background" option that refreshes expired cache values in the background, so your app keeps serving the previous value without waiting (#16057, #5871).

Notable Changes

  • 🎯 st.metric has a new icon parameter to display an icon next to the metric label (#15805, #12298).
  • ⏱ st.time_input received a major revamp with editable time segments, a new format parameter to control the hour cycle (12-hour, 24-hour, or localized), seconds granularity when step is under 60 seconds, paste support, and improved form behavior with Enter-to-submit (#16126, #16128, #16096, #15647, #6423, #8234).
  • πŸ‘₯ st.multiselect has improved tag accessibility, including keyboard navigation between tags and WAI-ARIA-aligned dropdown focus (#16200, #16109).
  • πŸ“₯ st.download_button now infers a missing file_name and mime from a file object's name when you pass data opened from disk (#16061). Thanks, SoMika00!
  • πŸšͺ st.Page is now a proper class, so isinstance(page, st.Page) behaves as expected (StreamlitPage remains a backward-compatible alias) (#16268).
  • πŸ”’ New server.allowedHosts config option lets deployments with known hostnames restrict incoming WebSocket handshakes (#16147).
  • πŸ›‘ The disabled widget parameter is now enforced server-side, so a disabled widget never accepts a value from the browser (#16209).
  • πŸ‘» Breaking change: The deprecated use_column_width parameter has been removed from st.image. Use the width parameter instead (#15786).
  • ☠️ Breaking change: Passing local file paths as strings to st.html and st.iframe is deprecated. Use a pathlib.Path object to load local files instead (#16150).

Other Changes

  • πŸ› Bug fix: AppTest now converts a script file path to its parent directory before adding it to sys.path (#15775). Thanks, ishaanlabs-gg!
  • πŸ¦‹ Bug fix: An unclean WebSocket close now reconnects to the existing session, preserving widget values, st.session_state, and run count instead of restarting the app (#15909, #8901).
  • πŸͺ² Bug fix: The in-app "install skills" nudge is now suppressed when an install would only conflict, and reports why (#15966).
  • 🐜 Bug fix: st.selectbox fuzzy search matches non-contiguous substrings again, fixing a regression since 1.59.0 (#16009, #16003). Thanks, LuC-9!
  • 🐝 Bug fix: st.popover placed inside st.sidebar no longer renders off-screen (#16087, #9387).
  • 🐞 Bug fix: Pressing Escape in st.selectbox now clears the typed search query and restores the committed label (#16088, #16004).
  • πŸ•·οΈ Bug fix: st.bar_chart and other built-in charts no longer fail on column names containing a . (#16089, #7714).
  • πŸͺ³ Bug fix: st.expander no longer stays clipped after a rapid open/close interaction interrupts its animation (#16090, #16027).
  • πŸͺ° Bug fix: Right-side padding is preserved when a st.code block is scrolled horizontally to the end (#16091, #8206).
  • 🦠 Bug fix: AppTest multipage path handling is now deterministic and better documented (#16122, #8429, #8154).
  • 🦟 Bug fix: AppTest now clears stale elements on each rerun, so its element tree no longer accumulates duplicate widgets from earlier runs (#16123, #9128, #12566).
  • πŸ¦‚ Bug fix: An open st.data_editor cell edit is now committed when you click outside the grid (#16132, #7868).
  • πŸ¦— Bug fix: @st.fragment(run_every=...) no longer raises a TypeError when Sentry's threading integration is enabled (#16140, #16139).
  • πŸ•ΈοΈ Bug fix: st.data_editor row additions no longer silently overwrite existing rows for non-RangeIndex DataFrames (#16144).
  • 🐌 Bug fix: st.Page now rejects network paths and null bytes before touching the filesystem (#16146).
  • 🦎 Bug fix: Mermaid config keys hardened by Streamlit can no longer be overridden by inline %%{init}%% directives in diagram source (#16151).
  • πŸ¦€ Bug fix: The st.multiselect dropdown background now matches the sidebar theme (#16163, #11348).
  • πŸ‘½ Bug fix: Plotly Sankey charts now honor layout fonts set via fig.update_layout(font=...) (#16164, #11031).
  • πŸ‘» Bug fix: st.data_editor NumberColumn now preserves IME composition, so CJK input is no longer cut off after the first composed digit (#16165, #16129).
  • πŸ› Bug fix: A dataframe header background configured with an alpha channel now renders stably instead of shifting color on hover (#16166, #11950).
  • πŸ¦‹ Bug fix: Downloading an Altair/Vega-Lite chart as PNG now respects display DPI for a higher-resolution export (#16170, #8177).
  • πŸͺ² Bug fix: Fragments nested inside a shared container no longer lose their children after the enclosing parent fragment reruns (#16171, #12514).
  • 🐜 Bug fix: An st.selectbox near the bottom of the sidebar now flips its dropdown up instead of clipping past the viewport (#16199, #16181).
  • 🐝 Bug fix: st.help no longer shows "page.run()" as the header in multipage apps (#16244, #11430).
  • 🐞 Bug fix: st.pills and st.segmented_control keep the current selection highlighted when a format_func changes an option's label between reruns (#16271, #16269).
  • πŸ•·οΈ Bug fix: st.download_button now accepts io.StringIO data as documented (#16272, #16270).
  • πŸͺ³ Bug fix: Port auto-increment is restored on Windows, so a second streamlit run no longer binds an in-use port (#16315, #16296).
  • πŸͺ° Bug fix: An st.status opened on a container declared outside a fragment no longer blanks the app (#16316, #16281).
  • 🦠 Bug fix: The host message guard again accepts same-window self-posts, restoring embedded Streamlit-in-Snowflake auth delivery (#16327).
  • πŸ“¦ Streamlit no longer depends on GitPython and inspects local repositories via the git CLI instead (#16241).
forum

Still have questions?

Our forums are full of helpful information and Streamlit experts.