Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
c07a319
Sync all relayout changes back to the figure prop, not only shapes
T4rk1n Jul 7, 2026
a0e3820
Fix callbacks double-registered when app file is loaded by import string
T4rk1n Jul 7, 2026
8627811
Fix Flask-WTF/Quart-WTF CSRF exemptions broken by backend refactor
T4rk1n Jul 9, 2026
8ed1d68
fix changelog
AnnMarieW Jul 9, 2026
600a5c6
fix dependabot
T4rk1n Jul 9, 2026
0c6b5a0
Merge pull request #3886 from AnnMarieW/fix-changelog
T4rk1n Jul 9, 2026
be23759
Merge branch 'dev' into fix/depbot-again
T4rk1n Jul 10, 2026
985f9da
Merge pull request #3887 from plotly/fix/depbot-again
T4rk1n Jul 10, 2026
8ef6ffe
Merge branch 'dev' into fix/flask-plugin
T4rk1n Jul 10, 2026
44361da
Merge branch 'dev' into fix/relayout
T4rk1n Jul 13, 2026
6f6512e
Merge pull request #3882 from plotly/fix/relayout
T4rk1n Jul 13, 2026
4d196ae
Update CHANGELOG.md
T4rk1n Jul 13, 2026
e65bfe5
Merge branch 'dev' into fix/flask-plugin
T4rk1n Jul 14, 2026
8c72a5f
Merge pull request #3885 from plotly/fix/flask-plugin
T4rk1n Jul 14, 2026
a49104a
Update CHANGELOG.md
T4rk1n Jul 14, 2026
d09941b
Merge branch 'dev' into fix/double-register
T4rk1n Jul 14, 2026
a102d22
canonical import for uvicorn double register on hot reload
T4rk1n Jul 15, 2026
f2f3151
Merge pull request #3883 from plotly/fix/double-register
T4rk1n Jul 15, 2026
08cc2b1
callback args hardening.
T4rk1n Jul 17, 2026
0c3d545
update changelog
T4rk1n Jul 17, 2026
b8ed27c
fix lint
T4rk1n Jul 17, 2026
6505036
fix lint
T4rk1n Jul 17, 2026
cf6cb45
fix lint
T4rk1n Jul 17, 2026
55e8648
Add 'comm' to install requirements
leontoddjohnson Jul 17, 2026
27bddaa
Merge pull request #3903 from leontoddjohnson/patch-1
T4rk1n Jul 20, 2026
f651bd5
Merge branch 'dev' into fix/callback-args-hardening
T4rk1n Jul 20, 2026
d282d93
Merge pull request #3902 from plotly/fix/callback-args-hardening
T4rk1n Jul 20, 2026
505958a
update radix in dcc
T4rk1n Jul 21, 2026
051be28
npm audit fix
T4rk1n Jul 21, 2026
8f0ec6f
Version 4.4.1
T4rk1n Jul 21, 2026
e06a351
Merge pull request #3908 from plotly/patch-4.4.1
T4rk1n Jul 21, 2026
3130ed6
Merge branch 'dev' into master-4.4.1
T4rk1n Jul 21, 2026
5079b04
Version 4.4.1 build artifacts
T4rk1n Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
version: 2
updates:
# Root package dependencies.
# NOTE: listing more than one entry under `directories` makes Dependabot treat
# "/" as a recursive glob, so it scans every nested package.json. The negated
# globs below keep it out of directories that have their own update entry — the
# components and the renderer carry narrow allow/ignore lists (e.g. react-docgen
# is pinned) that the root entry would otherwise bypass. @plotly/* is internal.
# NOTE: Dependabot's npm updater recurses from "/" into every nested
# package.json, and neither the singular `directory` nor plural `directories`
# with `!` exclusion globs stops that recursion. So the ONLY reliable way to
# keep this entry from bumping the components/renderer (which carry their own
# narrow allow/ignore lists, e.g. react-docgen is pinned) is the `allow` list
# below: it names only packages that exist SOLELY in the root package.json, so
# even while recursing, Dependabot opens root-only PRs. npm-run-all, rimraf and
# @types/jest are intentionally omitted — they also live in the components and
# would produce duplicate PRs.
- package-ecosystem: "npm"
directories:
- "/"
- "!/@plotly/*"
- "!/components/*"
- "!/dash/dash-renderer"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
Expand All @@ -26,6 +26,12 @@ updates:
applies-to: security-updates
patterns:
- "*"
allow:
- dependency-name: "@lerna/*"
- dependency-name: "@percy/cli"
- dependency-name: "husky"
- dependency-name: "lerna"
- dependency-name: "lint-staged"

