twenty/v2.41.0

achtungsoftware/alariktwenty/v2.41.0Sep 17, 2026by twenty-pr[bot]

Upgrading?

AI Summary

Updates to workflow management, messaging, and usage limits.

Key Highlights

  • Application admins can manage workspace-shared connections.
  • AI deployment catalogs generated from model specs.
  • Apps can now own and ingest messages into channels.

Breaking Changes

  • Let every application admin manage a workspace-shared connection.

New Features

  • Workflow version validation through exceptions
  • Author-keyed overrides blob (steps 1 to 3)
  • Seed a user-owned initial view per object
  • Add workspaceWorkflowId to core workflows
  • Expose usage limits over the metadata API
  • List and create/edit limits from settings billing
  • Report a rejected bot token to the platform connection
  • AI generate deployment catalog from model catalog
  • Access mode to restrict the assistant to linked members
  • Let apps own message channels
  • Let apps ingest messages into their channels
  • Resolve identity for non-email participants
  • Run database event triggers in batch mode

Full Release Notes

<!-- generated-release-notes v1 -->

## ⚠️ Breaking changes

- Let every application admin manage a workspace-shared connection ([#25773](https://github.com/twentyhq/twenty/pull/25773)) by @abdulrahmancodes

## ✨ New features

- feat(server): validate workflow versions through exceptions, malformed at write and non-activable on activate or validate ([#24964](https://github.com/twentyhq/twenty/pull/24964)) by @charlesBochet
- feat(metadata): author-keyed overrides blob (steps 1 to 3) ([#25284](https://github.com/twentyhq/twenty/pull/25284)) by @prastoin
- feat(view): seed a user-owned initial view per object alongside the INDEX view ([#25416](https://github.com/twentyhq/twenty/pull/25416)) by @thomtrp
- feat(workflow): add workspaceWorkflowId to core workflows ([#25723](https://github.com/twentyhq/twenty/pull/25723)) by @thomtrp
- feat(usage-limit): expose usage limits over the metadata API ([#25740](https://github.com/twentyhq/twenty/pull/25740)) by @etiennejouan
- feat(usage-limit): list workspace limits in a billing tab ([#25741](https://github.com/twentyhq/twenty/pull/25741)) by @etiennejouan
- feat(usage-limit): create and edit limits from settings billing ([#25742](https://github.com/twentyhq/twenty/pull/25742)) by @etiennejouan
- feat(workflow): point core workflows and command menu items at core version ids ([#25757](https://github.com/twentyhq/twenty/pull/25757)) by @thomtrp
- feat(slack): report a rejected bot token to the platform connection ([#25763](https://github.com/twentyhq/twenty/pull/25763)) by @abdulrahmancodes
- feat(ai): generate every deployment catalog from the model catalog and a spec ([#25831](https://github.com/twentyhq/twenty/pull/25831)) by @FelixMalfait
- feat(slack): access mode to restrict the assistant to linked members ([#25834](https://github.com/twentyhq/twenty/pull/25834)) by @abdulrahmancodes
- feat(workflow): read the workflow show page shell through core ([#25901](https://github.com/twentyhq/twenty/pull/25901)) by @thomtrp
- feat(workflow): discard a workflow draft through the core API ([#25902](https://github.com/twentyhq/twenty/pull/25902)) by @thomtrp
- feat(messaging): let apps own message channels ([#25903](https://github.com/twentyhq/twenty/pull/25903)) by @FelixMalfait
- feat(messaging): let apps ingest messages into their channels ([#25905](https://github.com/twentyhq/twenty/pull/25905)) by @FelixMalfait
- feat(messaging): resolve identity for non-email participants ([#25906](https://github.com/twentyhq/twenty/pull/25906)) by @FelixMalfait
- feat(workflow): remove the See Active Version command menu item from workspaces ([#25938](https://github.com/twentyhq/twenty/pull/25938)) by @thomtrp
- feat(last-contact): run database event triggers in batch mode ([#26072](https://github.com/twentyhq/twenty/pull/26072)) by @martmull

## 💅 Improvements & UX

- Enforce blocklist scope and surface the workspace blocklist in settings ([#25007](https://github.com/twentyhq/twenty/pull/25007)) by @neo773
- Record sharing: inherited objects follow their parent ([#25439](https://github.com/twentyhq/twenty/pull/25439)) by @martmull
- Granola 7/8: Filter Granola synchronization by folder ([#25576](https://github.com/twentyhq/twenty/pull/25576)) by @ehconitin
- [3/4] Desktop Recorder: add the Twenty desktop app ([#25616](https://github.com/twentyhq/twenty/pull/25616)) by @Bonapara
- [1/4] Desktop Recorder: support existing UI controls ([#25632](https://github.com/twentyhq/twenty/pull/25632)) by @Bonapara
- [2/4] Desktop Recorder: add the installable Twenty integration ([#25633](https://github.com/twentyhq/twenty/pull/25633)) by @Bonapara
- Replace frontend snackbars with twenty-ui toasts ([#25664](https://github.com/twentyhq/twenty/pull/25664)) by @bosiraphael
- Add `eloqnt lint` to catch translation errors ([#25754](https://github.com/twentyhq/twenty/pull/25754)) by @amannn
- Resolve Slack account identity through one typed service ([#25772](https://github.com/twentyhq/twenty/pull/25772)) by @abdulrahmancodes
- Fix shared connected account permissions and visibility ([#25777](https://github.com/twentyhq/twenty/pull/25777)) by @neo773
- Validate select option colors ([#25805](https://github.com/twentyhq/twenty/pull/25805)) by @bosiraphael
- Polish AI model settings ([#25810](https://github.com/twentyhq/twenty/pull/25810)) by @Bonapara
- Stop selecting non-mailbox connected accounts as the email sender ([#25814](https://github.com/twentyhq/twenty/pull/25814)) by @neo773
- Emit URL-safe pagination cursors ([#25822](https://github.com/twentyhq/twenty/pull/25822)) by @tomjtobinn
- Let runAgent messages carry file attachments ([#25835](https://github.com/twentyhq/twenty/pull/25835)) by @abdulrahmancodes
- Repair machine-translation damage in Crowdin automatically ([#25842](https://github.com/twentyhq/twenty/pull/25842)) by @FelixMalfait
- Cover every translation pipeline with the normalizer ([#25848](https://github.com/twentyhq/twenty/pull/25848)) by @FelixMalfait
- Ship three finished locales, drop the pseudo-locale, and lint the ICU apostrophe ([#25850](https://github.com/twentyhq/twenty/pull/25850)) by @FelixMalfait
- Close the silent gaps around adding a locale, and stop an email shipping its message ids ([#25851](https://github.com/twentyhq/twenty/pull/25851)) by @FelixMalfait
- Delete translations that came back as debris rather than words ([#25853](https://github.com/twentyhq/twenty/pull/25853)) by @FelixMalfait
- Lay the app out right to left for Arabic and Hebrew ([#25854](https://github.com/twentyhq/twenty/pull/25854)) by @FelixMalfait
- Mint optimistic cache cursors the way the server does ([#25855](https://github.com/twentyhq/twenty/pull/25855)) by @FelixMalfait
- Update book meetings doc for the calendar event composer ([#25856](https://github.com/twentyhq/twenty/pull/25856)) by @neo773
- Restore code identifiers the docs translated into prose ([#25858](https://github.com/twentyhq/twenty/pull/25858)) by @FelixMalfait
- Fix the English, and the catalogs and layout that made it unreadable ([#25859](https://github.com/twentyhq/twenty/pull/25859)) by @FelixMalfait
- fix (usage-limit) - stop plan-gated spender groups from opening in the billing limits form ([#25871](https://github.com/twentyhq/twenty/pull/25871)) by @etiennejouan
- Phone number fix ([#25882](https://github.com/twentyhq/twenty/pull/25882)) by @BOHEUS
- Thread replies to email group and campaign emails ([#25884](https://github.com/twentyhq/twenty/pull/25884)) by @neo773
- Migrate buttons to Base UI ([#25888](https://github.com/twentyhq/twenty/pull/25888)) by @bosiraphael
- Add live previews to Twenty UI documentation ([#25889](https://github.com/twentyhq/twenty/pull/25889)) by @bosiraphael
- [forms 1/3] Make record creation commands available across objects ([#25890](https://github.com/twentyhq/twenty/pull/25890)) by @Bonapara
- Move UI Library into the Developers menu ([#25898](https://github.com/twentyhq/twenty/pull/25898)) by @bosiraphael
- [4/4] Desktop Recorder: add desktop application coverage ([#25900](https://github.com/twentyhq/twenty/pull/25900)) by @Bonapara
- Index the messageList and messageCampaign legs on timelineActivity ([#25912](https://github.com/twentyhq/twenty/pull/25912)) by @charlesBochet
- Publish Twenty app skills as a portable Agent Skills collection (skills.sh) ([#25913](https://github.com/twentyhq/twenty/pull/25913)) by @martmull
- Record sharing: inherited records follow the records their child rows point at ([#25914](https://github.com/twentyhq/twenty/pull/25914)) by @martmull
- Remove the email group flag and gate campaigns behind their own flag ([#25916](https://github.com/twentyhq/twenty/pull/25916)) by @neo773
- fix(ai-chat) - fix AI chat turns dying on tool results that carry Date values ([#25921](https://github.com/twentyhq/twenty/pull/25921)) by @etiennejouan
- Show AI chat context and credit usage ([#25923](https://github.com/twentyhq/twenty/pull/25923)) by @Bonapara
- Record sharing: inherited records follow the parent's complete access policy, in queries and events ([#25925](https://github.com/twentyhq/twenty/pull/25925)) by @martmull
- Add readable admin feature flag names and descriptions ([#25927](https://github.com/twentyhq/twenty/pull/25927)) by @Bonapara
- Default demo accounts to the system theme ([#25928](https://github.com/twentyhq/twenty/pull/25928)) by @Bonapara
- Use primary text color for settings table identifying columns ([#25939](https://github.com/twentyhq/twenty/pull/25939)) by @Bonapara
- Add copy button on hover to Emails/Phones/Links in the record side panel ([#25940](https://github.com/twentyhq/twenty/pull/25940)) by @charlesBochet
- Clarify self-hosted pricing CTAs and Organization license keys ([#25941](https://github.com/twentyhq/twenty/pull/25941)) by @Bonapara
- Clarify model mode comparisons with an information popup ([#25947](https://github.com/twentyhq/twenty/pull/25947)) by @Bonapara
- Organize Twenty UI into primitive families ([#25948](https://github.com/twentyhq/twenty/pull/25948)) by @bosiraphael
- Read forwarded email bodies like the mailbox importers do ([#25954](https://github.com/twentyhq/twenty/pull/25954)) by @neo773
- Complete Organization naming in settings and activation ([#25961](https://github.com/twentyhq/twenty/pull/25961)) by @Bonapara
- Scope application file uploads to the registration owner ([#25962](https://github.com/twentyhq/twenty/pull/25962)) by @prastoin
- Split the admin application registration update input ([#25963](https://github.com/twentyhq/twenty/pull/25963)) by @prastoin
- Record sharing: gate events through one access policy entry point ([#25964](https://github.com/twentyhq/twenty/pull/25964)) by @martmull
- Pin catalog sync to a registration's own source package ([#25965](https://github.com/twentyhq/twenty/pull/25965)) by @prastoin
- Derive permission universal identifiers from their role and target ([#25966](https://github.com/twentyhq/twenty/pull/25966)) by @Weiko
- Redesign the marketplace app detail page ([#25969](https://github.com/twentyhq/twenty/pull/25969)) by @martmull
- [1/2 Sidebar] New layout ([#25974](https://github.com/twentyhq/twenty/pull/25974)) by @Bonapara
- Export roles, permissions and permission flags ([#25975](https://github.com/twentyhq/twenty/pull/25975)) by @Weiko
- Use Twenty UI components in presentation stories ([#25976](https://github.com/twentyhq/twenty/pull/25976)) by @bosiraphael
- Desktop Recorder: align merged integration and UI naming conventions ([#25977](https://github.com/twentyhq/twenty/pull/25977)) by @Bonapara
- Document data display primitives ([#25980](https://github.com/twentyhq/twenty/pull/25980)) by @bosiraphael
- Export row-level permission predicates and groups ([#25984](https://github.com/twentyhq/twenty/pull/25984)) by @Weiko
- Share CSV formatting and composite field labels ([#25986](https://github.com/twentyhq/twenty/pull/25986)) by @Weiko
- Write roles and permission flags on pull ([#25994](https://github.com/twentyhq/twenty/pull/25994)) by @Weiko
- Use a twenty-bounce MAIL FROM subdomain for new sending domains ([#25995](https://github.com/twentyhq/twenty/pull/25995)) by @neo773
- Show sending domain DNS records as a status list and a records table ([#25996](https://github.com/twentyhq/twenty/pull/25996)) by @neo773
- Use Twenty UI buttons in Menu and Popover stories ([#26001](https://github.com/twentyhq/twenty/pull/26001)) by @bosiraphael
- Remove unused view delete mutations from the front ([#26003](https://github.com/twentyhq/twenty/pull/26003)) by @Weiko
- Fix custom domain settings spacing ([#26007](https://github.com/twentyhq/twenty/pull/26007)) by @Bonapara
- Show shortcuts in command menu button tooltips ([#26009](https://github.com/twentyhq/twenty/pull/26009)) by @Bonapara
- Clip the toast progress overlay to the toast corners ([#26012](https://github.com/twentyhq/twenty/pull/26012)) by @neo773
- Record sharing: fail closed on unresolved row predicates, gate application events on the role, run dashboard duplication under the caller ([#26021](https://github.com/twentyhq/twenty/pull/26021)) by @martmull
- Require client authentication for OAuth token introspection ([#26023](https://github.com/twentyhq/twenty/pull/26023)) by @charlesBochet
- Consume the OAuth authorization code atomically ([#26025](https://github.com/twentyhq/twenty/pull/26025)) by @charlesBochet
- Block system and relation fields on workspace member settings update ([#26026](https://github.com/twentyhq/twenty/pull/26026)) by @charlesBochet
- Enforce UNLISTED view visibility when resolving query params ([#26027](https://github.com/twentyhq/twenty/pull/26027)) by @charlesBochet
- Expose minimum likelihood in enrichment workflows ([#26040](https://github.com/twentyhq/twenty/pull/26040)) by @bosiraphael
- Clarify twenty-ui setup in the README ([#26044](https://github.com/twentyhq/twenty/pull/26044)) by @bosiraphael
- Split Twenty UI docs into primitives and components ([#26045](https://github.com/twentyhq/twenty/pull/26045)) by @bosiraphael
- Skip participant matching jobs when no person email is involved ([#26058](https://github.com/twentyhq/twenty/pull/26058)) by @neo773
- Show contact auto-creation and sync options on shared mailboxes ([#26059](https://github.com/twentyhq/twenty/pull/26059)) by @neo773
- Honor exclude group emails on shared mailboxes ([#26060](https://github.com/twentyhq/twenty/pull/26060)) by @neo773
- Document controlled and uncontrolled UI state ([#26062](https://github.com/twentyhq/twenty/pull/26062)) by @bosiraphael
- Document Twenty UI anatomy and composition ([#26066](https://github.com/twentyhq/twenty/pull/26066)) by @bosiraphael
- Disable play functions in UI documentation examples ([#26069](https://github.com/twentyhq/twenty/pull/26069)) by @bosiraphael
- Make record sharing an enterprise feature ([#26070](https://github.com/twentyhq/twenty/pull/26070)) by @martmull
- Keep default domain deep links through sign-in and workspace selection ([#26073](https://github.com/twentyhq/twenty/pull/26073)) by @martmull
- Cache billing entitlements in the workspace cache ([#26078](https://github.com/twentyhq/twenty/pull/26078)) by @Weiko
- Embed MainButton and LightButton stories in docs ([#26089](https://github.com/twentyhq/twenty/pull/26089)) by @bosiraphael
- Add website release notes for 2.39 and 2.40 ([#26092](https://github.com/twentyhq/twenty/pull/26092)) by @Bonapara
- Add website release notes for 2.27 and 2.34 ([#26094](https://github.com/twentyhq/twenty/pull/26094)) by @Bonapara

## 🐛 Bug fixes

- fix(server): backfill workflow rich text record fields (2.41 upgrade command) ([#24965](https://github.com/twentyhq/twenty/pull/24965)) by @charlesBochet
- fix(shared): stop the utils barrel dragging handlebars into twenty-client-sdk ([#25846](https://github.com/twentyhq/twenty/pull/25846)) by @FelixMalfait
- fix(create-twenty-app): ship a lockfile so generated apps install under an age gate ([#25879](https://github.com/twentyhq/twenty/pull/25879)) by @FelixMalfait
- fix(front): widen the admin default-model rows ([#25881](https://github.com/twentyhq/twenty/pull/25881)) by @FelixMalfait
- fix(currency): prevent dropping decimal separator and multiplying amount on 0-decimal fields (#25870) ([#25904](https://github.com/twentyhq/twenty/pull/25904)) by @Dewin
- fix(email-tool): resolve the default sender through the caller entitlement filter ([#25908](https://github.com/twentyhq/twenty/pull/25908)) by @etiennejouan
- fix(billing): restore the credit-package match on an interval switch ([#25919](https://github.com/twentyhq/twenty/pull/25919)) by @FelixMalfait
- fix(record-form): render rich text fields with the BlockNote editor ([#25920](https://github.com/twentyhq/twenty/pull/25920)) by @thomtrp
- fix(messaging): resolve an app channel's connectedAccount for app contexts ([#25942](https://github.com/twentyhq/twenty/pull/25942)) by @FelixMalfait
- fix(upgrade): pin 2.20 messageList view command to its original columns ([#26006](https://github.com/twentyhq/twenty/pull/26006)) by @prastoin
- fix(front-component-renderer): forward React 18 camelCase attributes on remote elements ([#26015](https://github.com/twentyhq/twenty/pull/26015)) by @abdulrahmancodes
- fix(messaging): enforce CRLF line endings on raw outbound messages and surface IMAP append error responseText (#26011) ([#26017](https://github.com/twentyhq/twenty/pull/26017)) by @Dewin
- fix(workflow): stop reporting user-facing step errors to Sentry ([#26041](https://github.com/twentyhq/twenty/pull/26041)) by @charlesBochet
- fix(rest): forward flatIndexMaps to the merge query runner ([#26063](https://github.com/twentyhq/twenty/pull/26063)) by @charlesBochet
- fix(workflow): unblock the 2-41 See Active Version removal on workspaces that still have the item ([#26090](https://github.com/twentyhq/twenty/pull/26090)) by @thomtrp

## 🔧 Developer & API

- Migrate Avatar to the new twenty-ui API ([#25787](https://github.com/twentyhq/twenty/pull/25787)) by @bosiraphael
- Migrate Chip to the new twenty-ui API ([#25788](https://github.com/twentyhq/twenty/pull/25788)) by @bosiraphael
- Add Twenty UI documentation and generated API references ([#25791](https://github.com/twentyhq/twenty/pull/25791)) by @bosiraphael
- Prevent reactivating revoked API keys ([#25918](https://github.com/twentyhq/twenty/pull/25918)) by @Weiko

<details>
<summary>🏗️ Internal changes (10)</summary>

- refactor(ai): derive the SDK package from the packages we bundle ([#25845](https://github.com/twentyhq/twenty/pull/25845)) by @FelixMalfait
- refactor(shared): resolve workflow variables without handlebars ([#25852](https://github.com/twentyhq/twenty/pull/25852)) by @FelixMalfait
- docs: state which plan row-level permissions require ([#25868](https://github.com/twentyhq/twenty/pull/25868)) by @yosh1
- docs: move Translations under the Operations section ([#25892](https://github.com/twentyhq/twenty/pull/25892)) by @FelixMalfait
- docs(slack): point self-hosters at the Slack setup guide ([#25899](https://github.com/twentyhq/twenty/pull/25899)) by @abdulrahmancodes
- chore(security): bump curl/jq in the image and the npm packages flagged by Oneleet ([#25926](https://github.com/twentyhq/twenty/pull/25926)) by @charlesBochet
- chore(security): drop extract-zip (HIGH, past SLA, no fix) by lifting mintlify's puppeteer to 25 ([#25931](https://github.com/twentyhq/twenty/pull/25931)) by @charlesBochet
- test(messaging): cover the app-facing message channel API end to end ([#25945](https://github.com/twentyhq/twenty/pull/25945)) by @FelixMalfait
- revert(email-tool): restore the default sender resolution ([#25972](https://github.com/twentyhq/twenty/pull/25972)) by @etiennejouan
- refactor(server): bind resolved application packages to their registration ([#26077](https://github.com/twentyhq/twenty/pull/26077)) by @prastoin

</details>

## 🎉 New contributors

- @amannn made their first contribution in https://github.com/twentyhq/twenty/pull/25754
- @tomjtobinn made their first contribution in https://github.com/twentyhq/twenty/pull/25822
- @yosh1 made their first contribution in https://github.com/twentyhq/twenty/pull/25868
- @Dewin made their first contribution in https://github.com/twentyhq/twenty/pull/26017

<details>
<summary>Full changelog (188 PRs)</summary>

- feat(server): validate workflow versions through exceptions, malformed at write and non-activable on activate or validate ([#24964](https://github.com/twentyhq/twenty/pull/24964)) by @charlesBochet
- fix(server): backfill workflow rich text record fields (2.41 upgrade command) ([#24965](https://github.com/twentyhq/twenty/pull/24965)) by @charlesBochet
- Enforce blocklist scope and surface the workspace blocklist in settings ([#25007](https://github.com/twentyhq/twenty/pull/25007)) by @neo773
- feat(metadata): author-keyed overrides blob (steps 1 to 3) ([#25284](https://github.com/twentyhq/twenty/pull/25284)) by @prastoin
- feat(view): seed a user-owned initial view per object alongside the INDEX view ([#25416](https://github.com/twentyhq/twenty/pull/25416)) by @thomtrp
- Record sharing: inherited objects follow their parent ([#25439](https://github.com/twentyhq/twenty/pull/25439)) by @martmull
- Granola 7/8: Filter Granola synchronization by folder ([#25576](https://github.com/twentyhq/twenty/pull/25576)) by @ehconitin
- [3/4] Desktop Recorder: add the Twenty desktop app ([#25616](https://github.com/twentyhq/twenty/pull/25616)) by @Bonapara
- [1/4] Desktop Recorder: support existing UI controls ([#25632](https://github.com/twentyhq/twenty/pull/25632)) by @Bonapara
- [2/4] Desktop Recorder: add the installable Twenty integration ([#25633](https://github.com/twentyhq/twenty/pull/25633)) by @Bonapara
- Replace frontend snackbars with twenty-ui toasts ([#25664](https://github.com/twentyhq/twenty/pull/25664)) by @bosiraphael
- feat(workflow): add workspaceWorkflowId to core workflows ([#25723](https://github.com/twentyhq/twenty/pull/25723)) by @thomtrp
- feat(usage-limit): expose usage limits over the metadata API ([#25740](https://github.com/twentyhq/twenty/pull/25740)) by @etiennejouan
- feat(usage-limit): list workspace limits in a billing tab ([#25741](https://github.com/twentyhq/twenty/pull/25741)) by @etiennejouan
- feat(usage-limit): create and edit limits from settings billing ([#25742](https://github.com/twentyhq/twenty/pull/25742)) by @etiennejouan
- Add `eloqnt lint` to catch translation errors ([#25754](https://github.com/twentyhq/twenty/pull/25754)) by @amannn
- feat(workflow): point core workflows and command menu items at core version ids ([#25757](https://github.com/twentyhq/twenty/pull/25757)) by @thomtrp
- feat(slack): report a rejected bot token to the platform connection ([#25763](https://github.com/twentyhq/twenty/pull/25763)) by @abdulrahmancodes
- Resolve Slack account identity through one typed service ([#25772](https://github.com/twentyhq/twenty/pull/25772)) by @abdulrahmancodes
- Let every application admin manage a workspace-shared connection ([#25773](https://github.com/twentyhq/twenty/pull/25773)) by @abdulrahmancodes
- Fix shared connected account permissions and visibility ([#25777](https://github.com/twentyhq/twenty/pull/25777)) by @neo773
- Migrate Avatar to the new twenty-ui API ([#25787](https://github.com/twentyhq/twenty/pull/25787)) by @bosiraphael
- Migrate Chip to the new twenty-ui API ([#25788](https://github.com/twentyhq/twenty/pull/25788)) by @bosiraphael
- Add Twenty UI documentation and generated API references ([#25791](https://github.com/twentyhq/twenty/pull/25791)) by @bosiraphael
- Validate select option colors ([#25805](https://github.com/twentyhq/twenty/pull/25805)) by @bosiraphael
- Polish AI model settings ([#25810](https://github.com/twentyhq/twenty/pull/25810)) by @Bonapara
- chore: bump version to 2.41.0 ([#25813](https://github.com/twentyhq/twenty/pull/25813)) by @twenty-pr
- Stop selecting non-mailbox connected accounts as the email sender ([#25814](https://github.com/twentyhq/twenty/pull/25814)) by @neo773
- Emit URL-safe pagination cursors ([#25822](https://github.com/twentyhq/twenty/pull/25822)) by @tomjtobinn
- chore: sync AI model catalog ([#25825](https://github.com/twentyhq/twenty/pull/25825)) by @github-actions
- feat(ai): generate every deployment catalog from the model catalog and a spec ([#25831](https://github.com/twentyhq/twenty/pull/25831)) by @FelixMalfait
- feat(slack): access mode to restrict the assistant to linked members ([#25834](https://github.com/twentyhq/twenty/pull/25834)) by @abdulrahmancodes
- Let runAgent messages carry file attachments ([#25835](https://github.com/twentyhq/twenty/pull/25835)) by @abdulrahmancodes
- chore: sync AI model catalog ([#25840](https://github.com/twentyhq/twenty/pull/25840)) by @github-actions
- Repair machine-translation damage in Crowdin automatically ([#25842](https://github.com/twentyhq/twenty/pull/25842)) by @FelixMalfait
- refactor(ai): derive the SDK package from the packages we bundle ([#25845](https://github.com/twentyhq/twenty/pull/25845)) by @FelixMalfait
- fix(shared): stop the utils barrel dragging handlebars into twenty-client-sdk ([#25846](https://github.com/twentyhq/twenty/pull/25846)) by @FelixMalfait
- Cover every translation pipeline with the normalizer ([#25848](https://github.com/twentyhq/twenty/pull/25848)) by @FelixMalfait
- i18n - website translations ([#25849](https://github.com/twentyhq/twenty/pull/25849)) by @github-actions
- Ship three finished locales, drop the pseudo-locale, and lint the ICU apostrophe ([#25850](https://github.com/twentyhq/twenty/pull/25850)) by @FelixMalfait
- Close the silent gaps around adding a locale, and stop an email shipping its message ids ([#25851](https://github.com/twentyhq/twenty/pull/25851)) by @FelixMalfait
- refactor(shared): resolve workflow variables without handlebars ([#25852](https://github.com/twentyhq/twenty/pull/25852)) by @FelixMalfait
- Delete translations that came back as debris rather than words ([#25853](https://github.com/twentyhq/twenty/pull/25853)) by @FelixMalfait
- Lay the app out right to left for Arabic and Hebrew ([#25854](https://github.com/twentyhq/twenty/pull/25854)) by @FelixMalfait
- Mint optimistic cache cursors the way the server does ([#25855](https://github.com/twentyhq/twenty/pull/25855)) by @FelixMalfait
- Update book meetings doc for the calendar event composer ([#25856](https://github.com/twentyhq/twenty/pull/25856)) by @neo773
- Restore code identifiers the docs translated into prose ([#25858](https://github.com/twentyhq/twenty/pull/25858)) by @FelixMalfait
- Fix the English, and the catalogs and layout that made it unreadable ([#25859](https://github.com/twentyhq/twenty/pull/25859)) by @FelixMalfait
- i18n - website translations ([#25860](https://github.com/twentyhq/twenty/pull/25860)) by @github-actions
- i18n - website translations ([#25861](https://github.com/twentyhq/twenty/pull/25861)) by @github-actions
- i18n - translations ([#25863](https://github.com/twentyhq/twenty/pull/25863)) by @github-actions
- i18n - translations ([#25864](https://github.com/twentyhq/twenty/pull/25864)) by @github-actions
- i18n - website translations ([#25865](https://github.com/twentyhq/twenty/pull/25865)) by @github-actions
- i18n - translations ([#25867](https://github.com/twentyhq/twenty/pull/25867)) by @github-actions
- docs: state which plan row-level permissions require ([#25868](https://github.com/twentyhq/twenty/pull/25868)) by @yosh1
- chore: sync AI model catalog ([#25869](https://github.com/twentyhq/twenty/pull/25869)) by @github-actions
- fix (usage-limit) - stop plan-gated spender groups from opening in the billing limits form ([#25871](https://github.com/twentyhq/twenty/pull/25871)) by @etiennejouan
- fix(create-twenty-app): ship a lockfile so generated apps install under an age gate ([#25879](https://github.com/twentyhq/twenty/pull/25879)) by @FelixMalfait
- fix(front): widen the admin default-model rows ([#25881](https://github.com/twentyhq/twenty/pull/25881)) by @FelixMalfait
- Phone number fix ([#25882](https://github.com/twentyhq/twenty/pull/25882)) by @BOHEUS
- Thread replies to email group and campaign emails ([#25884](https://github.com/twentyhq/twenty/pull/25884)) by @neo773
- i18n - translations ([#25885](https://github.com/twentyhq/twenty/pull/25885)) by @github-actions
- i18n - translations ([#25886](https://github.com/twentyhq/twenty/pull/25886)) by @github-actions
- Migrate buttons to Base UI ([#25888](https://github.com/twentyhq/twenty/pull/25888)) by @bosiraphael
- Add live previews to Twenty UI documentation ([#25889](https://github.com/twentyhq/twenty/pull/25889)) by @bosiraphael
- [forms 1/3] Make record creation commands available across objects ([#25890](https://github.com/twentyhq/twenty/pull/25890)) by @Bonapara
- docs: move Translations under the Operations section ([#25892](https://github.com/twentyhq/twenty/pull/25892)) by @FelixMalfait
- Move UI Library into the Developers menu ([#25898](https://github.com/twentyhq/twenty/pull/25898)) by @bosiraphael
- docs(slack): point self-hosters at the Slack setup guide ([#25899](https://github.com/twentyhq/twenty/pull/25899)) by @abdulrahmancodes
- [4/4] Desktop Recorder: add desktop application coverage ([#25900](https://github.com/twentyhq/twenty/pull/25900)) by @Bonapara
- feat(workflow): read the workflow show page shell through core ([#25901](https://github.com/twentyhq/twenty/pull/25901)) by @thomtrp
- feat(workflow): discard a workflow draft through the core API ([#25902](https://github.com/twentyhq/twenty/pull/25902)) by @thomtrp
- feat(messaging): let apps own message channels ([#25903](https://github.com/twentyhq/twenty/pull/25903)) by @FelixMalfait
- fix(currency): prevent dropping decimal separator and multiplying amount on 0-decimal fields (#25870) ([#25904](https://github.com/twentyhq/twenty/pull/25904)) by @Dewin
- feat(messaging): let apps ingest messages into their channels ([#25905](https://github.com/twentyhq/twenty/pull/25905)) by @FelixMalfait
- feat(messaging): resolve identity for non-email participants ([#25906](https://github.com/twentyhq/twenty/pull/25906)) by @FelixMalfait
- fix(email-tool): resolve the default sender through the caller entitlement filter ([#25908](https://github.com/twentyhq/twenty/pull/25908)) by @etiennejouan
- i18n - translations ([#25910](https://github.com/twentyhq/twenty/pull/25910)) by @github-actions
- Index the messageList and messageCampaign legs on timelineActivity ([#25912](https://github.com/twentyhq/twenty/pull/25912)) by @charlesBochet
- Publish Twenty app skills as a portable Agent Skills collection (skills.sh) ([#25913](https://github.com/twentyhq/twenty/pull/25913)) by @martmull
- Record sharing: inherited records follow the records their child rows point at ([#25914](https://github.com/twentyhq/twenty/pull/25914)) by @martmull
- Remove the email group flag and gate campaigns behind their own flag ([#25916](https://github.com/twentyhq/twenty/pull/25916)) by @neo773
- i18n - translations ([#25917](https://github.com/twentyhq/twenty/pull/25917)) by @github-actions
- Prevent reactivating revoked API keys ([#25918](https://github.com/twentyhq/twenty/pull/25918)) by @Weiko
- fix(billing): restore the credit-package match on an interval switch ([#25919](https://github.com/twentyhq/twenty/pull/25919)) by @FelixMalfait
- fix(record-form): render rich text fields with the BlockNote editor ([#25920](https://github.com/twentyhq/twenty/pull/25920)) by @thomtrp
- fix(ai-chat) - fix AI chat turns dying on tool results that carry Date values ([#25921](https://github.com/twentyhq/twenty/pull/25921)) by @etiennejouan
- i18n - translations ([#25922](https://github.com/twentyhq/twenty/pull/25922)) by @github-actions
- Show AI chat context and credit usage ([#25923](https://github.com/twentyhq/twenty/pull/25923)) by @Bonapara
- i18n - translations ([#25924](https://github.com/twentyhq/twenty/pull/25924)) by @github-actions
- Record sharing: inherited records follow the parent's complete access policy, in queries and events ([#25925](https://github.com/twentyhq/twenty/pull/25925)) by @martmull
- chore(security): bump curl/jq in the image and the npm packages flagged by Oneleet ([#25926](https://github.com/twentyhq/twenty/pull/25926)) by @charlesBochet
- Add readable admin feature flag names and descriptions ([#25927](https://github.com/twentyhq/twenty/pull/25927)) by @Bonapara
- Default demo accounts to the system theme ([#25928](https://github.com/twentyhq/twenty/pull/25928)) by @Bonapara
- chore(security): bump @faker-js/faker to 10 (HIGH Dependabot alert on an SLA clock) ([#25930](https://github.com/twentyhq/twenty/pull/25930)) by @charlesBochet
- chore(security): drop extract-zip (HIGH, past SLA, no fix) by lifting mintlify's puppeteer to 25 ([#25931](https://github.com/twentyhq/twenty/pull/25931)) by @charlesBochet
- chore: sync AI model catalog ([#25934](https://github.com/twentyhq/twenty/pull/25934)) by @github-actions
- feat(workflow): remove the See Active Version command menu item from workspaces ([#25938](https://github.com/twentyhq/twenty/pull/25938)) by @thomtrp
- Use primary text color for settings table identifying columns ([#25939](https://github.com/twentyhq/twenty/pull/25939)) by @Bonapara
- Add copy button on hover to Emails/Phones/Links in the record side panel ([#25940](https://github.com/twentyhq/twenty/pull/25940)) by @charlesBochet
- Clarify self-hosted pricing CTAs and Organization license keys ([#25941](https://github.com/twentyhq/twenty/pull/25941)) by @Bonapara
- fix(messaging): resolve an app channel's connectedAccount for app contexts ([#25942](https://github.com/twentyhq/twenty/pull/25942)) by @FelixMalfait
- test(messaging): cover the app-facing message channel API end to end ([#25945](https://github.com/twentyhq/twenty/pull/25945)) by @FelixMalfait
- Clarify model mode comparisons with an information popup ([#25947](https://github.com/twentyhq/twenty/pull/25947)) by @Bonapara
- Organize Twenty UI into primitive families ([#25948](https://github.com/twentyhq/twenty/pull/25948)) by @bosiraphael
- i18n - translations ([#25949](https://github.com/twentyhq/twenty/pull/25949)) by @github-actions
- i18n - translations ([#25950](https://github.com/twentyhq/twenty/pull/25950)) by @github-actions
- i18n - translations ([#25952](https://github.com/twentyhq/twenty/pull/25952)) by @github-actions
- i18n - translations ([#25953](https://github.com/twentyhq/twenty/pull/25953)) by @github-actions
- Read forwarded email bodies like the mailbox importers do ([#25954](https://github.com/twentyhq/twenty/pull/25954)) by @neo773
- i18n - translations ([#25955](https://github.com/twentyhq/twenty/pull/25955)) by @github-actions
- i18n - website translations ([#25956](https://github.com/twentyhq/twenty/pull/25956)) by @github-actions
- i18n - translations ([#25958](https://github.com/twentyhq/twenty/pull/25958)) by @github-actions
- i18n - website translations ([#25960](https://github.com/twentyhq/twenty/pull/25960)) by @github-actions
- Complete Organization naming in settings and activation ([#25961](https://github.com/twentyhq/twenty/pull/25961)) by @Bonapara
- Scope application file uploads to the registration owner ([#25962](https://github.com/twentyhq/twenty/pull/25962)) by @prastoin
- Split the admin application registration update input ([#25963](https://github.com/twentyhq/twenty/pull/25963)) by @prastoin
- Record sharing: gate events through one access policy entry point ([#25964](https://github.com/twentyhq/twenty/pull/25964)) by @martmull
- Pin catalog sync to a registration's own source package ([#25965](https://github.com/twentyhq/twenty/pull/25965)) by @prastoin
- Derive permission universal identifiers from their role and target ([#25966](https://github.com/twentyhq/twenty/pull/25966)) by @Weiko
- i18n - website translations ([#25967](https://github.com/twentyhq/twenty/pull/25967)) by @github-actions
- Redesign the marketplace app detail page ([#25969](https://github.com/twentyhq/twenty/pull/25969)) by @martmull
- i18n - translations ([#25971](https://github.com/twentyhq/twenty/pull/25971)) by @github-actions
- revert(email-tool): restore the default sender resolution ([#25972](https://github.com/twentyhq/twenty/pull/25972)) by @etiennejouan
- i18n - translations ([#25973](https://github.com/twentyhq/twenty/pull/25973)) by @github-actions
- [1/2 Sidebar] New layout ([#25974](https://github.com/twentyhq/twenty/pull/25974)) by @Bonapara
- Export roles, permissions and permission flags ([#25975](https://github.com/twentyhq/twenty/pull/25975)) by @Weiko
- Use Twenty UI components in presentation stories ([#25976](https://github.com/twentyhq/twenty/pull/25976)) by @bosiraphael
- Desktop Recorder: align merged integration and UI naming conventions ([#25977](https://github.com/twentyhq/twenty/pull/25977)) by @Bonapara
- i18n - translations ([#25979](https://github.com/twentyhq/twenty/pull/25979)) by @github-actions
- Document data display primitives ([#25980](https://github.com/twentyhq/twenty/pull/25980)) by @bosiraphael
- i18n - website translations ([#25981](https://github.com/twentyhq/twenty/pull/25981)) by @github-actions
- Export row-level permission predicates and groups ([#25984](https://github.com/twentyhq/twenty/pull/25984)) by @Weiko
- i18n - translations ([#25985](https://github.com/twentyhq/twenty/pull/25985)) by @github-actions
- Share CSV formatting and composite field labels ([#25986](https://github.com/twentyhq/twenty/pull/25986)) by @Weiko
- i18n - translations ([#25990](https://github.com/twentyhq/twenty/pull/25990)) by @github-actions
- Write roles and permission flags on pull ([#25994](https://github.com/twentyhq/twenty/pull/25994)) by @Weiko
- Use a twenty-bounce MAIL FROM subdomain for new sending domains ([#25995](https://github.com/twentyhq/twenty/pull/25995)) by @neo773
- Show sending domain DNS records as a status list and a records table ([#25996](https://github.com/twentyhq/twenty/pull/25996)) by @neo773
- i18n - translations ([#25999](https://github.com/twentyhq/twenty/pull/25999)) by @github-actions
- Use Twenty UI buttons in Menu and Popover stories ([#26001](https://github.com/twentyhq/twenty/pull/26001)) by @bosiraphael
- Remove unused view delete mutations from the front ([#26003](https://github.com/twentyhq/twenty/pull/26003)) by @Weiko
- i18n - translations ([#26004](https://github.com/twentyhq/twenty/pull/26004)) by @github-actions
- fix(upgrade): pin 2.20 messageList view command to its original columns ([#26006](https://github.com/twentyhq/twenty/pull/26006)) by @prastoin
- Fix custom domain settings spacing ([#26007](https://github.com/twentyhq/twenty/pull/26007)) by @Bonapara
- Show shortcuts in command menu button tooltips ([#26009](https://github.com/twentyhq/twenty/pull/26009)) by @Bonapara
- i18n - translations ([#26010](https://github.com/twentyhq/twenty/pull/26010)) by @github-actions
- Clip the toast progress overlay to the toast corners ([#26012](https://github.com/twentyhq/twenty/pull/26012)) by @neo773
- i18n - translations ([#26013](https://github.com/twentyhq/twenty/pull/26013)) by @github-actions
- fix(front-component-renderer): forward React 18 camelCase attributes on remote elements ([#26015](https://github.com/twentyhq/twenty/pull/26015)) by @abdulrahmancodes
- fix(messaging): enforce CRLF line endings on raw outbound messages and surface IMAP append error responseText (#26011) ([#26017](https://github.com/twentyhq/twenty/pull/26017)) by @Dewin
- i18n - translations ([#26018](https://github.com/twentyhq/twenty/pull/26018)) by @github-actions
- Record sharing: fail closed on unresolved row predicates, gate application events on the role, run dashboard duplication under the caller ([#26021](https://github.com/twentyhq/twenty/pull/26021)) by @martmull
- i18n - translations ([#26022](https://github.com/twentyhq/twenty/pull/26022)) by @github-actions
- Require client authentication for OAuth token introspection ([#26023](https://github.com/twentyhq/twenty/pull/26023)) by @charlesBochet
- Consume the OAuth authorization code atomically ([#26025](https://github.com/twentyhq/twenty/pull/26025)) by @charlesBochet
- Block system and relation fields on workspace member settings update ([#26026](https://github.com/twentyhq/twenty/pull/26026)) by @charlesBochet
- Enforce UNLISTED view visibility when resolving query params ([#26027](https://github.com/twentyhq/twenty/pull/26027)) by @charlesBochet
- chore: sync AI model catalog ([#26033](https://github.com/twentyhq/twenty/pull/26033)) by @github-actions
- Expose minimum likelihood in enrichment workflows ([#26040](https://github.com/twentyhq/twenty/pull/26040)) by @bosiraphael
- fix(workflow): stop reporting user-facing step errors to Sentry ([#26041](https://github.com/twentyhq/twenty/pull/26041)) by @charlesBochet
- Clarify twenty-ui setup in the README ([#26044](https://github.com/twentyhq/twenty/pull/26044)) by @bosiraphael
- Split Twenty UI docs into primitives and components ([#26045](https://github.com/twentyhq/twenty/pull/26045)) by @bosiraphael
- i18n - translations ([#26050](https://github.com/twentyhq/twenty/pull/26050)) by @github-actions
- i18n - translations ([#26051](https://github.com/twentyhq/twenty/pull/26051)) by @github-actions
- Skip participant matching jobs when no person email is involved ([#26058](https://github.com/twentyhq/twenty/pull/26058)) by @neo773
- Show contact auto-creation and sync options on shared mailboxes ([#26059](https://github.com/twentyhq/twenty/pull/26059)) by @neo773
- Honor exclude group emails on shared mailboxes ([#26060](https://github.com/twentyhq/twenty/pull/26060)) by @neo773
- i18n - translations ([#26061](https://github.com/twentyhq/twenty/pull/26061)) by @github-actions
- Document controlled and uncontrolled UI state ([#26062](https://github.com/twentyhq/twenty/pull/26062)) by @bosiraphael
- fix(rest): forward flatIndexMaps to the merge query runner ([#26063](https://github.com/twentyhq/twenty/pull/26063)) by @charlesBochet
- Document Twenty UI anatomy and composition ([#26066](https://github.com/twentyhq/twenty/pull/26066)) by @bosiraphael
- i18n - translations ([#26067](https://github.com/twentyhq/twenty/pull/26067)) by @github-actions
- Disable play functions in UI documentation examples ([#26069](https://github.com/twentyhq/twenty/pull/26069)) by @bosiraphael
- Make record sharing an enterprise feature ([#26070](https://github.com/twentyhq/twenty/pull/26070)) by @martmull
- feat(last-contact): run database event triggers in batch mode ([#26072](https://github.com/twentyhq/twenty/pull/26072)) by @martmull
- Keep default domain deep links through sign-in and workspace selection ([#26073](https://github.com/twentyhq/twenty/pull/26073)) by @martmull
- i18n - translations ([#26074](https://github.com/twentyhq/twenty/pull/26074)) by @github-actions
- refactor(server): bind resolved application packages to their registration ([#26077](https://github.com/twentyhq/twenty/pull/26077)) by @prastoin
- Cache billing entitlements in the workspace cache ([#26078](https://github.com/twentyhq/twenty/pull/26078)) by @Weiko
- i18n - translations ([#26079](https://github.com/twentyhq/twenty/pull/26079)) by @github-actions
- Embed MainButton and LightButton stories in docs ([#26089](https://github.com/twentyhq/twenty/pull/26089)) by @bosiraphael
- fix(workflow): unblock the 2-41 See Active Version removal on workspaces that still have the item ([#26090](https://github.com/twentyhq/twenty/pull/26090)) by @thomtrp
- Add website release notes for 2.39 and 2.40 ([#26092](https://github.com/twentyhq/twenty/pull/26092)) by @Bonapara
- i18n - website translations ([#26093](https://github.com/twentyhq/twenty/pull/26093)) by @github-actions
- Add website release notes for 2.27 and 2.34 ([#26094](https://github.com/twentyhq/twenty/pull/26094)) by @Bonapara
- i18n - website translations ([#26095](https://github.com/twentyhq/twenty/pull/26095)) by @github-actions
- i18n - website translations ([#26096](https://github.com/twentyhq/twenty/pull/26096)) by @github-actions

</details>

**Full Changelog**: https://github.com/twentyhq/twenty/compare/twenty/v2.40.0...twenty/v2.41.0

Related Repositories