twenty/v2.24.0

FiloSottile/mkcerttwenty/v2.24.0Jul 24, 2026by Weiko

AI Summary

Enhances the user interface with a rewritten drag-and-drop engine for boards and calendars, improves AI chat reliability on Azure-hosted models, and fixes dashboard aggregate value persistence.

Key Highlights

  • Drag-and-drop improvements: Boards, calendars, and widgets now drop accurately between tabs.
  • AI Chat reliability: Fixes for silent dropping on long threads and storage lookup errors on Azure.
  • Email handling: Bulk senders no longer automatically create contacts.

New Features

  • Drag widgets between tabs in record page layouts
  • GraphQL mutations and SDK helpers for private key-value data per workspace
  • Webhook server routes now acknowledge immediately with 202

Full Release Notes

<!-- generated-release-notes v1 -->

Drag and drop runs on a new foundation this release. Record boards and calendars use a rewritten dnd-kit implementation; cards and events drop where you aim them. When editing a record page layout, you can now drag widgets between tabs.

AI chat is more reliable on two fronts. Answers no longer get swallowed mid-stream on long threads or after switching away from the tab. On Azure-hosted models, responses no longer fail mid-answer with a storage lookup error.

Emails from mailing lists and bulk senders no longer create contacts automatically. Dashboard aggregate values now persist when you save widget layouts. A white flash when overscrolling in dark mode is fixed.

## 🌟 Highlights