# Dash renderer
- package-ecosystem: "npm"
Expand Down
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,21 @@
All notable changes to `dash` will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/).

## [4.4.1] - 2026-07-21

## Fixed
- [#3902](https://github.com/plotly/dash/pull/3902) Fix background callbacks trusting the client-supplied `job`/`oldJob`/`cancelJob` and `cacheKey` query parameters verbatim, which let an unauthenticated client terminate an arbitrary process (with `DiskcacheManager`, by sending its PID) or read and delete arbitrary result-cache entries. The `cacheKey`/`job` handles are now HMAC-signed by the server and bound to a per-page-load token, so forged or replayed values are rejected. Handles stay opaque to the renderer, so no app or callback code changes are required.
- [3883](https://github.com/plotly/dash/pull/3883) Fix callbacks being registered twice when running the app file as a script with a server that loads it by import string, e.g. `uvicorn.run("app:server", reload=True)` with `backend="fastapi"`. The spawned worker re-executes the main module as `__mp_main__` and the import string then executed the same file a second time, duplicating every callback in `_dash-dependencies` and triggering `Duplicate callback outputs` errors in the renderer. `Dash()` now pre-registers the running main module in `sys.modules` under its canonical import name so the second import reuses it instead of re-executing the file. Fixes [#3818](https://github.com/plotly/dash/issues/3818).
- [3885](https://github.com/plotly/dash/pull/3885) Fix Flask-WTF `CSRFProtect` (and Quart-WTF) exemptions breaking after the backend refactor. The callback dispatch view is now exposed with the fully-qualified name `dash.dash.dispatch` again, so `csrf._exempt_views.add("dash.dash.dispatch")` works as it did in Dash 4.1.0. Fixes [#3827](https://github.com/plotly/dash/issues/3827).
- [#3882](https://github.com/plotly/dash/pull/3882) Fix `dcc.Graph` user interactions (pan, zoom, edited shapes & annotations, ...) being reverted by a subsequent `Patch` update, by syncing all relayout changes back to the `figure` prop instead of only shapes. Fixes [#3810](https://github.com/plotly/dash/issues/3810).
- [#3903](https://github.com/plotly/dash/pull/3903) Fix missing comm dependency, fix [#3657](https://github.com/plotly/dash/issues/3657).
- Updated radix-ui to fix [#3786](https://github.com/plotly/dash/issues/3786)

## [4.4.0] - 2026-07-03

### Added
- [#3826](https://github.com/plotly/dash/pull/3826) WebSocket callback dispatch no longer lets long-lived callbacks limit the number of concurrent users. Async callbacks (including session-persistent ones) run directly on the connection event loop instead of occupying a worker thread, and synchronous callbacks run on a shared `ThreadPoolExecutor` whose size is configurable via the new `websocket_max_workers` argument to `Dash` (default `4`). A synchronous persistent (no-output) callback now warns at registration since it would tie up a worker thread.
- [#3852](https://github.com/plotly/dash/pull/3852) Added support for Plotly hoveranywhere and clickanywhere events in `dcc.Graph` by adding `xvals` and `yvals` to `hoverData` and `clickData`.

## Fixed
- [#3861](https://github.com/plotly/dash/issues/3861) Fix synchronous WebSocket callbacks not inheriting `ContextVar` values bound by ASGI middleware. `copy_context()` is now captured on the event-loop thread before the callback is submitted to the thread pool, instead of inside the worker thread where only default values were visible.
Expand All @@ -23,7 +34,6 @@ This project adheres to [Semantic Versioning](https://semver.org/).

## Added
- [#3796](https://github.com/plotly/dash/pull/3796) MCP: Add `configure_mcp_server()` to toggle which content the MCP server exposes (`include_layout`, `include_callbacks`, `include_clientside_callbacks`, `include_pages`, `expose_callback_docstrings`). Only the parameters explicitly passed are updated; omitted parameters retain their current value.
- [#3852](https://github.com/plotly/dash/pull/3852) Added support for Plotly hoveranywhere and clickanywhere events in `dcc.Graph` by adding `xvals` and `yvals` to `hoverData` and `clickData`.

## Changed
- [#3796](https://github.com/plotly/dash/pull/3796) MCP: Remove the `mcp_expose_docstrings` `Dash()` constructor argument; callback docstring exposure is now controlled via `configure_mcp_server(expose_callback_docstrings=...)`.
Expand Down
Loading
Loading