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
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one