Thanks to visit codestin.com
Credit goes to docs.streamlit.io

2025 release notes

This page contains release notes for Streamlit versions released in 2025. For the latest version of Streamlit, see Release notes.

Release date: December 3, 2025

Highlights

Notable Changes

  • 🎹 You can configure keyboard shortcuts for buttons (#12975, #1291).
  • ❓ You can now pass query parameters to st.switch_page and st.page_link (#13027, #8102, #8112, #13093).
  • 〰️ st.html has a new unsafe_allow_javascript parameter to execute JavaScript (#12918).
  • ⬆️ st.metric has a new delta_arrow parameter to configure the visibility and orientation of the delta arrow (#12982, #4775).
  • ⌨️ You can configure the horizontal alignment of st.markdown, st.caption, st.title, st.header, st.subheader, and st.text with a new text_alignment parameter (#13032, #4109, #13034, #13036).
  • 🌀 You can use a spinner everywhere you can set an icon and in the avatar parameter of st.chat_message. The spinner can't be used as a page favicon (#13045, #6415).
  • 🛠️ You can now add tooltips to st.badge (#12897, #12878). Thanks, marcolanfranchi!
  • 🕳️ You can configure placeholder text for null values in st.dataframe and st.data_editor with a new placeholder parameter (#12968, #7360).
  • 🔑 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.file_uploader
    • st.camera_input
  • ↕️ st.plotly_chart has a height parameter to use with flex containers (#12593).
  • ↔️ st.container, st.dataframe, and st.data_editor support width="content" (#12848, #12875, #12391).
  • 🐍 Streamlit supports Python 3.14 and Vega-Altair 6!
  • 👻 st.bokeh_chart has been removed. Use the streamlit-bokeh custom component instead.
  • ☠️ **kwargs is deprecated in st.vega_lite_chart (#13141).
  • 💩 The .add_rows() method is under consideration for removal. Please leave feedback (#13063).
  • 👥 We're improving community contributions by using a public workflow for discussing feature specs (#12248).

Other Changes

  • 🪥 For better performance, Streamlit uses uvloop if it's installed (#13047).
  • 🧼 For improved performance, Markdown plugins are lazy loaded (#13152).
  • 🧽 To improve load times, we reduced the bundle size (#13071, #13077, #13099, #13115, #13128).
  • 🛁 To improve performance, we've refactored session context data (#12788, #12789, #12790, #12791).
  • 🚿 The hovering performance of st.line_chart was improved (#13156, #13154).
  • 🧹 st.metric was optimized to prevent poor hovering performance with large data sets (#12983).
  • 👽 The packaging Python dependency is no longer version-capped (#13073).
  • 🫥 For clarity, Streamlit logs a warning if you try to hide a non-range index when using st.data_editor with num_rows="dynamic". A non-range index must be editable to add rows (#12978, #8263).
  • 🦋 Bug fix: Streamlit auth raises a warning instead of an error when browser back navigation revisits a consumed OAuth callback (#13127, #13101).
  • 🦀 Bug fix: The WebSocket timeout was increased on Android to improve st.file_uploader performance (#13132, #11419).
  • 🦎 Bug fix: Query parameters are preserved when using browser back and forward navigation (#13129, #9279).
  • 🐌 Bug fix: For custom components v2, the frontend key is correctly computed to be stable if it has a key in Python and otherwise change when its parameters change (#12950).
  • 🕸️ Bug fix: Empty code blocks in Markdown don't display "undefined" (#13074, #12986). Thanks, ashm-dev!
  • 🦗 Bug fix: st.feedback is prevented from wrapping (#12970, #12068).
  • 🦂 Bug fix: Custom components v2 don't raise a warning when placeholders are replaced as a result of the initial manifest scan (#13043, #13042).
  • 🦟 Bug fix: st.audio_input has the correct padding for its waveform (#13010).
  • 🦠 Bug fix: The date and time icons in st.data_editor are visible in dark mode (#12994, #12852). Thanks, aritradhabal!
  • 🪰 Bug fix: st.pills and st.segmented_control wrap correctly when width="content" (#12969, #12067, #12879, #12857).
  • 🪳 Bug fix: st.color_picker has a minimum width to prevent a pixel width below its intrinsic size (#12962, #12872).
  • 🕷️ Bug fix: Disabled widgets hide their borders (#12949).
  • 🐞 st.audio_input and st.chat_input show a clearer message when microphone permissions are insufficient (#12914).
  • 🐝 Bug fix: st.navigation uses the sidebar font and Streamlit falls back to its built-in fonts if a font can't be found (#12948).
  • 🐜 Bug fix: MultiselectColumn doesn't raise a ValueError when adding new rows in st.data_editor (#12860, #12936, #12815). Thanks, kkchemboli!
  • 🪲 Bug fix: MultiselectColumn works correctly when the underlying dataframe has an empty column (#12935, #12842).
  • 🐛 Bug fix: st.text_area avoids negative height calculations that produce invalid CSS (#12891, #12867).

Release date: October 29, 2025

Highlights

  • 🧩 Announcing custom components, version 2! Easily create frameless custom UI with bidirectional data flow.
  • 🌗 Introducing custom light and dark theme configuration! You can simultaneously define custom light and dark themes in your app.
  • 🎨 Announcing reusable themes! You can define a theme in a sharable file and use it as a base in other themes.
  • 💫 Introducing st.space for adding vertical and horizontal spaces in your app.

Notable Changes

  • 🔗 New configuration options, theme.codeTextColor and theme.linkColor, let you configure the color of code and link text.
  • 📊 ProgressColumn has a new color parameter.
  • 🌈 You can set color="auto" in MultiselectColumn to inherit colors from theme.chartCategoricalColors.
  • 📌 MultiselectColumn has a pinned parameter to match other column types.
  • ⭐ You can set a default value for st.feedback (#12578, #9469). Thanks, andreasntr!
  • 👆 st.write_stream has a cursor parameter to set a custom cursor for the typewriter effect.
  • 🍿 st.popover has a type parameter to match st.button styling options.
  • 🔑 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.color_picker
    • st.segmented_control
    • st.radio
    • st.audio_input
    • st.slider
    • st.select_slider
    • st.chat_input
    • st.feedback
    • st.pills
  • ↕️ st.dataframe, st.data_editor, st.altair_chart, st.pydeck_chart, and all simple charts have height parameters to use with flex containers.
  • ↔️ st.plotly_chart, st.vega_lite_chart, st.altair_chart, st.pydeck_chart, and all simple charts have width parameters to use with flex containers.
  • 🐍 Due to end of life, Python 3.9 is no longer supported.

Other Changes

  • ⚡ If you don't pass a file to streamlit run, it will try streamlit_app.py by default (#12599).
  • 🥷 st.dataframe hides its index column by default when row selections are enabled (#12448, #12237). Thanks, plumol!
  • 👩‍🎨 For compatibility with new theming options, the app settings menu no longer supports theme editing (#12648).
  • 👋 The Streamlit hello app preloads its Python packages on its home page for a faster user experience (#12617).
  • 👍 Slider thumbs don't extend beyond the edge of their track (#12549, #4284).
  • ℹ️ Material icons and emojis were updated (#12669).
  • 🦠 Bug fix: Pyplot charts render correctly in fragments, containers, and expanders (#12807, #12678, #12763).
  • 🪰 Bug fix: Dataframes correctly resize and align when using width="content" (#12682).
  • 🪳 Bug fix: Fuzzy search in select boxes is case insensitive (#12849, #11724).
  • 🕷️ Bug fix: 500 errors display correctly (#12845).
  • 🐞 Bug fix: Deprecation warnings respect client.showErrorDetails (#12794, #12743).
  • 🐝 Bug fix: Path handling in the file watcher was improved to prevent a ValueError in Windows environments (#12741, #12731).
  • 🐜 Bug fix: st.pills shows its value when disabled (#12555, #12388). Thanks, davidsjoberg1!
  • 🪲 Bug fix: Plotly charts hide overflow to prevent flickering behavior from scrollbars (#12594).
  • 🐛 Bug fix: Streamlit's handling of Altair charts was improved for thread safety and prevention of an "Unrecognized data set" race condition (#12673, #11911, #11342, #11906).

Release date: September 23, 2025

Highlights

  • 🤹 Introducing MultiselectColumn to configure colorful, editable lists in your dataframes.
  • 🎨 Announcing color palette configuration options to set the exact shade of red, orange, yellow, green, blue, violet, and grey to use in Markdown, status elements, sparklines, st.metric, and st.badge.
  • 📊 st.bar_chart has a new sort parameter for conveniently sorting your bars.

Notable Changes

  • 🔑 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.button
    • st.download_button
    • st.form_submit_button
    • st.checkbox
    • st.toggle
    • st.text_area
    • st.text_input
    • st.number_input
    • st.time_input
    • st.date_input
    • st.selectbox
    • st.multiselect
    • Custom components
  • 🖌️ You can configure the color of chart columns.
  • 🔢 st.metric supports decimal.Decimal types (#12377, #12308). Thanks, aebrahim!
  • 🎤 You can specify the sample rate for st.audio_input, and the default sample rate has been reduced to 16000 Hz.
  • ⚙️ For clarity, in st.plotly_chart, **kwargs is deprecated and replaced by config (#12291, #12280). Thanks, zyfy29!
  • 📈 st.line_chart and st.graphviz_chart have width parameters to use with flex containers.
  • 🔲 You can configure st.table borders to show all, only horizontal, or no lines.
  • 📂 You can specify a default tab in st.tabs.
  • 🌐 To use hosted fonts from providers like Google and Adobe, you can declare externally hosted fonts with a URL to their CSS file in theme.font, theme.headingFont, and theme.codeFont.

Other Changes

  • 🧹 **kwargs has been removed from st.write (#12375, #12374).
  • ⏱️ To prevent browser defaults from invalidating caches too soon, cache headers include the max-age and immutable directives (#12420).
  • 👽 Material icons were updated (#12473, #12535).
  • 🦋 Visual tweaks (#12348, #12367).
  • 👻 Bug fix: To correct a sequential navigation regression for st.number_input, some internal refactoring was reverted (#12547, #12526).
  • 🦀 Bug fix: Custom components respect zero-size dimensions (#12479, #12454).
  • 🦎 Bug fix: Images respect center alignment in containers (#12495, #12435).
  • 🐌 Bug fix: If you use an empty string as a section label in top navigation, those pages will display individually before the collapsible sections (#12247, #12243).
  • 🕸️ Bug fix: To fix a performance regression, dataframes use .iat[] instead of .iloc[] internally (#12422, #10952).
  • 🦗 Bug fix: st.data_editor accepts Shift+Enter for multiline entry in a cell (#12401, #12386).
  • 🦂 Bug fix: To make st.pdf more compatible on Windows, MIME types were updated (#12399, #12387). Thanks, geoextra!
  • 🦟 Bug fix: To prevent long-word overflow, words are forced to break if they exceed their container's width (#12370, #12366).
  • 🦠 Bug fix: Hiding all dataframe columns won't raise a TypeError (#12361, #12227).
  • 🪰 Bug fix: st.logo doesn't dislocate the sidebar collapse button (#12329, #12326).
  • 🪳 Bug fix: When using accept_new_options=True with st.multiselect, mobile users can access their keyboards (#12330).
  • 🕷️ Bug fix: st.components.v1.html ignores fractional pixels in width (#12354, #12340).
  • 🐞 Bug fix: st.number_input correctly accepts keyed entries (#12351, #12349).
  • 🐝 Bug fix: Markdown images maintain their aspect ratio when constrained (#12343).
  • 🐜 Bug fix: st.date_input is inclusive of min and max values (#12295, #12293).
  • 🪲 Bug fix: Maintain image proportions in fullscreen mode for all width settings (#12235).
  • 🐛 Bug fix: Markdown code blocks don't overflow when used in labels (#12175, #12149).

Release date: August 26, 2025

Highlights

Notable Changes

  • 🏷️ You can configure the labels of options in SelectboxColumn with a new format_func parameter (#12232, #6795).
  • 🍞 You can configure the duration of st.toast messages (#11872, #7047).
  • 🔑 st.form_submit_button has a key parameter (#12190, #12121).
  • 🌻 Markdown and heading dividers can be yellow (#12201).
  • 💬 st.dialog widths have a larger option (#12040, #8904).
  • 💻 st.dataframe and st.data_editor have width and height to use with flex layouts (#11930).
  • 🖼️ st.image, st.pyplot, and st.graphviz_chart have a width parameter to use them with flex layouts (#11952, #12212).
  • 📈 Users can access the underlying data of a Vega chart through the toolbar. This includes all data passed to the chart, even if it's not displayed (#10311).
  • ☠️ st.bokeh_chart is deprecated. Use the streamlit-bokeh custom component instead.
  • 🧹 We removed deprecated commands and parameters: st.experimental_dialog, st.experimental_fragment, and caching's experimental_allow_widgets (#12167).

Other Changes

  • 🏃‍♂️ For better performance, st.slider will not rerun the app until the user releases the slider thumb (#11879, #4541).
  • 💅 For improved custom theming, single mark charts use the first categorical chart color (#12162).
  • 🌐 For st.logo, the crossorigin property can be configured by hosts (#12226).
  • 🎨 The colored decoration line at the top of Streamlit apps was removed (#12155).
  • 👻 The copy-to-clipboard function of multiple elements gives a checkmark feedback to users when they copy something (#12141, #12172).
  • 🫥 Users can quickly hide or unhide all columns in a dataframe (#12164, #12082). Thanks, plumol!
  • ℹ️ Material icons were updated (#12264).
  • 👽 Bug fix: CheckboxColumn uses the radii from the theming configuration options (#12263).
  • 🦀 Bug fix: A column's menu is not accessible when the column is hidden (#12233, #12230). Thanks, plumol!
  • 🦋 Bug fix: Streamlit correctly caches Pydantic models (#12137, #10348).
  • 🦎 Bug fix: st.plotly_chart correctly handles null selections (#12222, #12191).
  • 🐌 Bug fix: When using accept_new_options=True with st.selectbox, mobile users can access their keyboards (#12219, #12205).
  • 🕸️ Bug fix: Streamlit does not raise an error when the user's email is empty and server.showEmailPrompt is false (#12202, #12166). Thanks, wyattscarpenter!
  • 🦗 Bug fix: The drop area of st.file_uploader correctly truncates a long list of file types (#12192, #12189).
  • 🦂 Bug fix: The corner radius of st.page_link matches the navigation widget instead of the border radius configured for buttons (#12181).
  • 🦟 Bug fix: Cached replay correctly handles element height and width for flex layouts (#12183).
  • 🦠 Bug fix: When a client disconnects from a Streamlit server and the user dismisses the warning, the client will re-raise the warning while the app remains disconnected (#12178, #12113).
  • 🪰 Bug fix: Identity provider logout was reverted to prevent redirect failures in st.logout() (#12179).
  • 🪳 Bug fix: Currency symbols in column configuration are narrowly formatted (#11895).
  • 🕷️ Bug fix: Users can't remove files from st.file_uploader while the widget is disabled (#12180, #12146).
  • 🐞 Bug fix: pip install works correctly in Windows (#8952). Thanks, Dev-iL!
  • 🐝 Bug fix: The drop-down menu for st.time_input uses theme colors consistently with other elements (#12157).
  • 🐜 Bug fix: st.toast uses custom theme colors (#12160, #11951).
  • 🪲 Bug fix: The width handling of custom components was updated to work with horizontal containers (#12148).
  • 🐛 Bug fix: st.chat_input correctly resizes itself after the user submits a long message (#12132, #12079).

Release date: August 5, 2025

Highlights

  • 💪 Announcing horizontal flex containers! Configure the alignment, direction, and gap of containers to create dynamic layouts.

Notable Changes

Other Changes

  • 🌀 The spinner design was unified across Streamlit commands (#12031).
  • 💅 Design and style tweaks (#12032, #11989, #11986, #11999, #12015, #11995, #11981, #11964).
  • 🔄 Error logic and logging was improved to reduce confusion from asyncio runtime errors when unrelated errors are raised (#12008).
  • 🪧 Dataframe column menus include an icon to show the column type and a button to copy the column name (#11303).
  • 💽 For convenience, there are additional "extras" installation options (#11760, #8233).
  • 📁 Additional checks are performed to validate the extension of uploaded files, but app developers are still responsible for checking and handling the security of uploaded files (#11884, #11883).
  • 🔘 Button group widgets are identified by their command name in error messages (#11769, #11753). Thanks, bajajku!
  • ⚔️ For st.snow, st.balloons, chat avatars, and media elements, the crossorigin property can be configured by hosts (#12087, #11948).
  • 🦗 Bug fix: Ctrl+C will stop a Streamlit server in Windows, even if there is no active session (#12049, #6855).
  • 🦂 Bug fix: st.line_chart uses the column order in the chart data instead of reordering them alphabetically (#12092, #12071).
  • 🦟 Bug fix: Menu items set in st.set_page_config are not hidden when client.toolbarMode is set to "minimal" (#12091, #12083).
  • 🦠 Bug fix: theme.codeFontWeight does not interfere with bold inline code (#12074, #11976).
  • 🪰 Bug fix: To allow fractional pixel values, heading font sizes in theming configuration aren't rounded (#12077, #11963).
  • 🪳 Bug fix: Altair 5.4.0 and 5.4.1 have been excluded to prevent an upstream bug with reading dataframes (#12066, #12064).
  • 🕷️ Bug fix: Dataframe scrollbars have been tweaked to avoid sizing problems (#11936, #11921, #12053, #11985).
  • 🐞 Bug fix: Linting accepts lists in addition to tuples for callback arguments in widgets (#12039).
  • 🐝 Bug fix: To fix a deprecation warning, Altair theme syntax was updated (#12050).
  • 🐜 Bug fix: st.navigation does not hide the menu when a single section is used with position="top" (#12025, #12029).
  • 🪲 Bug fix: The sidebar state does not reset when the window is resized (#12024, #12016).
  • 🐛 Bug fix: st.pills and st.segmented_control don't raise unintended StreamlitDuplicateElementId errors (#11982, #11975).

Release date: July 16, 2025

Highlights

  • 🎨 Streamlit has additional theming configuration options!
    • theme.baseFontWeight: Set the root font weight of text in the app.
    • theme.chartCategoricalColors: Configure default categorical colors for Plotly, Altair, and Vega-Lite charts.
    • theme.chartSequentialColors: Configure default sequential colors for Plotly, Altair, and Vega-Lite charts.
    • theme.codeFontWeight: Set the font weight of code text.
    • theme.dataframeHeaderBackgroundColor: Set the background color of dataframe headers.
    • theme.headingFontSizes: Set the font sizes of headings.
    • theme.headingFontWeights: Set the font weights of headings.
    • theme.linkUnderline: Configure whether to underline links.

Notable Changes

Other Changes

  • 🧭 Section labels in the sidebar navigation widget are collapsible (#11863).
  • 📂 The "Deploy" button is hidden when the "File change" notification is visible in the app chrome (#11834).
  • 🔝 When using top navigation in an app, the header has more padding (#11836).
  • 🪜 In NumberColumn, the precision from step will override the display precision from format, unless format is a printf string (#11835).
  • 📅 When st.date_input accepts a date range, the widget displays a quick-select option below the calendar for common date ranges (#10166, #11108).
  • 🏋️ Dataframes support font weight defined in pandas Styler objects (#11705, #6461).
  • 🫥 The about dialog does not show by default in the app menu. The current Streamlit version is displayed in the settings dialog (#10091).
  • 💅 st.metric uses a background color for the delta value, like st.badge (#11678).
  • 💻 IDEs can give type hints for .clear() on cached functions (#11793, #11821). Thanks, whitphx!
  • 🔄 Bug swap: To prevent a multipage app regression, st.context.theme does not automatically rerun the app on first load. In some cases, st.context.theme may not be correct until the first rerun (#11870, #11797).
  • 🧹 Bug fix: st.chat_input displays correctly at the bottom of the screen in mobile view (#11896, #11722, #11891).
  • ⏳ Bug fix: When a WebSocket reconnects, the app will fully rerun to prevent missing fragments (#11890, #11660).
  • 🪱 Bug fix: To reduce No such file or directory errors, the file watcher has more robust exception handling and clearer logging (#11871, #11841, #11809, #11728).
  • 💩 Bug fix: Vega-Lite facet charts do not flicker (#11833).
  • ☠️ Bug fix: When the initial sidebar state is set to "collapsed", the sidebar correctly loads in a collapsed state without flickering open (#11861, #11848).
  • 👽 Bug fix: To prevent apps from being out of sync with their current code at a later time, Streamlit clears the script cache when all file watchers disconnect (#11876, #11739). Thanks, diwu-sf!
  • 👻 Bug fix: Inline code in tooltips has the same relative size as inline code in other Markdown text (#11877).
  • 🦀 Bug fix: st.multiselect and st.selectbox display the correct placeholder text when accept_new_options=True (#11623, #11609).
  • 🦋 Bug fix: The column visibility menu can be closed by toggling the toolbar icon (#11857, #11801).
  • 🦎 Bug fix: Progress bar columns in dataframes have the correct padding between the bar and its label (#11685).
  • 🐌 Bug fix: The warning indicator in a dataframe cell adapts to theme configuration (#11682).
  • 🕸️ Bug fix: To fix multiple visual and UX bugs in dataframe, glide-data-grid was updated (#11677, #8310, #9498, #9471).
  • 🦗 Bug fix: In the sidebar navigation widget, font spacing and weight were adjust for visual clarity (#11814).
  • 🦂 Bug fix: Altair charts correctly resize in width to match their container (#11807, #11802).
  • 🦟 Bug fix: The running-man icon matches the theme configuration (#11461, #11371). Thanks, TreavVasu!
  • 🦠 Bug fix: The top header background is correctly opaque when it contains elements (#11787, #11785).
  • 🪰 Bug fix: Extra top padding is removed when printing (#11798).
  • 🪳 Bug fix: Markdown inline code displays correctly when unsafe_allow_html=True (#11817, #11800). Thanks, bajajku!
  • 🕷️ Bug fix: The WebSocket ping interval does not exceed the timeout interval (#11693, #11670).
  • 🐞 Bug fix: The sidebar state initialized correctly on Community Cloud and page content slides and resizes correctly in response to the sidebar (#11732, #11702, #11710).
  • 🐝 Bug fix: The timer in st.spinner uses system time to prevent pausing when the user focuses on another browser tab (#11756, #11720).
  • 🐜 Bug fix: Empty containers with borders and empty expanders are visible before elements are added to them (#11669).
  • 🪲 Bug fix: st.audio_input and st.camera_input have consistent appearances (#11699, #11700).
  • 🐛 Bug fix: To prevent a race condition, the file watcher correctly applies a lock to watched paths (#11692, #11691).

Release date: June 18, 2025

Highlights

  • 🧭 Introducing top navigation! Use st.navigation with position="top" to create a navigation menu across the top of your app.
  • 🔆 You can detect if the viewer is in light mode or dark mode at runtime with st.context.theme.

Notable Changes

  • 🪺 Streamlit no longer restricts the nesting of columns, expanders, popovers, and chat message containers, but beware of bad design! Always be mindful of different screen sizes and orientations, and don't overuse nested layouts.
  • ↔️ You can set the width of most Streamlit elements.
  • ⬆️ st.form has a new parameter to configure its height.
  • 🛠️ st.columns supports gap=None for no gap between columns.
  • 🏋️ Font face declarations in config.toml support weight and unicode ranges (#11248, #11163, #11247).
  • 😃 Font face declarations are supported in the window variable (#11628, #11568).
  • 🔎 Streamlit searches for secrets and configuration options relative to the entrypoint file in addition to the working directory and user root (#10173, #8195).
  • 🎨 A new configuration option, theme.dataframeBorderColor, lets you set the border color for dataframes and tables separately from other border colors (#11475).
  • 🌯 A new configuration option, theme.buttonRadius, lets you set the radius of buttons separately from other elements (#11464).
  • 🖥️ A new configuration option, theme.codeFontSize, lets you set the size of code in st.code, st.json, and st.help (#11508).
  • 🔒 You can configure a list of allowed origins when CORS protection is enabled (#11377).
  • 📄 st.set_page_config can be called multiple times in a single script run (#11286, #4483, #2216, #9797, #9038).
  • 🗺️ st.pydeck_chart and st.map now use Carto by default to provide map tiles (#11231).
  • 👀 You can configure Streamlit to watch additional directories for changes with the new configuration option, server.folderWatchList (#9656, #9655). Thanks, akramsystems!

Other Changes

  • 🔘 Exception messages include a copy button to conveniently copy the message to your clipboard (#11250, #11083). Thanks, snakeM!
  • ⚓ Streamlit apps can be served from port 3000 (#11525, #8149).
  • 👟 Markdown dependencies were upgraded for improved performance (#11553, #11550).
  • ↔️ The sidebar is narrower by default and consistently handles the scrollbar spacing (#11412).
  • 👋 We gave Streamlit hello a couple small tweaks (#11442).
  • 🧑‍💻 Base URL window variables are consistently namespaced in __streamlit (#11481).
  • 🌐 Streamlit apps now serve a manifest.json file (#11462).
  • 🖌️ st.dataframe shows row selection boxes always instead of just on hover (#11411, #11410).
  • 🦋 ListColumn and LinkColumn can inherit coloring from pandas Styler (#11612, #8254).
  • 💹 NumberColumn and ProgressColumn support a Japanese yen number format (#11588). Thanks, alexmalins!
  • 🔗 st.page_link can inherit an icon when passed a StreamlitPage (#10694, #9743). Thanks, abokey1!
  • 🎫 A button's placement in the sidebar or main body of an app is included in its widget identity (#10881, #10598). Thanks, joaooliveira-11!
  • 🕷️ Built-in Streamlit fonts now use variable font files (#11646, #11600, #11534).
  • 🤹 Bug fix: Streamlit Markdown correctly formats task lists and block quotes (#11237).
  • 🐞 Bug fix: Horizontal scroll bars are sized correctly in Safari (#11625).
  • 🐝 Bug fix: Unnecessary media caching was reduced to improve efficiency and avoid video player crashes (#11635, #9688).
  • 🐜 Bug fix: st.text uses the break-word CSS property to wrap long lines without whitespace (#10969, #10824). Thanks, matilde2004!
  • 🪲 Bug fix: Material icons display correctly in st.markdown when unsafe_allow_html=True (#11633, #9945).
  • 🐛 Bug fix: Multi-index column names preserve brackets (#11617, #10415).
  • 💅 Bug fix: Various CSS tweaks (#11631, #11632, #11630, #11611, #11577, #9085, #8671, #11576, #11569).
  • ⛏️ Bug fix: st.dataframe clears filter options when applying sort to prevent incorrect highlights (#11587, #11575).
  • 📊 Bug fix: Altair charts have the correct width and don't overflow with long titles (#11585, #9984).
  • 🍞 Bug fix: st.toast messages appear above st.dialog containers (#11578, #10383).
  • 🪱 Bug fix: Streamlit apps correctly scroll to anchor links (#11552, #11551).
  • ✍️ Bug fix: st.context does not lose state in an app being edited (#11506, #11330).
  • ⬜ Bug fix: st.code preserves leading white space (#10065, #6302). Thanks, XuehaiPan!
  • 📅 Bug fix: st.date_input shows the correct hover effect when using date ranges (#11223, #10929). Thanks, Bernardo1008!
  • 💩 Bug fix: Dataframes using pandas Styler correctly display Enum values (#11049, #10637). Thanks, BigBird404!
  • ☠️ Bug fix: st.context does not lose state when st.switch_page is called (#11521, #11507).
  • 👽 Bug fix: File watcher correctly handles custom metaclasses (#10388, #10992). Thanks, HomenShum!
  • 👻 Bug fix: st.map uses a private Mapbox token when configured (#11511, #11399).
  • 🦀 Bug fix: vega-interpreter was updated to prevent unintentional blank axes (#11514, #5733).
  • 🦎 Bug fix: Truncated values in NumberColumn are rounded correctly (#11520, #11519).
  • 🐌 Bug fix: Highlighted in text in Markdown has the correct padding on wrapped lines (#11530).
  • 🕸️ Bug fix: For a Plotly chart, reset axes works correctly after using fullscreen (#11498, #11327).
  • 🦗 Bug fix: Altair chart are not cropped on the left on first load (#10939, #9339). Thanks, goncalossmartins!
  • 📈 Bug fix: Chart columns correctly show negative values (#11048, #10411). Thanks, tiagorb1!
  • 🦂 Bug fix: Streamlit doesn't crash when editing indices in st.data_editor (#11448, #11434).
  • 🦟 Bug fix: Color and style is preserved in charts when using .add_rows() (#11414, #11312).
  • 🌪️ Bug fix: Tornado 6.5.0 is excluded to prevent file uploading errors related to unicode filenames (#11440, #11396, #11436).
  • 🦠 Bug fix: Selected rows are cleared when a column in st.dataframe is sorted (#11363, #11345).
  • 📶 Bug fix: Streamlit shows a clearer message when it can't connect to the server and automatically dismisses the message if a connection is successful (#11366).
  • 🪰 Bug fix: Localized number and date formats correctly interpret locales with commas (#11297, #11291).
  • 🧹 Bug fix: Streamlit cleans up the forward message cache to prevent WebSocket message errors (#11302, #11299, #11300).
  • 📜 Bug fix: st.latex scrolls horizontally when its content is wider than the app (#10071, #4304).
  • 🪳 Bug fix: st.multiselect has a more stable sort when filtering options (#11309, #11218).
  • 🕷️ Bug fix: st.multiselect options are case sensitive and don't overlap in the drop down menu (#11307, #11217, #11306, #11215).
  • 🍪 Bug fix: Streamlit logs an error if the cookie returned by st.login is too large (#11290, #11168).
  • 🪲 Bug fix: Displaying elements within a fragment's callback logs a clear warning that it's not supported (#10942, #10475). Thanks, Zane-dev16!
  • 🐞 Bug fix: st.file_uploader is case insensitive when validating allowed file extensions (#11261, #11259).
  • 🐝 Bug fix: Page runs end correctly to prevent invalid widget states (#11258, #11202).
  • 👤 Bug fix: Error messages correctly refer to st.user instead of st.experimental_user (#11198).
  • 🏷️ Bug fix: The missing label warning for widgets includes a stack trace (#11187, #8908).
  • 🐛 Bug fix: st.data_editor returns the correct result when some rows are deleted and others are added (#11183, #11180).

Release date: April 29, 2025

Highlights

  • 🧑 Announcing the general availability of st.user, a dict-like object to access information about the current user.

Notable Changes

Other Changes

  • 🗑️ Per the scheduled deprecation, st.experimental_audio_input has been removed. Use st.audio_input instead.
  • 💅 Various elements received styling tweaks for consistency and compatibility with advanced theming (#10916, #10930, #10915, #10944, #10990, #11033, #11034).
  • ⚒️ The element toolbar sizing and spacing was adjusted for improved UX (#11135, #11155).
  • 🫥 Bug fix: Streamlit does not display a frontend error when displaying an empty dataframe (#11100, #11064).
  • 🔁 Bug fix: st.context retains its information when calling st.rerun (#11113, #11111).
  • 💩 Bug fix: st.camera_input has the correct color and hover effect when disabled (#11116).
  • 🎤 Bug fix: st.audio_input has consistent color and hover effects with other widgets (#11118).
  • ↔️ Bug fix: st.logo displays correctly when the sidebar is resized (#11063, #11062).
  • 📂 Bug fix: st.file_uploader can handle multi-part file extensions in its type parameter (#11043, #11041). Thanks, moutayam!
  • 💈 Bug fix: theme.fontFaces correctly supports font style (#11098, #11097).
  • 🧹 Bug fix: streamlit init specifies file encoding to avoid errors in systems where UTF-8 is not the default (#11090, #11086). Thanks, ashm-dev!
  • 📜 Bug fix: In the sidebar, space is reserved for the scrollbar to prevent flickering from resizing (#10733, #10310).
  • 🪱 Bug fix: st.logo supports SVGs defined with a viewBox (#11038, #10904).
  • ☠️ Bug fix: st.date_input raises an error in the UI if a user enters a date outside of the specified allowed range (#10764, #8475).
  • 👽 Bug fix: st.snow and st.balloons don't incorrectly rerun during a fragment rerun (#11015, #10961).
  • 👻 Bug fix: When updating config.tomlduring development, Streamlit will elegantly handle invalid TOML formatting and reload the configuration file on the next save (#10857, #1256, #8320).
  • 🦋 Bug fix: Streamlit applies the correct hover effect when colored text is used in button labels (#10996, #8767).
  • 🦀 Bug fix: Streamlit ignores __init__.py and dotfiles in the /pages directory when automatically declaring pages in a multipage app (#11009, #11006).
  • st.write received an optimization tweak for rendering strings (#10985).
  • 🦎 Bug fix: st.html renders at 100% width for correct sizing (#10976, #10964).
  • 🐌 Bug fix: Page links become disabled if a client disconnects from the Streamlit server (#10946, #9198).
  • 🕸️ Bug fix: Streamlit supports newer emojis in page icons (#10912, #11154).
  • 🦗 Bug fix: st.exception only shows links to Google and ChatGPT when the app is being accessed through localhost (#10971, #10924).
  • 🦂 Bug fix: st.chat_input will expand to show multi-line placeholder text in most browsers. Firefox does not support this fix (#10931, #10611).
  • 🦟 Bug fix: Streamlit elegantly catches a TypeError when concurrent changes to rows and columns cause a failure in serialization (#10954, #10937).
  • 🦠 Bug fix: Streamlit cleanly handles non-ASCII characters in anchor links, which may change some anchors in existing apps (#10929, #8114).
  • 🪰 Bug fix: To prevent a race condition, session information is not immediately cleared unless a new session message is received (#9886, #9767).
  • 🪳 Bug fix: streamlit config show correctly displays client.showErrorDetails as a string instead of a list (#10921, #10913).
  • 🕷️ Bug fix: st.selectbox does not lose its value if a partial edit is abandoned (#10891).
  • 🐞 Bug fix: st.badge doesn't falsely show rainbow as a color option (#10896).
  • 🐝 Bug fix: To avoid a file lock conflict the occurs with some IDEs, Streamlit's file watcher utilities retries reading files when blocked (#10868, #4486). Thanks, Morridin!
  • 🐜 Bug fix: st.selectbox and st.multiselect have consistent color and spacing for placeholder text (#10865).
  • 🪲 Bug fix: Context managers correctly handle form elements (#10752, #8761). Thanks, SrGesus!
  • 🐛 Bug fix: st.link_button and st.tabs remain active when a client disconnects from a Streamlit server (#10861).

Release date: March 25, 2025

Highlights

  • 💈 Introducing advanced theming options! Use an assortment of configuration options to customize the appearance of your app. Change the fonts, colors, and roundness of your app without CSS.
  • 👮 Introducing st.badge to insert a colored badge element. You can also include badges in Markdown using a new directive.
  • 🏗️ Use streamlit init in your terminal to create all the local files you need for a new Streamlit app.

Notable Changes

  • 🤖 st.exception includes links to open Google or ChatGPT with the contents of the exception. This includes uncaught exceptions displayed in the app.
  • 🗺️ You can access the user's locale through st.context (#10563).

Other Changes

  • 📄 When using a pages/ directory to automatically generate a multipage app, no pages (including the entrypoint file) can have the same inferred URL pathname (#10276).
  • 🏎️ To improve performance, Streamlit uses the React 18 createRoot API for its frontend (#10453).
  • 📝 To improve compatibility with AI tools, script compilation errors are logged when logger.level="error" and not just when logger.level="debug" (#10826).
  • 🪵 Streamlit automatically enables more detailed logging if rich is installed (#10650).
  • 🔢 st.slider and st.number_input raise an error when assigned a value in excess of a declared minimum or maximum (#9964, #9342).
  • 🛠️ st.table support pandas Styler.set_tooltips() (#10561, #10553).
  • ℹ️ Material symbols have been updated to the latest icon set (#10813, #10717).
  • 🦋 Visual tweaks to headers (#10599).
  • 🦀 Bug fix: st.html displays correctly when used inside st.tabs (#10825, #10815).
  • 🦎 Bug fix: For backwards compatibility, theme.font="sans serfi" is internally converted to the new theme.font="sans-serif" (#10789, #10786).
  • 🐌 Bug fix: When using st.secrets, if Streamlit can't find the secrets.toml file, it will raise a FileNotFoundError (#10508, #8559).
  • 🕸️ Bug fix: st.secrets raises a clear TypeError if you try to assign a value to an attribute (#10698, #10107).
  • 🦗 Bug fix: In single-page apps, st.page_link does not highlight external links as if they are the current page (#10690, #10689).
  • 🦂 Bug fix: st.poppover displays at the correct width when using the help parameter (#10709, #10693).
  • 🦟 Bug fix: All components (and custom components) that read their width from the DOM initially load with a width of -1 px to prevent flickering (#10712, #10672, #10663, #10644).
  • 🦠 Bug fix: When st.number_input is configured to use integers, the default minimum and maximum values will prevent integer overflow (#10655, #6740).
  • 🪰 Bug fix: st.navigation uses immutable types to prevent mypy errors (#10670).
  • 🪳 Bug fix: Custom components correctly inherit font from theme configuration (#10661, #10660).
  • 🕷️ Bug fix: Dataframes correctly support Dask data objects (#10662).
  • 🐞 Bug fix: Button widths are correct when using the help parameter (#10658, #10648, #10656).
  • 🐝 Bug fix: Scrolling is disabled when hovering over st.number_input to prevent accidental value changes (#10642, #8867).
  • 🐜 Bug fix: st.chat_input gives a clear error in the UI when the file size limit is exceeded (#10530).
  • 🪲 Bug fix: The favicon and Markdown emojis use the same SVG emoji source for consistency (#10539, #6822).
  • 🐛 Bug fix: The dataframe search bar is more responsive to width (#10534, #10532).

Release date: March 4, 2025

Highlights

  • 📁 Announcing the option to accept files with st.chat_input!
  • 📒 Introducing a new column type for column configuration! Use JsonColumn to show JSON-compatible objects.

Notable Changes

Other Changes

  • 🥷 Users can hide dataframe columns (#10264, #6870).
  • 📅 Users can change the format of numbers, dates, and times in dataframes (#10420).
  • ↔️ Users can auto-size column widths (#10476).
  • 🐻‍❄️ Streamlit supports Polars dataframe and series hashing (#10408, #10347).
  • ☠️ rich is no longer a required dependency for Streamlit (#10320).
  • 🦋 st.file_uploader has a better display format in narrow containers (#10272).
  • 🦎 Bug fix: Tabs are prevented from having a width of zero to prevent flickering (#10533).
  • 🐌 Bug fix: Column order is correctly displayed when set in column configuration (#10445, #10442).
  • 🕸️ Bug fix: We updated dataframe null handling to prevent deprecation warnings (#10484).
  • 🦗 Bug fix: Elapsed time doesn't overflow for st.audio_input (#10410, #10373). Thanks, ashm-dev!
  • 🦂 Bug fix: st.altair_chart does not show an incorrect "true" tooltip when the user makes a selection (#10456, #10448).
  • 🦟 Bug fix: Streamlit does not raise a RuntimeError when an asyncio event loop is not already running (#10455, #10452).
  • 🦠 Bug fix: The key for an internal MIME type is set correctly to avoid a browser warning (#10404).
  • 🪰 Bug fix: st.data_editor automatically scrolls to the bottom when a user adds a row (#10405, #10351).
  • 🪳 Bug fix: Tooltips are suppressed on user-added rows in st.data_editor to prevent erroneous warnings (#10398).
  • 🕷️ Bug fix: st.logo displays consistently when used with fragments and dialogs (#10377, #10350, #10382).
  • 🐞 Bug fix: st.graphviz_chart has rounded corners for consistent style (#10224).
  • 🐝 Bug fix: Streamlit raises a clear exception when an underscore is used in provider for st.login (#10360, #10356).
  • 🐜 Bug fix: The dataframe column menu displays correctly inside dialogs (#10359, #10357).
  • 🪲 Bug fix: Exception handling was adjusted for improved compatibility with Cython (#10354, #10353). Thanks, tutu-sol!
  • 🐛 Bug fix: st.pills and st.segmented_control have consistent font sizes across browsers (#10349).

Release date: February 4, 2025

Highlights

  • 👩‍💻 Introducing st.login() and st.logout() to authenticate users with any OpenID Connect provider.

Notable Changes

Other Changes

  • 📌 Dataframes have column menus for users to sort and pin columns (#10206).
  • 🚦 Dataframes support categorical indices (#9647, #10195).
  • 🛸 Dataframes show a hover highlight on rows (#8096, #10104).
  • ⚠️ When dataframes have cell values that are inconsistent with their configured type, Streamlit shows a tooltip describing the error (#8253, #9899).
  • ➰ If there is an existing asyncio event loop when a Streamlit app starts, the app will reuse it instead of creating a new one (#10164). Thanks, DeltaGa!
  • 🖼️ Streamlit recognizes pyspark.sql.connect.dataframe.DataFrame objects as dataframes (#9953, #9954). Thanks, OSalama!
  • 😃 We've updated emoji validation for new emojis (#10149).
  • 🔣 Material Symbols have been updated with the latest icons (#10247).
  • 💅 Visual tweaks and improvements (#8705, #9823, #10047, #10048, #10083, #10087, #10225).
  • ⭕ st.image displays rounded corners for consistent design (#9999).
  • 🎩 Bug fix: Top margin is applied correctly in st.columns (#10265, #10268).
  • 💩 Bug fix: react-syntax-highlighter is aliased to prevent rendering errors in st.code (#10231, #10244).
  • 🧹 Bug fix: We improved error messages for st.query_params (#10111, #10237).
  • 🪱 Bug fix: Linting for st.altair_chart recognizes all Altair chart types (#10202).
  • ↗️ Bug fix: st.dataframe supports raw Arrow data (#5606, #10191).
  • 🐍 Bug fix: st.navigation and st.page_link work when running in pure Python tests (#10163).
  • ☠️ Bug fix: Retries were added to prevent a possible race condition when files are removed while Streamlit is running (#10148).
  • 👽 Bug fix: When printing an app, st.logo will only print once (#10165, #10171).
  • 🌍 Bug fix: Material icons are marked to prevent translation (#10168, #10174).
  • 👻 Bug fix: st.vega_lite_chart correctly caches and updates its data (#6689, #10125).
  • 🦀 Bug fix: When a fragment ID is not found, Streamlit logs a warning but doesn't raise an error (#9921, #10130).
  • 🦋 Bug fix: The label on st.expander correctly fades when stale (#10085).
  • 🦎 Bug fix: st.date_input provides better type hinting for its return value (#9477, #9620). Thanks, pranaybattu!
  • 🐌 Bug fix: In dataframes, small float values display their first significant figure instead of displaying as 0 (#10060).
  • 🕸️ Bug fix: When rich is installed, errors are only logged once. (#10097).
  • 🦗 Bug fix: st.text preserves whitespace (#10055, #10062).
  • 🦂 Bug fix: Dataframe width is not ignored when height is changed (#9762, #10036).
  • 🦟 Bug fix: Multi index columns correctly handle empty labels (#9749, #10035).
  • 🦠 Bug fix: Pinned columns respect column_order in when configured in st.dataframe (#9997, #10034).
  • 🪰 Bug fix: Tooltips don't overflow to the left or right (#9288, #9452, #9983).
  • 🪳 Bug fix: Disabled feedback widgets correctly show their value (#10030).
  • 🕷️ Bug fix: Widgets correctly submit values if a user edits the value and immediately clicks a button (#10007, #10018).
  • 🐞 Bug fix: Some MIME types have been hardcoded to protect against browser misconfiguration (#10004, #10010).
  • 🐝 Bug fix: Files that unnecessarily inflated Streamlit's installation size were removed (#10008, #10011).
  • 🐜 Bug fix: st.date_input gives the correct type hint for the value parameter (#10005, #10006).
  • 🪲 Bug fix: st.write passes to st.html when ._repr_html() is present for an object (#9910).
  • 🐛 Bug fix: st.html preserves target=_blank if set in an HTML string (#9972, #9994).
forum

Still have questions?

Our forums are full of helpful information and Streamlit experts.