⚠️ Breaking changes
- Let apps connect accounts through their own authorization flow (#28672) by @FelixMalfait
- chore(security): bump vite to 8.3.5 in the app lockfiles (#28798) by @mabdullahabaid
- chore(security): bump twenty-companion vite to 7.3.7 (#28801) by @mabdullahabaid
- chore(security): bump undici in the app lockfiles (#28802) by @mabdullahabaid
- chore(security): bump undici in the root lockfile (#28805) by @mabdullahabaid
- chore(security): bump zod to 4.6.7 in the fathom, fireflies and granola apps (#28807) by @mabdullahabaid
💅 Improvements & UX
- feat(billing): lead the Plans page comparison with plan essentials (#28843) by @etiennejouan
- Let members manage personal app connections from App preferences (#28418) by @ehconitin
- Keep code step outputs when the code is saved and remove the link output schema (#28432) by @ghazy2001
- Pass fieldMetadataId in if/else workflow node (#28443) by @BOHEUS
- Report a superseded session as superseded when its revocation races the request (#28462) by @DamienFoulon
- Fix app sync recreating search rows that already exist (#28494) by @jackeddisciple
- Link a sent email to the record it was sent from (#28554) by @FelixMalfait
- Show only workspace-shared connections in app settings (#28556) by @ehconitin
- Build inbox thread details and sharing (#28565) by @bosiraphael
- Add global chat commands (#28567) by @bosiraphael
- Move the Slack app to twenty-ui 2.x and use its Skeleton (#28604) by @abdulrahmancodes
- Migrate the metadata tools to @definetool (#28631) by @prastoin
- Clarify DPA, AI and access answers in the Legal FAQ and pricing page (#28640) by @ijreilly
- Migrate multiple record pickers (#28643) by @bosiraphael
- Use twenty-ui date picker in the frontend (#28649) by @bosiraphael
- Allow npm publishing from protected release branches (#28677) by @FelixMalfait
- Mask restricted calendar events and messages in nested relations and groupBy (#28679) by @charlesBochet
- Add batch approval review components (#28684) by @bosiraphael
- Bring back toggles, nested blocks, deeper headings and table controls in rich text notes (#28687) by @neo773
- Remove IS_APPLICATION_MONITORING_ENABLED feature flag (#28688) by @martmull
- Remove the main sources of server integration shard flakiness (#28689) by @martmull
- Add email approval review (#28691) by @bosiraphael
- Give the rebuilt user auth context its full workspace (#28692) by @prastoin
- Stabilize frontend Storybook interactions (#28693) by @bosiraphael
- Keep non-email participant links when a person's emails change (#28694) by @FelixMalfait
- Match app channel participants on a declared person field (#28696) by @FelixMalfait
- Backfill frontend dependencies for existing Workspace apps (#28698) by @Weiko
- Show weekly AI user credits in AI chat (#28700) by @etiennejouan
- Balance server integration shards by recorded duration (#28702) by @neo773
- Let usage limit defaults override the plan while trialing (#28703) by @etiennejouan
- Bring back row and column controls in rich text tables (#28704) by @neo773
- Keep app uninstall hook failures out of Sentry (#28705) by @charlesBochet
- Fix workspace data export S3 upload and show exports on the admin user page (#28706) by @charlesBochet
- Keep sensitive-path maintainer approvals valid after pushes (#28707) by @FelixMalfait
- Replace the generic multi-item field inputs with composable bricks (#28708) by @charlesBochet
- Keep the front metadata store consistent across out-of-order updates (#28711) by @charlesBochet
- Refresh Resources menu previews and the homepage logo row (#28713) by @Bonapara
- Close the inbox conversation pane (#28716) by @bosiraphael
- Remove async CSV export feature flag (#28717) by @Weiko
- Hide app settings tab bar when General is the only tab (#28720) by @martmull
- Redesign the docs to match the website (#28733) by @Bonapara
- Edit list values and link labels in place in multi-item cell editors (#28734) by @charlesBochet
- Show the app error fallback for errors React Router catches (#28747) by @charlesBochet
- Restore JSX attributes Crowdin translated in docs pages (#28749) by @Bonapara
- Apply workflow step edits to the draft's own logic function or agent (#28750) by @charlesBochet
- Split the multi-item draft hook into focused bricks (#28751) by @charlesBochet
- Fix bulk update of emptied list fields, full name pasting and address separators (#28752) by @charlesBochet
- Edit emails and array values as lists in the record form (#28753) by @charlesBochet
- Show partial domain setup on the email channel list (#28754) by @neo773
- Add an Email Channels docs page (#28755) by @neo773
- Edit phones, links, files and full name in the record form (#28757) by @charlesBochet
- Show address details on demand in the record form (#28765) by @charlesBochet
- Infer the code step input schema in the debounced save so keystrokes can't be saved out of order (#28766) by @charlesBochet
- Edit wrapping text in a text area and show the domain favicon in link inputs (#28767) by @charlesBochet
- Show a blue border on keyboard focus in form inputs, pickers and selects (#28769) by @charlesBochet
- Edit the full name in one input and show address details on demand in cell editors (#28773) by @charlesBochet
- Route any casing of host-sanitized props to their canonical key in front component host elements (#28774) by @charlesBochet
- Suggest addresses as you type in the record form address (#28775) by @charlesBochet
- Upload files by dropping them on the files field input (#28777) by @charlesBochet
- Require a first-person session for admin panel actions (#28779) by @charlesBochet
- Backfill record form widgets for files fields (#28780) by @charlesBochet
- Apply field read permissions to timeline activity properties (#28782) by @charlesBochet
- Block bulk update while a field input is in error (#28783) by @charlesBochet
- Resend requests rejected because a sign-in superseded their session (#28784) by @charlesBochet
- Make the True/False control full width in record forms (#28787) by @charlesBochet
- Ignore isSecret changes on existing application and server variables (#28800) by @prastoin
- Reject changes to non-comparable flat entity properties (#28803) by @prastoin
- Initialize application variable value at creation instead of in the manifest (#28808) by @prastoin
- Add configurable tags when creating Lambda functions (#28810) by @FelixMalfait
- Document that app development is only supported on Unix systems (#28817) by @prastoin
- Let the Teams assistant work with CRM records (#28832) by @abdulrahmancodes
- Give the Teams assistant the earlier turns of the conversation (#28833) by @abdulrahmancodes
- Remove the
as anycasts in 2 files of modules/ui/input/components/internal/date/components (#28838) by @twenty-pr-author - Application monitoring: legend totals and credits by operation type (#28847) by @martmull
- Fix follow-redirects in the Workspace upgrade snapshot (#28852) by @Weiko
- Seed Workspace applications with frontend dependencies (#28853) by @Weiko
- Remove the free trial for users already in 2 trial workspaces (#28859) by @etiennejouan
- Prebundle rich text editor extensions for Storybook (#28862) by @bosiraphael
- Add merge proposal review (#28863) by @bosiraphael
- Add scheduling and time-picker UI (#28865) by @bosiraphael
- Fix orphaned case study card on partner profiles (#28913) by @ijreilly
- Stop deleting provider domains Twenty did not create (#28914) by @neo773
- Serve campaign unsubscribe and tracked links on links.domain (#28915) by @neo773
- Add glass and metal materials to the halftone studio (#28918) by @Bonapara
- Let application workflows send email and create calendar events (#28920) by @FelixMalfait
- Fix integration specs that break on suites run before them in the same shard (#28921) by @etiennejouan
- Skip morph relation targets the role cannot read (#28922) by @neo773
- Skip application lifecycle scripts when building dependency layers (#28926) by @prastoin
- Let the workspace custom application's workflows call other apps' actions (#28927) by @FelixMalfait
- Fill the single full name input in the create record e2e test (#28928) by @charlesBochet
- Show the Admin role in the roles list again (#28946) by @prastoin
- Only offer junction targets the role can update in relation pickers (#28947) by @charlesBochet
- Fit the AI chat user credits banner on one line (#28949) by @etiennejouan
- Keep Avatar fallback icons within small avatars (#28973) by @bosiraphael
- Add admin status indicator to workspace users in admin panel (#28974) by @martmull
- Reject object names that are not stable under camelCase (#28978) by @FelixMalfait
- Restore native blur in front component menus (#28980) by @bosiraphael
- Add Teams app to Microsoft publisher domain association (#28983) by @neo773
- Match AI chat user bubbles to the design (#28984) by @bosiraphael
🐛 Bug fixes
- fix(front): pin record table columns with logical insets so they work in RTL (#28379) by @almoghazaz-cell
- fix(metadata-store): adopt new collection hash on replaceDraft when data is unchanged (#28412) by @ghazy2001
- fix(record-form): block submission when field input has validation error (#28425) by @ghazy2001
- fix(front): keep cached relation picker results clickable while Search refreshes (#28458) by @lineico
- fix(slack): show one content-shaped skeleton while the settings tab loads (#28493) by @abdulrahmancodes
- fix(twenty-shared): promote formatBytes to the next unit when rounding reaches 1024 (#28502) by @RaphaelFakhri
- fix(onboarding): add aria-labels to invite team email inputs (#28748) by @zacyungblut
🔧 Developer & API
- Move app tooling consumers to the standalone CLI (#28182) by @Weiko
- Remove the legacy SDK CLI and retire create-twenty-app (#28183) by @Weiko
- Let Granola uninstall when no API key was saved (#28680) by @charlesBochet
- Clean up remaining legacy SDK CLI references (#28721) by @Weiko
- Fix docs translations for Crowdin CLI 5 (#28725) by @Weiko
- Delete logic function Lambdas and SDK layers on workspace deletion (#28813) by @prastoin
- Ignore the CLI patch version in the scaffolded engines.twenty range (#28814) by @prastoin
- Rename 9 server files to the singular suffix in src/engine/core-modules/open-api/utils (#28839) by @twenty-pr-author
- Bump graphql to 16.14.2 and graphql-yoga to 5 (#28976) by @charlesBochet
🏗️ Internal changes (14)
- docs: Introduce third-party marketplace vetting criteria (#28457) by @martmull
- chore(security): bump dompurify to 3.4.17 (#28772) by @mabdullahabaid
- chore(security): bump next to 16.4.1 (#28778) by @mabdullahabaid
- chore(security): bump storybook to 10.6.3 (#28790) by @mabdullahabaid
- chore(security): bump follow-redirects to 1.16.1 everywhere (#28792) by @mabdullahabaid
- chore(security): bump verdaccio to 6.10.7 and drop its two resolutions (#28809) by @mabdullahabaid
- chore(security): bump fast-uri to 3.1.9 (#28952) by @BOHEUS
- chore(security): bump @graphql-tools/executor-legacy-ws to 1.1.39 (#28953) by @BOHEUS
- chore(security): bump markdown-it to 14.3.3 (#28954) by @BOHEUS
- chore(security): bump postcss-selector-parser to 6.1.5 (#28955) by @BOHEUS
- chore(security): bump body-parser to 1.20.9 and 2.4.0 (#28958) by @BOHEUS
- chore(security): bump vitest to 4.1.12 (#28960) by @BOHEUS
- chore(security): bump electron to 44.9.1 (#28967) by @BOHEUS
- chore(security): bump nodemailer to 10.2.1 (#28968) by @BOHEUS
🎉 New contributors
- @ghazy2001 made their first contribution in #28412
- @zacyungblut made their first contribution in #28748
- @lineico made their first contribution in #28458
- @DamienFoulon made their first contribution in #28462
- @RaphaelFakhri made their first contribution in #28502
- @jackeddisciple made their first contribution in #28494
Full changelog (136 PRs)
- Move app tooling consumers to the standalone CLI (#28182) by @Weiko
- Remove the legacy SDK CLI and retire create-twenty-app (#28183) by @Weiko
- fix(front): pin record table columns with logical insets so they work in RTL (#28379) by @almoghazaz-cell
- fix(metadata-store): adopt new collection hash on replaceDraft when data is unchanged (#28412) by @ghazy2001
- Let members manage personal app connections from App preferences (#28418) by @ehconitin
- fix(record-form): block submission when field input has validation error (#28425) by @ghazy2001
- Keep code step outputs when the code is saved and remove the link output schema (#28432) by @ghazy2001
- Pass fieldMetadataId in if/else workflow node (#28443) by @BOHEUS
- docs: Introduce third-party marketplace vetting criteria (#28457) by @martmull
- fix(front): keep cached relation picker results clickable while Search refreshes (#28458) by @lineico
- Report a superseded session as superseded when its revocation races the request (#28462) by @DamienFoulon
- fix(slack): show one content-shaped skeleton while the settings tab loads (#28493) by @abdulrahmancodes
- Fix app sync recreating search rows that already exist (#28494) by @jackeddisciple
- fix(twenty-shared): promote formatBytes to the next unit when rounding reaches 1024 (#28502) by @RaphaelFakhri
- Link a sent email to the record it was sent from (#28554) by @FelixMalfait
- Show only workspace-shared connections in app settings (#28556) by @ehconitin
- Build inbox thread details and sharing (#28565) by @bosiraphael
- Add global chat commands (#28567) by @bosiraphael
- Move the Slack app to twenty-ui 2.x and use its Skeleton (#28604) by @abdulrahmancodes
- Migrate the metadata tools to @definetool (#28631) by @prastoin
- Clarify DPA, AI and access answers in the Legal FAQ and pricing page (#28640) by @ijreilly
- Migrate multiple record pickers (#28643) by @bosiraphael
- Use twenty-ui date picker in the frontend (#28649) by @bosiraphael
- Let apps connect accounts through their own authorization flow (#28672) by @FelixMalfait
- Allow npm publishing from protected release branches (#28677) by @FelixMalfait
- Mask restricted calendar events and messages in nested relations and groupBy (#28679) by @charlesBochet
- Let Granola uninstall when no API key was saved (#28680) by @charlesBochet
- Add batch approval review components (#28684) by @bosiraphael
- Bring back toggles, nested blocks, deeper headings and table controls in rich text notes (#28687) by @neo773
- Remove IS_APPLICATION_MONITORING_ENABLED feature flag (#28688) by @martmull
- Remove the main sources of server integration shard flakiness (#28689) by @martmull
- Add email approval review (#28691) by @bosiraphael
- Give the rebuilt user auth context its full workspace (#28692) by @prastoin
- Stabilize frontend Storybook interactions (#28693) by @bosiraphael
- Keep non-email participant links when a person's emails change (#28694) by @FelixMalfait
- Match app channel participants on a declared person field (#28696) by @FelixMalfait
- chore: bump version to 2.52.0 (#28697) by @twenty-pr
- Backfill frontend dependencies for existing Workspace apps (#28698) by @Weiko
- Show weekly AI user credits in AI chat (#28700) by @etiennejouan
- Balance server integration shards by recorded duration (#28702) by @neo773
- Let usage limit defaults override the plan while trialing (#28703) by @etiennejouan
- Bring back row and column controls in rich text tables (#28704) by @neo773
- Keep app uninstall hook failures out of Sentry (#28705) by @charlesBochet
- Fix workspace data export S3 upload and show exports on the admin user page (#28706) by @charlesBochet
- Keep sensitive-path maintainer approvals valid after pushes (#28707) by @FelixMalfait
- Replace the generic multi-item field inputs with composable bricks (#28708) by @charlesBochet
- Keep the front metadata store consistent across out-of-order updates (#28711) by @charlesBochet
- Refresh Resources menu previews and the homepage logo row (#28713) by @Bonapara
- Close the inbox conversation pane (#28716) by @bosiraphael
- Remove async CSV export feature flag (#28717) by @Weiko
- Hide app settings tab bar when General is the only tab (#28720) by @martmull
- Clean up remaining legacy SDK CLI references (#28721) by @Weiko
- Fix docs translations for Crowdin CLI 5 (#28725) by @Weiko
- Redesign the docs to match the website (#28733) by @Bonapara
- Edit list values and link labels in place in multi-item cell editors (#28734) by @charlesBochet
- Show the app error fallback for errors React Router catches (#28747) by @charlesBochet
- fix(onboarding): add aria-labels to invite team email inputs (#28748) by @zacyungblut
- Restore JSX attributes Crowdin translated in docs pages (#28749) by @Bonapara
- Apply workflow step edits to the draft's own logic function or agent (#28750) by @charlesBochet
- Split the multi-item draft hook into focused bricks (#28751) by @charlesBochet
- Fix bulk update of emptied list fields, full name pasting and address separators (#28752) by @charlesBochet
- Edit emails and array values as lists in the record form (#28753) by @charlesBochet
- Show partial domain setup on the email channel list (#28754) by @neo773
- Add an Email Channels docs page (#28755) by @neo773
- Edit phones, links, files and full name in the record form (#28757) by @charlesBochet
- Show address details on demand in the record form (#28765) by @charlesBochet
- Infer the code step input schema in the debounced save so keystrokes can't be saved out of order (#28766) by @charlesBochet
- Edit wrapping text in a text area and show the domain favicon in link inputs (#28767) by @charlesBochet
- Show a blue border on keyboard focus in form inputs, pickers and selects (#28769) by @charlesBochet
- chore(security): bump dompurify to 3.4.17 (#28772) by @mabdullahabaid
- Edit the full name in one input and show address details on demand in cell editors (#28773) by @charlesBochet
- Route any casing of host-sanitized props to their canonical key in front component host elements (#28774) by @charlesBochet
- Suggest addresses as you type in the record form address (#28775) by @charlesBochet
- Upload files by dropping them on the files field input (#28777) by @charlesBochet
- chore(security): bump next to 16.4.1 (#28778) by @mabdullahabaid
- Require a first-person session for admin panel actions (#28779) by @charlesBochet
- Backfill record form widgets for files fields (#28780) by @charlesBochet
- Apply field read permissions to timeline activity properties (#28782) by @charlesBochet
- Block bulk update while a field input is in error (#28783) by @charlesBochet
- Resend requests rejected because a sign-in superseded their session (#28784) by @charlesBochet
- Make the True/False control full width in record forms (#28787) by @charlesBochet
- chore(security): bump storybook to 10.6.3 (#28790) by @mabdullahabaid
- chore(security): bump follow-redirects to 1.16.1 everywhere (#28792) by @mabdullahabaid
- chore(security): bump vite to 8.3.5 in the app lockfiles (#28798) by @mabdullahabaid
- Ignore isSecret changes on existing application and server variables (#28800) by @prastoin
- chore(security): bump twenty-companion vite to 7.3.7 (#28801) by @mabdullahabaid
- chore(security): bump undici in the app lockfiles (#28802) by @mabdullahabaid
- Reject changes to non-comparable flat entity properties (#28803) by @prastoin
- chore(security): bump undici in the root lockfile (#28805) by @mabdullahabaid
- chore(security): bump zod to 4.6.7 in the fathom, fireflies and granola apps (#28807) by @mabdullahabaid
- Initialize application variable value at creation instead of in the manifest (#28808) by @prastoin
- chore(security): bump verdaccio to 6.10.7 and drop its two resolutions (#28809) by @mabdullahabaid
- Add configurable tags when creating Lambda functions (#28810) by @FelixMalfait
- Delete logic function Lambdas and SDK layers on workspace deletion (#28813) by @prastoin
- Ignore the CLI patch version in the scaffolded engines.twenty range (#28814) by @prastoin
- Document that app development is only supported on Unix systems (#28817) by @prastoin
- Let the Teams assistant work with CRM records (#28832) by @abdulrahmancodes
- Give the Teams assistant the earlier turns of the conversation (#28833) by @abdulrahmancodes
- Remove the
as anycasts in 2 files of modules/ui/input/components/internal/date/components (#28838) by @twenty-pr-author - Rename 9 server files to the singular suffix in src/engine/core-modules/open-api/utils (#28839) by @twenty-pr-author
- feat(billing): lead the Plans page comparison with plan essentials (#28843) by @etiennejouan
- Application monitoring: legend totals and credits by operation type (#28847) by @martmull
- Fix follow-redirects in the Workspace upgrade snapshot (#28852) by @Weiko
- Seed Workspace applications with frontend dependencies (#28853) by @Weiko
- Remove the free trial for users already in 2 trial workspaces (#28859) by @etiennejouan
- Prebundle rich text editor extensions for Storybook (#28862) by @bosiraphael
- Add merge proposal review (#28863) by @bosiraphael
- Add scheduling and time-picker UI (#28865) by @bosiraphael
- Fix orphaned case study card on partner profiles (#28913) by @ijreilly
- Stop deleting provider domains Twenty did not create (#28914) by @neo773
- Serve campaign unsubscribe and tracked links on links.domain (#28915) by @neo773
- Add glass and metal materials to the halftone studio (#28918) by @Bonapara
- Let application workflows send email and create calendar events (#28920) by @FelixMalfait
- Fix integration specs that break on suites run before them in the same shard (#28921) by @etiennejouan
- Skip morph relation targets the role cannot read (#28922) by @neo773
- Skip application lifecycle scripts when building dependency layers (#28926) by @prastoin
- Let the workspace custom application's workflows call other apps' actions (#28927) by @FelixMalfait
- Fill the single full name input in the create record e2e test (#28928) by @charlesBochet
- Show the Admin role in the roles list again (#28946) by @prastoin
- Only offer junction targets the role can update in relation pickers (#28947) by @charlesBochet
- Fit the AI chat user credits banner on one line (#28949) by @etiennejouan
- chore(security): bump fast-uri to 3.1.9 (#28952) by @BOHEUS
- chore(security): bump @graphql-tools/executor-legacy-ws to 1.1.39 (#28953) by @BOHEUS
- chore(security): bump markdown-it to 14.3.3 (#28954) by @BOHEUS
- chore(security): bump postcss-selector-parser to 6.1.5 (#28955) by @BOHEUS
- chore(security): bump body-parser to 1.20.9 and 2.4.0 (#28958) by @BOHEUS
- chore(security): bump vitest to 4.1.12 (#28960) by @BOHEUS
- chore(security): bump electron to 44.9.1 (#28967) by @BOHEUS
- chore(security): bump nodemailer to 10.2.1 (#28968) by @BOHEUS
- Keep Avatar fallback icons within small avatars (#28973) by @bosiraphael
- Add admin status indicator to workspace users in admin panel (#28974) by @martmull
- Bump graphql to 16.14.2 and graphql-yoga to 5 (#28976) by @charlesBochet
- Reject object names that are not stable under camelCase (#28978) by @FelixMalfait
- Restore native blur in front component menus (#28980) by @bosiraphael
- Add Teams app to Microsoft publisher domain association (#28983) by @neo773
- Match AI chat user bubbles to the design (#28984) by @bosiraphael
Full Changelog: twenty/v2.51.0...twenty/v2.52.0