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: 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.selectbox and st.multiselect now support a filter_mode parameter that lets users search and filter options by typing (#14537, #6160, #7238).

Notable Changes

  • πŸ“Š st.dataframe supports programmatically setting selections via the selection parameter (#13594, #10128).
  • 🎯 st.dataframe has a new "single-row-required" selection mode that always keeps exactly one row selected (#14288, #9253).
  • πŸ“ st.dataframe column configuration now supports an alignment parameter for controlling text alignment in columns (#14333, #12106).
  • πŸ‘€ The column visibility menu in st.dataframe is now always visible, making it easier to show and hide columns (#14336, #10649).
  • 🎹 AudioColumn and VideoColumn are now available in st.column_config for displaying audio and video players directly in dataframes (#14032, #8345).
  • 🐍 Streamlit now supports pandas 3.x (#13812, #13211).
  • 🧭 st.navigation has a new expanded parameter to control how many sidebar items are visible before collapsing (#14051, #9646).
  • πŸ”— st.Page now accepts external URLs, allowing you to add links to external sites in the navigation sidebar (#13691, #9025). Thanks, t0k0shi!
  • πŸ–Ό st.table has new hide_index and hide_header parameters for cleaner table presentation (#14113, #8235, #9251).
  • ⚑ st.link_button now supports an on_click callback that triggers a rerun before navigating (#14116, #7453).
  • πŸ“ st.file_uploader and st.chat_input now accept file type shortcuts like "image", "audio", "video", and "document" (#14140).
  • πŸ“ st.chat_input has a new height parameter 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.pills and st.segmented_control now have a required parameter to enforce that at least one option is always selected (#14414, #9870).
  • πŸ”„ st.container has a new autoscroll parameter that automatically scrolls to the bottom as new content is added (#14502, #8836).
  • 🧩 st.tabs, st.expander, and st.popover now 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_uploader is 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).
  • πŸ“¦ BidiComponentResult has been renamed to ComponentResult in the custom components v2 API (#14253).
  • βš™ The _stcore/metrics endpoint 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_area with height="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: BidiComponentManager is 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.multiselect options are now restored (#14353, #14351).
  • πŸͺ³ Bug fix: server.port is 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 reactJsonViewCompat shim for the local dev server (#14391).
  • 🦟 Bug fix: st.exception links 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 AttributeDictionary for consistent dot-notation access (#14455, #14454).
  • πŸ•ΈοΈ Bug fix: Streaming markdown with color directives no longer shows rendering artifacts (#14468, #14460).
  • 🐌 Bug fix: The session_duration metric is now OpenMetrics-compliant (#14476, #14432).
  • 🦎 Bug fix: The main menu now has a visible border in dark mode (#14529).
forum

Still have questions?

Our forums are full of helpful information and Streamlit experts.