twenty/v2.39.0
twentyhq/twentytwenty/v2.39.0Sep 9, 2026by twenty-pr[bot]
AI Summary
This release introduces a new usage quota engine to enforce limits behind organization entitlements and enhances workflows with retry logic and error handling. It also marks the Slack app as version 1.0.0 and includes significant UI/UX improvements for campaigns, navigation, and record sharing.
Key Highlights
- New usage quota engine and limit enforcement
- Slack app v1.0.0 release with typed task entities
- Workflow enhancements: retry on failure and error handling
- Record sharing features including writability metadata
- UI improvements for navigation and campaign composer
Breaking Changes
- Generate the twenty-ui theme artifacts from a single design-tokens source
New Features
- Custom settings tab with grouped sections for call recorder
- Provision a RECORD_FORM page layout per object
- Workflow executor honors retryOnFailure
- Gate intra-workspace limits behind Organization entitlement
- Render task links as Slack's typed task entity
- Node settings page for step error handling
- Idempotency hint under the retry setting
- Mark Recording Bot preference On only when a bot is scheduled
- Support logo asset on ConnectionProviderManifest
Full Release Notes
<!-- generated-release-notes v1 --> ## ⚠️ Breaking changes - Generate the twenty-ui theme artifacts from a single design-tokens source ([#24375](https://github.com/twentyhq/twenty/pull/24375)) by @bosiraphael ## ✨ New features - feat(call-recorder): custom settings tab with grouped sections ([#24913](https://github.com/twentyhq/twenty/pull/24913)) by @ehconitin - feat(record-form): provision a RECORD_FORM page layout per object ([#24999](https://github.com/twentyhq/twenty/pull/24999)) by @thomtrp - feat(workflow): honor retryOnFailure in the executor ([#25248](https://github.com/twentyhq/twenty/pull/25248)) by @thomtrp - feat(usage-limit): gate intra-workspace limits behind the Organization entitlement ([#25292](https://github.com/twentyhq/twenty/pull/25292)) by @etiennejouan - feat(slack): render task links as Slack's typed task entity ([#25303](https://github.com/twentyhq/twenty/pull/25303)) by @abdulrahmancodes - feat(slack): log Slack event retry deliveries ([#25304](https://github.com/twentyhq/twenty/pull/25304)) by @abdulrahmancodes - feat(workflow): Node settings page for step error handling ([#25314](https://github.com/twentyhq/twenty/pull/25314)) by @thomtrp - feat(workflow): idempotency hint under the retry setting ([#25334](https://github.com/twentyhq/twenty/pull/25334)) by @thomtrp - feat(call-recorder): mark the Recording Bot preference On only when a bot is scheduled ([#25412](https://github.com/twentyhq/twenty/pull/25412)) by @ehconitin - feat(apps): support logo asset on ConnectionProviderManifest ([#25419](https://github.com/twentyhq/twenty/pull/25419)) by @martmull ## 💅 Improvements & UX - Mark the Slack app as vetted and release it as 1.0.0 ([#25214](https://github.com/twentyhq/twenty/pull/25214)) by @abdulrahmancodes - Add Fathom discovery and backfill ([#25251](https://github.com/twentyhq/twenty/pull/25251)) by @ehconitin - List views ready for prod ([#25257](https://github.com/twentyhq/twenty/pull/25257)) by @Bonapara - Add fidelity manifest fields for objects, fields and permission flags ([#25265](https://github.com/twentyhq/twenty/pull/25265)) by @Weiko - Stop dropping the call recording transcript during media upload ([#25274](https://github.com/twentyhq/twenty/pull/25274)) by @ehconitin - feat(usage-limit) - reshape the limit model for quota kinds ([#25277](https://github.com/twentyhq/twenty/pull/25277)) by @etiennejouan - feat(usage-limit) - quota engine ([#25278](https://github.com/twentyhq/twenty/pull/25278)) by @etiennejouan - feat(usage) - credit allowance as a quota counter and enforcement wiring ([#25279](https://github.com/twentyhq/twenty/pull/25279)) by @etiennejouan - Tidy the campaign composer, add cancel, and confirm before sending ([#25293](https://github.com/twentyhq/twenty/pull/25293)) by @neo773 - Send campaigns in batches on a paced queue ([#25294](https://github.com/twentyhq/twenty/pull/25294)) by @neo773 - fix(ai-chat) - fix AI chat drop zone flickering while dragging over its own content ([#25307](https://github.com/twentyhq/twenty/pull/25307)) by @etiennejouan - Add the exportApplication query for the data model of a local application ([#25311](https://github.com/twentyhq/twenty/pull/25311)) by @Weiko - add fathom app gallery illustrations ([#25327](https://github.com/twentyhq/twenty/pull/25327)) by @ehconitin - bump call recorder app version to 1.12.0 ([#25329](https://github.com/twentyhq/twenty/pull/25329)) by @ehconitin - Publish queue job events over SSE ([#25333](https://github.com/twentyhq/twenty/pull/25333)) by @martmull - Keep undeclared application references on additive apply ([#25335](https://github.com/twentyhq/twenty/pull/25335)) by @Weiko - Animate navigation mode label transitions ([#25345](https://github.com/twentyhq/twenty/pull/25345)) by @Bonapara - Fix phone input editor sizing ([#25406](https://github.com/twentyhq/twenty/pull/25406)) by @Bonapara - Shorten the Link content field description ([#25409](https://github.com/twentyhq/twenty/pull/25409)) by @neo773 - Add `yarn twenty pull` to write an installed application back to source ([#25410](https://github.com/twentyhq/twenty/pull/25410)) by @Weiko - Capture the provider response when an account is revoked ([#25413](https://github.com/twentyhq/twenty/pull/25413)) by @neo773 - Record sharing 1/14: add the readability level on object metadata ([#25421](https://github.com/twentyhq/twenty/pull/25421)) by @martmull - Deliver SSE events once instead of twice ([#25423](https://github.com/twentyhq/twenty/pull/25423)) by @martmull - Add in-product Update Payment Method modal and retry unpaid invoices after SetupIntent ([#25430](https://github.com/twentyhq/twenty/pull/25430)) by @FelixMalfait - Make the navigation tabs reachable when collapsed and on mobile ([#25458](https://github.com/twentyhq/twenty/pull/25458)) by @FelixMalfait - Chunk calendar participant updates back under the 200 row limit ([#25465](https://github.com/twentyhq/twenty/pull/25465)) by @neo773 - Declare the messageListMember INDEX view and backfill both message list junction targets ([#25468](https://github.com/twentyhq/twenty/pull/25468)) by @FelixMalfait - Add a description to message lists and embed the members table on the list record page ([#25469](https://github.com/twentyhq/twenty/pull/25469)) by @FelixMalfait - Writability 1/3: expose writability on the object and field metadata DTOs ([#25470](https://github.com/twentyhq/twenty/pull/25470)) by @FelixMalfait - Writability 2/3: declare SYSTEM writability on platform-owned standard objects ([#25471](https://github.com/twentyhq/twenty/pull/25471)) by @FelixMalfait - Writability 3/3: derive record read-only state from writability instead of the system-object flag ([#25472](https://github.com/twentyhq/twenty/pull/25472)) by @FelixMalfait - Add a pinned Duplicate List action copying a message list and its members ([#25473](https://github.com/twentyhq/twenty/pull/25473)) by @FelixMalfait - Make relation table widgets follow junction relations ([#25475](https://github.com/twentyhq/twenty/pull/25475)) by @FelixMalfait - Fix Slack app doc inaccuracies found in review ([#25481](https://github.com/twentyhq/twenty/pull/25481)) by @abdulrahmancodes - Sync relation targets with their cached lists on attach and detach ([#25500](https://github.com/twentyhq/twenty/pull/25500)) by @FelixMalfait - Fix the duplicated list page and toast after Duplicate List ([#25504](https://github.com/twentyhq/twenty/pull/25504)) by @FelixMalfait - [codex] Ignore stale authentication errors after session changes ([#25510](https://github.com/twentyhq/twenty/pull/25510)) by @FelixMalfait - Make Slack app logic function executions free and simplify its README ([#25523](https://github.com/twentyhq/twenty/pull/25523)) by @abdulrahmancodes - Skip delayed workflow resume when the run no longer exists ([#25528](https://github.com/twentyhq/twenty/pull/25528)) by @thomtrp - Fix attachments missing from Outlook drafts created by the Draft Email action ([#25529](https://github.com/twentyhq/twenty/pull/25529)) by @neo773 ## 🐛 Bug fixes - Fix: Calendar drop issue & drop target resolution at list extremes ([#24082](https://github.com/twentyhq/twenty/pull/24082)) by @git-init-priyanshu - fix(workflow): blank step-editor tabs in the side panel ([#25318](https://github.com/twentyhq/twenty/pull/25318)) by @thomtrp - fix: keep completeFileUpload below the gateway timeout ([#25320](https://github.com/twentyhq/twenty/pull/25320)) by @martmull - fix: cap the SVG size that file upload completion will sanitize ([#25340](https://github.com/twentyhq/twenty/pull/25340)) by @FelixMalfait - fix: quarantine direct uploads until completion has validated them ([#25342](https://github.com/twentyhq/twenty/pull/25342)) by @FelixMalfait - fix(workflow): stop corrupting run state when a loop resets a deleted step ([#25352](https://github.com/twentyhq/twenty/pull/25352)) by @thomtrp - fix(server): ship ClickHouse migrations in the server build ([#25357](https://github.com/twentyhq/twenty/pull/25357)) by @etiennejouan ## 🔧 Developer & API - Create webhook subscriptions on the OAuth connect path ([#25211](https://github.com/twentyhq/twenty/pull/25211)) by @neo773 - Remove legacy graphql-upload mutations superseded by direct upload ([#25348](https://github.com/twentyhq/twenty/pull/25348)) by @martmull <details> <summary>🏗️ Internal changes (4)</summary> - chore(billing): centralize dollars to micro-credits conversion ([#25326](https://github.com/twentyhq/twenty/pull/25326)) by @etiennejouan - chore(workflow): remove graduated workflow-core feature flags ([#25338](https://github.com/twentyhq/twenty/pull/25338)) by @thomtrp - refactor: make each file folder state its MIME policy explicitly ([#25341](https://github.com/twentyhq/twenty/pull/25341)) by @FelixMalfait - chore(server): revert worker memory diagnostics logging ([#25355](https://github.com/twentyhq/twenty/pull/25355)) by @etiennejouan </details> <details> <summary>Full changelog (87 PRs)</summary> - Fix: Calendar drop issue & drop target resolution at list extremes ([#24082](https://github.com/twentyhq/twenty/pull/24082)) by @git-init-priyanshu - Generate the twenty-ui theme artifacts from a single design-tokens source ([#24375](https://github.com/twentyhq/twenty/pull/24375)) by @bosiraphael - feat(call-recorder): custom settings tab with grouped sections ([#24913](https://github.com/twentyhq/twenty/pull/24913)) by @ehconitin - feat(record-form): provision a RECORD_FORM page layout per object ([#24999](https://github.com/twentyhq/twenty/pull/24999)) by @thomtrp - Create webhook subscriptions on the OAuth connect path ([#25211](https://github.com/twentyhq/twenty/pull/25211)) by @neo773 - Mark the Slack app as vetted and release it as 1.0.0 ([#25214](https://github.com/twentyhq/twenty/pull/25214)) by @abdulrahmancodes - feat(workflow): honor retryOnFailure in the executor ([#25248](https://github.com/twentyhq/twenty/pull/25248)) by @thomtrp - Add Fathom discovery and backfill ([#25251](https://github.com/twentyhq/twenty/pull/25251)) by @ehconitin - List views ready for prod ([#25257](https://github.com/twentyhq/twenty/pull/25257)) by @Bonapara - Add fidelity manifest fields for objects, fields and permission flags ([#25265](https://github.com/twentyhq/twenty/pull/25265)) by @Weiko - Stop dropping the call recording transcript during media upload ([#25274](https://github.com/twentyhq/twenty/pull/25274)) by @ehconitin - feat(usage-limit) - reshape the limit model for quota kinds ([#25277](https://github.com/twentyhq/twenty/pull/25277)) by @etiennejouan - feat(usage-limit) - quota engine ([#25278](https://github.com/twentyhq/twenty/pull/25278)) by @etiennejouan - feat(usage) - credit allowance as a quota counter and enforcement wiring ([#25279](https://github.com/twentyhq/twenty/pull/25279)) by @etiennejouan - feat(usage-limit): gate intra-workspace limits behind the Organization entitlement ([#25292](https://github.com/twentyhq/twenty/pull/25292)) by @etiennejouan - Tidy the campaign composer, add cancel, and confirm before sending ([#25293](https://github.com/twentyhq/twenty/pull/25293)) by @neo773 - Send campaigns in batches on a paced queue ([#25294](https://github.com/twentyhq/twenty/pull/25294)) by @neo773 - feat(slack): render task links as Slack's typed task entity ([#25303](https://github.com/twentyhq/twenty/pull/25303)) by @abdulrahmancodes - feat(slack): log Slack event retry deliveries ([#25304](https://github.com/twentyhq/twenty/pull/25304)) by @abdulrahmancodes - fix(ai-chat) - fix AI chat drop zone flickering while dragging over its own content ([#25307](https://github.com/twentyhq/twenty/pull/25307)) by @etiennejouan - chore: bump version to 2.39.0 ([#25310](https://github.com/twentyhq/twenty/pull/25310)) by @twenty-pr - Add the exportApplication query for the data model of a local application ([#25311](https://github.com/twentyhq/twenty/pull/25311)) by @Weiko - i18n - translations ([#25312](https://github.com/twentyhq/twenty/pull/25312)) by @github-actions - feat(workflow): Node settings page for step error handling ([#25314](https://github.com/twentyhq/twenty/pull/25314)) by @thomtrp - i18n - translations ([#25316](https://github.com/twentyhq/twenty/pull/25316)) by @github-actions - fix(workflow): blank step-editor tabs in the side panel ([#25318](https://github.com/twentyhq/twenty/pull/25318)) by @thomtrp - fix: keep completeFileUpload below the gateway timeout ([#25320](https://github.com/twentyhq/twenty/pull/25320)) by @martmull - i18n - translations ([#25321](https://github.com/twentyhq/twenty/pull/25321)) by @github-actions - chore(billing): centralize dollars to micro-credits conversion ([#25326](https://github.com/twentyhq/twenty/pull/25326)) by @etiennejouan - add fathom app gallery illustrations ([#25327](https://github.com/twentyhq/twenty/pull/25327)) by @ehconitin - i18n - translations ([#25328](https://github.com/twentyhq/twenty/pull/25328)) by @github-actions - bump call recorder app version to 1.12.0 ([#25329](https://github.com/twentyhq/twenty/pull/25329)) by @ehconitin - i18n - translations ([#25331](https://github.com/twentyhq/twenty/pull/25331)) by @github-actions - Publish queue job events over SSE ([#25333](https://github.com/twentyhq/twenty/pull/25333)) by @martmull - feat(workflow): idempotency hint under the retry setting ([#25334](https://github.com/twentyhq/twenty/pull/25334)) by @thomtrp - Keep undeclared application references on additive apply ([#25335](https://github.com/twentyhq/twenty/pull/25335)) by @Weiko - i18n - translations ([#25336](https://github.com/twentyhq/twenty/pull/25336)) by @github-actions - chore(workflow): remove graduated workflow-core feature flags ([#25338](https://github.com/twentyhq/twenty/pull/25338)) by @thomtrp - i18n - translations ([#25339](https://github.com/twentyhq/twenty/pull/25339)) by @github-actions - fix: cap the SVG size that file upload completion will sanitize ([#25340](https://github.com/twentyhq/twenty/pull/25340)) by @FelixMalfait - refactor: make each file folder state its MIME policy explicitly ([#25341](https://github.com/twentyhq/twenty/pull/25341)) by @FelixMalfait - fix: quarantine direct uploads until completion has validated them ([#25342](https://github.com/twentyhq/twenty/pull/25342)) by @FelixMalfait - Animate navigation mode label transitions ([#25345](https://github.com/twentyhq/twenty/pull/25345)) by @Bonapara - i18n - translations ([#25347](https://github.com/twentyhq/twenty/pull/25347)) by @github-actions - Remove legacy graphql-upload mutations superseded by direct upload ([#25348](https://github.com/twentyhq/twenty/pull/25348)) by @martmull - i18n - translations ([#25350](https://github.com/twentyhq/twenty/pull/25350)) by @github-actions - i18n - translations ([#25351](https://github.com/twentyhq/twenty/pull/25351)) by @github-actions - fix(workflow): stop corrupting run state when a loop resets a deleted step ([#25352](https://github.com/twentyhq/twenty/pull/25352)) by @thomtrp - i18n - translations ([#25353](https://github.com/twentyhq/twenty/pull/25353)) by @github-actions - chore(server): revert worker memory diagnostics logging ([#25355](https://github.com/twentyhq/twenty/pull/25355)) by @etiennejouan - fix(server): ship ClickHouse migrations in the server build ([#25357](https://github.com/twentyhq/twenty/pull/25357)) by @etiennejouan - Fix phone input editor sizing ([#25406](https://github.com/twentyhq/twenty/pull/25406)) by @Bonapara - Shorten the Link content field description ([#25409](https://github.com/twentyhq/twenty/pull/25409)) by @neo773 - Add `yarn twenty pull` to write an installed application back to source ([#25410](https://github.com/twentyhq/twenty/pull/25410)) by @Weiko - i18n - translations ([#25411](https://github.com/twentyhq/twenty/pull/25411)) by @github-actions - feat(call-recorder): mark the Recording Bot preference On only when a bot is scheduled ([#25412](https://github.com/twentyhq/twenty/pull/25412)) by @ehconitin - Capture the provider response when an account is revoked ([#25413](https://github.com/twentyhq/twenty/pull/25413)) by @neo773 - i18n - translations ([#25414](https://github.com/twentyhq/twenty/pull/25414)) by @github-actions - i18n - translations ([#25417](https://github.com/twentyhq/twenty/pull/25417)) by @github-actions - i18n - translations ([#25418](https://github.com/twentyhq/twenty/pull/25418)) by @github-actions - feat(apps): support logo asset on ConnectionProviderManifest ([#25419](https://github.com/twentyhq/twenty/pull/25419)) by @martmull - Record sharing 1/14: add the readability level on object metadata ([#25421](https://github.com/twentyhq/twenty/pull/25421)) by @martmull - Deliver SSE events once instead of twice ([#25423](https://github.com/twentyhq/twenty/pull/25423)) by @martmull - i18n - translations ([#25424](https://github.com/twentyhq/twenty/pull/25424)) by @github-actions - Add in-product Update Payment Method modal and retry unpaid invoices after SetupIntent ([#25430](https://github.com/twentyhq/twenty/pull/25430)) by @FelixMalfait - chore: sync AI model catalog from models.dev ([#25451](https://github.com/twentyhq/twenty/pull/25451)) by @github-actions - i18n - translations ([#25455](https://github.com/twentyhq/twenty/pull/25455)) by @github-actions - i18n - translations ([#25456](https://github.com/twentyhq/twenty/pull/25456)) by @github-actions - Make the navigation tabs reachable when collapsed and on mobile ([#25458](https://github.com/twentyhq/twenty/pull/25458)) by @FelixMalfait - i18n - translations ([#25462](https://github.com/twentyhq/twenty/pull/25462)) by @github-actions - Chunk calendar participant updates back under the 200 row limit ([#25465](https://github.com/twentyhq/twenty/pull/25465)) by @neo773 - Declare the messageListMember INDEX view and backfill both message list junction targets ([#25468](https://github.com/twentyhq/twenty/pull/25468)) by @FelixMalfait - Add a description to message lists and embed the members table on the list record page ([#25469](https://github.com/twentyhq/twenty/pull/25469)) by @FelixMalfait - Writability 1/3: expose writability on the object and field metadata DTOs ([#25470](https://github.com/twentyhq/twenty/pull/25470)) by @FelixMalfait - Writability 2/3: declare SYSTEM writability on platform-owned standard objects ([#25471](https://github.com/twentyhq/twenty/pull/25471)) by @FelixMalfait - Writability 3/3: derive record read-only state from writability instead of the system-object flag ([#25472](https://github.com/twentyhq/twenty/pull/25472)) by @FelixMalfait - Add a pinned Duplicate List action copying a message list and its members ([#25473](https://github.com/twentyhq/twenty/pull/25473)) by @FelixMalfait - Make relation table widgets follow junction relations ([#25475](https://github.com/twentyhq/twenty/pull/25475)) by @FelixMalfait - Fix Slack app doc inaccuracies found in review ([#25481](https://github.com/twentyhq/twenty/pull/25481)) by @abdulrahmancodes - Sync relation targets with their cached lists on attach and detach ([#25500](https://github.com/twentyhq/twenty/pull/25500)) by @FelixMalfait - Fix the duplicated list page and toast after Duplicate List ([#25504](https://github.com/twentyhq/twenty/pull/25504)) by @FelixMalfait - [codex] Ignore stale authentication errors after session changes ([#25510](https://github.com/twentyhq/twenty/pull/25510)) by @FelixMalfait - i18n - translations ([#25517](https://github.com/twentyhq/twenty/pull/25517)) by @github-actions - Make Slack app logic function executions free and simplify its README ([#25523](https://github.com/twentyhq/twenty/pull/25523)) by @abdulrahmancodes - i18n - translations ([#25525](https://github.com/twentyhq/twenty/pull/25525)) by @github-actions - Skip delayed workflow resume when the run no longer exists ([#25528](https://github.com/twentyhq/twenty/pull/25528)) by @thomtrp - Fix attachments missing from Outlook drafts created by the Draft Email action ([#25529](https://github.com/twentyhq/twenty/pull/25529)) by @neo773 </details> **Full Changelog**: https://github.com/twentyhq/twenty/compare/twenty/v2.38.1...twenty/v2.39.0