twenty-ui ships a concentrated wave of breaking removals this release. Modal is replaced by a compound Dialog built on Base UI. AppTooltip gives way to the Base UI Tooltip API. Several button exports — FloatingButton, AnimatedButton, FloatingIconButton, and MenuItemSwitch among them — are deleted. The code editor moves to a new entry point and Monaco becomes an optional peer dependency. react-router jumps from v6 to v7 across twenty-ui and twenty-shared.
Two client-facing API calls change shape. MetadataApiClient.uploadFile drops contentType and takes a single object parameter; files go straight to storage. The generateApplicationToken mutation is removed.
Two new twenty-sdk exports land: defineHealthCheck reports app configuration health with a status and action link, and defineSettingsMenuItem registers settings pages in the Twenty navigation.
⚠️ Breaking changes
- FeatureFlagKey.IS_RECORD_CREATION_FORM_ENABLED is removed from generated enums; delete any references to this flag in your code. (#25907) by @thomtrp
- SelectableList now preselects its first item by default; set shouldPreselectFirstItem={false} to restore the previous behavior. (#26037) by @Bonapara
- IconButton is rebuilt on the shared Button API with tooltip support built in; update any imports that relied on the previous standalone version. (#26071) by @bosiraphael
- H1Title, H2Title, and H3Title are removed; use Heading from twenty-ui and its composed variants. Section.Root, Section.Header, and Dialog.Title are now exported. (#26085) by @bosiraphael
- Modal is removed from twenty-ui; replace it with the new compound Dialog built on Base UI. (#26087) by @bosiraphael
- AppTooltip is removed; replace it with the Base UI Tooltip API from twenty-ui. SDK and Preact sandbox fixes are deferred to a follow-up. (#26088) by @bosiraphael
- Code editor moves to twenty-ui/components/code-editor; CoreEditorHeader is renamed CodeEditorHeader; add @monaco-editor/react and monaco-editor as explicit peer dependencies. (#26134) by @bosiraphael
- Legacy tab exports are removed; replace them with Tabs for in-page selection and TabButton for links and actions from twenty-ui. (#26142) by @bosiraphael
- Descriptor types and the icon-button menu adapter are removed; pass iconButtons as JSX directly and replace IconButtonGroup with ButtonGroup (frame is now an optional prop). (#26144) by @bosiraphael
- Application tokens now only access their own app's variables; calls passing another app's applicationId to updateOneApplicationVariable, findOneApplication, or applicationVariables are refused. (#26192) by @prastoin
- MenuItemSwitch and MenuItemNavigate are removed from twenty-ui; replace them with SettingsRow and ListItem respectively. (#26200) by @bosiraphael
- FeatureFlagKey.IS_APP_CLAIMING_ENABLED is removed from the client SDK metadata schema and generated enums; delete any code that checks for this flag. (#26205) by @martmull
- Legacy single- and multi-select picker row components are removed from twenty-ui; replace them with ListItem compositions. (#26211) by @bosiraphael
- FloatingIconButton and FloatingIconButtonGroup are removed; use IconButton with the elevated variant instead. (#26213) by @bosiraphael
- twenty-ui and twenty-shared now require react-router@^7.18.4; upgrade your own react-router-dom and remove any @remix-run/router dependency. (#26232) by @charlesBochet
- AnimatedButton and AnimatedLightIconButton are removed; use Button with AnimatedIconCrossfade for edit-action animations. (#26276) by @bosiraphael
- The Classify workflow node no longer accepts a model choice; Jev is the only evaluation model, and per-step and per-workspace model selectors are removed. (#26291) by @Bonapara
- FloatingButton, FloatingButtonGroup, and ColorPickerButton are removed from twenty-ui exports with no replacement. (#26293) by @bosiraphael
- CreateNewButton wrapper is removed from twenty-ui; use ListItem for dropdown menu rows. (#26297) by @bosiraphael
- MetadataApiClient.uploadFile now takes { fileBuffer, filename, fieldMetadataUniversalIdentifier }; remove the contentType argument — files upload directly to storage. (#26305) by @martmull
- The workflow 'AI Agent' action type is renamed to 'Agent'; update any code referencing this action label or type string. (#26363) by @thomtrp
- The generateApplicationToken GraphQL mutation is removed; delete any calls to it — the server now computes the application-scoped schema internally. (#26439) by @prastoin
🌟 Highlights
generateApplicationTokenis removed; the server now computes the application-scoped schema internally — delete any calls to this mutation. (#26439)MetadataApiClient.uploadFilenow takes{ fileBuffer, filename, fieldMetadataUniversalIdentifier }— remove thecontentTypeargument; files upload directly to storage. (#26305)Modalis removed fromtwenty-ui; replace it with the new compoundDialogbuilt on Base UI. (#26087)- The code editor moves to
twenty-ui/components/code-editor;CoreEditorHeaderis renamedCodeEditorHeader; add@monaco-editor/reactandmonaco-editoras peer dependencies. (#26134) twenty-uiandtwenty-sharednow requirereact-router@^7.18.4; upgrade your ownreact-router-domand remove any@remix-run/routerdependency. (#26232)- New
defineHealthCheckintwenty-sdk/definelets apps return a configuration status, title, and action link that Twenty surfaces on their settings page. (#26277)
✨ New features
- New updateManyObjects mutation lets you update multiple object metadata entries in a single workspace migration instead of N separate calls. (#26105) by @Bonapara
- Apps can mark applicationVariables entries as isRequired: true in their manifest; Twenty surfaces unset required variables in a banner on the app's settings page. (#26270) by @martmull
- New defineHealthCheck export from twenty-sdk/define lets apps return a status, title, description, and optional action link that Twenty shows on their settings page. (#26277) by @martmull
- New defineSettingsMenuItem lets apps declare multiple settings pages that appear in the Twenty settings navigation. (#26302) by @martmull
- UpdateObjectPayload in the metadata API now accepts an optional readability field (OPEN or PRIVATE), so you can change object visibility without a manifest update. (#26427) by @martmull
💅 Improvements & UX
- twenty-ui now formally separates 43 primitives from 31 shared components; public import paths are unchanged. (#26207) by @bosiraphael
🐛 Bug fixes
- Banner button borders and hover/pressed colors are restored after the button migration stripped them. (#26135) by @bosiraphael
- fix(client-sdk): externalize all Node builtins in Vite lib build (#26234) by @AyeshaWaseemAhmad
- isSafeUrl in twenty-shared now rejects backslash-based scheme-relative URLs like /\evil.com that previously returned true. (#26397) by @Belkouche
🔧 Developer & API
- Missing dependency added to create-twenty-app; scaffolded projects no longer fail on install. (#26133) by @martmull
- yarn twenty pull now prints the export reason for each row, including warnings when a workspace override was not included in the export. (#26288) by @Weiko
- twenty app deploy now uploads tarballs directly to file storage, removing the 100 MB in-process buffer that previously applied. (#26314) by @martmull
🏗️ Internal changes (19)
- Add async CSV export server behind a workspace flag (#25987) by @Weiko
- Hard-delete views and their children instead of soft-deleting them (#26002) by @Weiko
- [forms 2/3] Improve record form field presentation (#26031) by @Bonapara
- feat(usage-limit): cap workspace file storage with a stock limit kind (#26042) by @etiennejouan
- Bind CSV export downloads to their requesting session (#26052) by @Weiko
- feat: migrate workflow editor and actions to core IDs (#26116) by @thomtrp
- feat(usage-limit): cap workspace records with a stock limit (#26147) by @etiennejouan
- feat(workflow): make core workflow and workflow version syncable so definition changes broadcast (#26158) by @thomtrp
- chore(usage-limit): remove the API rate limit v2 feature flag (#26169) by @etiennejouan
- chore(usage-limit): remove the quota engine credit bound feature flag (#26174) by @etiennejouan
- AI chat: tool calls render as widgets named by the tool (#26179) by @FelixMalfait
- Only write audit log events for workspaces entitled to audit logs (#26182) by @neo773
- Defer slow workspace migration actions to a worker job (#26222) by @charlesBochet
- feat(ai): add evaluation models and a Classify workflow node (#26225) by @FelixMalfait
- feat(usage-limit): gate workflow node runs and logic function executions (#26283) by @etiennejouan
- Secure front component media capture (#26303) by @bosiraphael
- Give message campaigns their own send rate limit counters (#26331) by @neo773
- fix: separate connected account disconnect from deletion (#26347) by @neo773
- Load limits on view groups (#26349) by @Bonapara
🎉 New contributors
- @Maharsh17 made their first contribution in #26118
- @mdminhazulhaque made their first contribution in #26097
- @Atharva0222 made their first contribution in #25989
- @minnibaevB made their first contribution in #25991
- @alamin284 made their first contribution in #24327
- @longshaww made their first contribution in #24349
- @mini0n-ai made their first contribution in #25809
Full changelog (54 PRs)
- feat(record-form): make the record creation form the default path (#25907) by @thomtrp
- Add async CSV export server behind a workspace flag (#25987) by @Weiko
- Hard-delete views and their children instead of soft-deleting them (#26002) by @Weiko
- [forms 2/3] Improve record form field presentation (#26031) by @Bonapara
- [2/2 Sidebar] New customization experience (#26037) by @Bonapara
- feat(usage-limit): cap workspace file storage with a stock limit kind (#26042) by @etiennejouan
- Bind CSV export downloads to their requesting session (#26052) by @Weiko
- Unify Twenty UI icon buttons (#26071) by @bosiraphael
- Migrate Twenty UI headings (#26085) by @bosiraphael
- Replace Twenty UI Modal with Dialog (#26087) by @bosiraphael
- Migrate tooltips to Base UI (#26088) by @bosiraphael
- chore: bump version to 2.42.0 (#26100) by @twenty-pr
- [3/3 Sidebar] Bulk object metadata updates (#26105) by @Bonapara
- feat: migrate workflow editor and actions to core IDs (#26116) by @thomtrp
- Import missing dependency in create-twenty-app (#26133) by @martmull
- Fix UI builds without Monaco (#26134) by @bosiraphael
- Restore banner button colors (#26135) by @bosiraphael
- Migrate Twenty UI tab navigation (#26142) by @bosiraphael
- Migrate light icon buttons and groups (#26144) by @bosiraphael
- feat(usage-limit): cap workspace records with a stock limit (#26147) by @etiennejouan
- feat(workflow): make core workflow and workflow version syncable so definition changes broadcast (#26158) by @thomtrp
- chore(usage-limit): remove the API rate limit v2 feature flag (#26169) by @etiennejouan
- chore(usage-limit): remove the quota engine credit bound feature flag (#26174) by @etiennejouan
- AI chat: tool calls render as widgets named by the tool (#26179) by @FelixMalfait
- Only write audit log events for workspaces entitled to audit logs (#26182) by @neo773
- Scope application variable reads and updates to the calling application and workspace (#26192) by @prastoin
- Add SettingsRow and migrate legacy rows (#26200) by @bosiraphael
- chore: remove IS_APP_CLAIMING_ENABLED feature flag (#26205) by @martmull
- Separate Twenty UI primitives and components (#26207) by @bosiraphael
- Migrate picker rows to ListItem (#26211) by @bosiraphael
- Unify icon buttons with elevated styling (#26213) by @bosiraphael
- Defer slow workspace migration actions to a worker job (#26222) by @charlesBochet
- feat(ai): add evaluation models and a Classify workflow node (#26225) by @FelixMalfait
- Upgrade react-router to 7.18.4 (#26232) by @charlesBochet
- fix(client-sdk): externalize all Node builtins in Vite lib build (#26234) by @AyeshaWaseemAhmad
- Flag missing required application variables on the app settings page (#26270) by @martmull
- Consolidate animated buttons (#26276) by @bosiraphael
- Let apps report their own configuration state with defineHealthCheck (#26277) by @martmull
- feat(usage-limit): gate workflow node runs and logic function executions (#26283) by @etiennejouan
- Print export reasons in the pull report (#26288) by @Weiko
- [2/5 workflows] Improve workflow classifier configuration (#26291) by @Bonapara
- Remove unused Twenty UI buttons (#26293) by @bosiraphael
- Migrate dropdown menu rows to ListItem (#26297) by @bosiraphael
- Let apps declare several settings menu items with defineSettingsMenuItem (#26302) by @martmull
- Secure front component media capture (#26303) by @bosiraphael
- feat(client-sdk): upload files straight to storage from uploadFile (#26305) by @martmull
- feat(application): deploy app tarballs straight to file storage (#26314) by @martmull
- Give message campaigns their own send rate limit counters (#26331) by @neo773
- fix: separate connected account disconnect from deletion (#26347) by @neo773
- Load limits on view groups (#26349) by @Bonapara
- Rename workflow AI Agent to Agent and align node presentation (#26363) by @thomtrp
- fix(shared): reject scheme-relative backslash urls in isSafeUrl (#26397) by @Belkouche
- feat(object-metadata): allow updating readability through the metadata API (#26427) by @martmull
- [BREAKING_CHANGE] refactor(server): compute the application-scoped core schema server-side (#26439) by @prastoin
Full Changelog: sdk/v2.41.0...sdk/v2.42.0