⚠️ Breaking changes
- [BREAKING_CHANGE] Ship the Conversations tab and workflow inbox messages under the inbox flag (#27830) by @FelixMalfait
- [BREAKING_CHANGE] Unpin chat Share and drop the AI chat sharing dropdown flag (#27832) by @FelixMalfait
- Add widgetAvailability to front components (#27841) by @martmull
- Reject records-API writes on workflow and workflowVersion (#27855) by @thomtrp
- Remove the legacy workspace-id workflow GraphQL API (#27856) by @thomtrp
- Accept [BREAKING_CHANGE] titles and stop flagging feature flag removals in the API breaking change check (#27859) by @FelixMalfait
- fix(admin-panel): look up admin chat threads in the workspace from the route (#27901) by @etiennejouan
✨ New features
- feat(campaigns): add selected people or a whole People view to a campaign list (#26823) by @neo773
- feat(teams): answer Teams assistant requests (#27811) by @abdulrahmancodes
- feat(apps): hide marketplace apps the server version does not satisfy (#27843) by @martmull
- feat(usage-limit): set quota and stock default values per billing plan (#27890) by @etiennejouan
💅 Improvements & UX
- Fix JSON filter (#26589) by @BOHEUS
- Show unique and total clicks and opens on campaigns (#26875) by @neo773
- Track campaign opens (#26938) by @neo773
- Make TipTap email documents the only outbound email body format (#26981) by @neo773
- Fix record gql fields typing (#27069) by @BOHEUS
- fix force redirect with Navigate (#27130) by @minnibaevB
- Add people to a campaign list with a background job (#27276) by @neo773
- Align agent execution with caller context (#27394) by @prastoin
- refactor(usage-limit) - quota counters hold consumption; allowance cap from the workspace cache (#27479) by @etiennejouan
- Support ImageInput file selection in the front component renderer (#27588) by @bosiraphael
- Let the AI agent build validation rules from the side panel (#27635) by @thomtrp
- Link Teams transcripts to their calendar event by Microsoft Graph event id (#27676) by @ehconitin
- Add Persian locale (#27684) by @BOHEUS
- Skip standby aggregate queries when refetching after record changes (#27691) by @FelixMalfait
- Align log console access and retention with plans (#27696) by @martmull
- Let application workflows run on a schedule (#27699) by @thomtrp
- Let application workflows run on record events (#27700) by @thomtrp
- Replace Pill and NotificationCounter with Badge (#27702) by @bosiraphael
- Complete radio and segmented selection (#27707) by @bosiraphael
- Preserve native edits across renderer updates (#27726) by @bosiraphael
- Align Tabs with Base UI (#27732) by @bosiraphael
- Remove the WhatsApp and Calls Soon tabs from Communication settings (#27733) by @Bonapara
- Expose NumberField and retain NumberStepper (#27734) by @bosiraphael
- Stop stacking record creation forms on repeated Create clicks (#27736) by @thomtrp
- Complete Select public parts (#27741) by @bosiraphael
- Normalize saved view filter values for query resolution (#27742) by @FelixMalfait
- Batch global admin chat report transactions (#27746) by @FelixMalfait
- Stop selecting agent.evaluationInputs once the 2.47 drop has run (#27748) by @charlesBochet
- Derive persisted record filter types from field metadata like views (#27754) by @FelixMalfait
- Last contact 1.9.1: stop restoring trashed people, skip unchanged writes (#27755) by @martmull
- Add missing translation keys (#27759) by @BOHEUS
- Rename morph relations (#27760) by @BOHEUS
- Fix ordering for view sort replacements (#27764) by @FelixMalfait
- Wait for popup visibility in disabled item stories (#27766) by @FelixMalfait
- Fix cascade-before-update ordering in workspace migrations (#27767) by @FelixMalfait
- Fix table skeleton cells overflowing into the next column (#27768) by @ehconitin
- Remove the 2.45/2.46 chat upgrade fences and fallbacks (#27779) by @FelixMalfait
- Drop usage limit meter compatibility in 2.47 (#27780) by @FelixMalfait
- Add OSS Scanner build and threat model (#27781) by @FelixMalfait
- Identify chat owners and senders by workspace member, and drop the legacy chat columns (#27783) by @FelixMalfait
- Follow shared chats only when taking part in them, and track what members read (#27786) by @FelixMalfait
- Spell out the security contact email in SECURITY.md (#27789) by @FelixMalfait
- Show workspace members by name or email through one helper (#27791) by @FelixMalfait
- Type RolePermissionConfig by role source (#27805) by @prastoin
- Complete Autocomplete parts (#27806) by @bosiraphael
- Remove leftover in Admin Panel (#27812) by @BOHEUS
- Show the real remaining count on relation card widgets (#27813) by @charlesBochet
- Fix double highlight on view picker rows (#27816) by @Bonapara
- Gate validation rules behind the Organization plan (#27818) by @thomtrp
- Require the roles permission to pick a role when sending invitations (#27820) by @thomtrp
- Group pending invoice items monthly for invoice-paying subscriptions (#27826) by @ijreilly
- Let invoice-paying customers end their trial without a card (#27827) by @ijreilly
- Add Teams user link object (#27828) by @abdulrahmancodes
- Unify Progress semantics and move onboarding motion (#27831) by @bosiraphael
- feat(billing) : store the ?partner= sign-up attribution on the Stripe customer (#27836) by @etiennejouan
- Revert the browser-bound application claim state (#26214) (#27837) by @martmull
- Keep app update tag visible in installed apps list (#27838) by @martmull
- Order application workflow steps by application and label (#27839) by @martmull
- Show validation rule messages under their field in the record creation form (#27840) by @thomtrp
- Keep add-people-to-message-list spec from flooding the workflow queue (#27842) by @FelixMalfait
- Ask consent to bill credits when installing an app (#27844) by @martmull
- Add Toast updates and status naming (#27846) by @bosiraphael
- Make the workflow editor hooks core-only (#27852) by @thomtrp
- Make workflow commands, navigation and pages core-only (#27853) by @thomtrp
- Remove the legacy workflow trigger and version workspace services (#27857) by @thomtrp
- Remove the legacy workflow step and edge workspace services (#27858) by @thomtrp
- Show core workflow and version on the workflow runs index (#27861) by @thomtrp
- Remove tabs from marketplace app detail page (#27868) by @martmull
- Fix oversized icon in side panel switch rows (#27869) by @FelixMalfait
- Sort admin apps by attention and show author and install count (#27871) by @martmull
- Navigate the inbox with the arrow keys (#27875) by @FelixMalfait
- Show application logo on fields, views, widgets and created-by actor (#27876) by @martmull
- Remove the workflow drift check, the workspace statuses job and the workspace-to-core sync listener (#27879) by @thomtrp
- Activate and deactivate workflows without writing workspace rows (#27880) by @thomtrp
- Write workflow version content and drafts to core only (#27881) by @thomtrp
- Create, rename, duplicate and delete workflows in core only (#27882) by @thomtrp
- Remove the dead workflow mirror write code (#27883) by @thomtrp
- Seed and prefill workflows in core only (#27884) by @thomtrp
- Keep AI chat thinking signatures valid across turns (#27888) by @charlesBochet
- Speed up switching between record table views (#27897) by @charlesBochet
- Use Teams user links when matching the sender (#27898) by @abdulrahmancodes
- Put twenty-ui styles in a cascade layer (#27899) by @bosiraphael
- Use the existing banner and field error components for validation rule messages (#27906) by @thomtrp
- Add a route to remove Teams user links (#27909) by @abdulrahmancodes
- Take row-level rules from the roles the permission config intersects (#27911) by @prastoin
- Fix application author display when the manifest carries an npm-style author object (#27918) by @martmull
- Only measure overflowing lists while their count can show (#27923) by @charlesBochet
- Enable initial object views on new workspaces (#27924) by @thomtrp
- Bump claude-code-action and Claude Code (#27928) by @neo773
- Only add Bedrock cache points for Claude models (#27929) by @charlesBochet
- Make Toast timing deterministic (#27930) by @bosiraphael
- Fix Kanban icon (#27936) by @BOHEUS
- Keep the role permission config on the workspace repository (#27942) by @prastoin
- Resolve the connected account when an email is clicked, not per cell (#27947) by @charlesBochet
- Wait for Select popup transitions (#27950) by @bosiraphael
- Read waiting job ids without loading job data in the BullMQ driver (#27955) by @charlesBochet
- Make table cell and skeleton styles static and add a block Skeleton layout (#27957) by @charlesBochet
- MCP: fix soft-delete generated tools (#27962) by @BOHEUS
- Make filter validation errors actionable for AI agents (#27963) by @BOHEUS
🐛 Bug fixes
- fix(front): lay phone numbers out left to right in RTL locales (#27006) by @almoghazaz-cell
- fix(billing): surface checkoutSession GraphQL errors in toast (#27018) by @evanliuuu
- fix(ui): truncate LTR values at their end in RTL layouts (#27059) by @almoghazaz-cell
- fix(cli): remove legacy CLI config migration (#27085) by @Sameer7-s
- fix: use overflow clip on app layout to stop side-panel shift (#27112) by @hussnainahmedd
- fix(server): sync userWorkspace.locale when a workspace member's locale is updated through the record API (#27245) by @slavarosin
- fix(website): bump @opennextjs/cloudflare to 1.20.8 for Next 16.3.8 cache keys (#27751) by @FelixMalfait
- fix(usage-limit): no workspace record or storage limit when the config variable is unset (#27803) by @etiennejouan
- fix(workspace-cleaner): never warn members of a soft-deleted workspace (#27814) by @etiennejouan
- fix(workflow): skip not-taken if/else branch targets also listed in the step's nextStepIds (#27833) by @thomtrp
- fix(cli): lock the app template with the pins the publish check verified (#27864) by @Weiko
- fix(server): sample AI SDK v7 agent spans at 100% in Sentry (#27913) by @etiennejouan
- fix(admin-panel): drop the admin panel global AI chats list (#27920) by @etiennejouan
- fix(cli): report the Node requirement when launched with npx (#27932) by @Weiko
🔧 Developer & API
- Stop registering dynamic record cache fragments with graphql-tag (#27690) by @FelixMalfait
- Adopt gpt-6-luna for the cheap tier (dev, staging, self-host) (#27763) by @twenty-pr-author
- Remove unused Menu API (#27815) by @bosiraphael
- Move workflow execution integration tests to the core workflow API (#27848) by @thomtrp
- Move workflow node, core workflow, lifecycle and permission integration tests to the core workflow API (#27849) by @thomtrp
- Deprecate the SDK CLI and create-twenty-app (#27862) by @Weiko
- Align CLI version with Twenty 2.46.0 (#27905) by @Weiko
- Let Bedrock AI providers authenticate with a Bedrock API key (#27907) by @charlesBochet
- Skip cli-test in the merge queue (#27908) by @prastoin
- Skip cli-package-test in the merge queue (#27910) by @prastoin
- Let application workflows start from a webhook (#27933) by @thomtrp
🏗️ Internal changes (11)
- chore(twenty-ui): declare storybook as a devDependency (#27697) by @abdulrahmancodes
- ci(website): serve the built Worker in workerd and smoke-test real pages (#27756) by @FelixMalfait
- chore(security): bump handlebars to 4.7.10 (#27765) by @mabdullahabaid
- chore(security): bump simple-git to 4.0.2 (#27769) by @mabdullahabaid
- chore(security): bump source-map-js to 1.2.2 (#27770) by @mabdullahabaid
- chore(security): bump oxfmt to 0.72.0 and reformat (#27772) by @mabdullahabaid
- chore(security): bump nx to 22.7.12 and smol-toml to 1.9.0 (#27782) by @mabdullahabaid
- refactor(usage-limit): stock counters hold what is held, keyed by scope (#27866) by @etiennejouan
- docs: list the Microsoft scopes Twenty actually requests (#27904) by @neo773
- refactor(usage-limit): import billing directly instead of discovering its providers (#27926) by @etiennejouan
- chore(cli): bump the twenty package to 2.47.0 (#27940) by @Weiko
🎉 New contributors
- @evanliuuu made their first contribution in #27018
- @hussnainahmedd made their first contribution in #27112
- @Sameer7-s made their first contribution in #27085
- @slavarosin made their first contribution in #27245
Full changelog (160 PRs)
- Fix JSON filter (#26589) by @BOHEUS
- feat(campaigns): add selected people or a whole People view to a campaign list (#26823) by @neo773
- Show unique and total clicks and opens on campaigns (#26875) by @neo773
- Track campaign opens (#26938) by @neo773
- Make TipTap email documents the only outbound email body format (#26981) by @neo773
- fix(front): lay phone numbers out left to right in RTL locales (#27006) by @almoghazaz-cell
- fix(billing): surface checkoutSession GraphQL errors in toast (#27018) by @evanliuuu
- fix(ui): truncate LTR values at their end in RTL layouts (#27059) by @almoghazaz-cell
- Fix record gql fields typing (#27069) by @BOHEUS
- fix(cli): remove legacy CLI config migration (#27085) by @Sameer7-s
- fix: use overflow clip on app layout to stop side-panel shift (#27112) by @hussnainahmedd
- fix force redirect with Navigate (#27130) by @minnibaevB
- fix(server): sync userWorkspace.locale when a workspace member's locale is updated through the record API (#27245) by @slavarosin
- Add people to a campaign list with a background job (#27276) by @neo773
- Align agent execution with caller context (#27394) by @prastoin
- refactor(usage-limit) - quota counters hold consumption; allowance cap from the workspace cache (#27479) by @etiennejouan
- Support ImageInput file selection in the front component renderer (#27588) by @bosiraphael
- Let the AI agent build validation rules from the side panel (#27635) by @thomtrp
- Link Teams transcripts to their calendar event by Microsoft Graph event id (#27676) by @ehconitin
- Add Persian locale (#27684) by @BOHEUS
- Stop registering dynamic record cache fragments with graphql-tag (#27690) by @FelixMalfait
- Skip standby aggregate queries when refetching after record changes (#27691) by @FelixMalfait
- Align log console access and retention with plans (#27696) by @martmull
- chore(twenty-ui): declare storybook as a devDependency (#27697) by @abdulrahmancodes
- Let application workflows run on a schedule (#27699) by @thomtrp
- Let application workflows run on record events (#27700) by @thomtrp
- Replace Pill and NotificationCounter with Badge (#27702) by @bosiraphael
- Complete radio and segmented selection (#27707) by @bosiraphael
- Preserve native edits across renderer updates (#27726) by @bosiraphael
- Align Tabs with Base UI (#27732) by @bosiraphael
- Remove the WhatsApp and Calls Soon tabs from Communication settings (#27733) by @Bonapara
- Expose NumberField and retain NumberStepper (#27734) by @bosiraphael
- chore: bump version to 2.47.0 (#27735) by @twenty-pr
- Stop stacking record creation forms on repeated Create clicks (#27736) by @thomtrp
- i18n - translations (#27737) by @github-actions
- i18n - translations (#27740) by @github-actions
- Complete Select public parts (#27741) by @bosiraphael
- Normalize saved view filter values for query resolution (#27742) by @FelixMalfait
- Batch global admin chat report transactions (#27746) by @FelixMalfait
- i18n - translations (#27747) by @github-actions
- Stop selecting agent.evaluationInputs once the 2.47 drop has run (#27748) by @charlesBochet
- i18n - translations (#27750) by @github-actions
- fix(website): bump @opennextjs/cloudflare to 1.20.8 for Next 16.3.8 cache keys (#27751) by @FelixMalfait
- Derive persisted record filter types from field metadata like views (#27754) by @FelixMalfait
- Last contact 1.9.1: stop restoring trashed people, skip unchanged writes (#27755) by @martmull
- ci(website): serve the built Worker in workerd and smoke-test real pages (#27756) by @FelixMalfait
- i18n - translations (#27757) by @github-actions
- i18n - translations (#27758) by @github-actions
- Add missing translation keys (#27759) by @BOHEUS
- Rename morph relations (#27760) by @BOHEUS
- chore: sync AI model catalog (#27761) by @github-actions
- Adopt gpt-6-luna for the cheap tier (dev, staging, self-host) (#27763) by @twenty-pr-author
- Fix ordering for view sort replacements (#27764) by @FelixMalfait
- chore(security): bump handlebars to 4.7.10 (#27765) by @mabdullahabaid
- Wait for popup visibility in disabled item stories (#27766) by @FelixMalfait
- Fix cascade-before-update ordering in workspace migrations (#27767) by @FelixMalfait
- Fix table skeleton cells overflowing into the next column (#27768) by @ehconitin
- chore(security): bump simple-git to 4.0.2 (#27769) by @mabdullahabaid
- chore(security): bump source-map-js to 1.2.2 (#27770) by @mabdullahabaid
- chore(security): bump oxfmt to 0.72.0 and reformat (#27772) by @mabdullahabaid
- chore: sync AI model catalog (#27773) by @github-actions
- Remove the 2.45/2.46 chat upgrade fences and fallbacks (#27779) by @FelixMalfait
- Drop usage limit meter compatibility in 2.47 (#27780) by @FelixMalfait
- Add OSS Scanner build and threat model (#27781) by @FelixMalfait
- chore(security): bump nx to 22.7.12 and smol-toml to 1.9.0 (#27782) by @mabdullahabaid
- Identify chat owners and senders by workspace member, and drop the legacy chat columns (#27783) by @FelixMalfait
- i18n - translations (#27784) by @github-actions
- Follow shared chats only when taking part in them, and track what members read (#27786) by @FelixMalfait
- Spell out the security contact email in SECURITY.md (#27789) by @FelixMalfait
- Show workspace members by name or email through one helper (#27791) by @FelixMalfait
- i18n - translations (#27801) by @github-actions
- chore: sync AI model catalog (#27802) by @github-actions
- fix(usage-limit): no workspace record or storage limit when the config variable is unset (#27803) by @etiennejouan
- Type RolePermissionConfig by role source (#27805) by @prastoin
- Complete Autocomplete parts (#27806) by @bosiraphael
- i18n - translations (#27808) by @github-actions
- i18n - translations (#27810) by @github-actions
- feat(teams): answer Teams assistant requests (#27811) by @abdulrahmancodes
- Remove leftover in Admin Panel (#27812) by @BOHEUS
- Show the real remaining count on relation card widgets (#27813) by @charlesBochet
- fix(workspace-cleaner): never warn members of a soft-deleted workspace (#27814) by @etiennejouan
- Remove unused Menu API (#27815) by @bosiraphael
- Fix double highlight on view picker rows (#27816) by @Bonapara
- Gate validation rules behind the Organization plan (#27818) by @thomtrp
- Require the roles permission to pick a role when sending invitations (#27820) by @thomtrp
- Group pending invoice items monthly for invoice-paying subscriptions (#27826) by @ijreilly
- Let invoice-paying customers end their trial without a card (#27827) by @ijreilly
- Add Teams user link object (#27828) by @abdulrahmancodes
- [BREAKING_CHANGE] Ship the Conversations tab and workflow inbox messages under the inbox flag (#27830) by @FelixMalfait
- Unify Progress semantics and move onboarding motion (#27831) by @bosiraphael
- [BREAKING_CHANGE] Unpin chat Share and drop the AI chat sharing dropdown flag (#27832) by @FelixMalfait
- fix(workflow): skip not-taken if/else branch targets also listed in the step's nextStepIds (#27833) by @thomtrp
- feat(billing) : store the ?partner= sign-up attribution on the Stripe customer (#27836) by @etiennejouan
- Revert the browser-bound application claim state (#26214) (#27837) by @martmull
- Keep app update tag visible in installed apps list (#27838) by @martmull
- Order application workflow steps by application and label (#27839) by @martmull
- Show validation rule messages under their field in the record creation form (#27840) by @thomtrp
- Add widgetAvailability to front components (#27841) by @martmull
- Keep add-people-to-message-list spec from flooding the workflow queue (#27842) by @FelixMalfait
- feat(apps): hide marketplace apps the server version does not satisfy (#27843) by @martmull
- Ask consent to bill credits when installing an app (#27844) by @martmull
- Add Toast updates and status naming (#27846) by @bosiraphael
- Move workflow execution integration tests to the core workflow API (#27848) by @thomtrp
- Move workflow node, core workflow, lifecycle and permission integration tests to the core workflow API (#27849) by @thomtrp
- Make the workflow editor hooks core-only (#27852) by @thomtrp
- Make workflow commands, navigation and pages core-only (#27853) by @thomtrp
- Reject records-API writes on workflow and workflowVersion (#27855) by @thomtrp
- Remove the legacy workspace-id workflow GraphQL API (#27856) by @thomtrp
- Remove the legacy workflow trigger and version workspace services (#27857) by @thomtrp
- Remove the legacy workflow step and edge workspace services (#27858) by @thomtrp
- Accept [BREAKING_CHANGE] titles and stop flagging feature flag removals in the API breaking change check (#27859) by @FelixMalfait
- Show core workflow and version on the workflow runs index (#27861) by @thomtrp
- Deprecate the SDK CLI and create-twenty-app (#27862) by @Weiko
- fix(cli): lock the app template with the pins the publish check verified (#27864) by @Weiko
- refactor(usage-limit): stock counters hold what is held, keyed by scope (#27866) by @etiennejouan
- Remove tabs from marketplace app detail page (#27868) by @martmull
- Fix oversized icon in side panel switch rows (#27869) by @FelixMalfait
- Sort admin apps by attention and show author and install count (#27871) by @martmull
- Navigate the inbox with the arrow keys (#27875) by @FelixMalfait
- Show application logo on fields, views, widgets and created-by actor (#27876) by @martmull
- Remove the workflow drift check, the workspace statuses job and the workspace-to-core sync listener (#27879) by @thomtrp
- Activate and deactivate workflows without writing workspace rows (#27880) by @thomtrp
- Write workflow version content and drafts to core only (#27881) by @thomtrp
- Create, rename, duplicate and delete workflows in core only (#27882) by @thomtrp
- Remove the dead workflow mirror write code (#27883) by @thomtrp
- Seed and prefill workflows in core only (#27884) by @thomtrp
- Keep AI chat thinking signatures valid across turns (#27888) by @charlesBochet
- feat(usage-limit): set quota and stock default values per billing plan (#27890) by @etiennejouan
- Speed up switching between record table views (#27897) by @charlesBochet
- Use Teams user links when matching the sender (#27898) by @abdulrahmancodes
- Put twenty-ui styles in a cascade layer (#27899) by @bosiraphael
- fix(admin-panel): look up admin chat threads in the workspace from the route (#27901) by @etiennejouan
- docs: list the Microsoft scopes Twenty actually requests (#27904) by @neo773
- Align CLI version with Twenty 2.46.0 (#27905) by @Weiko
- Use the existing banner and field error components for validation rule messages (#27906) by @thomtrp
- Let Bedrock AI providers authenticate with a Bedrock API key (#27907) by @charlesBochet
- Skip cli-test in the merge queue (#27908) by @prastoin
- Add a route to remove Teams user links (#27909) by @abdulrahmancodes
- Skip cli-package-test in the merge queue (#27910) by @prastoin
- Take row-level rules from the roles the permission config intersects (#27911) by @prastoin
- fix(server): sample AI SDK v7 agent spans at 100% in Sentry (#27913) by @etiennejouan
- Fix application author display when the manifest carries an npm-style author object (#27918) by @martmull
- fix(admin-panel): drop the admin panel global AI chats list (#27920) by @etiennejouan
- Only measure overflowing lists while their count can show (#27923) by @charlesBochet
- Enable initial object views on new workspaces (#27924) by @thomtrp
- refactor(usage-limit): import billing directly instead of discovering its providers (#27926) by @etiennejouan
- Bump claude-code-action and Claude Code (#27928) by @neo773
- Only add Bedrock cache points for Claude models (#27929) by @charlesBochet
- Make Toast timing deterministic (#27930) by @bosiraphael
- fix(cli): report the Node requirement when launched with npx (#27932) by @Weiko
- Let application workflows start from a webhook (#27933) by @thomtrp
- Fix Kanban icon (#27936) by @BOHEUS
- chore(cli): bump the twenty package to 2.47.0 (#27940) by @Weiko
- Keep the role permission config on the workspace repository (#27942) by @prastoin
- Resolve the connected account when an email is clicked, not per cell (#27947) by @charlesBochet
- Wait for Select popup transitions (#27950) by @bosiraphael
- Read waiting job ids without loading job data in the BullMQ driver (#27955) by @charlesBochet
- Make table cell and skeleton styles static and add a block Skeleton layout (#27957) by @charlesBochet
- MCP: fix soft-delete generated tools (#27962) by @BOHEUS
- Make filter validation errors actionable for AI agents (#27963) by @BOHEUS
Full Changelog: twenty/v2.46.0...twenty/v2.47.0