twenty/v2.24.0
pola-rs/polarstwenty/v2.24.0Jul 24, 2026by Weiko
AI Summary
This release introduces a rewritten drag-and-drop foundation for record boards and calendars, improves AI chat reliability, and prevents bulk sender emails from creating contacts automatically. Dashboard aggregate values now persist correctly when saving widget layouts.
Key Highlights
- Widgets can now be dragged between tabs when editing record page layouts.
- Record boards and calendars drop cards and events where you aim them on a rewritten drag-and-drop engine.
- AI chat answers no longer get silently dropped on long threads or after switching tabs.
- Emails from mailing lists and bulk senders no longer automatically create contacts.
- Self-hosted upgrades from 2.21.x that were failing with a missing column error are now fixed.
New Features
- Drag widgets between tabs when editing a record page layout.
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