twenty/v2.39.0

clockworklabs/SpacetimeDBtwenty/v2.39.0Sep 9, 2026by twenty-pr[bot]

Upgrading?

AI Summary

The release focuses on the internal architecture of the UI and usage limits. It generates theme artifacts from design tokens and implements a comprehensive usage limits engine with writability and record sharing features.

Key Highlights

  • Generate twenty-ui theme artifacts from a single design-tokens source
  • Implement usage limits engine and credit allowance quota
  • Expose writability on object and field metadata DTOs
  • Record sharing system (1/14) with readability levels

Breaking Changes

  • Generate the twenty-ui theme artifacts from a single design-tokens source

New Features

  • Custom settings tab for call recorder
  • Provision a RECORD_FORM page layout per object
  • Honor retryOnFailure in workflow executor
  • Gate intra-workspace limits behind Organization entitlement
  • Render Slack task links as typed task entities
  • Node settings page for step error handling
  • Tidy campaign composer with cancel and confirm actions
  • Publish queue job events over SSE
  • Writability metadata derivation for record read-only state

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

Related Repositories