twenty/v2.24.0
yangshun/tech-interview-handbooktwenty/v2.24.0Jul 24, 2026by Weiko
AI Summary
Rewrote drag-and-drop foundation for record boards/calendars and widgets. Improved AI chat reliability and fixed email contact creation issues for mailing lists.
Key Highlights
- Widgets can be dragged between tabs when editing record page layout
- Record boards and calendars use a rewritten dnd-kit implementation
- AI chat answers no longer get swallowed mid-stream on long threads
- Emails from mailing lists and bulk senders no longer create contacts
- Self-hosted upgrades from 2.21.x failing with missing column error now succeed
New Features
- Drag widgets between tabs when editing record page layout
- New drag-and-drop engine places cards and events where dropped
- Record table selection checkboxes have accessible labels
- Active navigation items use aria-current instead of aria-selected
- Dashboard aggregate values persist when saving widget layouts
- Onboarding no longer shows blank page during plan selection
- Permission-denied errors surface as proper client error messages
- Call recorder webhook deliveries process asynchronously
- Emails from mailing lists no longer automatically create contacts
- Saving view changes no longer fails with duplicate-key error
- Dark mode overscrolling no longer flashes white
- Fixed crash in People Data Labs app (React 19 compatibility)
- Trust badge padding fixed on onboarding import-contacts step
- Azure-hosted AI models no longer fail mid-answer with storage lookup error
- Workflow mirror rows fixed for newly activated workspaces
- Users joining via invite link skip install-apps onboarding step
- Fixed self-hosted upgrade failure from 2.21.x to 2.24
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