⚠️ Breaking changes
- Run
upgrade:2-51:migrate-rich-text-to-tiptapafter upgrading to convert existing rich text records to TipTap format. (#28486) by @neo773 - The
blocknotesub-field on rich text in the GraphQL and REST APIs is now deprecated; switch tomarkdownortiptapbefore it is removed. (#28488) by @neo773 - Billing plan configuration now lives in the
BILLING_PLANSenvironment variable; update your server config. (#28552) by @etiennejouan
🌟 Highlights
- Notes, tasks, and rich text fields now use the TipTap editor — one unified experience shared with emails and workflow forms. (#28487)
- Run upgrade:2-51:migrate-rich-text-to-tiptap after upgrading to convert existing rich text content to the new format. (#28486)
- Exports of 200 records or fewer now download straight to the browser with no background job. (#26673)
- Records with a related company now have a Link button on the Emails and Calendar widgets to manually file threads and events. (#28551)
- A workflow iterator that fails safely inside a loop no longer re-enters the loop and runs indefinitely. (#28524)
- The logs console is now on for every member with the Security permission — no feature flag needed. (#28481)
✨ New features
- Record filters can now compare a date or number field directly against another field on the same record. (#28237) by @FelixMalfait
- Server admins can now export a complete workspace — including suspended ones — as a zip of CSVs from the admin panel. (#28480) by @charlesBochet
- The logs console is now on for every member with the Security permission; the feature flag is gone. (#28481) by @martmull
- The server now stores rich text in TipTap format, replacing BlockNote as the canonical document format. (#28485) by @neo773
- Notes, tasks, and rich text fields now use the TipTap editor; BlockNote and its packages are removed from the app. (#28487) by @neo773
- AI chat threads with an unsent draft now show a Draft label in the inbox list. (#28503) by @FelixMalfait
- Percentage and boolean fields now have dedicated inputs in record create and bulk-update forms. (#28510) by @charlesBochet
- Records with a related company now have a Link button on the Emails and Calendar widgets to manually file threads and events. (#28551) by @FelixMalfait
- The Microsoft Teams settings page now shows a warning banner when the Teams connection is missing or needs reconnection. (#28568) by @ehconitin
- Sending a campaign to a list larger than the day's remaining email quota is now refused upfront with a clear message. (#28685) by @neo773
💅 Improvements & UX
- Exports of 200 records or fewer download straight to the browser; larger exports still use the background queue. (#26673) by @Weiko
- Autocomplete and Select dropdowns in front components now scroll to reveal the highlighted option. (#27895) by @bosiraphael
- Dashboards with charts that reference a deactivated field can now be saved without errors. (#28082) by @FelixMalfait
- Agent threads started via the Slack app are now owned by the linked workspace member and appear in the inbox correctly. (#28193) by @abdulrahmancodes
- Custom roles now require the CUSTOM_ROLES billing entitlement; existing role assignments are not affected. (#28218) by @etiennejouan
- XCG (Caribbean guilder) is now available as a currency option. (#28430) by @BOHEUS
- The Companion panel now uses Twenty's shared UI components for consistent styling. (#28439) by @bosiraphael
- Front-end controls, tooltips, and typography now use shared Twenty UI components throughout the app. (#28441) by @bosiraphael
- Call recording and participant widgets now show a slim single-row skeleton while loading, matching Twenty's style. (#28442) by @ehconitin
- Select all in the command menu now correctly passes the full filter to side panel front components. (#28447) by @charlesBochet
- Hover backgrounds behind chip close buttons are removed. (#28449) by @bosiraphael
- Credits in app stats are now truncated: 10 or more show whole numbers, under 10 show two decimal places. (#28452) by @martmull
- App registration statistics now use a two-column grid: installs on the left, credits on the right. (#28456) by @martmull
- Naming a CRM during AI chat setup now restarts the conversation fresh instead of ending at a plain-text dead end. (#28459) by @etiennejouan
- The workflow step editor now saves on a debounce, eliminating the lock-timeout flood that fired on every keystroke. (#28461) by @charlesBochet
- Dropdown menus retain their search text and draft content for the full duration of one open session. (#28474) by @bosiraphael
- Whether a conversation is waiting is now determined in one place in the agent engine, fixing inconsistencies across callers. (#28499) by @FelixMalfait
- Multiple agent runs waiting on a busy conversation now queue in order and run one at a time instead of racing. (#28506) by @FelixMalfait
- PDL enrichment now costs $0.15 per person match and $0.075 per company match. (#28516) by @bosiraphael
- Icons inside flex layouts, including buttons, now keep their requested width and no longer shrink. (#28523) by @bosiraphael
- Banners now support a labeled dismiss button; the Companion notice uses this shared component. (#28525) by @bosiraphael
- Gmail/Calendar, Outlook, and IMAP account apps each have their own cover image on the settings page. (#28530) by @ehconitin
- Calendar event fields restricted by channel sharing now show "Not shared" instead of a raw internal marker. (#28542) by @charlesBochet
- The system filter on Workflows and Agents pages is now a regular filter rule in the filters side panel. (#28544) by @FelixMalfait
- Chart settings dropdowns now use the shared Dropdown components. (#28545) by @bosiraphael
- The AI chat welcome screen, suggested prompts, and composer are now centered in the inbox. (#28546) by @bosiraphael
- The empty Billing Limits tab now explains the available limit types instead of redirecting to the new-limit form. (#28550) by @FelixMalfait
- Inbox rows are refreshed with shared List and Text components, with unread and draft indicators. (#28564) by @bosiraphael
- Your own messages in AI chat now align to the right; reactions, questions, and forms use shared UI components. (#28566) by @bosiraphael
- A member's own AI chat is automatically filed when they leave after reading the last agent reply. (#28583) by @FelixMalfait
- On upgrade to 2.51, settled AI chats already in members' inboxes are filed automatically. (#28584) by @FelixMalfait
- In Claim an application, Sync catalog is now icon-only with a tooltip, and Look up sits at the far right. (#28615) by @martmull
- The Credits used column in app stats is hidden when billing is disabled on the server. (#28616) by @martmull
- Widget and tab settings dropdowns now use the shared Dropdown components. (#28617) by @bosiraphael
- The OAuth consent screen now shows the redirect destination host so you can verify where a connection goes. (#28619) by @charlesBochet
- Workspaces on legacy Pro or Enterprise plans now see their own plan column on Billing Plans. (#28624) by @etiennejouan
- Search controls no longer show blue focus rings. (#28638) by @bosiraphael
- The default role picker in Security settings now only lists roles that can be assigned to workspace members. (#28644) by @prastoin
- Row-level permission rules can no longer be created or updated on non-editable roles such as Admin. (#28645) by @prastoin
- The budget field in the partner brief form is now labeled "Implementation/migration budget range". (#28650) by @ijreilly
- Inbox triage actions stay next to the title and preview in compact 65px rows. (#28656) by @bosiraphael
- The Twenty standard application now has Admin set as its explicit default role. (#28667) by @prastoin
- Currency symbol and amount now render in the same text style on opportunity boards. (#28676) by @bosiraphael
🐛 Bug fixes
- Front components and direct file uploads now work behind cookie-authenticating proxies like Google Cloud IAP and Cloudflare Access. (#28375) by @Prashaxt
- Add rule group in a workflow Search Records step now creates the group as expected. (#28396) by @BOHEUS
- Records with long relation table names are no longer incorrectly denied access due to Postgres' 63-byte identifier limit. (#28411) by @ijreilly
- View-derived filters now go through the same validation as other filters, so invalid operators are rejected consistently. (#28414) by @etiennejouan
- Calendar events with no channel association now return masked titles and descriptions instead of real content. (#28415) by @ehconitin
- The AI assistant no longer describes menus from other CRMs when answering how-to questions about Twenty. (#28478) by @etiennejouan
- Signing up for a new workspace no longer creates an unwanted DPA agreement record. (#28504) by @FelixMalfait
- A workflow iterator that fails safely inside a loop no longer re-enters and runs forever. (#28524) by @charlesBochet
- The web app manifest is now fetched with credentials, fixing PWA install failures behind cookie-based proxies. (#28531) by @prastoin
- Querying applications with their
agents,frontComponents, orapplicationVariablesfields no longer returns a null error. (#28534) by @charlesBochet - App OAuth reconnect flows now preserve the settings page and tab through errors; reconnecting a broken connection restores it correctly. (#28548) by @ehconitin
- Rich text fields in search result preview cards now show one truncated line instead of wrapping over multiple rows. (#28581) by @FelixMalfait
- Timeline processing no longer causes mass query timeouts when a person receives thousands of linked messages at once. (#28607) by @etiennejouan
- Field icons in timeline field-diff entries are now the correct size and no longer overlap the field label. (#28625) by @FelixMalfait
- Delete and destroy commands are now hidden on objects that reject user-session writes. (#28641) by @martmull
- Currency symbols and amounts stay on one line in record cards and align correctly with their field icons. (#28657) by @bosiraphael
- Neutral outline buttons in onboarding now display in the correct foreground color. (#28662) by @bosiraphael
- Navigation skeleton rows now have correct horizontal padding and stay inside the menu. (#28663) by @bosiraphael
- Restricted calendar event titles now show "Not shared" in the record page breadcrumb. (#28670) by @charlesBochet
- After an app's SDK is regenerated, all its logic functions rebuild with the new SDK, not just the first one to run. (#28683) by @neo773
⚡ Performance
- App installs and upgrades now skip storage writes for unchanged files, using a server-side content hash. (#28213) by @neo773
- Lambda function metadata is now cached in Redis for 24 hours, reducing AWS API calls per logic function run. (#28647) by @charlesBochet
🔧 Developer & API
- Chat channels (
agentChatChannel,agentChatChannelRole) are now core metadata entities with role-based access. (#27448) by @FelixMalfait - App log rows now carry the app's registration ID, version, source, and error code for per-app attribution. (#28283) by @martmull
- API rate-limit hits and server route failures are now recorded as app log entries alongside other platform events. (#28286) by @martmull
- App run counts and platform events are now stored in a 90-day metric table that survives workspace log retention. (#28288) by @martmull
- App owners can query run counts, failure rates, and rate-limit totals via
findApplicationRegistrationMonitoring. (#28292) by @martmull - Instance admins can query per-workspace monitoring data via
findAdminApplicationRegistrationMonitoring. (#28293) by @martmull - App owners now have a Monitoring tab in Settings Developers Apps with health, activity, and function charts. (#28304) by @martmull
- Instance admins now have an app Monitoring page in the admin panel with per-workspace filtering. (#28316) by @martmull
- The workspace log console now shows install, upgrade, uninstall, and rate-limit events in the App logs tab. (#28318) by @martmull
@DefineTooltools now declare their ownrequiredPermissionFlagsinstead of inheriting them from a provider. (#28416) by @prastoin- Webhook tools are now
@DefineToolclasses;WebhookToolWorkspaceServiceandWebhookToolProviderare deleted. (#28417) by @prastoin - Frontend component build transforms are now shared between the SDK and server compiler. (#28465) by @Weiko
- The seven role tools are now
@DefineToolclasses. (#28476) by @prastoin - Navigation menu item tools are now
@DefineToolclasses; discriminated union inputs are now supported in tool schemas. (#28477) by @prastoin - The App logs tab now shows an App column (logo and name) identifying which app emitted each log line. (#28482) by @martmull
- App monitoring now includes a Credits used chart covering the same period as the other charts. (#28483) by @martmull
- Rate-limit hits are now counted per rejected request and charted separately from errors in app monitoring. (#28495) by @martmull
- Settings Developers now has a CLI tab with copyable commands for connecting, exploring data, and building apps. (#28498) by @FelixMalfait
@DefineToolexecute methods now receive a single{ input, context }object instead of two positional arguments. (#28519) by @prastoinTextandOverflowingTextWithTooltipin twenty-ui now acceptsize,weight, and semanticcolorprops. (#28527) by @bosiraphaelCardin twenty-ui now hasCard.ActionandCard.Controlslots for row activation and independent controls. (#28528) by @bosiraphaelInputandTextareain twenty-ui now have aplainvariant. (#28529) by @bosiraphael- The 22 view tools are now
@DefineToolclasses and returnToolOutputinstead of bare values. (#28532) by @prastoin - The workspace custom application now has its own default role with full permissions and
isEditable: false. (#28538) by @prastoin - The CLI and SDK now share the same frontend component build transforms, including nested CSS and asset bundling. (#28541) by @Weiko
- The Microsoft Teams app is now registered for public marketplace visibility and exempt from execution billing. (#28543) by @ehconitin
twenty remote --helpnow explains how to create a connection withauth login, with examples. (#28557) by @Weiko- Node.js updated to 24.22.1 (October 2026 security release); Docker base and .nvmrc updated. (#28559) by @prastoin
DetailsRowis now available in twenty-ui for aligned label, icon, value, and action layouts. (#28570) by @bosiraphaelReactionButtonis now available in twenty-ui for emoji reactions with counts. (#28571) by @bosiraphaelListItemandListItemButtonnow support multiline rows with descriptions below the label. (#28572) by @bosiraphael- The Lambda driver now has integration tests running against a Floci emulator via testcontainers. (#28574) by @neo773
- New documentation page on securing self-hosted Twenty instances, covering Tailscale, Cloudflare Tunnel, and Caddy setups. (#28595) by @FelixMalfait
- The email/calendar account field row is now a shared twenty-ui component; callers supply data and permissions. (#28608) by @bosiraphael
LabeledSeparatoris now available in twenty-ui with centered or end labels and neutral/danger tones. (#28610) by @bosiraphael@DefineTooltools can now declare a catalog icon via theiconoption onDefineToolOptions. (#28612) by @prastoin@DefineTooltools can now require workspace feature flags viarequiredFeatureFlagsonDefineToolOptions. (#28614) by @prastoin- The four agent tools are now
@DefineToolclasses, declaring theIS_AI_CHAT_INBOX_ENABLEDandAI_SETTINGSgates. (#28630) by @prastoin - Endpoint permission snapshots now record
requiredPermissionFlagsandrequiredFeatureFlagsper endpoint. (#28633) by @prastoin - The date picker is now a shared twenty-ui component with themed calendar styles; product logic stays in twenty-front. (#28636) by @bosiraphael
- A connection provider's scope is now immutable; changing it requires a new provider with a new
universalIdentifier. (#28637) by @ehconitin - Non-editable roles are excluded from application manifests on export and sync. (#28674) by @prastoin
- Ask AI tool context now includes the calling application, correctly scoping workflow and logic function tools. (#28678) by @prastoin
- App developer docs now have an Operations Monitoring page covering the monitoring tab and log sources. (#28686) by @martmull
🏗️ Internal changes (27)
- AI tiers: Balanced to gpt-6-luna@max; self-host Anthropic cheap rungs to Haiku 5.5 (#28390) by @twenty-pr-author
- docs: match the filters page and mailbox docs to the product (#28479) by @etiennejouan
- Replace CODEOWNERS with a CI approval check for sensitive paths (#28497) by @FelixMalfait
- Remove the
as anycasts in config-value-converter.service.ts (#28505) by @twenty-pr-author - Rename 3 server files to the singular suffix in src/engine/core-modules/auth/constants (#28507) by @twenty-pr-author
- AI catalog: move dev/staging Smart to gpt-6.1-sol and Extra Smart to claude-opus-5-5, raise Balanced to luna@max, add gemini-4-argon (#28512) by @twenty-pr-author
- Add a required status check to the merge-queue workflow (#28514) by @prastoin
- Update Twenty UI front component documentation (#28518) by @bosiraphael
- Align Twenty UI documentation (#28522) by @bosiraphael
- Rename local-driver-kernel.const.ts to local-driver-kernel.constant.ts (#28596) by @twenty-pr-author
- Remove unused BILLING_STRIPE_BASE_PLAN_PRODUCT_ID from server CI env (#28602) by @etiennejouan
- Recreate application registration versions skipped on v2.48.0 instances (#28603) by @martmull
- Keep only the npm build and publish executor public (#28605) by @FelixMalfait
- Use the multi-arch Node 24.22.1 Docker base (#28611) by @prastoin
- Fix annotated publishing tags after shallow checkout (#28620) by @FelixMalfait
- Use a single object argument for renderStats test helper (#28622) by @martmull
- Validate npm publishing with native Yarn staging (#28623) by @FelixMalfait
- Upgrade Yarn to 4.18.1 for native staged publishing (#28627) by @FelixMalfait
- Make the Microsoft Teams app README concise (#28628) by @ehconitin
- fix(ci): track standalone CLI in docs and skills drift checks (#28646) by @Weiko
- Allow private CLI staging before SDK publication (#28651) by @FelixMalfait
- Classify mail.instinct.com as a personal email domain (#28661) by @FelixMalfait
- Stabilize renderer popup interactions (#28665) by @bosiraphael
- Rename 6 server files to the singular suffix in src/engine/core-modules/file/utils (#28666) by @twenty-pr-author
- Use the shared separator for inbox unread messages (#28669) by @bosiraphael
- Refresh email campaign doc screenshots for the redesigned UI (#28681) by @neo773
- Remove the role service spec (#28690) by @prastoin
🎉 New contributors
Full changelog (163 PRs)
- feat: keep small CSV exports local and share CSV formatting (#26673) by @Weiko
- Add chat channels to the inbox (server) (#27448) by @FelixMalfait
- Support scrolling inside front component controls (#27895) by @bosiraphael
- Allow chart widgets to reference deactivated fields (#28082) by @FelixMalfait
- feat(ai): make the member a keyed runAgent call acts as the owner of the thread it continues (#28193) by @abdulrahmancodes
- Skip identical file writes using a stored content hash (#28213) by @neo773
- feat(billing): gate custom roles behind the CUSTOM_ROLES entitlement (#28218) by @etiennejouan
- Compare a field with another field in record filters (#28237) by @FelixMalfait
- Attach registration, version, source and error code to app logs (#28283) by @martmull
- Record app rate limits and server route failures as app logs (#28286) by @martmull
- Count app runs and platform events in a 90-day metric table (#28288) by @martmull
- Add app monitoring query for app owners (#28292) by @martmull
- Add app monitoring query for instance admins (#28293) by @martmull
- Add monitoring page for app owners (#28304) by @martmull
- Add app monitoring page to the admin panel (#28316) by @martmull
- Show and filter app platform events in the log console (#28318) by @martmull
- Fix front components and uploads behind cookie-authenticating proxies (#28375) by @Prashaxt
- i18n - translations (#28385) by @github-actions
- AI tiers: Balanced to gpt-6-luna@max; self-host Anthropic cheap rungs to Haiku 5.5 (#28390) by @twenty-pr-author
- Fix add rule group in search node (#28396) by @BOHEUS
- Keep row access aliases within Postgres' 63-byte identifier limit (#28411) by @ijreilly
- fix(server): route view-derived filters through the filter processor (#28414) by @etiennejouan
- Mask calendar events without shared channels instead of a no-op splice (#28415) by @ehconitin
- Gate @definetool tools with their own permission flags and serve the catalog from one method (#28416) by @prastoin
- Migrate the remaining webhook tools to @definetool (#28417) by @prastoin
- Add XCG currency (#28430) by @BOHEUS
- Use shared components in Companion (#28439) by @bosiraphael
- Use shared UI styles in frontend callers (#28441) by @bosiraphael
- Match the call recorder widget skeletons to Twenty's loader (#28442) by @ehconitin
- Give side panel front components the Select all filter (#28447) by @charlesBochet
- chore: bump version to 2.51.0 (#28448) by @twenty-pr
- Remove chip close button hover backgrounds (#28449) by @bosiraphael
- Truncate application registration credits display (#28452) by @martmull
- i18n - translations (#28453) by @github-actions
- i18n - translations (#28455) by @github-actions
- Show application statistics in a two-column stats grid (#28456) by @martmull
- fix(ai-chat): setup chat CRM pick continues as a fresh start (#28459) by @etiennejouan
- Make the workflow flow the editor's source of truth and save it on a debounce (#28461) by @charlesBochet
- Share frontend component build transforms with the server (#28465) by @Weiko
- Keep Dropdown pages for one open session (#28474) by @bosiraphael
- i18n - translations (#28475) by @github-actions
- Migrate the role tools to @definetool (#28476) by @prastoin
- Migrate the navigation menu item tools to @definetool (#28477) by @prastoin
- fix(ai): have the agent name only the UI its docs search shows (#28478) by @etiennejouan
- docs: match the filters page and mailbox docs to the product (#28479) by @etiennejouan
- Add whole-workspace data export to the admin panel (#28480) by @charlesBochet
- Remove IS_LOGS_SETTINGS_SECTION_ENABLED feature flag (#28481) by @martmull
- Add an App column to the app logs console table (#28482) by @martmull
- Chart credits used on app monitoring (#28483) by @martmull
- Store rich text as TipTap on the server (#28485) by @neo773
- [BREAKING_CHANGE] Convert existing rich text to TipTap in a 2.51 upgrade command (#28486) by @neo773
- Replace the BlockNote editor with TipTap in the app (#28487) by @neo773
- [BREAKING_CHANGE] Mark the rich text blocknote sub-field as deprecated in the GraphQL and REST schemas (#28488) by @neo773
- Count every rate-limited request and chart rate limits apart from errors (#28495) by @martmull
- chore: sync AI model catalog (#28496) by @github-actions
- Replace CODEOWNERS with a CI approval check for sensitive paths (#28497) by @FelixMalfait
- Add a CLI tab to Developers settings and move app creation to the standalone CLI (#28498) by @FelixMalfait
- Agent engine: read whether a conversation is waiting from one query (#28499) by @FelixMalfait
- Show unsent drafts in the AI chat list (#28503) by @FelixMalfait
- fix(dpa): stop recording a click-through DPA on every signup (#28504) by @FelixMalfait
- Remove the
as anycasts in config-value-converter.service.ts (#28505) by @twenty-pr-author - Agent engine: runs wait for a busy conversation in one ordered line (#28506) by @FelixMalfait
- Rename 3 server files to the singular suffix in src/engine/core-modules/auth/constants (#28507) by @twenty-pr-author
- Give percentages and booleans their own inputs in record forms (#28510) by @charlesBochet
- AI catalog: move dev/staging Smart to gpt-6.1-sol and Extra Smart to claude-opus-5-5, raise Balanced to luna@max, add gemini-4-argon (#28512) by @twenty-pr-author
- Add a required status check to the merge-queue workflow (#28514) by @prastoin
- i18n - translations (#28515) by @github-actions
- Lower PDL enrichment prices (#28516) by @bosiraphael
- Update Twenty UI front component documentation (#28518) by @bosiraphael
- Pass @definetool execute arguments as a single object (#28519) by @prastoin
- Align Twenty UI documentation (#28522) by @bosiraphael
- Keep icon widths in flex layouts (#28523) by @bosiraphael
- Stop a failed iterator from re-entering its loop (#28524) by @charlesBochet
- Add shared Banner dismissal (#28525) by @bosiraphael
- Add shared Text typography props (#28527) by @bosiraphael
- Add shared Card actions and controls (#28528) by @bosiraphael
- Add plain Input and Textarea variants (#28529) by @bosiraphael
- Add cover images for the built-in account apps (#28530) by @ehconitin
- Send cookies with the web app manifest request (#28531) by @prastoin
- Migrate the view tools to @definetool (#28532) by @prastoin
- i18n - translations (#28533) by @github-actions
- Load the selected list relations in findManyApplications (#28534) by @charlesBochet
- i18n - translations (#28537) by @github-actions
- Give the workspace custom application its own default role (#28538) by @prastoin
- i18n - translations (#28539) by @github-actions
- Unify CLI and SDK frontend component build transforms (#28541) by @Weiko
- Show "Not shared" for restricted record names (#28542) by @charlesBochet
- Prepare Microsoft Teams v1 marketplace release (#28543) by @ehconitin
- Move the system filter into the core object filters panel (#28544) by @FelixMalfait
- Migrate chart settings dropdowns (#28545) by @bosiraphael
- Update the new chat design (#28546) by @bosiraphael
- Fix app OAuth recovery and return navigation (#28548) by @ehconitin
- Show starter limits on the empty Limits tab instead of redirecting (#28550) by @FelixMalfait
- Link company email threads and calendar events from a record (#28551) by @FelixMalfait
- [BREAKING_CHANGE] feat(billing): move billing plans config to BILLING_PLANS (#28552) by @etiennejouan
- i18n - translations (#28553) by @github-actions
- Explain remote setup in CLI help (#28557) by @Weiko
- Bump Node to 24.22.1 (#28559) by @prastoin
- Update inbox rows and triage controls (#28564) by @bosiraphael
- Align inbox conversation components (#28566) by @bosiraphael
- Add a connection health check to the Microsoft Teams app (#28568) by @ehconitin
- Add a shared details row (#28570) by @bosiraphael
- Add a shared reaction button (#28571) by @bosiraphael
- Add multiline ListItem rows (#28572) by @bosiraphael
- i18n - translations (#28573) by @github-actions
- Add Lambda driver integration tests against Floci (#28574) by @neo773
- Truncate rich text field display to a single line (#28581) by @FelixMalfait
- File a member's own AI chat once they leave it caught up (#28583) by @FelixMalfait
- File the chats left open in members' inboxes on upgrade to 2.51 (#28584) by @FelixMalfait
- i18n - translations (#28590) by @github-actions
- chore: sync AI model catalog (#28593) by @github-actions
- Add a guide to securing self-hosted instances (#28595) by @FelixMalfait
- Rename local-driver-kernel.const.ts to local-driver-kernel.constant.ts (#28596) by @twenty-pr-author
- Remove unused BILLING_STRIPE_BASE_PLAN_PRODUCT_ID from server CI env (#28602) by @etiennejouan
- Recreate application registration versions skipped on v2.48.0 instances (#28603) by @martmull
- Keep only the npm build and publish executor public (#28605) by @FelixMalfait
- Lock and read timeline merges per linked record (#28607) by @etiennejouan
- Extract shared form field row (#28608) by @bosiraphael
- Add a shared labeled separator (#28610) by @bosiraphael
- Use the multi-arch Node 24.22.1 Docker base (#28611) by @prastoin
- Let @definetool tools declare a catalog icon (#28612) by @prastoin
- Let @definetool tools require workspace feature flags (#28614) by @prastoin
- Claim an application: icon-only sync catalog button, look up on the right (#28615) by @martmull
- Hide credits used column in app stats when billing is disabled (#28616) by @martmull
- Migrate widget settings dropdowns (#28617) by @bosiraphael
- Show the redirect host on the OAuth consent screen (#28619) by @charlesBochet
- Fix annotated publishing tags after shallow checkout (#28620) by @FelixMalfait
- Use a single object argument for renderStats test helper (#28622) by @martmull
- Validate npm publishing with native Yarn staging (#28623) by @FelixMalfait
- feat(billing): show the current legacy plan on the Plans page (#28624) by @etiennejouan
- Fix oversized icons in timeline field diffs (#28625) by @FelixMalfait
- Upgrade Yarn to 4.18.1 for native staged publishing (#28627) by @FelixMalfait
- Make the Microsoft Teams app README concise (#28628) by @ehconitin
- Migrate the agent tools to @definetool (#28630) by @prastoin
- Record permission and feature flags in the endpoint permission snapshot (#28633) by @prastoin
- Migrate DatePicker to twenty-ui (#28636) by @bosiraphael
- Make connection provider scope immutable and derive account scope from it (#28637) by @ehconitin
- Remove focus rings from search inputs (#28638) by @bosiraphael
- Hide record write commands on objects not writable from user sessions (#28641) by @martmull
- Only offer user-assignable roles in the workspace default role picker (#28644) by @prastoin
- Refuse row-level permission rule changes on non-editable roles (#28645) by @prastoin
- fix(ci): track standalone CLI in docs and skills drift checks (#28646) by @Weiko
- Cache Lambda GetFunction results per logic function (#28647) by @charlesBochet
- Clarify budget field label in the partner brief form (#28650) by @ijreilly
- Allow private CLI staging before SDK publication (#28651) by @FelixMalfait
- Keep inbox rows compact (#28656) by @bosiraphael
- Fix currency and date display in cards (#28657) by @bosiraphael
- Classify mail.instinct.com as a personal email domain (#28661) by @FelixMalfait
- Restore onboarding button contrast (#28662) by @bosiraphael
- Fix navigation skeleton overflow (#28663) by @bosiraphael
- Stabilize renderer popup interactions (#28665) by @bosiraphael
- Rename 6 server files to the singular suffix in src/engine/core-modules/file/utils (#28666) by @twenty-pr-author
- Set Admin as the Twenty standard application default role (#28667) by @prastoin
- Use the shared separator for inbox unread messages (#28669) by @bosiraphael
- Show "Not shared" in the record page breadcrumb for restricted titles (#28670) by @charlesBochet
- Keep non-editable roles out of application manifests (#28674) by @prastoin
- Match currency values to Figma (#28676) by @bosiraphael
- Give Ask AI the calling application in its tool context (#28678) by @prastoin
- Refresh email campaign doc screenshots for the redesigned UI (#28681) by @neo773
- Fix logic functions staying on the old SDK after it is regenerated (#28683) by @neo773
- Refuse a campaign send upfront when the list is over the daily email limit (#28685) by @neo773
- Document app monitoring for app developers (#28686) by @martmull
- Remove the role service spec (#28690) by @prastoin
Full Changelog: twenty/v2.50.0...twenty/v2.51.0