Releases: twentyhq/twenty
Releases · twentyhq/twenty
Release list
twenty/v2.30.0
⚠️ Breaking changes
- The GraphQL metadata API no longer uses nestjs-query cursor types. Remove ObjectConnection, FieldConnection, CursorPaging, and related cursor inputs from metadata queries and switch to the new resolver-based shape. (#23925) by @abdulrahmancodes
- Server image security update: undici bumped from v6/v7 to v8 (potentially breaking for direct callers), plus js-yaml, sharp, brace-expansion, ip-address, and dompurify patched for critical and high CVEs. Self-hosters should update. (#23963) by @charlesBochet
🌟 Highlights
- Hidden records no longer surface as chart labels through unfiltered relation joins. (#23369)
- A new /chat mode keeps the conversation front and center with records opening as side-panel artifacts. (#23929)
- Campaign email bodies now have a canvas editor with sections, columns, buttons, and image blocks. (#23657)
- Views can now be displayed as a List, alongside table, board, and calendar. (#23829)
- Records that no longer match an active filter disappear from the open table in real time. (#23858)
- Opening and closing a currency field editor without typing no longer corrupts the stored amount. (#23874)
✨ New features
- The runAgent API now accepts a messages array for multi-turn bot conversations alongside the existing single-prompt form. (#23395) by @abdulrahmancodes
- Apps can now run an agent on behalf of a specific workspace member, scoping the run to that person's permissions. (#23470) by @abdulrahmancodes
- Large-company signups now see an optional Cal.com call-booking step during onboarding, between the team invite and plan selection. (#23521) by @bosiraphael
- The Slack bot now includes direct links to records it creates or surfaces, so you can open them from the reply. (#23539) by @abdulrahmancodes
- Fireflies calls missed by webhooks can be backfilled via POST /fireflies/backfill; the work fans out as batched background jobs. (#23622) by @ehconitin
- Campaign email bodies now open in a canvas editor with sections, columns, buttons, dividers, and image blocks that render to email-safe HTML per recipient. (#23657) by @ijreilly
- Navigating away from the workspace setup chat now carries the conversation into the Ask AI side panel instead of losing it. (#23744) by @bosiraphael
- The transcript provider for call recordings is now a workspace-admin setting. The default is Recall.ai; Gladia remains available for mixed-language calls. (#23789) by @ehconitin
- Record pages can now show a field widget listing records two relation hops away — e.g. a Client page listing Transactions of the Client's Wallets. (#23815) by @FelixMalfait
- A sending domain waiting on DKIM record propagation now shows as Pending instead of Failed in email domain settings. (#23818) by @ijreilly
- Views can now be displayed as a List, alongside the existing Table, Board, and Calendar layouts. (#23829) by @neo773
- The Slack bot now answers empty mentions and DMs with example prompts, and notifies lapsed threads rather than dropping them silently. (#23835) by @abdulrahmancodes
- The bot's own mention is stripped wherever it appears in a Slack message, not just at the very start. (#23837) by @abdulrahmancodes
- The Slack bot now uses Slack's native agent surface, gaining a built-in thinking indicator, suggested prompts, and thread titles. (#23838) by @abdulrahmancodes
- A new /chat mode keeps the AI conversation in the main pane; records and views the agent surfaces open as side-panel artifacts next to the thread. (#23929) by @FelixMalfait
- List-layout views now render as a proper list widget instead of silently falling through to a table renderer. (#23940) by @FelixMalfait
- Recipient chips in the email composer can be dragged to reorder, moved across To/Cc/Bcc, range-selected with shift or cmd/ctrl, and deleted as a group. (#23947) by @FelixMalfait
- The email composer header is restyled with flush rows, inline labels, and a clean divider — closer to a mail client than a settings form. (#23948) by @FelixMalfait
💅 Improvements & UX
- A failed page chunk load no longer shows a raw browser error string in a snackbar. (#23571) by @bosiraphael
- Microsoft Graph webhook lifecycle events now route correctly: subscriptionRemoved recreates the subscription, reauthorizationRequired renews it in place. (#23707) by @neo773
- Onboarding no longer shows free-credit tags or reward prompts when billing is disabled on the instance. (#23717) by @bosiraphael
- The Slack bot no longer calls the Slack API to identify itself on every channel-join event; the bot user id is cached at connect time. (#23726) by @abdulrahmancodes
- Expired invitations are no longer treated as active and no longer count toward the onboarding invitation limit. (#23749) by @prastoin
- Drag-and-drop across the app now uses a single consistent drop-position algorithm; table rows, Kanban cards, and tabs drop where you aim them. (#23752) by @git-init-priyanshu
- Disconnecting a Slack workspace now releases the team claim so another Twenty workspace can connect to the same Slack team. (#23753) by @abdulrahmancodes
- A new cross-workspace chat list in the admin panel (AI tab) shows all AI conversations, filterable by onboarding status, errors, and workspace. (#23757) by @bosiraphael
- Dragged table rows and Kanban cards now share a consistent background and opacity treatment. (#23772) by @Bonapara
- During workspace setup, only display name, subdomain, and logo can be changed; all other fields are locked until the workspace is activated. (#23781) by @prastoin
- A stray ] that sometimes appeared after AI chat record chips is fixed. (#23798) by @bosiraphael
- Recall call recordings that end due to bot-detection timeout are now processed normally instead of being marked as not recorded. (#23812) by @ehconitin
- Streaming AI chat messages now render at constant cost per chunk instead of slowing down as the message grows. (#23831) by @FelixMalfait
- The button that opens the credit package picker is renamed from 'Increase' to 'Manage'. (#23840) by @FelixMalfait
- The active session list and 'Log out all devices' in Settings → Devices now apply only to the current workspace. (#23843) by @FelixMalfait
- The bottom border of the last row in a record table is no longer missing. (#23846) by @FelixMalfait
- Opening the Ask AI panel with a fast-model preselection no longer silently falls back to the smart model. (#23854) by @charlesBochet
- Opening Monaco-backed editors (code logic, MCP settings, workflow code) no longer causes worker method errors from having two Monaco instances loaded. (#23855) by @FelixMalfait
- Fonts are now served from Twenty's own servers; no browsing data is shared with Google Fonts when loading any Twenty page. (#23859) by @FelixMalfait
- JSON-LD structured data in page heads is now properly escaped, closing a potential XSS path from crafted string values in page titles or names. (#23865) by @FelixMalfait
- The HTML block preview sanitizer now removes template, slot, and portal elements to close a parser-differential gap. (#23866) by @FelixMalfait
- Workspace subdomains can now be as short as one character (previously the minimum was three). (#23871) by @ijreilly
- Invitees who complete onboarding are no longer routed to a dead-end workspace setup page. (#23881) by @bosiraphael
- On mobile, the record page header shows only the record title; the object type and pagination count are hidden where there is not enough room. ([#23902](https://github.com/twentyhq/twenty/p...
sdk/v2.30.0
⚠️ Breaking changes
- Remove any reference to
clientConfig.subdomainMinLength— the field is deleted fromClientConfigintwenty-client-sdk. (#23915) by @ijreilly - Cursor-pagination types from the metadata API (
FieldEdge,FieldFilter,CursorPaging,PageInfo,ConnectionCursor, and comparison inputs) are removed; switch to the offset-based equivalents in the updated schema. (#23925) by @abdulrahmancodes
🌟 Highlights
- BREAKING:
subdomainMinLengthis removed fromClientConfigintwenty-client-sdk— drop any reference toclientConfig.subdomainMinLength. (#23915) - BREAKING: Cursor-pagination types from the metadata API (
FieldEdge,FieldFilter,CursorPaging,PageInfo,ConnectionCursor) are removed following the nestjs-query migration. (#23925) runAgentnow accepts amessagesarray (alternating user/assistant turns) for multi-turn bot conversations; existingprompt-only calls are unchanged. (#23395)runAgentcan now execute on behalf of a specific workspace member, scoping the agent to that user's permissions. (#23470)CALL_RECORDING_SUMMARYandCALL_RECORDING_TRANSCRIPTare registered as new widget types and appear intwenty-client-sdkgenerated types. (#23864)
✨ New features
- Pass a
messagesarray (alternating user/assistant turns) torunAgentfor multi-turn bot conversations; the existingpromptfield continues to work for one-shot calls. (#23395) by @abdulrahmancodes - New option on
runAgentlets your app execute an agent as a specific workspace member, capping the agent's permissions to that user's role. (#23470) by @abdulrahmancodes CALL_RECORDING_SUMMARYandCALL_RECORDING_TRANSCRIPTare now registered widget types; they appear intwenty-client-sdkgenerated type definitions. (#23864) by @ehconitinUser.isWorkspaceCreatoris now a resolved GraphQL field, accessible throughtwenty-client-sdkgenerated types. (#23881) by @bosiraphael
💅 Improvements & UX
- Minimum allowed subdomain length is now 1 character instead of 3; update any client-side subdomain validation that assumed the old floor. (#23871) by @ijreilly
🐛 Bug fixes
- Logic function layer builds no longer die with out-of-memory errors when an app bundles large packages such as
twenty-ui. (#23805) by @charlesBochet
⚡ Performance
- Workspace metadata cache now uses compact storage behind a server flag, reducing GC pressure on heavy traffic; no API changes. (#23880) by @charlesBochet
🏗️ Internal changes (11)
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- Feat/list view type (#23829) by @neo773
- Self-host every font instead of loading them from Google (#23859) by @FelixMalfait
- Add full-page AI chat mode with records as side panel artifacts (#23929) by @FelixMalfait
- Add List View lab icon and make lab feature flag icons mandatory (#23930) by @FelixMalfait
- Make LIST a widget layout instead of a table in disguise (#23940) by @FelixMalfait
🎉 New contributors
- @blockgroot made their first contribution in #23758
- @Dumeng made their first contribution in #23913
Full changelog (23 PRs)
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Add messages support to runAgent for multi-turn bot conversations (#23395) by @abdulrahmancodes
- feat(run-agent): let apps run an agent on behalf of a workspace member (#23470) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- chore: bump version to 2.28.0 (#23730) by @twenty-pr
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- fix(twenty-server): stop the yarn-install Lambda from running out of memory (#23805) by @charlesBochet
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- chore: bump version to 2.29.0 (#23820) by @twenty-pr
- Feat/list view type (#23829) by @neo773
- Self-host every font instead of loading them from Google (#23859) by @FelixMalfait
- Add call recording transcript and summary widget types (#23864) by @ehconitin
- Revert "Make subdomain minimum length configurable via env var" (#23871) by @ijreilly
- perf(server): compact and cold-store workspace cache payloads behind a feature flag (#23880) by @charlesBochet
- Gate the workspace setup AI chat to workspace creators (#23881) by @bosiraphael
- chore: bump version to 2.30.0 (#23914) by @twenty-pr
- Remove deprecated subdomainMinLength from ClientConfig (#23915) by @ijreilly
- [BREAKING CHANGE] refactor(server): migrate the metadata API off nestjs-query (#23925) by @abdulrahmancodes
- Add full-page AI chat mode with records as side panel artifacts (#23929) by @FelixMalfait
- Add List View lab icon and make lab feature flag icons mandatory (#23930) by @FelixMalfait
- Make LIST a widget layout instead of a table in disguise (#23940) by @FelixMalfait
Full Changelog: sdk/v2.27.0...sdk/v2.30.0
sdk/v2.29.0
🌟 Highlights
- runAgent now accepts a messages array for multi-turn conversations; pass either messages or prompt, not both — existing prompt-only callers are unchanged. (#23395)
- Metadata client schemas regenerated with new CALL_RECORDING_SUMMARY and CALL_RECORDING_TRANSCRIPT widget-type enum values; update your generated client to pick them up. (#23864)
- isWorkspaceCreator is now a resolvable field on the User type in the GraphQL schema. (#23881)
✨ New features
- runAgent now accepts a messages array (user/assistant turns) alongside the existing prompt field — pass exactly one of the two; bot integrations can send thread history directly without wrapping it in a prompt string. (#23395) by @abdulrahmancodes
💅 Improvements & UX
- Metadata client schemas now include CALL_RECORDING_SUMMARY and CALL_RECORDING_TRANSCRIPT in the widget-type and configuration-type enums; regenerate your metadata client to consume the new values. (#23864) by @ehconitin
- isWorkspaceCreator is now exposed as a resolved field on User in the GraphQL schema; query it to gate creator-only flows in your integration without an extra round-trip. (#23881) by @bosiraphael
🏗️ Internal changes (9)
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- fix(twenty-server): stop the yarn-install Lambda from running out of memory (#23805) by @charlesBochet
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- Self-host every font instead of loading them from Google (#23859) by @FelixMalfait
- Revert "Make subdomain minimum length configurable via env var" (#23871) by @ijreilly
🎉 New contributors
- @blockgroot made their first contribution in #23758
Full changelog (14 PRs)
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Add messages support to runAgent for multi-turn bot conversations (#23395) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- chore: bump version to 2.28.0 (#23730) by @twenty-pr
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- fix(twenty-server): stop the yarn-install Lambda from running out of memory (#23805) by @charlesBochet
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- chore: bump version to 2.29.0 (#23820) by @twenty-pr
- Self-host every font instead of loading them from Google (#23859) by @FelixMalfait
- Add call recording transcript and summary widget types (#23864) by @ehconitin
- Revert "Make subdomain minimum length configurable via env var" (#23871) by @ijreilly
- Gate the workspace setup AI chat to workspace creators (#23881) by @bosiraphael
Full Changelog: sdk/v2.27.0...sdk/v2.29.0
twenty/v2.29.0
✨ New features
- feat(twenty-slack): link records and format the assistant reply footer (#23539) by @abdulrahmancodes
- feat(slack): cache the Slack bot user id at connect time (#23726) by @abdulrahmancodes
- feat(workflow): repair orphan core workflow versions via upgrade command (#23739) by @thomtrp
- feat(server): export event-loop delay and workspace-cache recompute metrics (#23751) by @charlesBochet
- feat(slack): release the Slack team claim when the connection goes away (#23753) by @abdulrahmancodes
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- feat(server): instrument the local metadata cache and cap heavy providers by entry count (#23778) by @charlesBochet
- feat(slack): strip the bot's own mention anywhere in the request text (#23837) by @abdulrahmancodes
💅 Improvements & UX
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Enforce row-level permissions on joined relations (#23369) by @bosiraphael
- Add messages support to runAgent for multi-turn bot conversations (#23395) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Stop showing raw chunk load errors (#23571) by @bosiraphael
- Fix grouping a view that can no longer be changed or removed (#23619) by @abdulrahmancodes
- Fan out Fireflies backfill into batched jobs (#23622) by @ehconitin
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- Add cookie-session integration test suite (#23715) by @prastoin
- Hide onboarding credits when billing is disabled (#23717) by @bosiraphael
- Update website release notes through 2.26 (#23736) by @Bonapara
- Run the people-data-labs spec suite in CI (#23743) by @bosiraphael
- Continue the workspace setup chat in the side panel when navigating away (#23744) by @bosiraphael
- Ignore expired invitations in invitation lookups (#23749) by @prastoin
- Add IS_FEATURE_FLAG_MANAGEMENT_ENABLED to unlock feature flag toggling outside cloud (#23750) by @FelixMalfait
- Dnd library migration fixes and changes (#23752) by @git-init-priyanshu
- Keep the token pair as a fallback after switching to cookie auth (#23755) by @FelixMalfait
- Add global admin panel chat list with onboarding filter and enriched transcript (#23757) by @bosiraphael
- Standardize dragged element feedback (#23772) by @Bonapara
- Restrict which workspace fields can be updated before activation (#23781) by @prastoin
- Refactor outbound email content compilation (#23782) by @FelixMalfait
- Make the call recorder transcript provider an application variable (#23789) by @ehconitin
- Add OpenTelemetry metrics to workspace migration build and run (#23797) by @prastoin
- Fix stray bracket after AI chat chips (#23798) by @bosiraphael
- Fix workflow email body overflowing into the attachments section (#23810) by @ijreilly
- Fix AI campaign editing: tool auth context in workers and live editor resync (#23811) by @FelixMalfait
- Stop classifying Recall bot-detection timeouts as NOT_RECORDED in call-recorder (#23812) by @ehconitin
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Fix widget view save paths dropping relationTargetFieldMetadataId (#23814) by @FelixMalfait
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- Cancel drag activation when the drag source unmounts mid-gesture (#23816) by @FelixMalfait
- Report a sending domain as pending while SES waits for the DKIM records (#23818) by @ijreilly
- Extend live update coverage: workflow draft updates and side-panel records (#23830) by @FelixMalfait
- Make AI chat streaming render cost independent of message length (#23831) by @FelixMalfait
- Fix client-side record matching for nested relation filters (#23832) by @FelixMalfait
- slack: answer empty requests and nudge lapsed threads (#23835) by @abdulrahmancodes
- Rename credits "Increase" button to "Manage" (#23840) by @FelixMalfait
- Scope sessions and application authorizations to the workspace (#23843) by @FelixMalfait
- Fix missing border below the last record table row (#23846) by @FelixMalfait
- Revert AI chat chips to the [[kind:...:label]] syntax (#23852) by @bosiraphael
- Add call recording transcript and summary widget types (#23864) by @ehconitin
- Escape JSON-LD payloads before inlining them in a script tag (#23865) by @FelixMalfait
- Strip template elements from the HTML block preview (#23866) by @FelixMalfait
- Clear to-one relation key instead of storing {id: null} in record workflow steps (#23869) by @thomtrp
- Revert "Make subdomain minimum length configurable via env var" (#23871) by @ijreilly
- Gate the workspace setup AI chat to workspace creators (#23881) by @bosiraphael
- Show only the record title in the mobile page header (#23902) by @FelixMalfait
🐛 Bug fixes
- fix: allow app-manifest RECORD_TABLE widgets to reference a view by universal identifier (#23634) by @thomtrp
- fix(twenty-front): expand HTML preview viewport in DocumentViewer (#23668) (#23676) by @Shinu-Cherian
- fix(front): show relation value chip (Me / record names) in advanced filters (#23718) by @charlesBochet
- fix(settings): unbreak the AI tools table and validate page-level graphql documents (#23731) by @FelixMalfait
- fix(front): only show Discard Draft when workflow has a published version (#23756) by @thomtrp
- fix(workflow): reject if-else branches with a dangling filterGroupId (#23758) by @blockgroot
- fix(twenty-front): stop field widget layout dropdown from crashing th… (#23784) by @FelixMalfait
- fix(twenty-server): compose email from the caller's own connected account (#23793) by @charlesBochet
- fix(twenty-server): stop the yarn-install Lambda from running out of memory (#23805) by @charlesBochet
- fix(workflow): make core-consistency drift check trustworthy for rollout (#23807) by @thomtrp
- fix(front): apply advanced filter value and operand edits after a fresh page load (#23819) by @charlesBochet
- fix(twenty-front): keep auto-select model preselection instead of discarding it (#23854) by @charlesBochet
- fix(front): run a single Monaco instance across the app (#23855) by @FelixMalfait
- fix(twenty-server): notify SSE subscribers when an update leaves their filtered view (#23858) by @charlesBochet
- fix(front): preserve currency decimals when opening the field editor (#23874) by @thomtrp
🔧 Developer & API
- webhook subscriptions error h...
twenty/v2.28.0
✨ New features
- feat(twenty-slack): link records and format the assistant reply footer (#23539) by @abdulrahmancodes
- feat(slack): cache the Slack bot user id at connect time (#23726) by @abdulrahmancodes
- feat(workflow): repair orphan core workflow versions via upgrade command (#23739) by @thomtrp
- feat(server): export event-loop delay and workspace-cache recompute metrics (#23751) by @charlesBochet
- feat(workflow): dispatch automated triggers from core behind a flag (#23775) by @thomtrp
- feat(server): instrument the local metadata cache and cap heavy providers by entry count (#23778) by @charlesBochet
💅 Improvements & UX
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Enforce row-level permissions on joined relations (#23369) by @bosiraphael
- Add messages support to runAgent for multi-turn bot conversations (#23395) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- Stop showing raw chunk load errors (#23571) by @bosiraphael
- Fix grouping a view that can no longer be changed or removed (#23619) by @abdulrahmancodes
- Fan out Fireflies backfill into batched jobs (#23622) by @ehconitin
- Feat/advanced text editor capability presets (#23657) by @ijreilly
- Add cookie-session integration test suite (#23715) by @prastoin
- Hide onboarding credits when billing is disabled (#23717) by @bosiraphael
- Update website release notes through 2.26 (#23736) by @Bonapara
- Run the people-data-labs spec suite in CI (#23743) by @bosiraphael
- Continue the workspace setup chat in the side panel when navigating away (#23744) by @bosiraphael
- Ignore expired invitations in invitation lookups (#23749) by @prastoin
- Add IS_FEATURE_FLAG_MANAGEMENT_ENABLED to unlock feature flag toggling outside cloud (#23750) by @FelixMalfait
- Dnd library migration fixes and changes (#23752) by @git-init-priyanshu
- Keep the token pair as a fallback after switching to cookie auth (#23755) by @FelixMalfait
- Standardize dragged element feedback (#23772) by @Bonapara
- Restrict which workspace fields can be updated before activation (#23781) by @prastoin
- Refactor outbound email content compilation (#23782) by @FelixMalfait
- Make the call recorder transcript provider an application variable (#23789) by @ehconitin
- Add OpenTelemetry metrics to workspace migration build and run (#23797) by @prastoin
- Fix stray bracket after AI chat chips (#23798) by @bosiraphael
- Fix workflow email body overflowing into the attachments section (#23810) by @ijreilly
- Fix AI campaign editing: tool auth context in workers and live editor resync (#23811) by @FelixMalfait
- Stop classifying Recall bot-detection timeouts as NOT_RECORDED in call-recorder (#23812) by @ehconitin
- Bump vulnerable dependencies flagged by ECR image scanning (#23813) by @charlesBochet
- Fix widget view save paths dropping relationTargetFieldMetadataId (#23814) by @FelixMalfait
- Add nested relation Field widgets on record page layouts (#23815) by @FelixMalfait
- Cancel drag activation when the drag source unmounts mid-gesture (#23816) by @FelixMalfait
- Report a sending domain as pending while SES waits for the DKIM records (#23818) by @ijreilly
- Extend live update coverage: workflow draft updates and side-panel records (#23830) by @FelixMalfait
- Make AI chat streaming render cost independent of message length (#23831) by @FelixMalfait
- Fix client-side record matching for nested relation filters (#23832) by @FelixMalfait
- Rename credits "Increase" button to "Manage" (#23840) by @FelixMalfait
- Scope sessions and application authorizations to the workspace (#23843) by @FelixMalfait
- Fix missing border below the last record table row (#23846) by @FelixMalfait
- Revert AI chat chips to the [[kind:...:label]] syntax (#23852) by @bosiraphael
🐛 Bug fixes
- fix: allow app-manifest RECORD_TABLE widgets to reference a view by universal identifier (#23634) by @thomtrp
- fix(twenty-front): expand HTML preview viewport in DocumentViewer (#23668) (#23676) by @Shinu-Cherian
- fix(front): show relation value chip (Me / record names) in advanced filters (#23718) by @charlesBochet
- fix(settings): unbreak the AI tools table and validate page-level graphql documents (#23731) by @FelixMalfait
- fix(front): only show Discard Draft when workflow has a published version (#23756) by @thomtrp
- fix(workflow): reject if-else branches with a dangling filterGroupId (#23758) by @blockgroot
- fix(twenty-front): stop field widget layout dropdown from crashing th… (#23784) by @FelixMalfait
- fix(twenty-server): compose email from the caller's own connected account (#23793) by @charlesBochet
- fix(workflow): make core-consistency drift check trustworthy for rollout (#23807) by @thomtrp
- fix(front): apply advanced filter value and operand edits after a fresh page load (#23819) by @charlesBochet
🔧 Developer & API
- webhook subscriptions error handling (#23707) by @neo773
- Accept a singleton or filter in the GraphQL filter walker (#23738) by @bosiraphael
- Proxy API routes through the vite dev server to keep local dev same-origin (#23779) by @prastoin
🏗️ Internal changes (3)
🎉 New contributors
- @blockgroot made their first contribution in #23758
Full changelog (76 PRs)
- Make subdomain minimum length configurable via env var (#23209) by @ijreilly
- Enforce row-level permissions on joined relations (#23369) by @bosiraphael
- Add messages support to runAgent for multi-turn bot conversations (#23395) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads (#23521) by @bosiraphael
- feat(twenty-slack): link records and format the assistant reply footer (#23539) by @abdulrahmancodes
- Stop showing raw chunk load errors (#23571) by @bosiraphael
- Fix grouping a view that can no longer be changed or removed (#23619) by @abdulrahmancodes
- Fan out Fireflies backfill into batched jobs (#23622) by @ehconitin
- fix: allow app-manifest RECORD_TABLE widgets to reference a view by universal identifier (#23634) by @thomtrp
- Feat/advanced text editor capabilit...
twenty/v2.27.0
✨ New features
- feat(connections): add an onDisconnect lifecycle hook to connection providers (#23538) by @abdulrahmancodes
- feat(workflow): route all version content readers through the flag-aware sources (#23583) by @thomtrp
- feat(server): add role management tools for AI chat (#23613) by @FelixMalfait
- feat(workflow): variable pickers for Search Records limit, offset and date filters (#23696) by @thomtrp
- feat(slack): implement channel welcome message functionality (#23699) by @abdulrahmancodes
💅 Improvements & UX
- Add captcha and throttling to the password reset link (#23372) by @bosiraphael
- Keep leading + when filtering phones by calling code (#23546) by @thomtrp
- Fix record title cell reopening on every page refresh (#23551) by @avonian
- Messaging archived account fix (#23553) by @BOHEUS
- Replace last-contact backfill with cursor-paginated per-record backfills (#23582) by @martmull
- Use the fast model for the onboarding setup chat (#23586) by @bosiraphael
- Improve the workspace setup kickoff prompt (#23594) by @bosiraphael
- Fix calendar field picker state handling (#23595) by @Weiko
- Make page layout tab layoutMode diffable and default standalone pages to vertical list (#23596) by @bosiraphael
- v1.6.1 — fix(partners): scope Application RLS to the partner's own partnerUser (#23597) by @rashad
- v1.6.0 — Partners: let partners set the regions they serve on My Profile (#23605) by @rashad
- Harden Fireflies call synchronization lifecycle (#23610) by @ehconitin
- Unwrap settings front components in the front component build (#23631) by @ehconitin
- Fix TOTP validation ignoring the configured tolerance window (#23632) by @FelixMalfait
- Add a roles standard skill for the AI chat agent (#23636) by @bosiraphael
- Keep chart palette colors stable when series order changes (#23638) by @ehconitin
- Remove shouldRunOnVersionUpgrade (#23641) by @martmull
- Migrate web auth from localStorage token pairs to httpOnly cookie sessions (#23642) by @FelixMalfait
- Fix ReconcileIndexViewUniversalIdentifier failing on occupied derived identifiers (#23647) by @prastoin
- Remove noisy actor context injection logs (#23649) by @Weiko
- Update slack app naming (#23650) by @martmull
- Update record page layout card (#23654) by @Bonapara
- Remove outdated index view pitfall from app agent docs (#23667) by @prastoin
- Docs update - Microsoft integration (#23671) by @BOHEUS
- Record and enforce per-user OAuth application authorizations (#23678) by @FelixMalfait
- Bound an application by its own role as well as the user's (#23680) by @FelixMalfait
- Classify Recall no-capture sub codes as NOT_RECORDED in call-recorder app (#23693) by @ehconitin
- Classify OAuth refresh errors by reason instead of status code (#23705) by @neo773
- Default workspaceMember openRecordIn when the workspace is not upgraded yet (#23723) by @FelixMalfait
🐛 Bug fixes
- fix(ai-chat): show streaming activity during and between steps (#23581) by @etiennejouan
- fix(front): reload record board groups when view groups change (#23637) by @thomtrp
- fix(server): preserve null values in record update util (#23639) by @thomtrp
- fix(server): stop FIND_RECORDS from silently ignoring its filter (#23640) by @thomtrp
- fix: provision INDEX view fields for relations created in the same batch as their object (#23665) by @prastoin
- fix(twenty-front): Scrolling and Dragging conflict on mobile devices (#23677) by @git-init-priyanshu
- fix(server): catch application job enqueue throttle instead of failing the batch job (#23684) by @thomtrp
- fix(server): scope personal favorite SSE events to their owner (#23712) by @thomtrp
- fix(workflow): clear nextStepIds when converting a step to If/Else (#23714) by @thomtrp
🔧 Developer & API
- Filter connected account webhook renewal to exclude accounts with failed authentication errors (#23694) by @neo773
- Track connected account webhook subscription lifecycle metrics (#23710) by @neo773
🏗️ Internal changes (5)
- refactor(navigation-menu-item): validate universal properties instead of ids (#23566) by @prastoin
- docs: fix inaccuracies found auditing the docs against v2.27.0 (#23616) by @FelixMalfait
- test(server): strengthen MCP catalog and gating coverage (#23630) by @FelixMalfait
- refactor(last-contact): drive backfill with enqueued jobs (#23646) by @martmull
- ci(pr-review): dispatch on PR open (standard review only) (#23708) by @charlesBochet
Full changelog (77 PRs)
- Add captcha and throttling to the password reset link (#23372) by @bosiraphael
- feat(connections): add an onDisconnect lifecycle hook to connection providers (#23538) by @abdulrahmancodes
- Keep leading + when filtering phones by calling code (#23546) by @thomtrp
- Fix record title cell reopening on every page refresh (#23551) by @avonian
- Messaging archived account fix (#23553) by @BOHEUS
- refactor(navigation-menu-item): validate universal properties instead of ids (#23566) by @prastoin
- fix(ai-chat): show streaming activity during and between steps (#23581) by @etiennejouan
- Replace last-contact backfill with cursor-paginated per-record backfills (#23582) by @martmull
- feat(workflow): route all version content readers through the flag-aware sources (#23583) by @thomtrp
- Use the fast model for the onboarding setup chat (#23586) by @bosiraphael
- Improve the workspace setup kickoff prompt (#23594) by @bosiraphael
- Fix calendar field picker state handling (#23595) by @Weiko
- Make page layout tab layoutMode diffable and default standalone pages to vertical list (#23596) by @bosiraphael
- v1.6.1 — fix(partners): scope Application RLS to the partner's own partnerUser (#23597) by @rashad
- i18n - translations (#23600) by @github-actions
- i18n - docs translations (#23602) by @github-actions
- i18n - translations (#23603) by @github-actions
- chore: bump version to 2.27.0 (#23604) by @twenty-pr
- v1.6.0 — Partners: let partners set the regions they serve on My Profile (#23605) by @rashad
- i18n - docs translations (#23608) by @github-actions
- Harden Fireflies call synchronization lifecycle (#23610) by @ehconitin
- feat(server): add role management tools for AI chat (#23613) by @FelixMalfait
- Move open-record-in to object metadata and member preference ([#23614](htt...
sdk/v2.27.0
✨ New features
- feat(connections): add an onDisconnect lifecycle hook to connection providers (#23538) by @abdulrahmancodes
💅 Improvements & UX
- Add captcha and throttling to the password reset link (#23372) by @bosiraphael
- Make page layout tab layoutMode diffable and default standalone pages to vertical list (#23596) by @bosiraphael
- Unwrap settings front components in the front component build (#23631) by @ehconitin
- Migrate web auth from localStorage token pairs to httpOnly cookie sessions (#23642) by @FelixMalfait
- Remove outdated index view pitfall from app agent docs (#23667) by @prastoin
- Record and enforce per-user OAuth application authorizations (#23678) by @FelixMalfait
Full changelog (9 PRs)
- Add captcha and throttling to the password reset link (#23372) by @bosiraphael
- feat(connections): add an onDisconnect lifecycle hook to connection providers (#23538) by @abdulrahmancodes
- Make page layout tab layoutMode diffable and default standalone pages to vertical list (#23596) by @bosiraphael
- chore: bump version to 2.27.0 (#23604) by @twenty-pr
- Move open-record-in to object metadata and member preference (#23614) by @FelixMalfait
- Unwrap settings front components in the front component build (#23631) by @ehconitin
- Migrate web auth from localStorage token pairs to httpOnly cookie sessions (#23642) by @FelixMalfait
- Remove outdated index view pitfall from app agent docs (#23667) by @prastoin
- Record and enforce per-user OAuth application authorizations (#23678) by @FelixMalfait
Full Changelog: sdk/v2.26.0...sdk/v2.27.0
twenty/v2.26.0
⚠️ Breaking changes
- [BREAKING-CHANGE] Centralize system
ViewviewFieldside effect (#23081) by @prastoin - [breaking-change] fix(server): return runAgent execution failures as result errors (#23390) by @abdulrahmancodes
✨ New features
- feat: Slack conversational assistant (#22984) by @abdulrahmancodes
- feat(workflow): read workflow version content from core in the engine, behind a flag (#23403) by @thomtrp
- feat(front): preview highlighted record in the search command bar (#23413) by @FelixMalfait
- feat(workflow): pin concrete model on AI agent node creation and exclude interactive tools from workflow runs (#23447) by @etiennejouan
- feat(ai-agent): lazy tool loading for the open-ended runAgent path (#23454) by @abdulrahmancodes
- feat(ai-tool): resolve and default icons in AI metadata tools (#23480) by @etiennejouan
- feat(workflow): make the flow atom authoritative for version content, read core behind a flag (#23499) by @thomtrp
- feat(server): attach app attributes to application rate-limited metric (#23500) by @prastoin
- feat(dashboard): extend number format option to bar, line and pie charts (#23505) by @ehconitin
- feat(apps): add enqueueJob to run a logic function on the workers (#23527) by @martmull
💅 Improvements & UX
- Mirror host element geometry into front component workers (#23264) by @bosiraphael
- Restore soft-deleted junction record when re-adding a junction relation (#23371) by @thomtrp
- Show call recorders as calendar event participants (#23380) by @martmull
- Include root cause errors in workspace migration runner exception message (#23416) by @prastoin
- Take openRecordIn from the view in scope instead of a global atom (#23422) by @FelixMalfait
- Make record chips open records natively on touch devices (#23424) by @FelixMalfait
- Docs update (#23429) by @BOHEUS
- Auto-start the workspace setup chat with a data model proposal (#23437) by @bosiraphael
- Keep email participant avatar colors consistent (#23444) by @Weiko
- Add calendar date field submenu with grouped field options (#23445) by @Weiko
- Hide the command menu button while the mobile side panel is open (#23471) by @FelixMalfait
- PDF upload fix (#23473) by @BOHEUS
- Open records on a full page instead of a side panel on mobile (#23474) by @FelixMalfait
- Dashboard doc fix (#23475) by @BOHEUS
- Disable double-tap zoom while keeping pinch zoom (#23476) by @FelixMalfait
[Upgrade]Stop command gracefully on SIGINT/SIGTERM (#23481) by @prastoin- Resolve route-trigger workspace from bearer token on bare hosts (#23490) by @ehconitin
- Stop building the Campaigns navigation menu item (#23493) by @FelixMalfait
- Restore the Figma halftone shapes and calm the welcome animation (#23495) by @bosiraphael
- Align campaign view column positions with the standard layout (#23496) by @FelixMalfait
[Upgrade]Add a detached-run wrapper for theupgradecommand (#23497) by @prastoin- System view tooling explicit params key naming (#23506) by @prastoin
- Fix clipped New chat button label in localized navigation drawer (#23511) by @thomtrp
- Make onboarding cards contrast with the page background (#23516) by @bosiraphael
- Install pre-installed apps in a dedicated job after the workspace upgrade cursor is written (#23517) by @martmull
- Move settings tabs below page headers (#23519) by @Bonapara
- Pin last-contact to twenty >=2.26.0 (#23520) by @prastoin
- Prevent overlapping workspace cleanup executions (#23522) by @Weiko
- Switch call recorder post-call transcription to Gladia with code switching (#23532) by @ehconitin
- Refresh billing state after ending trial period (#23534) by @FelixMalfait
- Keep fullWidth buttons at full width while loading (#23536) by @FelixMalfait
- Document current front component limitations (#23549) by @bosiraphael
- Let the instance upgrade version reach releases without instance commands (#23552) by @prastoin
- Add licensing section to legal FAQ (#23560) by @BOHEUS
- Hide app record-selection commands when all records are selected (#23561) by @bosiraphael
- Clarify application licensing and add trademark policy (#23564) by @FelixMalfait
- Revert the external link confirmation popup for front components (#23567) by @bosiraphael
- Compute last contact on relationship changes in last-contact app (#23569) by @martmull
- Add application job enqueue limits guard on all message queue drivers (#23570) by @martmull
- Display object, field and view links as chips in the AI chat (#23573) by @bosiraphael
- Optimize upgrade status gauges with count-only queries (#23574) by @Weiko
- Delete DESIGN.md (#23576) by @FelixMalfait
- Delete PRODUCT.md (#23577) by @FelixMalfait
- Throttle local cache expiration sweeps (#23579) by @Weiko
- Add connected account handle/provider index (#23580) by @Weiko
- Create INDEX view fields visible on field creation (#23585) by @prastoin
- Add Enterprise plan and competitor pricing comparison pages (#23588) by @FelixMalfait
- Maintain INDEX view system side effects on deactivated views (#23590) by @prastoin
- Cache metadata lookups during ORM result formatting (#23593) by @Weiko
🐛 Bug fixes
- fix(page-layout): render standalone rich text widget on record pages (#23435) by @thomtrp
- fix(workflow): rename the trigger step through the dedicated mutation (#23450) by @thomtrp
- fix: Decrypt encrypted front component variables (#23494) by @remihuigen
- fix(server): stop the global catch-all filter from shadowing typed GraphQL exception filters (#23508) by @thomtrp
- fix(workflow): use as draft with an existing draft and cross-object record page filters (#23524) by @thomtrp
🔧 Developer & API
- Use client SDK /s dispatch for call-recorder own-route posts (#23558) by @ehconitin
🏗️ Internal changes (3)
🎉 New contributors
- @remihuigen made their first contribution in #23494
Full changelog (93 PRs)
- feat: Slack conversational assistant (#22984) by @abdulrahmancodes
- [BREAKING-CHANGE] Centralize system
ViewviewFieldside effect ([#23081](https://git...
sdk/v2.26.0
⚠️ Breaking changes
✨ New features
- feat(dashboard): extend number format option to bar, line and pie charts (#23505) by @ehconitin
- feat(apps): add enqueueJob to run a logic function on the workers (#23527) by @martmull
💅 Improvements & UX
- Auto-start the workspace setup chat with a data model proposal (#23437) by @bosiraphael
- System view tooling explicit params key naming (#23506) by @prastoin
- Refresh billing state after ending trial period (#23534) by @FelixMalfait
- Clarify application licensing and add trademark policy (#23564) by @FelixMalfait
🎉 New contributors
- @remihuigen made their first contribution in #23494
Full changelog (8 PRs)
- [BREAKING-CHANGE] Centralize system
ViewviewFieldside effect (#23081) by @prastoin - Auto-start the workspace setup chat with a data model proposal (#23437) by @bosiraphael
- chore: bump version to 2.26.0 (#23451) by @twenty-pr
- feat(dashboard): extend number format option to bar, line and pie charts (#23505) by @ehconitin
- System view tooling explicit params key naming (#23506) by @prastoin
- feat(apps): add enqueueJob to run a logic function on the workers (#23527) by @martmull
- Refresh billing state after ending trial period (#23534) by @FelixMalfait
- Clarify application licensing and add trademark policy (#23564) by @FelixMalfait
Full Changelog: sdk/v2.25.0...sdk/v2.26.0
twenty/v2.25.0
Release notes preview
🌟 Highlights
- Relation field widgets on record pages can now display related records as a kanban board, calendar, or grouped table. (#23112)
- Dashboard charts grouped by a relation field now show the related record's name instead of a raw database ID. (#23163)
- Records that changed while disconnected now re-appear automatically on reconnect, without needing a page refresh. (#23357)
✨ New features
- Full-page record tabs (Timeline, Tasks, Notes, Files, Emails, Calendar) now support drag-and-drop widget editing and behave consistently with the rest of the layout editor. (#23109) by @FelixMalfait
- Relation field widgets on a record page can now render as a kanban board, calendar, or grouped table, scoped to that record's related data. (#23112) by @FelixMalfait
- Dashboard charts grouped by a relation field now show the related record's display name instead of the raw database ID. (#23163) by @bosiraphael
- Email settings now let you configure a display name for outgoing emails and manage your unsubscriber list. (#23180) by @neo773
- The email composer moves to its own page, auto-saves drafts you can return to later, and adds a send-test-email option. (#23188) by @neo773
- During workspace setup, the company is automatically enriched from People Data Labs so the AI assistant knows your company from its first reply. (#23199) by @bosiraphael
- Logic function executions triggered by Call Recorder and Last Contact app events no longer consume workspace credits. (#23255) by @martmull
- Applications can again expose a custom settings tab in their settings detail page. (#23256) by @martmull
- Front components (dashboard widgets, side panel items, settings previews) now show a shimmering skeleton placeholder while loading instead of blank space. (#23261) by @bosiraphael
- 'Me' filters now work for relation fields pointing to a workspace member (such as an account-owner field) in dashboard widget filters. (#23282) by @bosiraphael
💅 Improvements & UX
- The onboarding 'Install your first apps' step only shows marketplace apps that have been vetted. (#23222) by @martmull
- Clicking a link in a front component that leads to a different domain now shows a confirmation dialog before navigating away. (#23270) by @bosiraphael
- The external-link confirmation dialog for front components has a new design with clearer copy and the destination URL shown as a pill. (#23404) by @bosiraphael
- The record page card on mobile no longer has a rounded top-left corner and hairline border carried over from the desktop layout. (#23414) by @FelixMalfait
- Folder items in the mobile navigation drawer no longer show grey corners around them. (#23425) by @FelixMalfait
🐛 Bug fixes
- The admin panel no longer displays 'latest' as the latest version when DockerHub tag fetching fails; it now shows no version found. (#22885) by @Rehansanjay
- The call recording bot now leaves a meeting when only other recording bots remain, rather than staying for up to 30 minutes. (#23053) by @martmull
- Google and Microsoft sign-in no longer puts a long-lived refresh token in the redirect URL, browser history, or server access logs. (#23061) by @bosiraphael
- Creating a record in a junction relation picker no longer shows the new record twice until the page is reloaded. (#23185) by @neo773
- Front components no longer render a blank panel in Firefox; the structured-clone error that blocked rendering is now handled correctly. (#23213) by @bosiraphael
- Application icons now display correctly after install and sync instead of falling back to initials avatars. (#23245) by @martmull
- Agent tools now use the agent's assigned role permissions when reading or writing records, rather than the app's default role. (#23248) by @abdulrahmancodes
- The message list member backfill upgrade command now runs correctly during a 2.25 upgrade. (#23271) by @prastoin
- Upgrading a self-hosted instance from 2.23 to 2.24 no longer fails on startup with a missing
keyValuePair.applicationIdcolumn error. (#23272) by @prastoin - AI chat threads that became permanently broken due to duplicate tool call IDs now work again on the next turn. (#23277) by @etiennejouan
- Roles that explicitly deny access to system objects (messages, calendar events) now enforce that restriction; it was previously silently bypassed. (#23280) by @thomtrp
- The agent role foreign-key migration now runs correctly during a 2.25 upgrade. (#23285) by @prastoin
- AI chat no longer allows oversized tool outputs into conversation history; they are now capped or spilled to files. (#23286) by @etiennejouan
- The navigation drawer collapse/expand button now has an accessible label for screen readers. (#23287) by @djadji-gueye
- Workspace cleanup no longer times out; missing database indexes on page-layout foreign keys that caused sequential scans are now added. (#23289) by @etiennejouan
- Workflow record-change triggers on morph relations no longer offer a phantom
targetIdoutput variable that doesn't exist. (#23290) by @thomtrp - Custom sidebar links of type PAGE_LAYOUT now open an edit panel when clicked in edit mode. (#23293) by @eeshsaxena
- The core database now respects
PG_POOL_MAX_CONNECTIONSinstead of being capped at the node-postgres default of 10 connections. (#23322) by @Weiko - Transactional emails (workspace invites, password resets, email verifications) now have content again; they were being delivered with an empty body. (#23323) by @guillaume-flambard
- Icon-only 'more options' buttons across settings pages now have accessible labels for screen readers. (#23325) by @guillaume-flambard
- Opening a password reset link while already logged in no longer returns a FORBIDDEN error. (#23335) by @thomtrp
- The layout editor and its entry points are now hidden for users whose role lacks the LAYOUTS permission. (#23343) by @Shinu-Cherian
- App HTTP route triggers are now blocked for suspended workspaces instead of continuing to serve traffic. (#23347) by @Weiko
- Records that changed while the SSE connection was down are re-fetched on reconnect, so live updates no longer go silent until a page refresh. (#23357) by @thomtrp
- The onboarding flow no longer hangs indefinitely when a CSS chunk fails to preload, a regression that affected Mobile Safari. (#23359) by @bosiraphael
- Stale-chunk auto-reload is now limited to once per 60 seconds, preventing infinite reload loops after a bad deploy. (#23362) by @bosiraphael
- Apps using the runAgent API (such as call recorder) no longer receive a 'you are executing in a workflow' system prompt. (#23394) by @abdulrahmancodes
- AI agent nodes scoped to a specific object no longer load CRUD tools for every object in the workspace, cutting prompt size dramatically. (#23400) by @etiennejouan
- Token usage reported for AI runs no longer double-counts cache-creation tokens. (#23405) by @etiennejouan
- The 'Add option' prompt in multiselect fields is now hidden from users who lack the data-model permission. (#23410) by @thomtrp
- Installed application icons now display correctly across the UI instead of falling back to initials. (#23411) by @martmull
- Single-widget tabs in the side panel and on mobile now render with correct padding instead of sitting flush against the edge. (#23412) by @FelixMalfait
- The call recording bot's REC badge now renders as text in production instead of showing empty placeholder boxes. ([#23415](https...