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 newlazyparameter lets you turn this on or off explicitly, and PolarsLazyFrameobjects are supported natively (#15756).
st.cache_dataandst.cache_resourcehave a newrefresh_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.metrichas a newiconparameter to display an icon next to the metric label (#15805, #12298).
st.time_inputreceived a major revamp with editable time segments, a newformatparameter to control the hour cycle (12-hour, 24-hour, or localized), seconds granularity whenstepis under 60 seconds, paste support, and improved form behavior with Enter-to-submit (#16126, #16128, #16096, #15647, #6423, #8234).
st.multiselecthas improved tag accessibility, including keyboard navigation between tags and WAI-ARIA-aligned dropdown focus (#16200, #16109).
st.download_buttonnow infers a missingfile_nameandmimefrom a file object’s name when you pass data opened from disk (#16061). Thanks, SoMika00!
st.Pageis now a proper class, soisinstance(page, st.Page)behaves as expected (StreamlitPageremains a backward-compatible alias) (#16268).
New server.allowedHostsconfig option lets deployments with known hostnames restrict incoming WebSocket handshakes (#16147).
The disabledwidget parameter is now enforced server-side, so a disabled widget never accepts a value from the browser (#16209).
Breaking change: The deprecated use_column_widthparameter has been removed fromst.image. Use thewidthparameter instead (#15786).
Breaking change: Passing local file paths as strings to st.htmlandst.iframeis deprecated. Use apathlib.Pathobject to load local files instead (#16150).
Other Changes
Bug fix: AppTestnow converts a script file path to its parent directory before adding it tosys.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.selectboxfuzzy search matches non-contiguous substrings again, fixing a regression since 1.59.0 (#16009, #16003). Thanks, LuC-9!
Bug fix: st.popoverplaced insidest.sidebarno longer renders off-screen (#16087, #9387).
Bug fix: Pressing Escape in st.selectboxnow clears the typed search query and restores the committed label (#16088, #16004).
Bug fix: st.bar_chartand other built-in charts no longer fail on column names containing a.(#16089, #7714).
Bug fix: st.expanderno longer stays clipped after a rapid open/close interaction interrupts its animation (#16090, #16027).
Bug fix: Right-side padding is preserved when a st.codeblock is scrolled horizontally to the end (#16091, #8206).
Bug fix: AppTestmultipage path handling is now deterministic and better documented (#16122, #8429, #8154).
Bug fix: AppTestnow 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_editorcell edit is now committed when you click outside the grid (#16132, #7868).
Bug fix: @st.fragment(run_every=...)no longer raises aTypeErrorwhen Sentry’s threading integration is enabled (#16140, #16139).
Bug fix: st.data_editorrow additions no longer silently overwrite existing rows for non-RangeIndexDataFrames (#16144).
Bug fix: st.Pagenow 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.multiselectdropdown 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_editorNumberColumnnow 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.selectboxnear the bottom of the sidebar now flips its dropdown up instead of clipping past the viewport (#16199, #16181).
Bug fix: st.helpno longer shows “page.run()” as the header in multipage apps (#16244, #11430).
Bug fix: st.pillsandst.segmented_controlkeep the current selection highlighted when aformat_funcchanges an option’s label between reruns (#16271, #16269).
Bug fix: st.download_buttonnow acceptsio.StringIOdata as documented (#16272, #16270).
Bug fix: Port auto-increment is restored on Windows, so a second streamlit runno longer binds an in-use port (#16315, #16296).
Bug fix: An st.statusopened 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 gitCLI instead (#16241).