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: April 29, 2026

Highlights

  • πŸš€ Introducing Starlette as the default web server! Streamlit now uses Starlette/Uvicorn instead of Tornado, bringing improved ASGI compatibility, better performance, and access to the modern Python async ecosystem. The underlying server is also exposed via st.App for advanced configuration (#14553, #439, #861).
  • 🍿 Introducing st.bottom β€” a pinned container at the bottom of your app, perfect for chat inputs, toolbars, and persistent controls (#14726, #8564, #8185).

Notable Changes

  • ✨ Introducing the :shimmer[] markdown directive β€” add animated loading text to your apps with st.markdown(":shimmer[Loading...]") for a polished streaming experience (#14055, #13247).
  • ⚑ Direct Polars-to-Arrow conversion now bypasses pandas entirely, improving performance and type fidelity for Polars DataFrames (#14885, #12913).
  • πŸ‘» Removed deprecated spec, use_container_width, and sharing keyword arguments from st.plotly_chart and st.vega_lite_chart (#14800).
  • πŸ‘» Removed the deprecated _get_websocket_headers function. Use st.context.headers instead (#14801).
  • πŸ§ͺ st.testing.v1.AppTest now supports st.pills, st.segmented_control, and st.dataframe key lookups (#14518, #11361, #11338).
  • πŸ”” Alert elements (st.info, st.warning, st.error, st.success) have a new title parameter for adding a bold header to alert messages (#14665, #12417).
  • 🎨 st.menu_button and st.popover now hide the chevron when using menu-style icon-only labels (#14697).
  • 🎯 st.App is now available in the st namespace for programmatic app configuration (#14722).
  • πŸ”‘ st.App has a new secrets parameter to programmatically pass secrets instead of relying on secrets.toml files (#14861, #10543).
  • πŸ€– Streamlit now bundles developing-with-streamlit AI agent skills in the pip package:
    • Core development skills for AI coding assistants (#14745).
    • App and theme templates for quick scaffolding (#14746).
  • πŸ’… st.video and st.map now have rounded corners matching other Streamlit elements (#14781, #12806).

Other Changes

  • πŸ› Bug fix: st.dataframe no longer crashes with pandas 3 ArrowStringArray columns (#14611, #14609).
  • πŸ¦‹ Bug fix: Custom component v1 serialization now correctly downcasts large Arrow types instead of failing (#14617, #14608).
  • πŸͺ² Bug fix: @st.cache_data and @st.cache_resource now chain the original exception in UnserializableReturnValueError for better debugging (#14655, #14654). Thanks, mango766!
  • 🐜 Bug fix: CSS Color Level 4 color functions (oklch, lab, etc.) are now supported in color parameters (#14674, #14573).
  • 🐝 Bug fix: Query parameter space encoding is now consistent across all operations (#14691, #14671).
  • 🐞 Bug fix: st.data_editor correctly preserves None values with pandas 3.0+ (#14694, #14693).
  • πŸ•·οΈ Bug fix: Namespace package children are now correctly evicted when watched source files reload (#14708, #14704).
  • πŸͺ³ Bug fix: st.radio now retains selections when using format_func with custom option objects (#14815, #14814).
  • πŸͺ° Bug fix: st.bar_chart axis labels now correctly swap when horizontal=True (#14866, #14830).
  • 🦠 Bug fix: st.text_area with height="content" now sizes correctly on initial load (#14884, #14876).
  • 🦟 Bug fix: st.file_uploader no longer shows duplicate equivalent file extensions in the accepted types display (#14552, #11991).

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.