github twentyhq/twenty twenty/v2.51.0

3 hours ago

⚠️ Breaking changes

  • Run upgrade:2-51:migrate-rich-text-to-tiptap after upgrading to convert existing rich text records to TipTap format. (#28486) by @neo773
  • The blocknote sub-field on rich text in the GraphQL and REST APIs is now deprecated; switch to markdown or tiptap before it is removed. (#28488) by @neo773
  • Billing plan configuration now lives in the BILLING_PLANS environment 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, or applicationVariables fields 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
  • @DefineTool tools now declare their own requiredPermissionFlags instead of inheriting them from a provider. (#28416) by @prastoin
  • Webhook tools are now @DefineTool classes; WebhookToolWorkspaceService and WebhookToolProvider are 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 @DefineTool classes. (#28476) by @prastoin
  • Navigation menu item tools are now @DefineTool classes; 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
  • @DefineTool execute methods now receive a single { input, context } object instead of two positional arguments. (#28519) by @prastoin
  • Text and OverflowingTextWithTooltip in twenty-ui now accept size, weight, and semantic color props. (#28527) by @bosiraphael
  • Card in twenty-ui now has Card.Action and Card.Control slots for row activation and independent controls. (#28528) by @bosiraphael
  • Input and Textarea in twenty-ui now have a plain variant. (#28529) by @bosiraphael
  • The 22 view tools are now @DefineTool classes and return ToolOutput instead 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 --help now explains how to create a connection with auth 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
  • DetailsRow is now available in twenty-ui for aligned label, icon, value, and action layouts. (#28570) by @bosiraphael
  • ReactionButton is now available in twenty-ui for emoji reactions with counts. (#28571) by @bosiraphael
  • ListItem and ListItemButton now 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
  • LabeledSeparator is now available in twenty-ui with centered or end labels and neutral/danger tones. (#28610) by @bosiraphael
  • @DefineTool tools can now declare a catalog icon via the icon option on DefineToolOptions. (#28612) by @prastoin
  • @DefineTool tools can now require workspace feature flags via requiredFeatureFlags on DefineToolOptions. (#28614) by @prastoin
  • The four agent tools are now @DefineTool classes, declaring the IS_AI_CHAT_INBOX_ENABLED and AI_SETTINGS gates. (#28630) by @prastoin
  • Endpoint permission snapshots now record requiredPermissionFlags and requiredFeatureFlags per 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 any casts 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)

Full Changelog: twenty/v2.50.0...twenty/v2.51.0

Don't miss a new twenty release

NewReleases is sending notifications on new releases.