2026 release notes
This page contains release notes for Streamlit versions released in 2026. For the latest version of Streamlit, see Release notes.
Version 1.56.0
Release date: March 31, 2026
Highlights
- 🍿 Introducing
st.menu_button— a new widget that renders a dropdown button with a customizable popover container for building menus, toolbars, and action lists (#13981, #11409). - 🎁 Introducing
st.iframe— embed external URLs or raw HTML content directly in your app using an iframe (#14433, #12977). - 🔍
st.selectboxandst.multiselectnow support afilter_modeparameter that lets users search and filter options by typing (#14537, #6160, #7238).
Notable Changes
- 📊
st.dataframesupports programmatically setting selections via theselectionparameter (#13594, #10128). - 🎯
st.dataframehas a new"single-row-required"selection mode that always keeps exactly one row selected (#14288, #9253). - 📐
st.dataframecolumn configuration now supports analignmentparameter for controlling text alignment in columns (#14333, #12106). - 👀 The column visibility menu in
st.dataframeis now always visible, making it easier to show and hide columns (#14336, #10649). - 🎹
AudioColumnandVideoColumnare now available inst.column_configfor displaying audio and video players directly in dataframes (#14032, #8345). - 🐍 Streamlit now supports pandas 3.x (#13812, #13211).
- 🧭
st.navigationhas a newexpandedparameter to control how many sidebar items are visible before collapsing (#14051, #9646). - 🔗
st.Pagenow accepts external URLs, allowing you to add links to external sites in the navigation sidebar (#13691, #9025). Thanks, t0k0shi! - 🖼
st.tablehas newhide_indexandhide_headerparameters for cleaner table presentation (#14113, #8235, #9251). - ⚡
st.link_buttonnow supports anon_clickcallback that triggers a rerun before navigating (#14116, #7453). - 📁
st.file_uploaderandst.chat_inputnow accept file type shortcuts like"image","audio","video", and"document"(#14140). - 📏
st.chat_inputhas a newheightparameter to control the initial height of the text area (#14165, #10724). - ✨ Alert elements (
st.info,st.warning,st.error,st.success) now automatically extract a leading Material icon from the message body and display it as the alert icon (#14173, #10892). - 🪄 Streaming markdown now auto-completes incomplete syntax (e.g., unclosed bold, links, or code blocks) during streaming for a cleaner reading experience (#13939).
- 🏷
st.pillsandst.segmented_controlnow have arequiredparameter to enforce that at least one option is always selected (#14414, #9870). - 🔄
st.containerhas a newautoscrollparameter that automatically scrolls to the bottom as new content is added (#14502, #8836). - 🧩
st.tabs,st.expander, andst.popovernow preserve their open/closed state across reruns (#14332, #14356). - 🛠 Static files served via
st.static/now use native content types instead of a generic fallback (#14090). - 🎥 Media elements now support relative static file serving URLs (e.g.,
/app/static/video.mp4) (#14317, #12104). - 🧪
st.file_uploaderis now supported in AppTest for programmatic testing of file upload flows (#14341, #8093). - 🔧 Widget state duplication warnings are now logged to the console instead of displayed in the app UI (#14141).
- 📦
BidiComponentResulthas been renamed toComponentResultin the custom components v2 API (#14253). - ⚙ The
_stcore/metricsendpoint is now fully OpenMetrics-compliant (#14538).
Other Changes
- 🐛 Bug fix: Streamlit can now run with Python optimization flags (
-O/-OO) (#14171, #14155). - 🦋 Bug fix: Reduced false-positive file change detections on Windows by adding a stability check to the file watcher (#14174, #13954).
- 🪲 Bug fix:
st.text_areawithheight="content"now correctly auto-sizes to fit content (#14228, #14222). - 🐜 Bug fix: Stale anchor links are no longer preserved when clearing transient nodes (#14251, #14249).
- 🐝 Bug fix:
BidiComponentManageris now properly initialized in AppTest mock runtime (#14301, #14274). Thanks, tysoncung! - 🐞 Bug fix: Streamlit is now compatible with Python 3.14's PEP 649 deferred annotation evaluation (#14327, #14324).
- 🕷️ Bug fix: Tooltips on selected
st.multiselectoptions are now restored (#14353, #14351). - 🪳 Bug fix:
server.portis now correctly updated after binding to port 0 (#14372, #11308). Thanks, joanaarnauth! - 🪰 Bug fix: Bound query params are now correctly restored in the URL when navigating in multi-page apps (#14374, #14350).
- 🦠 Bug fix: Restored the
reactJsonViewCompatshim for the local dev server (#14391). - 🦟 Bug fix:
st.exceptionlinks no longer overflow their container at small viewport widths (#14417, #12870). - 🦂 Bug fix: Headings inside horizontal containers (
st.columns) no longer have extra top padding (#14419, #12434). - 🦗 Bug fix: Programmatic dataframe selections now return
AttributeDictionaryfor consistent dot-notation access (#14455, #14454). - 🕸️ Bug fix: Streaming markdown with color directives no longer shows rendering artifacts (#14468, #14460).
- 🐌 Bug fix: The
session_durationmetric is now OpenMetrics-compliant (#14476, #14432). - 🦎 Bug fix: The main menu now has a visible border in dark mode (#14529).
Version 1.55.0
Release date: March 3, 2026
Highlights
- 🍿 Introducing dynamic containers:
st.tabs,st.popover, andst.expandercan rerun the app when they are opened or closed by setting theon_changeparameter. If a key is also provided, you can programmatically open and close them, too. - 🖇️ Announcing widget binding! Most non-trigger widgets have a
bindparameter to simplify syncing widget state with query parameters.
Notable Changes
- 🔗
st.imagehas alinkparameter to make images clickable with HTTP/HTTPS URLs (#14139, #9836). - 🥷
st.Pagehas avisibilityparameter that lets you hide pages in the navigation menu while keeping them routable (#13905, #10738). - 🎨 Markdown supports arbitrary CSS colors for text foreground and background (#14041, #7808).
- 📐
st.metrichas adelta_descriptionparameter to display descriptive text next to delta values (#13848, #13690). - 📏 You can configure the font weight and size for
st.metricwith the newmetricValueFontWeightandmetricValueFontSizeconfiguration options (#13550, #12300). Thanks, kagawa0710! - 🏓
st.tablehasheightandwidthparameters (#13850, #10775, #10820). - 📈
st.altair_chartandst.vega_lite_chartsupport selections on multi-view charts (#13591, #8643). - 🔑 To prevent widgets from resetting when you change a parameter, widgets are transitioning to an identity based only on their keys (if provided). The following widgets use only their key for their identity:
- 📂
st.markdownacceptswidth="auto"to adapt its default behavior depending on the flex layout of its container (#13841). - 🌐 Added a new
client.allowedOriginsconfig option to let you customize which origins can send cross-originpostMessage(#13829, #6389).
Other Changes
- 🖋️ Page titles in
st.Pageand section labels inst.navigationsupport Markdown (#14053, #14010, #11771). - 🧹 Common block elements in widget labels are auto-escaped for convenience (#13887, #7359).
- 🏄♂️
st.multiselectlets users select all options or all currently filtered options with a single click (#13795, #4714). - 💅 Improved the design of
st.multiselectandst.selectbox(#13004). Thanks, rishi-kumar0612! - ‼️ All widget drop-downs were restyled for consistency (#13796, #13797, #13798).
- ↔️ For better accessibility,
st.tabsdisplays navigation arrows when the tabs overflow their container horizontally (#13987, #5552). - 📝 The app menu was redesigned (#14101):
- 🔍 Improved
streamlit config showoutput to better distinguish theme value sources (#13761). - ♥️ To improve behavior in hosted environments, the Streamlit server acknowledges client heartbeats (#13810).
- 🔣 Extended
sprintfto support,as a thousands separator inNumberColumn,ProgressColumn,st.number_input,st.slider, andst.metric(#13284, #1301). - ⬆️ Added support for cachetools 7.x (#13839, #13801).
- ☠️ Added a deprecation notice to
SnowparkConnectionfor better visibility (#14125). - 🦀 Bug fix:
st.spinneravoids a race condition when used right before a cache miss (#13849, #13634). - 🦎 Bug fix:
st.date_inputvalues are normalized in Session State to prevent a type error (#14123, #14109). - 🐌 Bug fix:
st.metricwith sparklines display correctly in horizontal flex containers (#14110, #13785). - 🕸️ Bug fix:
SQLConnection.query()caches results at the instance level instead of the class level (#14094, #14077). - 🦗 Bug fix:
st.segmented_controlhas consistent border styling on hover (#14067, #12802). - 🦂 Bug fix:
st.date_inputandst.datetime_inputremove validation marks when they are cleared (#14066, #14052). - 🦟 Bug fix: Fixed a rendering regression for
vconcatcharts in Altair with faceted children (#14065, #14050). - 🦠 Bug fix:
st.Pageraised an exception if it's passed a URL path of only slashes (#14005, #13952). Thanks, nileshhadalgi016! - 🪰 Bug fix: The code block copy button was moved into a toolbar to prevent text overlap (#14024, #12958).
- 🪳 Bug fix:
st.tabsretain their state when rendered after a transitional element likest.spinner(#14023, #14018). - 🕷️ Bug fix: Treemap and sunburst Plotly charts support selections (#13935, #9001).
- 🐞 Bug fix: Fixed a width regression for layered
vconcatcharts in Altair (#13980, #13974). - 🐝 Bug fix:
st.multiselectraises an exception whenmax_selectionsisn't positive (#13966, #13965). - 🐜 Bug fix: When a user adds a row to
st.data_editor, all columns, including hidden ones, are initialized (#13916, #13915). - 🪲 Bug fix:
st.select_sliderdoesn't apply its format function twice inAppTest(#13837, #13832). - 🐛 Bug fix: Content in collapsed expanders is not included in page search (#13818).
Version 1.54.0
Release date: February 4, 2026
Notable Changes
- 🎨 The
colorparameter ofst.area_chart,st.bar_chart,st.line_chart, andst.scatter_chartsupports the basic color palette which can be configured with theming (#13739, #12694). - ☯️ You can use the new
theme.chartDivergingColorsto set default diverging colors for Plotly, Altair, and Vega-Lite charts. - 🔗 You can configure the display of error help links with a new configuration option,
client.showErrorLinks(#13472, #11238). Thanks, karubian! - 😃
st.logosupports Material icons and emojis (#13416). Thanks, rahuld109! - 🥷 To prevent widgets from resetting when you change a parameter, widgets are transitioning to an identity based only on their keys (if provided). The following widgets use only their key for their identity:
st.dataframe(with selections)st.area_chartst.bar_chartst.line_chartst.scatter_chartst.altair_chartst.vegalite_chartst.pydeck_chartst.date_inputst.datetime_inputst.radiost.select_slider
- 👆
ListColumnandMultiselectColumnlet users select the text of their pills for copying (#13663). - 👻
st.experimental_get_query_paramsandst.experimental_set_query_paramshave been removed. Usest.query_paramsinstead. - ☠️
st.experimental_userhas been removed. Usest.userinstead.
Other Changes
- 👽 The warning about the proposed removal of
.add_rows()shows in the browser. Please leave feedback (#13063). - 🦎 When a
.streamlit/config.tomlfile is created after a Streamlit app is running, the file watcher will recognize it without restarting the Streamlit server (#13625, #11296). - 🔐 Bug fix: Path security validation improves protection against Server-Side Request Forgery (SSRF) and path traversal vulnerabilities (#13733).
- 🕸️ Bug fix: Wildcard URLs display as
localhostin the browser URL and console output (#13720, #13712). - 🦗 Bug fix: Modals and drop-down menus don't collapse the sidebar (#13653).
- 🦂 Bug fix:
st.bar_chartdoesn't raise aKeyErrorwhen sorting melted data (#13695). - 🦟 Bug fix:
st.multiselectandst.selectboxdon't clear state when a custom class object is selected (#13648, #13646). - 🦠 Bug fix: Transient nodes used for spinners will correctly anchor themselves in the Streamlit DOM to avoid an empty delta path (#13674).
- 🪰 Bug fix: Snowflake connections will re-initialize if closed (#13665).
- 🪳 Bug fix: Nested containers under a spinner don't raise a
Bad delta path indexerror (#13659, #13658). - 🕷️ Bug fix:
SnowflakeConnection.query()correctly passes theparamsargument to caching (#13652, #13644). - 🐞 Bug fix:
client.toolbarMode="viewer"correctly hides developer options from the settings menu (#13623). - 🐝 Bug fix: When using the experimental Starlette configuration, Streamlit auth can log users out of your identity provider and surface user tokens, consistent with recent updates (#13571).
- 🐜 Bug fix: Streamlit will defensively not load packaged components with missing or invalid component names in their manifests (#13612).
- 🪲 Bug fix: The width of file chips in
st.chat_inputwas increased to reduce filename truncation (#13589). - 🐛 Bug fix:
st.bar_chartdoesn't raise an error about y-axis minimum and maximum when the bars have all the same value (#13590, #13584).
Version 1.53.0
Release date: January 14, 2026
Highlights
- ❄️ You can create session-scoped caller's rights connections in Streamlit in Snowflake and other Snowpark Container Services environments.
- ⭐ Announcing experimental support for running Streamlit with Starlette with the new
server.useStarletteconfiguration option. - 🌐 Introducing
st.App, an experimental ASGI-compatible entry point that enables custom HTTP routes, middleware, lifecycle hooks, and integration with Python web frameworks like FastAPI and Starlette (#13537). - 🔑 You can expose OIDC ID and access tokens in
st.user.tokens(#12044). Thanks, velochy!
Notable Changes
- 🚪
st.logoutlogs users out of your identity provider, if supported by your OIDC setup (#12693). Thanks, velochy! - 🌀 To prevent unwanted stale elements, especially in chat layouts, Streamlit treats spinners as transient elements and doesn't include them in the element refresh that happens with reruns (#12826, #9239, #10199, #13166).
- 🧩 For custom components v2, style isolation is set in
st.components.v2.componentinstead of when an instance is mounted (#13518). - 🎨 To access heading font size and weights in custom components without using JavaScript to parse an array, CSS custom properties in an app include individual properties for each heading font size and weight (#13268).
- ✂️ For custom components v2,
html,js, andcssare all fully optional (#13511). - 🔗
BaseConnectionhas a new class method to scope connections globally or by session (#13506). - 💾
st.cache_dataandst.cache_resourcecan be scoped to a session (#13482, #6703). - 🧹
st.cache_resourcehas a new parameteron_releaseto use to clean up resources, like closing connections (#13439, #8674). - 🏷️
st.multiselectdoesn't includeoptionsin widget identity when akeyis provided (#13448, #7855). - 🔢
st.number_inputdoesn't includeminandmaxin widget identity when akeyis provided (#13512, #11277). - 📋
st.selectboxdoesn't includeoptionsin widget identity when akeyis provided (#13383, #6352, #8496, #4854). - 🎚️ You can format values for
st.sliderwith a newformatparameter (#13392, #13243). - 🖼️
st.dialoghas a newiconparameter to add an icon next to the dialog title (#13244, #13202). Thanks, KaranPradhan266! - ✏️ You can configure
st.data_editorto allow only adding or only deleting rows (#13228, #7091). - ➡️ You can display a button icon on the right instead of the left with a new
icon_positionparameter (#13150, #13069). Thanks, SiddhantSadangi! - ↔️
st.columns,st.container, andst.spacesupport larger and smallergapandsizevalues (#13345). - 📦 You can configure the maximum file size for
st.file_uploaderandst.chat_inputwith a new parameter that overrides theserver.maxUploadSizeconfiguration option (#12816, #12692, #12579). Thanks, rishabhjain1712! - 📐 You can configure the default width of the sidebar with
st.set_page_config(#12154, #11980). Thanks, jose-mindwayai! - 📝 The
optionsparameter inst.select_slidersupports Markdown (#12960, #11774). Thanks, jensonjohnathon! - 📊 The
deltaandvalueparameters inst.metricsupport Markdown (#13094, #11773). Thanks, jensonjohnathon! - 🔣 You can configure number format in
st.metric(#13193, #12229, #6951). - 🌈 You can set the color of
st.metricdelta indicators from the basic color palette (#13153, #4052, #6665).
Other Changes
- 🔌 You can exclude the port from your Streamlit auth redirect URI to use the current port (#12251, #12249). Thanks, velochy!
- 📛 Various custom components v2 types were semantically renamed (#13515).
- 📜 When an item is removed from
st.multiselect, the scroll position of the drop down is preserved (#13384, #13317). Thanks, kagawa0710! - 🐍 Pydantic sequences are treated as dataframe-like by Streamlit commands (#13348, #13344).
- 🏠 The logo displayed by
st.logolinks to the app's homepage (#13222, #13155). - ⌨️ For improved accessibility, tooltips are keyboard focusable (#13379, #13330).
- ⚓ For improved accessibility, anchor links are keyboard focusable (#13378, #13329).
- 🗺️
st.jsondisplays a tooltip on hover for each element to show its full path (#13113, #13057). - 💬
st.chat_inputwas redesigned for improved style and accessibility (#13088, #13223, #13364, #13532, #13556, #13546, #13542, #13535, #13554, #13553, #13555, #13547). - 💅 Various style updates for consistency (#13536, #13557).
- 🔐
st.authis compatible with Authlib version 1.6.6 (#13333, #13335, #13424). - 👽 Bug fix: Embedded apps respect the theme embedding option when they are configured with a custom theme (#13498, #13496). Thanks, ranmocy!
- 👻 Bug fix:
st.number_inputaccounts for floating point precision when incrementing and decrementing its value (#13484). - 🦀 Bug fix:
st.altair_chartcorrectly displays HConcat and VConcat charts (#13423, #13410). - 🦋 Bug fix:
st.selectboxis initialized correctly when its value is set from Session State (#13438, #13435). - 🦎 Bug fix:
st.htmlindents list items correctly (#13437, #13426). - 🐌 Bug fix: A logger message for
SnowflakeConnectionreferences the correct URL to the Snowflake docs (#13363, #13361). - 🕸️ Bug fix: Tooltip text with newlines renders correctly (#13365, #13339).
- 🦗 Bug fix: The DOM elements within
st.spinnerare properly aligned when showing elapsed time (#13388, #13387). - 🦂 Bug fix: Custom components v2 have the same cross-origin behavior as other elements in the app (#13376).
- 🦟 Bug fix: CSS custom properties in custom components handle null or unset values correctly (#13240).
- 🦠 Bug fix: Theme preference is persisted into new app sessions (#13306, #13280).
- 🪰 Bug fix:
st.dialogdoesn't show stale elements from a previous dialog (#13297, #10907). - 🪳 Bug fix:
st.data_editorbehaves correctly when starting with a column ofNonevalues (#13309, #13305). - 🕷️ Bug fix: To correctly reflect edits to the theme configuration during development, theme settings are properly hashed (#13173).
- 🐞 Bug fix: In v2 custom components, app-level keyboard shortcuts (like
Rfor rerun) are disabled in typing contexts to prevent unintentional usage (#13264). - 🐝 Bug fix: Custom component v2 includes default values in component identity, unless a key is provided (#13266).
- 🐜 Bug fix: The sidebar navigation is correctly hidden when topbar navigation is used (#13227, #13224).
- 🪲 Bug fix:
st.logodisplays the logo correctly when an app uses top navigation (#13226, #13225). - 🐛 Bug fix: Error messages are clearer when width or height are invalidly set to
0(#13206, #12868).
Still have questions?
Our forums are full of helpful information and Streamlit experts.