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