🎉 Major new capabilities, critical stability fixes
🧩 And the long-awaited MySQL support finally arrives!
🚀 New Features
Infrastructure & DevOps
MySQL adaptation (PostgreSQL / MySQL / OceanBase now fully supported)
Thanks @longbingljw from the OceanBase team!
PR: #28188
- Adds
DB_TYPEconfiguration option - Supports MySQL JSON / LONGTEXT / UUID / index differences
- Updates Alembic migrations for multi-DB compatibility
- Introduces cross-DB SQL helpers for statistics and date handling
- Rewrites dataset metadata filters with SQLAlchemy JSON operators
- Adds CI workflows for MySQL migration testing
This is a significant backend upgrade in Dify’s history — multi-database support is now first-class.
Performance & Workflow Editor Optimization
- Implemented a major performance upgrade for the Workflow Editor, eliminating costly per-node validation scans, reducing unnecessary re-renders, and improving responsiveness from becoming laggy at ~50 nodes to remaining smooth even near ~200 nodes — #28591, by @iamjoel.
Pipelines & Workflow Engine
- Introduced a broad set of workflow-editor improvements, including UI refinement, stability fixes, and quality-of-life enhancements across variable inspection, media components, and node interactions — #27981, by @Xiu-Lan, @crazywoola, @johnny0120, @Woo0ood.
🛠 Fixes & Improvements
Runtime Stability & Workflow Execution
- Fixed an issue where advanced-chat workflows could fail to stop, preventing stuck or lingering processes — #27803, by @Kevin9703.
- Fixed a 500 error triggered when running “any node” in draft mode, improving workflow debugging reliability — #28636, by @hjlarry.
- Corrected token overcounting during loop/iteration evaluation (not related to billing tokens) — #28406, by @anobaka.
- Fixed workflow-as-tool returning an empty files field, ensuring tool integrations receive correct file metadata — #27925, by @CrabSAMA.
- Resolved a session-scope error in FileService that could cause inconsistent file deletion behavior — #27911, by @ethanlee928.
Knowledge Base
- Fixed a 500 error when using the weightedScore retrieval option, restoring stability for weighted ranking scenarios — #28586, by @Eric-Guo.
Developer Experience & SDKs
- Fixed Node.js SDK route and multipart upload handling, ensuring robust file and data submission through JavaScript integrations — #28573, by @lyzno1.
- Fixed OpenAPI/Swagger failing to load, restoring developer documentation access — #28509, by @changkeke, with contributions from @asukaminato0721.
Web UI & UX
- Corrected dark-mode rendering for the ExternalDataToolModal, ensuring consistent appearance across themes — #28630, by @Nov1c444.
- Fixed Marketplace search-trigger behavior and scroll position, improving discovery and navigation — #28645, by @lyzno1.
- Fixed incorrect navigation when opening chatflow log details, providing more predictable UI behavior — #28626, by @hjlarry.
- Fixed layout and rendering issues in the README display panel, ensuring cleaner content presentation — #28658, by @yangzheli.
- Reduced unnecessary re-renders in the useNodes hook, improving overall front-end performance — #28682, by @iamjoel.
Plugins & Integrations
- Updated plugin verification logic to use a unique identifier, improving correctness across plugin installations and updates — #28608, by @Mairuis.
System Robustness
- Prevented nullable tags in TriggerProviderIdentity, avoiding potential runtime errors — #28646, by @Yeuoly.
- Improved error messaging for invalid webhook requests, providing clearer diagnostics — #28671, by @hjlarry.
Feedback & Logging
- Fixed like/dislike feedback not appearing in logs, ensuring end-user rating signals are correctly visualized — #28652, by @fatelei.
Internationalization (i18n)
- Standardized terminology for trigger and billing events, improving translation consistency — #28543, by @NeatGuyCoding.
- Fixed multiple issues in execution-related translations, correcting missing or malformed entries — #28610, by @NeatGuyCoding.
- Removed incorrect “running” translation entries — #28571, by @NeatGuyCoding.
- Refactored i18n scripts and removed obsolete translation keys — #28618, by @lyzno1.
- Added missing translations across the UI, improving language coverage — #28631, by @lyzno1.
Maintenance & Developer Tooling
- Added front-end automated testing rules to strengthen baseline reliability — #28679, by @CodingOnStar and contributors.
- Upgraded system libraries and Python dependencies to maintain security and compatibility — #28624, by @laipz8200 and @GareArc.
- Updated start-web development script to use
pnpm dev, simplifying contributor workflows — #28684, by @laipz8200.
Upgrade Guide
Docker Compose Deployments
Important
Required Action Before Upgrading
Starting from 1.10.1, the Dify API image now runs as a non-root user (UID 1001) for improved security.
If you are using local filesystem storage (the default in community deployments), you must update the ownership of your mounted storage directories on the host machine, or the containers will fail to read/write files.
Affected services:
apiworker
Affected host directory:
./volumes/app/storage→ mounted to/app/api/storage
What you must do before restarting the new version:
# Stop existing containers
docker compose down
# Update directory ownership on the host
sudo chown -R 1001:1001 ./volumes/app/storage
# Restart normally
docker compose up -dAfter this one-time migration, Dify will operate normally with the new non-root user model.
-
Back up your customized docker-compose YAML file (optional)
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
-
Get the latest code from the main branch
git checkout main git pull origin main
-
Stop the service. Please execute in the docker directory
docker compose down
-
Back up data
tar -cvf volumes-$(date +%s).tgz volumes -
Upgrade services
docker compose up -d
Source Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release branch:
git checkout 1.10.1
-
Update Python dependencies:
cd api uv sync -
Then, let's run the migration script:
uv run flask db upgrade
-
Finally, run the API server, Worker, and Web frontend Server again.
What's Changed
- Upgrade weave version to fix weave configuration failure by @xprilion in #28197
- fix: knowledge pipeline can not published by @hjlarry in #28203
- feat: add icon gallery stories by @lyzno1 in #28214
- fix: card view render by @lyzno1 in #28189
- add icon for forum by @crazywoola in #28164
- fix: click log panel of log page cause whole page crash by @hjlarry in #28218
- Perf/mutual node UI by @zhsama in #28282
- fix: update currentTriggerPlugin check in BasePanel component by @Yessenia-d in #28287
- chore: remove unused style.module.css from app-icon component by @lyzno1 in #28302
- fix: published webhook can't receive inputs by @hjlarry in #28205
- add cnt script and one more example by @asukaminato0721 in #28272
- add vdb-test workflow run filter by @JohnJyong in #28336
- doc: add doc for env config when site and backend are in different domains by @iamjoel in #28318
- fix: dataset metadata counts when documents are deleted by @kenwoodjw in #28305
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28284
- refactor: consume events after pause/abort and improve API clarity by @laipz8200 in #28328
- fix(docker): start-up TiFlash by @Lloyd-Pottiger in #28376
- Revert "add vdb-test workflow run filter" by @JohnJyong in #28382
- fix: address user input preparation in workflow app generator by @Mairuis in #28410
- feat:mysql adaptation for metadb by @longbingljw in #28188
- feat: trigger billing by @Mairuis in #28335
- refactor: refactor python sdk by @fatelei in #28118
- style(web): fix vertical alignment of search button on apps page by @coding-ice in #28398
- fix(frontend): add missing vertical type to divider in provider config modal by @minimAluminiumalism in #28387
- make expand/collapse in question classifier node by @jubinsoni in #26772
- feat: implement RFC-compliant OAuth discovery with dynamic scope selection for MCP providers by @Nov1c444 in #28294
- fix: improve email code sign-in experience by @lyzno1 in #28307
- fix: change TenantApi endpoint from GET to POST by @laipz8200 in #27858
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28425
- feat(workflow): optimize workflow canvas pan and scroll behavior by @yangzheli in #28250
- feat: add display status filtering to document list and API by @ZeroZ-lab in #28342
- fix(web): fix checkbox unselectable bug & optimize document-list/app-annotation styles by @yangzheli in #28244
- chore: remove redundant reimports by @IthacaDream in #28415
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28429
- fix: add make test for short cut backend unittest by @yihong0618 in #28380
- refactor(web): remove redundant dataset card-item components and related code by @yangzheli in #28199
- Fix duration displayed for workflow steps on Weave dashboard by @xprilion in #28289
- fix(workflow): validate node compatibility when importing dsl between chatflows and workflows by @yangzheli in #28012
- fix: resolve CSRF token cookie name mismatch in browser (#28228) by @importcjj in #28378
- fix: update table alias in document service display status test asser… by @ZeroZ-lab in #28436
- fix: lazy init audioplayer to fix no tts message also switch audio source bug by @CrabSAMA in #28433
- Add Comprehensive Unit Tests for Console Auth Controllers by @codomposer in #28349
- fix(web): remove StatusPanel's internal useStore to fix context issues by @yangzheli in #28348
- fix: remove deprecated UnsafeUnwrappedHeaders usage by @17hz in #28219
- fix: add .ts and .mjs to EditorConfig indent rules by @17hz in #28397
- fix: add app_id to Redis cache keys for trigger nodes to ensure uniqueness by @17hz in #28243
- chore: update celery command for debugging trigger by @RockChinQ in #28443
- Feat integrate partner stack by @hj24 in #28353
- fix: add missing particle in Japanese trigger events translation by @lyzno1 in #28452
- refactor: remove TimeSliceLayer before the release of HITL by @Yeuoly in #28441
- fix: correct monitor and fix trigger billing rate limit by @Mairuis in #28465
- fix: treat -1 as unlimited for API rate limit and trigger events by @lyzno1 in #28460
- fix: correct trigger events limit modal wording by @lyzno1 in #28463
- fix: adjust overflow styles in EditMetadataBatchModal for better layout by @ZeroZ-lab in #28445
- feat: support redis 7.0 shared pub and sub by @fatelei in #28333
- fix: allow API to access conversations created before upgrade to 1.10.0 by @zhangzhefang-github in #28462
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28478
- add two test examples by @asukaminato0721 in #28236
- fix(api): add session_id validation for webapp JWT authentication by @yangzheli in #28297
- disable sticky scroll by @jubinsoni in #28248
- Feat/add test script for account models by @codomposer in #28479
- fix: fix numeric type conversion issue in if-else condition comparison by @qiqizjl in #28155
- feat: Implement partial update for document metadata, allowing merging of new values with existing ones. by @ZeroZ-lab in #28390
- more typed orm by @asukaminato0721 in #28331
- use deco by @asukaminato0721 in #28153
- Clean up legacy conditions data in if-else nodes to prevent misjudgments by @qiqizjl in #28148
- more typed orm by @asukaminato0721 in #28494
- fix(api):
SegmentType.is_valid()raisesAssertionErrorforSegmentType.GROUPby @fatelei in #28249 - fix: Code editor throws dozen of errors by @hjlarry in #28500
- Fix/24655 by @dickens88 in #26527
- Support node reference multiple structured_output variables in single-step run by @goofy-z in #26661
- feat: complete test script for dataset models by @codomposer in #28512
- more typed orm by @asukaminato0721 in #28507
- feat: add a stop run button to the published app UI by @55Kamiryo in #27509
- feat: add comprehensive unit tests for dataset service creation methods by @SmartDever02 in #28522
- feat: MLflow tracing by @B-Step62 in #26093
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28518
- chore: translate i18n files and update type definitions by @github-actions[bot] in #28528
- api -> console_ns by @asukaminato0721 in #28246
- fix: use default values for optional workflow input variables (#28546) by @importcjj in #28527
- feat: add comprehensive unit tests for dataset service retrieval/list… by @SmartDever02 in #28539
- chore(deps): bump clickhouse-connect from 0.7.19 to 0.10.0 in /api by @dependabot[bot] in #28559
- chore: fix de-DE translations by @lyzno1 in #28552
- fix: add
COMPOSE_PROFILESparam to middleware.env.example file by @ACAne0320 in #28541 - feat: complete app models test script by @codomposer in #28549
- more typed orm by @asukaminato0721 in #28519
- chore: not using db.session.get by @fatelei in #28555
- fix: plugin auto update display issues by @hjlarry in #28564
- feat(seo): add meaningful
<h1>headings across all public pages by @coding-ice in #28569 - fix: i18n: stop running translation by @NeatGuyCoding in #28571
- pref: workflow by @iamjoel in #28591
- fix: Failed to load API definition by @changkeke in #28509
- Fix Node.js SDK routes and multipart handling by @lyzno1 in #28573
- fix: i18n: standardize trigger events terminology in billing translations by @NeatGuyCoding in #28543
- more typed orm by @asukaminato0721 in #28577
- fix: update plugin verification logic to use unique identifier instea… by @Mairuis in #28608
- Feat/test workflow models by @codomposer in #28604
- fix: i18n: executions translation by @NeatGuyCoding in #28610
- Fix(workflow): Prevent token overcount caused by loop/iteration by @anobaka in #28406
- chore: refactor i18n scripts and remove extra keys by @lyzno1 in #28618
- chore: add missing translations by @lyzno1 in #28631
- fix: chatflow log details always navigate to page first by @hjlarry in #28626
- fix(style): update ExternalDataToolModal to support dark mode using semantic tokens by @Nov1c444 in #28630
- Fix start tab marketplace trigger search and plugin list scroll by @lyzno1 in #28645
- fix: draft run any nodes raise 500 by @hjlarry in #28636
- fix(TriggerProviderIdentity): avoid nullable tags by @Yeuoly in #28646
- Feat/web workflow improvements by @Xiu-Lan in #27981
- use no-root user in docker image by default by @41tair in #26419
- fix [Chore/Refactor] Generate complete API documentation using Flask-RESTX #24421 by @asukaminato0721 in #28649
- Feat/add weaviate tokenization configurable by @lcedaw in #28159
- fix: ensure advanced-chat workflows stop correctly by @Kevin9703 in #27803
- fix(web): resolve readme-panel display and styling issues by @yangzheli in #28658
- feat(web): update marketplace description & icon by @yangzheli in #28662
- test: add comprehensive unit tests for SegmentService - Fix: #28656 by @SmartDever02 in #28568
- Feat/add test script for tool models by @codomposer in #28653
- fix: fix feedback like or dislike not display in logs by @fatelei in #28652
- chore: enhance the hint when the user triggers an invalid webhook request by @hjlarry in #28671
- fix: fixed workflow as tool files field return empty problem by @CrabSAMA in #27925
- frontend auto testing rules by @CodingOnStar in #28679
- chore: upgrade system libraries and Python dependencies by @laipz8200 in #28624
- Fixes session scope bug in FileService.delete_file by @ethanlee928 in #27911
- Use pnpm dev in dev/start-web by @laipz8200 in #28684
- Fix 500 error in knowledge base, select weightedScore and click retrieve. by @Eric-Guo in #28586
- pref: reduce the times of useNodes reRender by @iamjoel in #28682
New Contributors
- @Lloyd-Pottiger made their first contribution in #28376
- @coding-ice made their first contribution in #28398
- @importcjj made their first contribution in #28378
- @zhangzhefang-github made their first contribution in #28462
- @55Kamiryo made their first contribution in #27509
- @B-Step62 made their first contribution in #26093
- @changkeke made their first contribution in #28509
- @anobaka made their first contribution in #28406
- @Xiu-Lan made their first contribution in #27981
- @ethanlee928 made their first contribution in #27911
Full Changelog: 1.10.0...1.10.1