- Widgets can now be dragged between tabs when editing a record page layout. ([#23023](https://github.com/twentyhq/twenty/pull/23023))
- Record boards and calendars drop cards and events where you aim them, on a rewritten drag-and-drop foundation. ([#23071](https://github.com/twentyhq/twenty/pull/23071))
- AI chat answers no longer get silently dropped on long threads or after switching tabs. ([#23198](https://github.com/twentyhq/twenty/pull/23198))
- Emails from mailing lists and bulk senders no longer automatically create contacts. ([#23137](https://github.com/twentyhq/twenty/pull/23137))
- Self-hosted upgrades from 2.21.x that were failing with a missing column error will now succeed. ([#23215](https://github.com/twentyhq/twenty/pull/23215))

## ✨ New features

- You can now drag widgets between tabs when editing a record page layout. ([#23023](https://github.com/twentyhq/twenty/pull/23023)) by @FelixMalfait

## 💅 Improvements & UX

- Record boards and calendars use a new drag-and-drop engine that places cards and events where you drop them. ([#23071](https://github.com/twentyhq/twenty/pull/23071)) by @git-init-priyanshu
- Record table selection checkboxes now carry accessible labels so screen readers can identify what each checkbox selects. ([#23147](https://github.com/twentyhq/twenty/pull/23147)) by @thomtrp
- Active navigation items use aria-current instead of aria-selected, fixing an accessibility attribute violation on links. ([#23160](https://github.com/twentyhq/twenty/pull/23160)) by @thomtrp

## 🐛 Bug fixes

- Dashboard aggregate values (count, sum, etc.) now persist correctly when saving widget layouts. ([#23008](https://github.com/twentyhq/twenty/pull/23008)) by @scarab-systems
- Onboarding no longer shows a blank page during plan selection or immediately after the welcome animation. ([#23069](https://github.com/twentyhq/twenty/pull/23069)) by @bosiraphael
- Permission-denied errors now surface as proper client error messages instead of unhandled server exceptions. ([#23104](https://github.com/twentyhq/twenty/pull/23104)) by @thomtrp
- Call recorder webhook deliveries now process asynchronously, so failed retries no longer cascade into API overload at meeting-end peaks. ([#23135](https://github.com/twentyhq/twenty/pull/23135)) by @martmull
- Emails from mailing lists, newsletters, and bulk senders no longer automatically create contacts. ([#23137](https://github.com/twentyhq/twenty/pull/23137)) by @neo773
- Saving view changes no longer sometimes fails with a duplicate-key error. ([#23150](https://github.com/twentyhq/twenty/pull/23150)) by @prastoin
- Scrolling past the top or bottom of a page in dark mode no longer flashes white. ([#23153](https://github.com/twentyhq/twenty/pull/23153)) by @etiennejouan
- Fixed a crash in the People Data Labs app caused by a React 19 compatibility issue. ([#23169](https://github.com/twentyhq/twenty/pull/23169)) by @prastoin
- The trust badge on the onboarding import-contacts step is now evenly padded on both sides. ([#23174](https://github.com/twentyhq/twenty/pull/23174)) by @bosiraphael
- AI chat on Azure-hosted models (e.g. GPT-5.5) no longer fails mid-answer with a storage lookup error. ([#23182](https://github.com/twentyhq/twenty/pull/23182)) by @etiennejouan
- AI chat answers no longer get silently discarded on long threads or when returning from another tab. ([#23198](https://github.com/twentyhq/twenty/pull/23198)) by @etiennejouan
- Newly activated workspaces no longer start with missing workflow mirror rows that break trigger dispatch. ([#23204](https://github.com/twentyhq/twenty/pull/23204)) by @thomtrp
- Users joining a workspace via an invite link no longer see the install-apps onboarding step. ([#23214](https://github.com/twentyhq/twenty/pull/23214)) by @bosiraphael
- Fixed a self-hosted upgrade failure where a migration command registered under the wrong version caused upgrades from 2.21.x to fail with a missing column error. ([#23215](https://github.com/twentyhq/twenty/pull/23215)) by @prastoin

## ⚡ Performance

- Metadata and view caches now invalidate on content hashes rather than a version counter, so stale data clears faster and more reliably. ([#23164](https://github.com/twentyhq/twenty/pull/23164)) by @Weiko

## 🔧 Developer & API

- Applications can now store and retrieve private key-value data scoped per workspace, via new GraphQL mutations and SDK helpers. ([#23089](https://github.com/twentyhq/twenty/pull/23089)) by @abdulrahmancodes
- Webhook server routes now acknowledge immediately with 202 and run the handler on the worker queue, preventing timeout-driven redelivery storms. ([#23134](https://github.com/twentyhq/twenty/pull/23134)) by @martmull
- Applications can set an environment variable to skip the provider check during development. ([#23155](https://github.com/twentyhq/twenty/pull/23155)) by @prastoin
- Connection providers can now run a logic function immediately after a successful OAuth connection is established. ([#23167](https://github.com/twentyhq/twenty/pull/23167)) by @abdulrahmancodes
- Workers can now be limited to specific queues via QUEUE_WORKER_INCLUDED_QUEUES and QUEUE_WORKER_EXCLUDED_QUEUES environment variables. ([#23181](https://github.com/twentyhq/twenty/pull/23181)) by @martmull
- Admins can now stop a misbehaving installed application at the workspace or server level without disabling all logic functions instance-wide. ([#23183](https://github.com/twentyhq/twenty/pull/23183)) by @martmull
- The workspace metadataVersion GraphQL field is deprecated; external API consumers should stop selecting it as it no longer drives cache invalidation. ([#23189](https://github.com/twentyhq/twenty/pull/23189)) by @Weiko

<details>
<summary>🏗️ Internal changes (15)</summary>

- feat(workflow): periodic core-consistency check for workflows, versions and triggers ([#23103](https://github.com/twentyhq/twenty/pull/23103)) by @thomtrp
- Add post-onboarding AI chat setup behind a feature flag ([#23120](https://github.com/twentyhq/twenty/pull/23120)) by @bosiraphael
- fix: bump websocket-driver 0.7.4 - 0.7.5 (Dependabot) ([#23142](https://github.com/twentyhq/twenty/pull/23142)) by @mabdullahabaid
- Show agent names on real estate dashboard charts ([#23146](https://github.com/twentyhq/twenty/pull/23146)) by @thomtrp
- fix: bump tar 7.5.16 - 7.5.20 (Dependabot) ([#23159](https://github.com/twentyhq/twenty/pull/23159)) by @mabdullahabaid
- fix(website): restore condensed marketplace list card ([#23161](https://github.com/twentyhq/twenty/pull/23161)) by @rashad
- Bump to alpha 2 all published apps ([#23165](https://github.com/twentyhq/twenty/pull/23165)) by @prastoin
- fix: bump vitest family 4.1.8 - 4.1.10 (Dependabot) ([#23166](https://github.com/twentyhq/twenty/pull/23166)) by @mabdullahabaid
- v1.3.2 — Modularize partners app into vertical-slice modules/ ([#23168](https://github.com/twentyhq/twenty/pull/23168)) by @rashad
- Upgrade to 1.0.9 PDL app ([#23172](https://github.com/twentyhq/twenty/pull/23172)) by @prastoin
- feat(ai-instrumentation): fix AI histogram buckets & add tool-call duration instrumentation ([#23173](https://github.com/twentyhq/twenty/pull/23173)) by @etiennejouan
- fix: bump js-yaml pins 4.2.0 - 4.3.0 (Dependabot) ([#23178](https://github.com/twentyhq/twenty/pull/23178)) by @mabdullahabaid
- Remove legacy FindAllViews response cache flush from migration runner ([#23190](https://github.com/twentyhq/twenty/pull/23190)) by @Weiko
- Switch application stop/start commands to Redis-backed global kill switch ([#23202](https://github.com/twentyhq/twenty/pull/23202)) by @Weiko
- Remove DATABASE_EVENT_JOBS_CHUNK_SIZE and Promise.all from logic function trigger jobs ([#23205](https://github.com/twentyhq/twenty/pull/23205)) by @martmull

</details>

## 🎉 New contributors

- @scarab-systems made their first contribution in https://github.com/twentyhq/twenty/pull/23008

<details>
<summary>Full changelog (52 PRs)</summary>

- Fix dashboard record table widget aggregate persistence ([#23008](https://github.com/twentyhq/twenty/pull/23008)) by @scarab-systems
- feat(page-layout): drag widgets across tabs on record pages ([#23023](https://github.com/twentyhq/twenty/pull/23023)) by @FelixMalfait
- Fix blank pages and add error recovery in onboarding ([#23069](https://github.com/twentyhq/twenty/pull/23069)) by @bosiraphael
- Record Board & Record Calendar Drag Drop `dnd-kit` rewrite. ([#23071](https://github.com/twentyhq/twenty/pull/23071)) by @git-init-priyanshu
- key-value storage for applications ([#23089](https://github.com/twentyhq/twenty/pull/23089)) by @abdulrahmancodes
- feat(workflow): periodic core-consistency check for workflows, versions and triggers ([#23103](https://github.com/twentyhq/twenty/pull/23103)) by @thomtrp
- Fix TWENTY-SERVER-60Y: register permissions exception filter globally ([#23104](https://github.com/twentyhq/twenty/pull/23104)) by @thomtrp
- Add post-onboarding AI chat setup behind a feature flag ([#23120](https://github.com/twentyhq/twenty/pull/23120)) by @bosiraphael
- feat(server): queued-only server-route dispatch ([#23134](https://github.com/twentyhq/twenty/pull/23134)) by @martmull
- fix(call-recorder): listen proper updated fileds event ([#23135](https://github.com/twentyhq/twenty/pull/23135)) by @martmull
- fix(messaging): stop group and bulk emails from creating contacts ([#23137](https://github.com/twentyhq/twenty/pull/23137)) by @neo773
- fix: bump websocket-driver 0.7.4 - 0.7.5 (Dependabot) ([#23142](https://github.com/twentyhq/twenty/pull/23142)) by @mabdullahabaid
- Show agent names on real estate dashboard charts ([#23146](https://github.com/twentyhq/twenty/pull/23146)) by @thomtrp
- fix: add aria-label to record table selection checkboxes ([#23147](https://github.com/twentyhq/twenty/pull/23147)) by @thomtrp
- Sync metadata store after view child entity mutations server response ([#23150](https://github.com/twentyhq/twenty/pull/23150)) by @prastoin
- chore: bump version to 2.24.0 ([#23152](https://github.com/twentyhq/twenty/pull/23152)) by @twenty-pr
- fix - fix light overscroll flash in dark mode ([#23153](https://github.com/twentyhq/twenty/pull/23153)) by @etiennejouan
- twenty-sdk env var to disable prov check ([#23155](https://github.com/twentyhq/twenty/pull/23155)) by @prastoin
- i18n - translations ([#23157](https://github.com/twentyhq/twenty/pull/23157)) by @github-actions
- fix: bump tar 7.5.16 - 7.5.20 (Dependabot) ([#23159](https://github.com/twentyhq/twenty/pull/23159)) by @mabdullahabaid
- fix: use aria-current instead of aria-selected on navigation drawer items ([#23160](https://github.com/twentyhq/twenty/pull/23160)) by @thomtrp
- fix(website): restore condensed marketplace list card ([#23161](https://github.com/twentyhq/twenty/pull/23161)) by @rashad
- i18n - docs translations ([#23162](https://github.com/twentyhq/twenty/pull/23162)) by @github-actions
- Rekey metadata caches when flat map hashes change ([#23164](https://github.com/twentyhq/twenty/pull/23164)) by @Weiko
- Bump to alpha 2 all published apps ([#23165](https://github.com/twentyhq/twenty/pull/23165)) by @prastoin
- fix: bump vitest family 4.1.8 - 4.1.10 (Dependabot) ([#23166](https://github.com/twentyhq/twenty/pull/23166)) by @mabdullahabaid
- feat(connections): run a logic function on connection provider connect ([#23167](https://github.com/twentyhq/twenty/pull/23167)) by @abdulrahmancodes
- v1.3.2 — Modularize partners app into vertical-slice modules/ ([#23168](https://github.com/twentyhq/twenty/pull/23168)) by @rashad
- PDL react 19 ([#23169](https://github.com/twentyhq/twenty/pull/23169)) by @prastoin
- i18n - translations ([#23170](https://github.com/twentyhq/twenty/pull/23170)) by @github-actions
- i18n - translations ([#23171](https://github.com/twentyhq/twenty/pull/23171)) by @github-actions
- Upgrade to 1.0.9 PDL app ([#23172](https://github.com/twentyhq/twenty/pull/23172)) by @prastoin
- feat(ai-instrumentation): fix AI histogram buckets & add tool-call duration instrumentation ([#23173](https://github.com/twentyhq/twenty/pull/23173)) by @etiennejouan
- Fix uneven padding in the onboarding trust badge ([#23174](https://github.com/twentyhq/twenty/pull/23174)) by @bosiraphael
- fix: bump js-yaml pins 4.2.0 - 4.3.0 (Dependabot) ([#23178](https://github.com/twentyhq/twenty/pull/23178)) by @mabdullahabaid
- i18n - docs translations ([#23179](https://github.com/twentyhq/twenty/pull/23179)) by @github-actions
- feat(server): per-worker queue filtering via env vars ([#23181](https://github.com/twentyhq/twenty/pull/23181)) by @martmull
- fix(ai-chat): disable Responses API storage for Azure models to stop "Item with id ... not found" stream failures ([#23182](https://github.com/twentyhq/twenty/pull/23182)) by @etiennejouan
- Add workspace and server level stop commands for applications ([#23183](https://github.com/twentyhq/twenty/pull/23183)) by @martmull
- i18n - translations ([#23184](https://github.com/twentyhq/twenty/pull/23184)) by @github-actions
- i18n - docs translations ([#23186](https://github.com/twentyhq/twenty/pull/23186)) by @github-actions
- i18n - translations ([#23187](https://github.com/twentyhq/twenty/pull/23187)) by @github-actions
- Deprecate workspace metadataVersion and stop consuming it in the frontend ([#23189](https://github.com/twentyhq/twenty/pull/23189)) by @Weiko
- Remove legacy FindAllViews response cache flush from migration runner ([#23190](https://github.com/twentyhq/twenty/pull/23190)) by @Weiko
- i18n - translations ([#23191](https://github.com/twentyhq/twenty/pull/23191)) by @github-actions
- fix(ai-chat): write the stream heartbeat before the DB claim ([#23198](https://github.com/twentyhq/twenty/pull/23198)) by @etiennejouan
- i18n - translations ([#23200](https://github.com/twentyhq/twenty/pull/23200)) by @github-actions
- Switch application stop/start commands to Redis-backed global kill switch ([#23202](https://github.com/twentyhq/twenty/pull/23202)) by @Weiko
- fix(workflow): create core mirror rows during workflow prefill ([#23204](https://github.com/twentyhq/twenty/pull/23204)) by @thomtrp
- Remove DATABASE_EVENT_JOBS_CHUNK_SIZE and Promise.all from logic function trigger jobs ([#23205](https://github.com/twentyhq/twenty/pull/23205)) by @martmull
- Skip install apps onboarding step for invitees ([#23214](https://github.com/twentyhq/twenty/pull/23214)) by @bosiraphael
- fix(server): repair missing applicationRegistration.logoFileId on upgraded instances ([#23215](https://github.com/twentyhq/twenty/pull/23215)) by @prastoin

</details>

**Full Changelog**: https://github.com/twentyhq/twenty/compare/twenty/v2.23.0...twenty/v2.24.0