This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
+8 more
Affected surfaces
ReleasePort's take
Moderate signalv2.4.0 fixes FTP command injection via CRLF in basic-ftp and secures sendEmail endpoints. Billing migrates from Stripe metering (breaking change).
Why it matters: Patch v2.4.0 immediately to fix FTP command injection in basic-ftp. Update now if using FTP connections; review Stripe billing migration requirements.
Summary
AI summaryBasic‑FTP FTP command injection vulnerability fixed.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
fix: basic-ftp has FTP Command injection via CRLF fix: basic-ftp has FTP Command injection via CRLF Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Security | Medium |
Protect sendEmail endpoint and thread user context through logic function executor Protect sendEmail endpoint and thread user context through logic function executor Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Breaking | Medium |
Billing - Migrate from Stripe metering Billing - Migrate from Stripe metering Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Breaking | Medium |
External contributor auto-draft and dispatch pr-review event type External contributor auto-draft and dispatch pr-review event type Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Add defineApplicationRole method Add defineApplicationRole method Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
feat(sdk): warn when local server image is behind latest feat(sdk): warn when local server image is behind latest Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
feat: add email forwarding message channel feat: add email forwarding message channel Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
feat(public-domain): bind public domains to apps + reorganize settings feat(public-domain): bind public domains to apps + reorganize settings Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Add description to oAuth_only app created Add description to oAuth_only app created Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Detail steps during create twenty app Detail steps during create twenty app Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Dependency | Medium |
chore(front): move mocked-metadata helpers under src/testing chore(front): move mocked-metadata helpers under src/testing Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
Simplify dispatch pr review Simplify dispatch pr review Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Deprecation | Medium |
Billing - remove default feature flag Billing - remove default feature flag Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
fix: workspace member "me" filters now work in dashboard widgets fix: workspace member "me" filters now work in dashboard widgets Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
fix: Use settings table rows and detail page for app connections fix: Use settings table rows and detail page for app connections Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
fix: validate enum values before opening transaction in alterEnumValues fix: validate enum values before opening transaction in alterEnumValues Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
fix(messaging): reset sync state when IMAP/SMTP/CalDAV credentials are updated fix(messaging): reset sync state when IMAP/SMTP/CalDAV credentials are updated Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Fix plan-required modal issue Fix plan-required modal issue Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Bugfix | Medium |
Fix docs apps navigation Fix docs apps navigation Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Medium |
refactor: scope ApplicationRegistrationService findOneById to tenant rows refactor: scope ApplicationRegistrationService findOneById to tenant rows Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Other | Medium |
Improved create-twenty-app documentation for AI coding agents Improved create-twenty-app documentation for AI coding agents Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Other | Medium |
i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20347 i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20347 Source: llm_adapter@2026-05-21 Confidence: low |
— |
Full changelog
What's Changed
- chore(front): move mocked-metadata helpers under src/testing by @charlesBochet in https://github.com/twentyhq/twenty/pull/20341
- Add description to oAuth_only app created by @martmull in https://github.com/twentyhq/twenty/pull/20336
- Fix plan-required modal issue by @etiennejouan in https://github.com/twentyhq/twenty/pull/20346
- i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20347
- chore: bump version to 2.4.0 by @twenty-pr[bot] in https://github.com/twentyhq/twenty/pull/20345
- Oxlint ignore twenty-version constant by @prastoin in https://github.com/twentyhq/twenty/pull/20350
- Improved create-twenty-app documentation for AI coding agents by @Bredo in https://github.com/twentyhq/twenty/pull/20325
- fix: workspace member "me" filters now work in dashboard widgets by @QuantumByteMaster in https://github.com/twentyhq/twenty/pull/20266
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20353
- External contributor auto-draft and dispatch pr-review event type by @prastoin in https://github.com/twentyhq/twenty/pull/20329
- Fix auto draft workflow by @prastoin in https://github.com/twentyhq/twenty/pull/20357
- Billing - Migrate from Stripe metering by @etiennejouan in https://github.com/twentyhq/twenty/pull/20298
- Fix docs apps navigation by @dev111-actor in https://github.com/twentyhq/twenty/pull/20359
- i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20362
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20366
- Billing - remove default feature flag by @etiennejouan in https://github.com/twentyhq/twenty/pull/20365
- fix: Use settings table rows and detail page for app connections by @bitloi in https://github.com/twentyhq/twenty/pull/20257
- i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20372
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20373
- Add defineApplicationRole method by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/20314
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20375
- Detail steps during create twenty app by @martmull in https://github.com/twentyhq/twenty/pull/20374
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20378
- [Website] Reintroduce the product page. by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20349
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20385
- chore: sync AI model catalog from models.dev by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20392
- i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20384
- fix: handle widgets with missing universalConfiguration in 2.3 delete-gauge-widgets command by @charlesBochet in https://github.com/twentyhq/twenty/pull/20393
- fix: validate enum values before opening transaction in alterEnumValues by @Weiko in https://github.com/twentyhq/twenty/pull/20376
- fix: basic-ftp has FTP Command injection via CRLF by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20396
- Protect sendEmail endpoint and thread user context through logic function executor by @martmull in https://github.com/twentyhq/twenty/pull/20369
- Simplify dispatch pr review by @prastoin in https://github.com/twentyhq/twenty/pull/20397
- feat(sdk): warn when local server image is behind latest by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20352
- Isolate twenty apps from nx project by @martmull in https://github.com/twentyhq/twenty/pull/20406
- refactor: scope ApplicationRegistrationService findOneById to tenant rows by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20408
- feat: add email forwarding message channel by @FelixMalfait in https://github.com/twentyhq/twenty/pull/19535
- i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20411
- Prevent non-admin users from impersonating admin users by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20412
- [Website] Codebase cleanup and SEO improvements. by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20415
- fix: scroll AI chat to bottom on side panel reopen by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20413
- Reserve inbound subdomain for SES by @neo773 in https://github.com/twentyhq/twenty/pull/20414
- i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20418
- fix(messaging): reset sync state when IMAP/SMTP/CalDAV credentials are updated by @fucx in https://github.com/twentyhq/twenty/pull/20405
- feat(public-domain): bind public domains to apps + reorganize settings by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20360
- i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20428
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20429
- i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20431
- [Website] Extract HomeVisual into shared AppPreview section. by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20432
- i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20434
New Contributors
- @Bredo made their first contribution in https://github.com/twentyhq/twenty/pull/20325
- @dev111-actor made their first contribution in https://github.com/twentyhq/twenty/pull/20359
- @fucx made their first contribution in https://github.com/twentyhq/twenty/pull/20405
Full Changelog: https://github.com/twentyhq/twenty/compare/v2.3.0...v2.4.0
Security Fixes
- Fix: basic-ftp has FTP Command injection via CRLF
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Earlier breaking changes
- v2.8.0 Introduces a new permission flags system defined by apps
- v2.8.0 Permission flags system replaces previous permission model
- v2.7.0 Unify connected account permissions.
- v2.7.0 Encrypt `ConnectedAccount` connectionParameters field.
- v2.6.0 Rename permissionFlag to rolePermissionFlag and add catalog/backfill
Beta — feedback welcome: [email protected]