2026 release notes

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

Release date: November 5, 2026

Highlights

  • πŸ”² Introducing st.grid, a responsive grid container for repeated tiles like metric cards, galleries, and dashboard cards that reflow with the available width (#17800, #11101).
  • πŸ€– Announcing agent-accessible apps! When you turn on the experimental server.enableAgentApi option, AI agents and other programs can use your app over HTTP or through an MCP endpoint that you can add to clients like Claude, ChatGPT, Cursor, and VS Code (#17731, #17510).
  • 🎨 Introducing a refreshed default theme! The built-in light and dark themes have a warmer palette, updated colors, and widget and sidebar borders shown by default, and st.map markers use your theme's primary color (#17450, #17467, #17495, #17493).

Notable Changes

  • πŸ’Ύ You can limit the memory used by st.cache_data with its new max_size parameter for each function, or across all functions with the new server.maxCacheDataSize configuration option (#17552, #17553, #2911).
  • 🚩 The following widgets have a new required parameter to prevent users from committing or submitting an empty value:
  • πŸ“ st.dialog accepts a pixel width, so you can size a dialog to fit fixed-width content. Invalid width values now raise an error instead of falling back to the small dialog (#17412).
  • 🧭 st.Page has a help parameter to describe each page in a navigation tooltip, which st.page_link also uses by default (#17807).
  • πŸͺ„ st.selectbox has an icon parameter to show an emoji or Material icon at the start of the field, like st.text_input (#17850, #17840).
  • πŸ“Š st.echarts_chart has new selection and data features:
    • Set on_select to return the point and brush selections that you enable in the chart's spec (#16786).
    • Dataframes in dataset.source are sent as Arrow, which makes large charts faster and displays values the same way as st.dataframe (#17678).
    • Dataframe-backed charts have a "Show data" toolbar action that displays the chart's data as a table (#17708).
  • ⚑ st.altair_chart and st.vega_lite_chart send selections as soon as a click or brush gesture ends, so selection reruns are faster and a form submitted right after includes the latest selection (#17666).
  • πŸ”§ You can set a server-wide default TTL for st.connection with the new runner.connectionDefaultTTL configuration option (#17248).

Other Changes

  • πŸ“š The bundled developing-with-streamlit agent skill has improved guidance on theming and CSS, Session State, testing with AppTest, dynamic containers, and performance (#17473, #17483, #17496, #17605, #17674, #17675, #17724).
  • πŸ“ˆ The docstrings for st.pyplot, st.plotly_chart, and st.echarts_chart and the bundled agent skill recommend Vega-based charts or st.echarts_chart with a dataframe source for new charts. st.echarts_chart also raises an error for unsupported ECharts GL map components instead of rendering a blank chart (#17769, #17810).
  • πŸ”’ st.echarts_chart tooltips accept st.metric number formats in tooltip.valueFormatter, so you can format tooltip values without JavaScript (#17755).
  • πŸ§ͺ AppTest supports st.data_editor, file uploads in st.chat_input, and setting st.user and st.context for a test (#17476, #17464, #17611).
  • πŸ”£ Type checkers infer a fixed-length tuple from st.columns when you pass an integer from 1 to 6 or a tuple of up to six widths, so a mismatched unpack is caught before the app runs (#17498, #17506).
  • πŸš€ Charts, st.metric, and st.dataframe load faster because the "Show data" grid and Vega are downloaded only when needed (#17846, #17853).
  • ⏩ The Material Symbols icon font starts loading at app startup, so icons appear sooner on first load (#17849, #17839).
  • πŸ“ Corrected outdated docstrings and configuration help text, including for client.toolbarMode (#17613).
  • πŸ› Bug fix: st.echarts_chart has better default layouts for titles with top legends, treemaps, and horizontal markLine labels (#17885).
  • πŸ¦‹ Bug fix: Default tooltips in st.echarts_chart label each field and format dates when the chart's data is a dataframe in dataset.source (#17883).
  • πŸͺ² Bug fix: The page keeps scrolling when the mouse wheel passes over an st.echarts_chart that zooms or pans with the wheel, such as a default treemap, until the pointer rests on the chart (#17882, #17507).
  • 🐜 Bug fix: When an st.echarts_chart spec can't be serialized, the error names the offending value and how to convert it (#17881).
  • 🐝 Bug fix: The agent API matches browser behavior more closely and has more accurate snapshots, clearer error messages, and better MCP tool descriptions (#17870, #17871, #17872, #17880).
  • 🐞 Bug fix: height="stretch" dataframes and data editors fall back to their default height when no parent sets one, and they stay inside their parent while you resize them (#17879, #17662).
  • πŸ•·οΈ Bug fix: Dataframes and chart "Show data" tables no longer have extra space below them (#17864).
  • πŸͺ³ Bug fix: st.echarts_chart hides overlapping labels on time, value, and log axes by default (#17858).
  • πŸͺ° Bug fix: snowflake-callers-rights connections use the container's protocol and port settings and no longer require a default database and schema (#17848, #17820).
  • 🦠 Bug fix: The range calendar in st.date_input no longer loses or double-commits the first date you pick (#17833).
  • 🦟 Bug fix: Element calls no longer rewrite shared method attributes, which serialized concurrent script threads on free-threaded Python (#17823, #17801).
  • πŸ¦‚ Bug fix: Widgets don't rerun the app when an interaction leaves their value unchanged, like closing st.multiselect without changing it (#17822).
  • πŸ¦— Bug fix: Keyed elements stay mounted when a rerun inserts content above them, so they keep their state, focus, and in-progress input (#17804).
  • πŸ•ΈοΈ Bug fix: The global Streamlit meta-skill reliably finds a project's bundled agent skill on Windows, macOS, and Linux without creating or syncing Python environments (#17803).
  • 🐌 Bug fix: Installing the bundled agent skills from the in-app prompt no longer fails when the server's console can't print the install summary, which mostly affected Windows (#17802).
  • 🦎 Bug fix: Streamlit replaces pandas inplace= calls that pandas 3.1 deprecates, so st.data_editor row deletion and charts keep working on pandas 4 (#17795).
  • πŸ¦€ Bug fix: st.vega_lite_chart redraws when new data has the same shape as the old data, and Altair and built-in charts update their data in place instead of rebuilding the view (#17793).
  • πŸ‘½ Bug fix: st.dataframe and st.data_editor with a fixed height expand to show more rows in fullscreen (#17791, #17771).
  • πŸ› Bug fix: st.echarts_chart and Vega-based charts use faster rendering defaults for very large datasets, so they no longer stall the browser (#17788).
  • πŸ¦‹ Bug fix: Time axes in st.echarts_chart show midnight values as dates instead of with a 00:00:00 time (#17781).
  • πŸͺ² Bug fix: st.echarts_chart logs chart errors to the browser console and can render again after an option fails (#17780).
  • 🐜 Bug fix: st.metric sparklines and the dataframe column statistics menu no longer log a Vega-Lite version warning in the browser console (#17778).
  • 🐝 Bug fix: Muted text, like placeholders and file uploader hints, meets WCAG AA contrast in the default light theme (#17766, #8289, #8249, #8276, #8288, #16149).
  • 🐞 Bug fix: Dollar amounts in Markdown, like $315K of $1.46M, render as plain text instead of being parsed as math (#17753).
  • πŸ•·οΈ Bug fix: st.echarts_chart default colors are readable in dark mode. Candlestick charts also use green for rising and red for falling, matching st.plotly_chart (#17750).
  • πŸͺ³ Bug fix: Altair and Vega-Lite charts restore their interval brush rectangle after remounting or switching to fullscreen (#17744).
  • πŸͺ° Bug fix: Element toolbars, like the one on st.dataframe, appear above an overlapping st.segmented_control option and stay clickable (#17734).
  • 🦠 Bug fix: Printed apps follow the on-screen layout without charts, cards, metrics, or the sidebar overlapping or getting clipped (#17727).
  • 🦟 Bug fix: st.pydeck_chart resets its camera when a rerun changes the chart's views, such as from a map view to a globe view (#17701).
  • πŸ¦‚ Bug fix: Errors and docs for @st.fragment(parallel=True) no longer suggest writing to outside containers, which parallel fragments don't support (#17688, #17612).
  • πŸ¦— Bug fix: When script runs overlap, the frontend applies each run's completion to the run that finished, so stale elements are cleaned up correctly and st.chat_input and st.text_input re-enable at the right time (#17686).
  • πŸ•ΈοΈ Bug fix: st.dataframe, st.table, and st.data_editor correctly display decimals, periods, intervals, categoricals, and other Arrow types (#17684, #5864).
  • 🐌 Bug fix: st.plotly_chart(theme=None) no longer applies the app's theme fonts and backgrounds, so light figures stay readable in dark mode (#17671, #17665).
  • 🦎 Bug fix: Custom themes that don't set textColor no longer log an invalid sidebar color warning in the browser console (#17669, #17638).
  • πŸ¦€ Bug fix: When two pages in st.navigation resolve to the same URL pathname, the error names both pages (#17646).
  • πŸ‘½ Bug fix: st.feedback supports the persist_state and bind parameters like other input widgets (#17621).
  • πŸ› Bug fix: A snowflake-callers-rights connection raises an error if it's used from a session other than the one that created it, so queries can't run with another user's identity (#17584).
  • πŸ¦‹ Bug fix: st.audio_input in the sidebar no longer shows an error after a successful recording (#17583, #17585).
  • πŸͺ² Bug fix: Help tooltips no longer open and stick when their trigger gets focus from a mouse click, such as after closing an st.dialog (#17581, #17562).
  • 🐜 Bug fix: Calling .toast() on the object returned by st.toast updates the toast in place again (#17580, #17522).
  • 🐝 Bug fix: The st.chat_input audio waveform stays visible after the text area expands, and recording works with a custom height (#17579, #17528).
  • 🐞 Bug fix: The error for a fragment writing to an outside container without a reserved position explains how to reserve one (#17577, #17563).
  • πŸ•·οΈ Bug fix: The "File change" prompt no longer goes missing when run on save is off (#17551).
  • πŸͺ³ Bug fix: The default time slider can reach the end of the day, and other sliders can reach a maximum that falls just past their last full step (#17504, #17494).
  • πŸͺ° Bug fix: Type hints for st.components match their runtime behavior (#17501).
  • 🦠 Bug fix: Top navigation section dropdowns support arrow-key navigation and follow the expected Tab order, and Tab skips links hidden in the overflow menu (#17423, #17482, #17339).
  • 🦟 Bug fix: Type checkers report unknown container methods, like st.sidebar.echo(), as errors (#17475).
  • πŸ¦‚ Bug fix: Custom Components v2 events, st.menu_button selections, and ButtonColumn clicks are no longer lost when another widget updates while their rerun is queued (#17471, #17215).
  • πŸ¦— Bug fix: After st.logout(), a reconnecting client can't resume the logged-out session or its Session State (#17310).
  • πŸ•ΈοΈ Bug fix: Timedelta columns in st.dataframe and st.data_editor display as readable durations, sort by value, and can be edited. NumberColumn also has a new "duration" format (#16722, #8949, #9751).

Release date: October 14, 2026

Highlights

Notable Changes

  • 🧭 Apps have a "Skip to main content" link and <main> and <nav> landmarks for keyboard and screen-reader users. Custom CSS selectors like section[data-testid="stMain"] should drop the tag (#17418, #17338, #17416).
  • πŸ§ͺ AppTest supports more elements:
    • at.form and at.form_submit_button let you look up forms by key and click their submit buttons (#17229).
    • at.link_button and at.page_link (#17308).
    • at.progress, at.html, and at.help (#17280).
    • at.pagination can select a page for the next run (#17322).
    • at.audio_input and at.camera_input can stage a recording or photo for the next run (#17346, #17459).
  • 🐍 Streamlit supports Python 3.15 (#17426, #17422).
  • πŸ‘» Due to end of life, Python 3.10 is no longer supported. The minimum supported versions of NumPy, pandas, Pillow, and PyArrow are raised to releases with Python 3.11 wheels (#17315).

Other Changes

  • πŸ“¦ httptools is now an optional dependency. Install streamlit[performance] to keep Uvicorn's faster HTTP parser (#16554).
  • πŸ’Ώ Streamlit no longer requires the toml dependency (#17315, #17342).
  • ⚠ Streamlit logs a startup warning when websockets 17 or later is installed with uvicorn older than 0.52.0, a combination that can break the WebSocket handshake behind proxies that forward non-ASCII headers (#17115, #16030).
  • πŸ› Bug fix: st.switch_page and st.page_link reject Windows network and device paths before resolving them, so untrusted input can't trigger an SMB connection (#17301).
  • πŸ¦‹ Bug fix: A disabled st.download_button with a callable data argument no longer registers a download that can run the callable (#17288).
  • πŸͺ² Bug fix: Apps embedded in an iframe sandboxed without allow-same-origin render instead of staying blank (#17409, #17402).
  • 🐜 Bug fix: A run that is stopped or replaced while waiting for another run's cached value exits promptly instead of holding a thread (#17340).
  • 🐝 Bug fix: Streamlit logs an error at startup when secrets.toml can't be parsed, instead of silently continuing with empty secrets (#17428).
  • 🐞 Bug fix: Checking for a missing st.* attribute with hasattr or getattr no longer imports modules, which could raise a RuntimeError in code that iterates sys.modules (#17311, #17298).
  • πŸ•·οΈ Bug fix: A fragment callback that only calls st.switch_page or st.stop no longer logs a false warning about displaying elements (#17292).
  • πŸͺ³ Bug fix: Keyed containers no longer trigger React key warnings or remount while a rerun is in progress (#17456).
  • πŸͺ° Bug fix: Side-by-side elements line up better: height="stretch" elements in horizontal containers match the tallest element in their row, and vertically aligned st.columns fill the row height (#17392).
  • 🦠 Bug fix: Stretch-height charts fall back to their default height when nothing gives them one, and stretch-height containers and forms grow to fit their content (#17410, #17424).
  • 🦟 Bug fix: st.echarts_chart tooltips use the theme's font weight and round long numbers (#17333).
  • πŸ¦‚ Bug fix: st.pydeck_chart tooltips appear at the cursor instead of above it (#17313, #17309).
  • πŸ¦— Bug fix: Buttons, checkboxes, toggles, and other labels show a hover tooltip only when their text is cut off (#17266, #17264).
  • πŸ•ΈοΈ Bug fix: Muted icon buttons in widgets, such as clear and microphone buttons, share one color treatment and are no longer tinted by a custom theme.grayColor (#17231).
  • 🐌 Bug fix: Screen readers skip Material icons and decorative images, and icon-only controls have accessible names (#17170, #12873).
  • 🦎 Bug fix: The sidebar's expand and collapse buttons report their state with aria-expanded. Custom CSS or scripts that read aria-expanded on the sidebar should use data-collapsed instead (#17293).
  • πŸ¦€ Bug fix: st.date_input and st.datetime_input have a calendar button that keyboard users can reach with Tab and that reports its state to screen readers (#17294, #17296, #17316).
  • πŸ‘½ Bug fix: st.selectbox and st.multiselect let screen readers announce the active option while you type (#17295, #16841).
  • πŸ‘» Bug fix: Type hints for st.connection, st.query_params, st.secrets, and st.session_state match runtime behavior more closely (#17245, #17419, #17460, #17466).
  • πŸ› Bug fix: AppTest layout collections such as at.expander and at.tabs can be looked up by key (#17256).
  • πŸ¦‹ Bug fix: AppTest keeps persist_state="page" widget values and selected tabs across reruns of the same page (#17305, #17249).
  • πŸͺ² Bug fix: AppTest renders imported Custom Components v2, including st.pdf, in every AppTest instance in the same process (#17331, #17216).

Release date: October 2, 2026

Highlights

Notable Changes

Other Changes

  • πŸ’‘ Mistyped or removed st.* commands raise an AttributeError that suggests the correct name or replacement (#16912).
  • πŸ’¬ Session State mutation errors show the exact st.session_state[key] expression and how to fix it (#17016).
  • πŸ“¦ Streamlit can be installed alongside websockets 17.x (#17113, #17097).
  • πŸ› Bug fix: st.query_params follows the URL when browser back/forward changes only the query string on the same page (#16989, #13963).
  • πŸ¦‹ Bug fix: Widgets bound to query parameters restore their values from the URL on browser back/forward (#16998, #13853).
  • πŸͺ² Bug fix: Ctrl+C and SIGTERM stop the server even when an app script is stuck in a loop (#17022, #2975).
  • 🐜 Bug fix: Dialogs opened from a fragment stay responsive when that fragment reruns (#17039, #17011).
  • 🐝 Bug fix: Keyed widgets that first appear after a Session State write show the stored value instead of their default (#17106, #17093).
  • 🐞 Bug fix: st.data_editor keeps leading decimals, so typing .07 commits 0.07 instead of 7 (#16920, #16909).
  • πŸ•·οΈ Bug fix: Clearing a dataframe selection through Session State a second time also unchecks the rows in the grid (#17224, #17195).
  • πŸͺ³ Bug fix: LinkColumn shows the :material/open_in_new: icon in narrow columns instead of truncated text (#17090, #14782).
  • πŸͺ° Bug fix: st.chat_input placed in st.bottom no longer triggers scroll-to-bottom for the app (#16980, #16977).
  • 🦠 Bug fix: Pressing Enter in a form submits with the correct button when the first submit button is disabled (#17171).
  • 🦟 Bug fix: Synchronous st.cache_data and st.cache_resource functions that return an awaitable raise a clear error instead of a confusing serialization failure (#16921).
  • πŸ¦‚ Bug fix: st.image accepts the removed use_column_width parameter with a warning instead of raising a TypeError (#16999).
  • πŸ¦— Bug fix: st.image and st.pyplot no longer use list indexes as alt text, and st.image links with unsafe URL schemes render as plain images (#17136).
  • πŸ•ΈοΈ Bug fix: Element toolbar buttons include the element's alt text in their accessible names and have a 24px minimum target size (#17211, #17225, #16148, #17127).
  • 🐌 Bug fix: Range-mode st.date_input validation errors say the date is outside the allowed range instead of naming the wrong field (#16983).
  • 🦎 Bug fix: Range-mode st.date_input cancels a half-finished calendar selection when the app changes its value (#16984).
  • πŸ¦€ Bug fix: st.date_input clears partly typed dates when a clear_on_submit form resets (#16985).
  • πŸ‘½ Bug fix: st.date_input and st.datetime_input keep their clear and error icons visible in narrow layouts (#16986).
  • πŸ‘» Bug fix: Unchecked st.checkbox and st.radio options show a hover state again, matching secondary buttons (#17034, #17035).
  • πŸ› Bug fix: A custom theme.borderColor no longer fills the off track of st.toggle or the main menu's auto-rerun toggle (#17079, #17083).
  • πŸ¦‹ Bug fix: The visible sidebar border gets stronger on hover when theme.showSidebarBorder is enabled (#17071, #12803).
  • πŸͺ² Bug fix: Keyboard events without a key no longer throw errors in global hotkeys or non-dismissible dialogs (#17105, #17111, #17082, #17107).
  • 🐜 Bug fix: CacheReplayClosureError names the layout block instead of showing a $THING placeholder (#17065).
  • 🐝 Bug fix: AppTest form widgets commit their values only when the form is submitted, matching the browser (#16972).
  • 🐞 Bug fix: AppTest.get() accepts the same element names as AppTest attributes, such as datetime_input and pills (#17000).
  • πŸ•·οΈ Bug fix: AppTest lists st.expander elements with an icon under at.expander instead of at.status (#17162).
  • πŸͺ³ Bug fix: AppTest supports st.space through at.space (#17208).

Release date: September 15, 2026

Highlights

  • ✨ Introducing st.echarts_chart, a new command that renders Apache ECharts options with Streamlit theming, and accepts dicts, JSON strings, or pyecharts charts (#16785).
  • πŸ”€ Streamlit now supports async/await in app code, so you can use async libraries like httpx, aiohttp, and asyncpg directly (#16167, #744).
  • πŸ†• Announcing live updates for st.text_input: set live=True and the widget commits while the user types, after a short pause (#16662, #4553).

Notable Changes

Other Changes

  • πŸ› Bug fix: st.dialog hides a leftover dialog as soon as the next full-app run starts, so st.rerun() closes the modal before later blocking work (#16901, #9405).
  • πŸ¦‹ Bug fix: st.dataframe and st.data_editor convert list columns that PyArrow cannot serialize to strings, instead of raising when the nesting levels differ (#16838, #9380).
  • πŸͺ² Bug fix: Widgets after st.rerun keep the values the user selected, instead of resetting to their defaults (#16762, #3533).
  • 🐜 Bug fix: Altair mark_geoshape charts render on first view, instead of showing an empty plot (#16886, #2910).
  • 🐝 Bug fix: st.pydeck_chart honors pydeck views, so OrbitView, GlobeView, and map_provider=None render as specified (#16819, #2590, #2302, #9933).
  • 🐞 Bug fix: st.pydeck_chart renders layers that declare deck.gl extensions, instead of showing an error box (#16823).
  • πŸ•·οΈ Bug fix: Altair binding_radio and binding_select stay a single widget when on_select is enabled (#16809, #8765).
  • πŸͺ³ Bug fix: Vega and Altair bind= controls use Streamlit fonts, colors, and focus rings (#16813).
  • πŸͺ° Bug fix: Vega-Lite legend titles get more padding under the Streamlit theme, so the title is not stuck to the first entry (#16818).
  • 🦠 Bug fix: Elements stay dimmed after you press Stop, until the run actually finishes (#16839, #9904).
  • 🦟 Bug fix: st.query_params skips a browser history entry when the query string does not change, so the Back button leaves the app (#16831, #9878).
  • πŸ¦‚ Bug fix: Custom Components v2 keep in-flight trigger values, so the value reaches Python instead of the script rerunning without it (#16833, #16732).
  • πŸ¦— Bug fix: st.download_button encodes filenames that a quoted Content-Disposition header cannot hold, so the browser saves the full name (#16646, #16631).
  • πŸ•ΈοΈ Bug fix: st.slider swaps reversed min_value and max_value bounds, instead of truncating the range or raising an error about numbers you never passed (#16716, #16675).
  • 🐌 Bug fix: st.number_input raises a clear error when min_value is greater than max_value (#16895).
  • 🦎 Bug fix: Widgets raise an actionable error for an on_change mode they do not support (#16889).
  • πŸ¦€ Bug fix: Streamlit classifies invalid icon= values more precisely, so an empty value means no icon and a URL raises an image error (#16900).
  • πŸ› Bug fix: The error for a nested url_path names the invalid path and links to the issue you can upvote (#16896).
  • πŸ¦‹ Bug fix: Exception traces in the browser hide Streamlit package frames, keep your st.* call site, and show chained exceptions (#16718).
  • πŸͺ² Bug fix: Coalesced reruns dispatch only the callbacks that have not run yet (#16765).
  • 🐜 Bug fix: st.button and similar controls wait 500ms before they show a help tooltip on hover, so a pointer that crosses a control does not open one (#16794, #8686).
  • 🐝 Bug fix: st.radio exposes option captions as descriptions, so assistive tech reads the option text as the name (#16811).
  • 🐞 Bug fix: st.cache_resource rejects async validate and on_release callbacks, instead of discarding the awaitable they return (#16860).
  • πŸ•·οΈ Bug fix: AppTest treats unknown element subtypes as UnknownElement, so .run() finishes against a newer Streamlit (#16835).
  • πŸͺ³ Bug fix: AppTest raises AppTestError when you call set_value() or click() on an element with no typed wrapper (#16837).
  • πŸͺ° Bug fix: AppTest treats an empty st.chat_input submit as a real value, and prints ChatInputValue without an error when accept_file=True (#16857).
  • 🦠 Bug fix: AppTest.session_state supports the same dict methods as st.session_state, which are get, keys, items, values, to_dict, len, and iteration (#16897).
  • 🦟 Bug fix: streamlit skills installs the bundled agent skills where Claude Code reads them, and reports an incomplete install instead of success (#16394).

Release date: September 1, 2026

Highlights

  • 🎯 Introducing event-scoped fragment reruns, which let a widget callback rerun just one named fragment:
    • Name a fragment with @st.fragment(key=…) and target it with st.rerun("filters") or st.rerun(["alpha", "beta"]) from an on_change or on_click callback (#16161).
    • st.rerun() and st.switch_page() now take effect inside widget callbacks instead of being discarded with a warning; apps that relied on the previous no-op will now rerun (#16158).
  • ✨ Introducing on_change="ignore", a new mode that updates a widget in the browser without rerunning your app. Your script receives the buffered value on the next rerun, such as a button click, and the mode is available on st.slider and st.text_input (#14828, #16605).
  • 🍿 Introducing type="step" for st.expander and st.status, which renders containers as a connected timeline β€” well suited to showing an agent's or a pipeline's progress (#16558, #13248).

Notable Changes

  • πŸ“ The wrap parameter introduced in 1.62.0 extends to more commands:
  • πŸ”’ st.multiselect has a new select_all parameter to always show, never show, or threshold the "Select all" bulk action, and pressing Enter now selects the first row (#16673, #16537).
  • πŸ–Ό st.title, st.header, and st.subheader have a new icon parameter that renders a leading emoji or Material Symbol scaled to the heading (#16418, #11752).
  • πŸ§ͺ AppTest is more robust: apps using unimplemented commands stay inspectable, interacting with a disabled widget raises, container keys are exposed through at.container(key=…) and at.get_by_key(), and switch_page() resolves pages registered by st.navigation (#16711, #9814, #12844, #13163, #16611).
  • βš™ The new runner.cacheBackgroundRefreshTTLMultiplier config option widens or narrows the stale-while-revalidate window for refresh_mode="background" caches (#16599).

Other Changes

  • 🚨 Invalid API usage raises specific StreamlitAPIException subclasses for missing, incompatible, out-of-range, and wrongly typed parameters instead of generic Streamlit, TypeError, or ValueError failures (#16508, #16637, #16656, #16668, #16690, #16701, #16707).
  • πŸ’“ st.spinner keeps animating at a slower rate under prefers-reduced-motion and exposes its label as an accessible status, so paused motion is not mistaken for a hung app (#16620, #16598).
  • πŸ”— st.context supports key notation so st.context["timezone"] matches st.context.timezone, st.user.is_logged_in is typed as bool, and the documented st.user.tokens names surface in autocompletion (#16710).
  • πŸ› Bug fix: The install-skills prompt shown with local error messages sizes its action labels to match the card's text (#16482).
  • πŸ¦‹ Bug fix: st.code renders very long inputs instead of failing with a call-stack error, by skipping syntax highlighting past a line-count threshold (#16567, #11996).
  • πŸͺ² Bug fix: st.date_input and st.datetime_input no longer crash for values near Python's minimum and maximum dates when no explicit bounds are given (#16582, #7427).
  • 🐜 Bug fix: st.menu_button dropdowns and JSON path tooltips stay interactive inside st.dialog (#16583).
  • 🐝 Bug fix: Pressing Cmd/Ctrl+C no longer opens the clear-cache dialog when the modifier is released before the C key (#16615).
  • 🐞 Bug fix: Markdown list items holding a long unbreakable token wrap inside narrow containers instead of overflowing them (#16632, #16618).
  • πŸ•·οΈ Bug fix: Type checkers infer the documented return types for st.plotly_chart, st.pydeck_chart, st.file_uploader, st.chat_input, and st.selectbox when arguments are omitted or not literals (#16633, #16630).
  • πŸͺ³ Bug fix: Embedded apps forward the full guest-to-host postMessage stream to in-iframe hosts, which unblocks metrics events when metricsUrl is "postMessage" (#16647, #16644).
  • πŸͺ° Bug fix: Ctrl/Cmd+A selects the typed filter text in st.multiselect instead of being intercepted as a bulk-select shortcut (#16650).
  • 🦠 Bug fix: st.datetime_input keeps a time entered before a date, so completing the date commits the time on screen instead of midnight (#16664).
  • 🦟 Bug fix: Invalid-color errors render their valid formats as a list, and object reprs with uppercase hexadecimal addresses take the same st.write and st.help path on Windows as elsewhere (#16683, #16674, #16677).
  • πŸ¦‚ Bug fix: The calendar header shows the year matching the visible grid when min_value and max_value cross a year boundary (#16706, #16686).
  • πŸ¦— Bug fix: File uploads no longer hang when in-process ASGI middleware such as Sentry has already read the request body (#16709, #16697).
  • πŸ•ΈοΈ Bug fix: Library warnings that previously appeared only as in-app alerts also log to the server console with a stack trace, so CLI users and coding agents can see them (#16717).

Release date: August 19, 2026

Highlights

Notable Changes

  • 🎨 Date and datetime inputs have a more accessible, keyboard-friendly editing experience:
  • πŸ“Š You can configure chart categorical, sequential, and diverging colors separately for light, dark, and sidebar themes (#16357, #16355).
  • πŸ”€ Theme font-weight settings support increments of 50 for finer typography control (#16396, #16354).
  • πŸ‘» The long-deprecated st.cache command has been removed; use st.cache_data or st.cache_resource instead (#15787).
  • ☠️ Passing Matplotlib savefig keyword arguments to st.pyplot is deprecated; save the figure directly and display it with st.image instead (#16450).
  • πŸ‘» Calling st.pyplot without an explicit figure is no longer supported (#16464).

Other Changes

  • πŸͺ„ When Streamlit raises an uncaught error during local development, the error display can offer to install Streamlit's agent skills for supported coding agents (#15693).
  • πŸ“ st.table uses a 14-pixel font size consistent with other Streamlit widgets (#16397, #16389).
  • 🚨 Invalid enum-like parameter values consistently raise StreamlitValueError while preserving compatibility with existing specialized exception classes (#16422).
  • πŸ“¦ Streamlit no longer requires the tenacity dependency for SQL and Snowflake connection retries (#16497).
  • πŸ› Bug fix: st.popover keeps its contents visible and scrollable in narrow or embedded viewports (#16173, #9340).
  • πŸ¦‹ Bug fix: st.pyplot supports SVG output through format="svg" (#16283, #11489).
  • πŸͺ² Bug fix: runner.cacheHashSeed lets apps change the sample used to hash large pandas, Polars, and NumPy objects without invalidating existing caches by default (#16284, #14622).
  • 🐜 Bug fix: Heading anchors update when heading text changes during a rerun (#16286, #8793).
  • 🐝 Bug fix: Altair charts reconstructed with alt.Chart.from_json preserve their inline datasets (#16288, #6269).
  • 🐞 Bug fix: Nested st.fragment functions with queued periodic reruns no longer execute twice and create duplicate element IDs (#16314, #10719).
  • πŸ•·οΈ Bug fix: Multiple Streamlit servers correctly advance to the next available port on Windows (#16315, #16296).
  • πŸͺ³ Bug fix: Updating st.status through a container created outside a fragment no longer corrupts the app's element tree (#16316, #16281).
  • πŸͺ° Bug fix: Streamlit falls back to MD5 for element IDs, cache keys, and file watching on FIPS-enabled systems whose BLAKE2b implementation rejects custom digest sizes (#16324, #15148).
  • 🦠 Bug fix: Embedded Streamlit-in-Snowflake apps can receive same-window authentication messages while retaining host-message spoofing protections (#16327).
  • 🦟 Bug fix: Streamlit remains compatible with newer Starlette gzip middleware while preserving correct media, download, and range-response handling (#16342, #16344, #16341, #16462).
  • πŸ¦‚ Bug fix: Malformed WebSocket messages are rejected without exposing tracebacks or absolute server paths to the browser (#16392, #16391).
  • πŸ¦— Bug fix: The startup warning for server.enableCORS=false accurately describes CORS and XSRF behavior instead of claiming the setting is overridden (#16393, #16390).
  • πŸ•ΈοΈ Bug fix: Derived code and dataframe-header background colors respect custom theme background settings (#16401, #16398).
  • 🐌 Bug fix: Timelike st.slider values are validated against the frontend's safe numeric range instead of silently changing (#16475, #16474).
  • 🦎 Bug fix: st.toast notifications remain visible when immediately followed by st.rerun() (#16498, #7740).
  • πŸ¦€ Bug fix: st.color_picker remains interactive inside dialogs (#16541, #16538).
  • πŸ‘½ Bug fix: st.metric restores its sparkline after chart data becomes empty and is populated again (#16543, #16539).

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 new lazy parameter lets you turn this on or off explicitly, and Polars LazyFrame objects are supported natively (#15756).
  • 🍿 st.cache_data and st.cache_resource have a new refresh_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.metric has a new icon parameter to display an icon next to the metric label (#15805, #12298).
  • ⏱ st.time_input received a major revamp with editable time segments, a new format parameter to control the hour cycle (12-hour, 24-hour, or localized), seconds granularity when step is under 60 seconds, paste support, and improved form behavior with Enter-to-submit (#16126, #16128, #16096, #15647, #6423, #8234).
  • πŸ‘₯ st.multiselect has improved tag accessibility, including keyboard navigation between tags and WAI-ARIA-aligned dropdown focus (#16200, #16109).
  • πŸ“₯ st.download_button now infers a missing file_name and mime from a file object's name when you pass data opened from disk (#16061). Thanks, SoMika00!
  • πŸšͺ st.Page is now a proper class, so isinstance(page, st.Page) behaves as expected (StreamlitPage remains a backward-compatible alias) (#16268).
  • πŸ”’ New server.allowedHosts config option lets deployments with known hostnames restrict incoming WebSocket handshakes (#16147).
  • πŸ›‘ The disabled widget parameter is now enforced server-side, so a disabled widget never accepts a value from the browser (#16209).
  • πŸ‘» Breaking change: The deprecated use_column_width parameter has been removed from st.image. Use the width parameter instead (#15786).
  • ☠️ Breaking change: Passing local file paths as strings to st.html and st.iframe is deprecated. Use a pathlib.Path object to load local files instead (#16150).

Other Changes

  • πŸ› Bug fix: AppTest now converts a script file path to its parent directory before adding it to sys.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.selectbox fuzzy search matches non-contiguous substrings again, fixing a regression since 1.59.0 (#16009, #16003). Thanks, LuC-9!
  • 🐝 Bug fix: st.popover placed inside st.sidebar no longer renders off-screen (#16087, #9387).
  • 🐞 Bug fix: Pressing Escape in st.selectbox now clears the typed search query and restores the committed label (#16088, #16004).
  • πŸ•·οΈ Bug fix: st.bar_chart and other built-in charts no longer fail on column names containing a . (#16089, #7714).
  • πŸͺ³ Bug fix: st.expander no longer stays clipped after a rapid open/close interaction interrupts its animation (#16090, #16027).
  • πŸͺ° Bug fix: Right-side padding is preserved when a st.code block is scrolled horizontally to the end (#16091, #8206).
  • 🦠 Bug fix: AppTest multipage path handling is now deterministic and better documented (#16122, #8429, #8154).
  • 🦟 Bug fix: AppTest now 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_editor cell edit is now committed when you click outside the grid (#16132, #7868).
  • πŸ¦— Bug fix: @st.fragment(run_every=...) no longer raises a TypeError when Sentry's threading integration is enabled (#16140, #16139).
  • πŸ•ΈοΈ Bug fix: st.data_editor row additions no longer silently overwrite existing rows for non-RangeIndex DataFrames (#16144).
  • 🐌 Bug fix: st.Page now 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.multiselect dropdown 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_editor NumberColumn now 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.selectbox near the bottom of the sidebar now flips its dropdown up instead of clipping past the viewport (#16199, #16181).
  • 🐝 Bug fix: st.help no longer shows "page.run()" as the header in multipage apps (#16244, #11430).
  • 🐞 Bug fix: st.pills and st.segmented_control keep the current selection highlighted when a format_func changes an option's label between reruns (#16271, #16269).
  • πŸ•·οΈ Bug fix: st.download_button now accepts io.StringIO data as documented (#16272, #16270).
  • πŸͺ³ Bug fix: Port auto-increment is restored on Windows, so a second streamlit run no longer binds an in-use port (#16315, #16296).
  • πŸͺ° Bug fix: An st.status opened 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 git CLI instead (#16241).

Release date: July 21, 2026

Highlights

  • ✨ You can now disable bulk data export app-wide with the new client.disableDataExport config option. When set, the CSV export button is hidden for st.dataframe, st.data_editor, and chart table views, and clipboard copy is disabled for read-only dataframes (#15910, #8402, #11358).

Notable Changes

  • πŸ”’ Security hardening (breaking changes):
    • Streamlit now rejects host messages that appear to originate from child iframes or injected scripts, preventing origin spoofing (CWE-346) (#15800).
    • Client-supplied query strings are now capped at 512 KiB and 1,000 fields, guarding against unbounded resource allocation (CWE-770) (#15803).
    • New server.maxWidgetStateSize config option (default 25 MB) limits the widget state payload a client can send per script rerun, hardening against oversized widget and custom-component payloads (#15804).
  • πŸ“Š st.dataframe now preserves row selections when the user sorts the table (#16020, #8851).
  • πŸŽ› st.tabs has a new height parameter to set a fixed pixel height for the tab panel area (#15847, #12217).
  • πŸ“ The gap parameter in st.columns now accepts integer pixel values in addition to the existing string presets (#15850, #13005).
  • 🎨 st.data_editor now uses key as the primary row identity when num_rows="fixed", improving stability when the underlying data changes (#15884).
  • πŸ“ˆ Zero delta values in st.metric are now displayed in neutral grey instead of green or red, so a zero change no longer implies a positive or negative direction (#15790, #15005).
  • πŸ–Œ Vega-Lite chart action buttons (download, copy spec to clipboard) are now integrated into the native Streamlit toolbar; the Vega-Lite action menu overlay has been removed (#15806).

Other Changes

  • πŸ› Bug fix: Non-finite float values (e.g. NaN, Inf) in URL query params are now rejected to prevent unexpected behavior (#15799).
  • πŸ¦‹ Bug fix: Dangerous URLs in Graphviz link attributes are now sanitized (#15819).
  • πŸͺ² Bug fix: HTML in PyDeck chart tooltip interpolations is now escaped to prevent injection (#15820).
  • 🐜 Bug fix: Dangerous URLs in st.link_button and st.image are now sanitized (#15851).
  • 🐝 Bug fix: st.selectbox now virtualizes long dropdown option lists for better rendering performance (#15870, #15863).
  • 🐞 Bug fix: Viewport gutter is now preserved around dialogs on narrow screens (#15875).
  • πŸ•·οΈ Bug fix: React Aria dialog overlays now stack correctly when multiple dialogs are open (#15876, #15859).
  • πŸͺ³ Bug fix: The "Missing Submit Button" warning has been removed (#15889, #14247).
  • πŸͺ° Bug fix: st.tabs panels no longer stack visually after a widget rerun (#15894, #15893).
  • 🦠 Bug fix: st.metric area chart fill baseline is now drawn correctly (#15907).
  • 🦟 Bug fix: run_every auto-rerun timers are now deduplicated per fragment, preventing duplicate reruns (#15912).
  • πŸ¦‚ Bug fix: Redundant keyboard tab stop removed from the file uploader dropzone for better accessibility (#15928).
  • πŸ¦— Bug fix: Auto-rerun correctly stops when a fragment is evicted (#15932).
  • πŸ•ΈοΈ Bug fix: A PyArrow 25 thread initialization crash is now avoided (#15947).
  • 🐌 Bug fix: Missing httpx error message for the auth extra is now surfaced correctly (#15864).
  • 🦎 Bug fix: st.App with programmatic secrets now correctly honors the expose_tokens setting (#15865).
  • πŸ¦€ Bug fix: RuntimeError: reentrant call inside _io.BufferedWriter on Ctrl+C is fixed (#15949, #15740). Thanks, chang-pro!
  • πŸ‘½ Bug fix: File watcher no longer crashes on Windows drive-root paths (#15951, #12731).
  • πŸ‘» Bug fix: Overlay stacking and dismissal inside popovers works correctly (#15961).
  • πŸ› Bug fix: Mobile keyboard no longer appears for st.selectbox when filter_mode=None (#15962).
  • πŸ¦‹ Bug fix: st.selectbox "No results" empty state is now styled correctly (#15967).
  • πŸͺ² Bug fix: IndexError in number formatting for values β‰₯ 1 quadrillion is fixed (#15971). Thanks, eeshsaxena!
  • 🐜 Bug fix: Type-to-search in st.selectbox is restored (#15996, #15985).
  • 🐝 Bug fix: Typing a value in st.number_input inside a form now correctly submits on the first Enter press (#16013, #13751).
  • 🐞 Bug fix: Hashing fallback warning messages are now more informative (#16040, #10957).
  • πŸ•·οΈ Bug fix: Inconsistent checkbox margin in a horizontal container within a column is fixed (#16060, #13162).
  • πŸͺ³ Bug fix: Widgets inside a popover that is itself inside a dialog are now clickable (#16067, #16005).
  • πŸͺ° Bug fix: st.echo output now correctly includes decorators on the displayed function (#16068, #9252).
  • πŸ”© Internal TTLCache implementation replaces the cachetools third-party dependency (#16014).

Release date: July 6, 2026

Highlights

  • ✨ Introducing ButtonColumn β€” a new column type for st.dataframe and st.data_editor that renders clickable buttons inside table cells, letting users trigger actions directly from a row (#14544, #7015).
  • πŸ“Š st.dataframe has a new column statistics submenu β€” click the dropdown icon in any column header to see per-column summary stats (#14307, #13148).
  • 🍿 Introducing st.skeleton β€” a new element that renders animated loading placeholders, making it easy to give users visual feedback while content is loading (#15169, #8032).
  • 🎨 Introducing st.mermaid_chart β€” render Mermaid diagrams directly in your app, letting you embed flowcharts, sequence diagrams, and more. Mermaid also works from st.markdown (#14022, #10721).

Notable Changes

  • πŸŽ› st.chat_input has a new submit_mode parameter that controls widget behavior after the user submits a message, e.g. showing a stop button or disabling the chat input (#14344, #8323, #11854).
  • πŸ“‹ st.dataframe and st.data_editor support a new MarkdownColumn type in st.column_config that renders Markdown text inside table cells (#13931, #10211).
  • πŸ”— st.markdown has a new anchors parameter for adding linkable heading anchors to Markdown content (#15722, #13913).
  • πŸ’» You can now launch Streamlit apps directly with python app.py or uv run app.py using the new App.run() entry point β€” no more streamlit run required (#15563, #9450, #11420).
  • 🧩 st.fragment can now write to containers defined outside the fragment. Fragments can update any part of your app β€” including elements created before the fragment β€” without triggering a full rerun (#15623, #15620, #10481).
  • πŸ“Ž st.chat_input now supports pasting files directly into the input field (#15558, #10307).
  • πŸ€– st.write_stream now supports OpenAI Responses API streams in addition to the existing Chat Completions streams (#15559, #11061).
  • πŸ”’ st.set_page_config supports a new "locked" option for initial_sidebar_state that prevents users from toggling the sidebar open or closed (#15459, #15411).
  • πŸ’… Widgets have a new persist_state parameter for finer control over how widget state is preserved across reruns (#15645).
  • πŸ“· st.camera_input has a new resolution parameter to control the captured image resolution (#15766, #4320).
  • πŸ§ͺ AppTest now supports testing st.download_button and st.image (#15528, #9003).
  • πŸ’Ύ Programmatic secrets now support list values (#15491).
  • ⌨ You can now look up Streamlit API documentation from the CLI with streamlit docs <command> (#15547).
  • πŸ” A new server.xsrfCookieSameSite config option lets you customize the SameSite attribute of the XSRF cookie for deployments with specific cross-site requirements (#15634, #5793, #9397).
  • πŸ’‘ Streamlit now recommends installing AI coding skills on app startup to improve your development workflow with AI coding assistants (#15437, #15473).
  • βš™ The /_stcore/metrics endpoint now reports memory stats in a less detailed (cheaper) form by default (#15472).
  • πŸ‘» The deprecated Snowpark connection type has been removed. Migrate to a supported connection type (#15784).
  • πŸ‘» The deprecated st.bokeh_chart command has been removed. Use the streamlit-bokeh component instead (#15636).

Other Changes

  • ⚑ VegaLite charts now use Vega's native resize API for faster rendering when the container size changes (#15302).
  • 🎨 The pagination widget's selected-state styling has been redesigned (#15550).
  • πŸ”§ Various fixes related to the Baseweb library removal (#15737).
  • πŸ› Bug fix: The metrics endpoint no longer errors when SQLAlchemy connections are present (#15334).
  • πŸ¦‹ Bug fix: @st.fragment(run_every=...) no longer raises a TypeError in _run_with_thread_state (#15376).
  • πŸͺ² Bug fix: Named Snowflake connections defined in config files are now correctly discovered and used (#15382).
  • 🐜 Bug fix: P-mode PIL palette images are now hashed correctly to prevent hash collisions (#15397).
  • 🐝 Bug fix: The server now correctly binds to IPv6 dual-stack wildcards for the default address (#15400).
  • 🐞 Bug fix: Stale and invalid auth cookies are now cleared on login (#15420).
  • πŸ•·οΈ Bug fix: widgetMgr is synced correctly to fix lazy loading in tab.open (#15460).
  • πŸͺ³ Bug fix: Installed Custom Component v2 components are now correctly discovered in AppTest (#15488).
  • πŸͺ° Bug fix: st.pills and st.segmented_control callbacks now fire correctly after selection (#15522).
  • 🦠 Bug fix: The page title is no longer reset to the default on rerun (#15527).
  • 🦟 Bug fix: The "Missing Submit Button" warning no longer flashes briefly on app load (#15561).
  • πŸ¦‚ Bug fix: Streamlit now defaults to the polling file watcher in WSL environments, avoiding inotify issues (#15562).
  • πŸ¦— Bug fix: AppTest now correctly handles formatted labels in format_func widgets (#15564).
  • πŸ•ΈοΈ Bug fix: The invalid session upload error message now explains multi-replica deployment as a possible cause (#15635).
  • 🐌 Bug fix: st.selectbox no longer loses its selection when format_func depends on object identity (#15639).
  • 🦎 Bug fix: Pressing Escape no longer clears the current selection in st.multiselect (#15646).
  • πŸ¦€ Bug fix: StreamlitPage now validates that its source matches the registered page, catching misconfiguration earlier (#15721, #10572).
  • πŸ‘½ Bug fix: st.dataframe no longer intercepts the Ctrl+F keyboard shortcut when the search bar is disabled (#15764).
  • πŸ› Bug fix: Column headers in st.dataframe no longer wrap text in the column header menu (#15772).

Release date: May 28, 2026

Highlights

  • 🌟 Introducing parallel=True for @st.fragment, which lets fragments run concurrently for more responsive apps and background-style workflows (#15214).
  • 🍿 Introducing st.pagination to help you build paged interfaces, e.g. for dataframes (#14975, #10785).
  • πŸš€ Announcing streamlit skills, a new CLI command for installing AI agent skills (#15116).

Notable Changes

  • πŸ”” st.App now supports custom script error handling, letting you attach a custom exception handler to your app (#14972, #3426, #8713).
  • πŸ“ st.expander and st.status have a new type parameter for a more compact visual style (#14054, #13246).
  • πŸ‘» The deprecated element.add_rows feature has been removed (#15034, #299, #13063, #7994, #5860).
  • πŸ‘» LangChain callback handler integration has been removed (#15051).

Other Changes

  • πŸ› Query-parameter-bound widgets now keep the URL in sync when their values change through Session State (#14744).
  • πŸ–Œ Widget and icon sizing is more consistent across the app (#15056, #15098, #13945).
  • ⏱ Streamlit reduces the timeout for external IP lookups to avoid startup freezes when the lookup is slow or unavailable (#14984).
  • πŸ›‘ st.markdown now blocks javascript: and vbscript: URLs in Markdown links (#15161).
  • πŸ› Bug fix: Streamlit now supports symlinks in Starlette static file serving (#15112, #13600).
  • πŸ¦‹ Bug fix: Fragment apps no longer crash because of stale auto-reruns (#15130, #15084).
  • πŸͺ² Bug fix: blake2b hashing now uses usedforsecurity=False for FIPS-compatible environments (#15149, #15148). Thanks, andriykislitsyn!
  • 🐜 Bug fix: st.login cookies now restore 30-day persistence with a Max-Age value (#15194, #15193). Thanks, GiovanniPaoloGibilisco!
  • 🐝 Bug fix: OAuth PKCE behavior has been restored in the Starlette-based auth flow (#15282, #15115).
  • 🐞 Bug fix: OAuth no longer regresses with MismatchingStateError after upgrading to 1.57.0 (#15048, #14991).
  • πŸ•·οΈ Bug fix: Provider tokens now use joserfc, improving auth compatibility and token handling (#15178, #15170).
  • πŸͺ³ Bug fix: st.vega_lite_chart tooltips work again inside dialogs (#15191, #12390). Thanks, marawanokasha!
  • πŸͺ° Bug fix: st.button warns when a keyboard shortcut is reserved by the browser (#15217, #15216).
  • 🦠 Bug fix: st.markdown shows its help icon again when unsafe_allow_html=True (#15232, #15211).
  • 🦟 Bug fix: Browser Back/Forward navigation now works for pages with Unicode URL paths (#15281, #15267).
  • πŸ¦‚ Bug fix: Programmatically closed popovers and expanders no longer reopen when you interact with another container (#14945, #14943).
  • πŸ¦— Bug fix: st.selectbox no longer hides its first option when exactly seven options are selected (#14997, #14989).
  • πŸ•ΈοΈ Bug fix: st.multiselect disables "Select all" for very large option lists to avoid performance problems (#15301, #14918, #15299).
  • 🐌 Bug fix: Tables, dataframes, and data editors no longer accidentally overscroll during interaction (#15309). Thanks, kantuni!

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).

Release date: March 3, 2026

Highlights

  • 🍿 Introducing dynamic containers: st.tabs, st.popover, and st.expander can rerun the app when they are opened or closed by setting the on_change parameter. If a key is also provided, you can programmatically open and close them, too.
  • πŸ–‡οΈΒ Announcing widget binding! Most non-trigger widgets have a bind parameter to simplify syncing widget state with query parameters.

Notable Changes

  • πŸ”—Β st.image has a link parameter to make images clickable with HTTP/HTTPS URLs (#14139, #9836).
  • πŸ₯·Β st.Page has a visibility parameter 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.metric has a delta_description parameter to display descriptive text next to delta values (#13848, #13690).
  • πŸ“Β You can configure the font weight and size for st.metric with the new metricValueFontWeight and metricValueFontSize configuration options (#13550, #12300). Thanks, kagawa0710!
  • πŸ“Β st.table has height and width parameters (#13850, #10775, #10820).
  • πŸ“ˆΒ st.altair_chart and st.vega_lite_chart support 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.markdown accepts width="auto" to adapt its default behavior depending on the flex layout of its container (#13841).
  • 🌐 Added a newΒ client.allowedOriginsΒ config option to let you customize which origins can send cross-origin postMessage (#13829, #6389).

Other Changes

  • πŸ–‹οΈΒ Page titles in st.Page and section labels in st.navigation support Markdown (#14053, #14010, #11771).
  • 🧹 Common block elements in widget labels are auto-escaped for convenience (#13887, #7359).
  • πŸ„β€β™‚οΈΒ st.multiselect lets users select all options or all currently filtered options with a single click (#13795, #4714).
  • πŸ’…Β Improved the design of st.multiselect and st.selectbox (#13004). Thanks, rishi-kumar0612!
  • ‼️ All widget drop-downs were restyled for consistency (#13796, #13797, #13798).
  • ↔️ For better accessibility, st.tabs displays navigation arrows when the tabs overflow their container horizontally (#13987, #5552).
  • πŸ“Β The app menu was redesigned (#14101):
    • Improved accessibility (#13878, #14131).
    • Added a copy button for the Streamlit version (#13791).
    • Removed the settings menu, surfacing the theme selector and rerun settings in the main menu (#13937, #13988, #14048).
  • πŸ”Β Improved streamlit config show output to better distinguish theme value sources (#13761).
  • β™₯️ To improve behavior in hosted environments, the Streamlit server acknowledges client heartbeats (#13810).
  • πŸ”£Β Extended sprintf to support , as a thousands separator in NumberColumn, ProgressColumn, st.number_input, st.slider, and st.metric (#13284, #1301).
  • ⬆️ Added support for cachetools 7.x (#13839, #13801).
  • ☠️ Added a deprecation notice to SnowparkConnection for better visibility (#14125).
  • πŸ¦€Β Bug fix: st.spinner avoids a race condition when used right before a cache miss (#13849, #13634).
  • 🦎 Bug fix: st.date_input values are normalized in Session State to prevent a type error (#14123, #14109).
  • 🐌 Bug fix: st.metric with 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_control has consistent border styling on hover (#14067, #12802).
  • πŸ¦‚Β Bug fix: st.date_input and st.datetime_input remove validation marks when they are cleared (#14066, #14052).
  • 🦟 Bug fix: Fixed a rendering regression for vconcat charts in Altair with faceted children (#14065, #14050).
  • 🦠 Bug fix: st.Page raised 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.tabs retain their state when rendered after a transitional element like st.spinner (#14023, #14018).
  • πŸ•·οΈΒ Bug fix: Treemap and sunburst Plotly charts support selections (#13935, #9001).
  • 🐞 Bug fix: Fixed a width regression for layered vconcat charts in Altair (#13980, #13974).
  • 🐝 Bug fix: st.multiselect raises an exception when max_selections isn'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_slider doesn't apply its format function twice in AppTest (#13837, #13832).
  • πŸ›Β Bug fix: Content in collapsed expanders is not included in page search (#13818).

Release date: February 4, 2026

Notable Changes

  • 🎨 The color parameter of st.area_chart, st.bar_chart, st.line_chart, and st.scatter_chart supports the basic color palette which can be configured with theming (#13739, #12694).
  • ☯️ You can use the new theme.chartDivergingColors to 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.logo supports 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_chart
    • st.bar_chart
    • st.line_chart
    • st.scatter_chart
    • st.altair_chart
    • st.vegalite_chart
    • st.pydeck_chart
    • st.date_input
    • st.datetime_input
    • st.radio
    • st.select_slider
  • πŸ‘†Β ListColumn and MultiselectColumn let users select the text of their pills for copying (#13663).
  • πŸ‘»Β st.experimental_get_query_params and st.experimental_set_query_params have been removed. Use st.query_params instead.
  • ☠️ st.experimental_user has been removed. Use st.user instead.

Other Changes

  • πŸ‘½Β The warning about the proposed removal of .add_rows() shows in the browser. Please leave feedback (#13063).
  • 🦎 When a .streamlit/config.toml file 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 localhost in 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_chart doesn't raise a KeyError when sorting melted data (#13695).
  • 🦟 Bug fix: st.multiselect and st.selectbox don'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 index error (#13659, #13658).
  • πŸ•·οΈΒ Bug fix: SnowflakeConnection.query() correctly passes the params argument 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_input was increased to reduce filename truncation (#13589).
  • πŸ›Β Bug fix: st.bar_chart doesn't raise an error about y-axis minimum and maximum when the bars have all the same value (#13590, #13584).

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.useStarlette configuration 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

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.logo links 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.json displays a tooltip on hover for each element to show its full path (#13113, #13057).
  • πŸ’¬ st.chat_input was 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.auth is 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_input accounts for floating point precision when incrementing and decrementing its value (#13484).
  • πŸ¦€ Bug fix: st.altair_chart correctly displays HConcat and VConcat charts (#13423, #13410).
  • πŸ¦‹ Bug fix: st.selectbox is initialized correctly when its value is set from Session State (#13438, #13435).
  • 🦎 Bug fix: st.html indents list items correctly (#13437, #13426).
  • 🐌 Bug fix: A logger message for SnowflakeConnection references 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.spinner are 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.dialog doesn't show stale elements from a previous dialog (#13297, #10907).
  • πŸͺ³ Bug fix: st.data_editor behaves correctly when starting with a column of None values (#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 R for 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.logo displays 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).
forum

Still have questions?

Our forums are full of helpful information and Streamlit experts.