v2.5.0

twentyhq/twentyv2.5.0May 19, 2026by Weiko

AI Summary

This major release introduces significant security improvements including asymmetric JWT signing with key rotation, encryption for connected account tokens, and a new ENCRYPTION_KEY environment variable. It also adds one-hop relation filters in GraphQL API and inline sort sub-field selection for views.

Key Highlights

  • Asymmetric JWT signing with kid header and key rotation table
  • Encryption of connected account accessToken and refreshToken
  • One-hop relation filters in GraphQL API
  • View sort sub-field inline selection on chips
  • SAML relayState structure refactor

Breaking Changes

  • View sort sub-field inline selection requires deploying server before front

New Features

  • Asymmetric JWT signing with key rotation
  • Connected account token encryption
  • ENCRYPTION_KEY env var with versioned envelope
  • One-hop relation filters in GraphQL
  • Inline sort sub-field picker in workflow UI
  • Logic function label display instead of technical name
  • Discord integration for workflows
  • Email sync toggle for internal emails

Full Release Notes

## What's Changed
* Stop rejecting application token on calendar and message events requests by @martmull in https://github.com/twentyhq/twenty/pull/20440
* fix: update broken AI documentation link by @ajitkumarsaini02 in https://github.com/twentyhq/twenty/pull/20401
* Upgrade sdk version by @martmull in https://github.com/twentyhq/twenty/pull/20444
* chore: bump version to 2.5.0 by @twenty-pr[bot] in https://github.com/twentyhq/twenty/pull/20446
* chore(members): rename "Access" tab to "Invite" + fix e2e by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20447
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20449
* Refactor SAML relayState structure by @prastoin in https://github.com/twentyhq/twenty/pull/20430
* Use workflow inputSchema to render boolean, number, and enum fields in code/logic function steps by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/20439
* Ignore twenty versions constant files in prettier by @prastoin in https://github.com/twentyhq/twenty/pull/20448
* [codex] Add Twenty Claude skills package by @Bonapara in https://github.com/twentyhq/twenty/pull/20450
* Encrypt connected account `accessToken` and `refreshToken` by @prastoin in https://github.com/twentyhq/twenty/pull/20441
* Stop rejecting application install when APP_VERSION is wrong by @martmull in https://github.com/twentyhq/twenty/pull/20443
* i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20451
* fix: prevent admin panel workspace upgrade error from overflowing the table by @charlesBochet in https://github.com/twentyhq/twenty/pull/20394
* [Website] Replace feature card screenshots with interactive visuals by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20442
* refactor(file v2) - deletion by @etiennejouan in https://github.com/twentyhq/twenty/pull/20356
* i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20454
* fix(front-component): preserve caret position on controlled input/textarea updates by @QuantumByteMaster in https://github.com/twentyhq/twenty/pull/20416
* Fix(UI): Side panel having two scrollbars by @git-init-priyanshu in https://github.com/twentyhq/twenty/pull/20456
* ci(preview-env): replace bore.pub with Cloudflare quick tunnel by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20459
* feat(messaging): add workspace toggle to sync internal emails by @neo773 in https://github.com/twentyhq/twenty/pull/20457
* feat(front-component-renderer): forward file input metadata by @charlesBochet in https://github.com/twentyhq/twenty/pull/20458
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20461
* ci(preview-env): use --light seed so Apple is the default workspace by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20464
* Fix lint:diff-with-main oxlint rules build dependency by @bitloi in https://github.com/twentyhq/twenty/pull/20389
* Show logic function label instead of technical name in workflow UI by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/20470
* Support optional labels on logic-function input schema fields by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/20471
* fix(ci): probe real schema in breaking-changes server readiness check by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20465
* ci(preview-env): drop yarn `--` separator so `--light` reaches the seed command by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20479
* chore: remove dead feature flags by @charlesBochet in https://github.com/twentyhq/twenty/pull/20460
* Billing - Add default ff by @etiennejouan in https://github.com/twentyhq/twenty/pull/20480
* security: harden CI against supply-chain attacks by @neo773 in https://github.com/twentyhq/twenty/pull/20476
* fix(kanban): give title full width when card is not hovered by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20455
* chore: add an icon to why-twenty page and update preview by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20482
* i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20495
* Upgrade cli tools by @martmull in https://github.com/twentyhq/twenty/pull/20496
* feat(server): asymmetric JWT signing with kid + key rotation table by @charlesBochet in https://github.com/twentyhq/twenty/pull/20467
* Improve linear app by @martmull in https://github.com/twentyhq/twenty/pull/20453
* fix: map FlatEntityMaps and WorkspaceMigrationRunner exceptions to proper status codes on REST and GraphQL by @Weiko in https://github.com/twentyhq/twenty/pull/20494
* Fix application variable issue by @martmull in https://github.com/twentyhq/twenty/pull/20500
* chore: sync AI model catalog from models.dev by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20523
* `[twenty-server]` no floating promises lint rule by @prastoin in https://github.com/twentyhq/twenty/pull/20499
* feat(server): migrate all remaining JWT token types to ES256 by @charlesBochet in https://github.com/twentyhq/twenty/pull/20513
* Fix phone unique constraints by @MkDev11 in https://github.com/twentyhq/twenty/pull/20261
* Dedicated REST controllers for object & field metadata by @Weiko in https://github.com/twentyhq/twenty/pull/20364
* `[twenty-server]` no-misused-promise lint by @prastoin in https://github.com/twentyhq/twenty/pull/20529
* fix(ai-agent-node) - agent node execution error by @etiennejouan in https://github.com/twentyhq/twenty/pull/20534
* fix(server): add Apple seed workspace as fallback for single-workspace mode by @Rpaudel379 in https://github.com/twentyhq/twenty/pull/20498
* fix(navigation): settings drawer should never appear collapsed by @GusFromSpace in https://github.com/twentyhq/twenty/pull/20505
* feat(ai-chat) - Stop ai thinking if credits exhausted by @etiennejouan in https://github.com/twentyhq/twenty/pull/20526
* fix(server): handle ImapFlow socket errors instead of crashing the process by @davidfarah2003 in https://github.com/twentyhq/twenty/pull/20510
* feat(twenty-server): introduce ENCRYPTION_KEY env var with versioned envelope by @charlesBochet in https://github.com/twentyhq/twenty/pull/20528
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20547
* Inject none secret env variables into front components by @martmull in https://github.com/twentyhq/twenty/pull/20511
* fix - nav drawer expansion by @etiennejouan in https://github.com/twentyhq/twenty/pull/20545
* chore(billing) - remove feature flag by @etiennejouan in https://github.com/twentyhq/twenty/pull/20531
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20548
* i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20549
* Simplify create-twenty-app command by @martmull in https://github.com/twentyhq/twenty/pull/20512
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20551
* i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20553
* [breaking: deploy server before front] feat(view-sort): pick sort sub-field inline on the chip by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20445
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20554
* feat(upgrade): emit structured logfmt logs for upgrade flow by @charlesBochet in https://github.com/twentyhq/twenty/pull/20539
* fix(auth): preserve returnToPath across Google/Microsoft SSO redirects by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20537
* Add default value to apiKey for authentication method by @martmull in https://github.com/twentyhq/twenty/pull/20552
* feat(upgrade): expose twenty_upgrade_workspaces_up_to_date_total by @charlesBochet in https://github.com/twentyhq/twenty/pull/20555
* chore(page-layout): remove IS_RECORD_PAGE_LAYOUT_* feature flags by @charlesBochet in https://github.com/twentyhq/twenty/pull/20556
* feat(twenty-server): migrate remaining at-rest encryption sites to versioned envelope by @charlesBochet in https://github.com/twentyhq/twenty/pull/20550
* chore(deps): bump react-dropzone from 14.2.3 to 14.4.1 by @dependabot[bot] in https://github.com/twentyhq/twenty/pull/20560
* chore(auth): drop unused workspacePersonalInviteToken from SSO state by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20557
* chore(deps-dev): bump @mui/material from 7.3.8 to 7.3.11 by @dependabot[bot] in https://github.com/twentyhq/twenty/pull/20562
* chore(deps-dev): bump vite-plugin-svgr from 4.3.0 to 4.5.0 by @dependabot[bot] in https://github.com/twentyhq/twenty/pull/20561
* Update OAuth consent modal design by @Bonapara in https://github.com/twentyhq/twenty/pull/20540
* Regrant id token write to claude for oidc swap by @prastoin in https://github.com/twentyhq/twenty/pull/20564
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20567
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20569
* [Website] Replace product page hero visual with interactive CRM depicting AI chat in action. by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20566
* chore(server): drop unused postgresCredentials feature by @charlesBochet in https://github.com/twentyhq/twenty/pull/20573
* Fix time consuming search ilike fallback by @Weiko in https://github.com/twentyhq/twenty/pull/20544
* [Website] Refine feature card scroll entrance to a subtle opacity fade by @mabdullahabaid in https://github.com/twentyhq/twenty/pull/20574
* fix(auth): exclude /authorize from MinimalMetadataGater loading gate by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20572
* fix(server): decouple SDK client generation from workspace activation by @neo773 in https://github.com/twentyhq/twenty/pull/20514
* chore(.vscode): add remaining packages to VSCode workspace by @Rpaudel379 in https://github.com/twentyhq/twenty/pull/20570
* Twenty discord integration by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/20530
* feat(server): migrate TOTP secret encryption to SecretEncryptionService by @charlesBochet in https://github.com/twentyhq/twenty/pull/20577
* feat(twenty-server): one-hop relation filters in GraphQL API by @FelixMalfait in https://github.com/twentyhq/twenty/pull/20527
* i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/20582
* fix(server): scope workspace findOne in 1-21 backfill-datasource command by @charlesBochet in https://github.com/twentyhq/twenty/pull/20581
* fix(server): scope workspace findOne in ApplicationService by @charlesBochet in https://github.com/twentyhq/twenty/pull/20583
* fix(server): add subFieldName column early in upgrade sequence by @charlesBochet in https://github.com/twentyhq/twenty/pull/20584

## New Contributors
* @ajitkumarsaini02 made their first contribution in https://github.com/twentyhq/twenty/pull/20401
* @MkDev11 made their first contribution in https://github.com/twentyhq/twenty/pull/20261
* @GusFromSpace made their first contribution in https://github.com/twentyhq/twenty/pull/20505
* @davidfarah2003 made their first contribution in https://github.com/twentyhq/twenty/pull/20510

**Full Changelog**: https://github.com/twentyhq/twenty/compare/v2.4.0...v2.5.0