twenty/v2.28.0

twentyhq/twentytwenty/v2.28.0Aug 11, 2026by twenty-pr[bot]

AI Summary

Improves Slack integration, workflow stability, and general UI/UX, including record linking in Slack and automated workflow triggers.

Key Highlights

  • Slack integration allows linking records and formatting assistant replies.
  • Workflow improvements include repairing orphaned versions and automated triggers.
  • Fixes for various Slack and workflow-related bugs.

New Features

  • Link records and format the assistant reply footer in Slack.
  • Repair orphan core workflow versions via upgrade command.
  • Dispatch automated triggers from core behind a flag.

Full Release Notes

<!-- generated-release-notes v1 -->

## ✨ New features

- feat(twenty-slack): link records and format the assistant reply footer ([#23539](https://github.com/twentyhq/twenty/pull/23539)) by @abdulrahmancodes
- feat(slack): cache the Slack bot user id at connect time ([#23726](https://github.com/twentyhq/twenty/pull/23726)) by @abdulrahmancodes
- feat(workflow): repair orphan core workflow versions via upgrade command ([#23739](https://github.com/twentyhq/twenty/pull/23739)) by @thomtrp
- feat(server): export event-loop delay and workspace-cache recompute metrics ([#23751](https://github.com/twentyhq/twenty/pull/23751)) by @charlesBochet
- feat(workflow): dispatch automated triggers from core behind a flag ([#23775](https://github.com/twentyhq/twenty/pull/23775)) by @thomtrp
- feat(server): instrument the local metadata cache and cap heavy providers by entry count ([#23778](https://github.com/twentyhq/twenty/pull/23778)) by @charlesBochet

## πŸ’… Improvements & UX

- Make subdomain minimum length configurable via env var ([#23209](https://github.com/twentyhq/twenty/pull/23209)) by @ijreilly
- Enforce row-level permissions on joined relations ([#23369](https://github.com/twentyhq/twenty/pull/23369)) by @bosiraphael
- Add messages support to runAgent for multi-turn bot conversations ([#23395](https://github.com/twentyhq/twenty/pull/23395)) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads ([#23521](https://github.com/twentyhq/twenty/pull/23521)) by @bosiraphael
- Stop showing raw chunk load errors ([#23571](https://github.com/twentyhq/twenty/pull/23571)) by @bosiraphael
- Fix grouping a view that can no longer be changed or removed ([#23619](https://github.com/twentyhq/twenty/pull/23619)) by @abdulrahmancodes
- Fan out Fireflies backfill into batched jobs ([#23622](https://github.com/twentyhq/twenty/pull/23622)) by @ehconitin
- Feat/advanced text editor capability presets ([#23657](https://github.com/twentyhq/twenty/pull/23657)) by @ijreilly
- Add cookie-session integration test suite ([#23715](https://github.com/twentyhq/twenty/pull/23715)) by @prastoin
- Hide onboarding credits when billing is disabled ([#23717](https://github.com/twentyhq/twenty/pull/23717)) by @bosiraphael
- Update website release notes through 2.26 ([#23736](https://github.com/twentyhq/twenty/pull/23736)) by @Bonapara
- Run the people-data-labs spec suite in CI ([#23743](https://github.com/twentyhq/twenty/pull/23743)) by @bosiraphael
- Continue the workspace setup chat in the side panel when navigating away ([#23744](https://github.com/twentyhq/twenty/pull/23744)) by @bosiraphael
- Ignore expired invitations in invitation lookups ([#23749](https://github.com/twentyhq/twenty/pull/23749)) by @prastoin
- Add IS_FEATURE_FLAG_MANAGEMENT_ENABLED to unlock feature flag toggling outside cloud ([#23750](https://github.com/twentyhq/twenty/pull/23750)) by @FelixMalfait
- Dnd library migration fixes and changes ([#23752](https://github.com/twentyhq/twenty/pull/23752)) by @git-init-priyanshu
- Keep the token pair as a fallback after switching to cookie auth ([#23755](https://github.com/twentyhq/twenty/pull/23755)) by @FelixMalfait
- Standardize dragged element feedback ([#23772](https://github.com/twentyhq/twenty/pull/23772)) by @Bonapara
- Restrict which workspace fields can be updated before activation ([#23781](https://github.com/twentyhq/twenty/pull/23781)) by @prastoin
- Refactor outbound email content compilation ([#23782](https://github.com/twentyhq/twenty/pull/23782)) by @FelixMalfait
- Make the call recorder transcript provider an application variable ([#23789](https://github.com/twentyhq/twenty/pull/23789)) by @ehconitin
- Add OpenTelemetry metrics to workspace migration build and run ([#23797](https://github.com/twentyhq/twenty/pull/23797)) by @prastoin
- Fix stray bracket after AI chat chips ([#23798](https://github.com/twentyhq/twenty/pull/23798)) by @bosiraphael
- Fix workflow email body overflowing into the attachments section ([#23810](https://github.com/twentyhq/twenty/pull/23810)) by @ijreilly
- Fix AI campaign editing: tool auth context in workers and live editor resync ([#23811](https://github.com/twentyhq/twenty/pull/23811)) by @FelixMalfait
- Stop classifying Recall bot-detection timeouts as NOT_RECORDED in call-recorder ([#23812](https://github.com/twentyhq/twenty/pull/23812)) by @ehconitin
- Bump vulnerable dependencies flagged by ECR image scanning ([#23813](https://github.com/twentyhq/twenty/pull/23813)) by @charlesBochet
- Fix widget view save paths dropping relationTargetFieldMetadataId ([#23814](https://github.com/twentyhq/twenty/pull/23814)) by @FelixMalfait
- Add nested relation Field widgets on record page layouts ([#23815](https://github.com/twentyhq/twenty/pull/23815)) by @FelixMalfait
- Cancel drag activation when the drag source unmounts mid-gesture ([#23816](https://github.com/twentyhq/twenty/pull/23816)) by @FelixMalfait
- Report a sending domain as pending while SES waits for the DKIM records ([#23818](https://github.com/twentyhq/twenty/pull/23818)) by @ijreilly
- Extend live update coverage: workflow draft updates and side-panel records ([#23830](https://github.com/twentyhq/twenty/pull/23830)) by @FelixMalfait
- Make AI chat streaming render cost independent of message length ([#23831](https://github.com/twentyhq/twenty/pull/23831)) by @FelixMalfait
- Fix client-side record matching for nested relation filters ([#23832](https://github.com/twentyhq/twenty/pull/23832)) by @FelixMalfait
- Rename credits "Increase" button to "Manage" ([#23840](https://github.com/twentyhq/twenty/pull/23840)) by @FelixMalfait
- Scope sessions and application authorizations to the workspace ([#23843](https://github.com/twentyhq/twenty/pull/23843)) by @FelixMalfait
- Fix missing border below the last record table row ([#23846](https://github.com/twentyhq/twenty/pull/23846)) by @FelixMalfait
- Revert AI chat chips to the [[kind:...:label]] syntax ([#23852](https://github.com/twentyhq/twenty/pull/23852)) by @bosiraphael

## πŸ› Bug fixes

- fix: allow app-manifest RECORD_TABLE widgets to reference a view by universal identifier ([#23634](https://github.com/twentyhq/twenty/pull/23634)) by @thomtrp
- fix(twenty-front): expand HTML preview viewport in DocumentViewer (#23668) ([#23676](https://github.com/twentyhq/twenty/pull/23676)) by @Shinu-Cherian
- fix(front): show relation value chip (Me / record names) in advanced filters ([#23718](https://github.com/twentyhq/twenty/pull/23718)) by @charlesBochet
- fix(settings): unbreak the AI tools table and validate page-level graphql documents ([#23731](https://github.com/twentyhq/twenty/pull/23731)) by @FelixMalfait
- fix(front): only show Discard Draft when workflow has a published version ([#23756](https://github.com/twentyhq/twenty/pull/23756)) by @thomtrp
- fix(workflow): reject if-else branches with a dangling filterGroupId ([#23758](https://github.com/twentyhq/twenty/pull/23758)) by @blockgroot
- fix(twenty-front): stop field widget layout dropdown from crashing th… ([#23784](https://github.com/twentyhq/twenty/pull/23784)) by @FelixMalfait
- fix(twenty-server): compose email from the caller's own connected account ([#23793](https://github.com/twentyhq/twenty/pull/23793)) by @charlesBochet
- fix(workflow): make core-consistency drift check trustworthy for rollout ([#23807](https://github.com/twentyhq/twenty/pull/23807)) by @thomtrp
- fix(front): apply advanced filter value and operand edits after a fresh page load ([#23819](https://github.com/twentyhq/twenty/pull/23819)) by @charlesBochet

## πŸ”§ Developer & API

- webhook subscriptions error handling ([#23707](https://github.com/twentyhq/twenty/pull/23707)) by @neo773
- Accept a singleton or filter in the GraphQL filter walker ([#23738](https://github.com/twentyhq/twenty/pull/23738)) by @bosiraphael
- Proxy API routes through the vite dev server to keep local dev same-origin ([#23779](https://github.com/twentyhq/twenty/pull/23779)) by @prastoin

<details>
<summary>πŸ—οΈ Internal changes (3)</summary>

- chore(codeowners): guard .claude, .mcp.json and CLAUDE.md ([#23734](https://github.com/twentyhq/twenty/pull/23734)) by @prastoin
- refactor(front): move workflow run step logs into workflow-actions ([#23841](https://github.com/twentyhq/twenty/pull/23841)) by @thomtrp
- ci(pr-review): stop a skipped label dispatch from cancelling the open dispatch ([#23856](https://github.com/twentyhq/twenty/pull/23856)) by @charlesBochet

</details>

## πŸŽ‰ New contributors

- @blockgroot made their first contribution in https://github.com/twentyhq/twenty/pull/23758

<details>
<summary>Full changelog (76 PRs)</summary>

- Make subdomain minimum length configurable via env var ([#23209](https://github.com/twentyhq/twenty/pull/23209)) by @ijreilly
- Enforce row-level permissions on joined relations ([#23369](https://github.com/twentyhq/twenty/pull/23369)) by @bosiraphael
- Add messages support to runAgent for multi-turn bot conversations ([#23395](https://github.com/twentyhq/twenty/pull/23395)) by @abdulrahmancodes
- Add a book-a-call onboarding step for qualified leads ([#23521](https://github.com/twentyhq/twenty/pull/23521)) by @bosiraphael
- feat(twenty-slack): link records and format the assistant reply footer ([#23539](https://github.com/twentyhq/twenty/pull/23539)) by @abdulrahmancodes
- Stop showing raw chunk load errors ([#23571](https://github.com/twentyhq/twenty/pull/23571)) by @bosiraphael
- Fix grouping a view that can no longer be changed or removed ([#23619](https://github.com/twentyhq/twenty/pull/23619)) by @abdulrahmancodes
- Fan out Fireflies backfill into batched jobs ([#23622](https://github.com/twentyhq/twenty/pull/23622)) by @ehconitin
- fix: allow app-manifest RECORD_TABLE widgets to reference a view by universal identifier ([#23634](https://github.com/twentyhq/twenty/pull/23634)) by @thomtrp
- Feat/advanced text editor capability presets ([#23657](https://github.com/twentyhq/twenty/pull/23657)) by @ijreilly
- fix(twenty-front): expand HTML preview viewport in DocumentViewer (#23668) ([#23676](https://github.com/twentyhq/twenty/pull/23676)) by @Shinu-Cherian
- webhook subscriptions error handling ([#23707](https://github.com/twentyhq/twenty/pull/23707)) by @neo773
- Add cookie-session integration test suite ([#23715](https://github.com/twentyhq/twenty/pull/23715)) by @prastoin
- Hide onboarding credits when billing is disabled ([#23717](https://github.com/twentyhq/twenty/pull/23717)) by @bosiraphael
- fix(front): show relation value chip (Me / record names) in advanced filters ([#23718](https://github.com/twentyhq/twenty/pull/23718)) by @charlesBochet
- feat(slack): cache the Slack bot user id at connect time ([#23726](https://github.com/twentyhq/twenty/pull/23726)) by @abdulrahmancodes
- chore: bump version to 2.28.0 ([#23730](https://github.com/twentyhq/twenty/pull/23730)) by @twenty-pr
- fix(settings): unbreak the AI tools table and validate page-level graphql documents ([#23731](https://github.com/twentyhq/twenty/pull/23731)) by @FelixMalfait
- chore(codeowners): guard .claude, .mcp.json and CLAUDE.md ([#23734](https://github.com/twentyhq/twenty/pull/23734)) by @prastoin
- Update website release notes through 2.26 ([#23736](https://github.com/twentyhq/twenty/pull/23736)) by @Bonapara
- Accept a singleton or filter in the GraphQL filter walker ([#23738](https://github.com/twentyhq/twenty/pull/23738)) by @bosiraphael
- feat(workflow): repair orphan core workflow versions via upgrade command ([#23739](https://github.com/twentyhq/twenty/pull/23739)) by @thomtrp
- i18n - translations ([#23740](https://github.com/twentyhq/twenty/pull/23740)) by @github-actions
- Run the people-data-labs spec suite in CI ([#23743](https://github.com/twentyhq/twenty/pull/23743)) by @bosiraphael
- Continue the workspace setup chat in the side panel when navigating away ([#23744](https://github.com/twentyhq/twenty/pull/23744)) by @bosiraphael
- i18n - translations ([#23746](https://github.com/twentyhq/twenty/pull/23746)) by @github-actions
- i18n - translations ([#23748](https://github.com/twentyhq/twenty/pull/23748)) by @github-actions
- Ignore expired invitations in invitation lookups ([#23749](https://github.com/twentyhq/twenty/pull/23749)) by @prastoin
- Add IS_FEATURE_FLAG_MANAGEMENT_ENABLED to unlock feature flag toggling outside cloud ([#23750](https://github.com/twentyhq/twenty/pull/23750)) by @FelixMalfait
- feat(server): export event-loop delay and workspace-cache recompute metrics ([#23751](https://github.com/twentyhq/twenty/pull/23751)) by @charlesBochet
- Dnd library migration fixes and changes ([#23752](https://github.com/twentyhq/twenty/pull/23752)) by @git-init-priyanshu
- Keep the token pair as a fallback after switching to cookie auth ([#23755](https://github.com/twentyhq/twenty/pull/23755)) by @FelixMalfait
- fix(front): only show Discard Draft when workflow has a published version ([#23756](https://github.com/twentyhq/twenty/pull/23756)) by @thomtrp
- fix(workflow): reject if-else branches with a dangling filterGroupId ([#23758](https://github.com/twentyhq/twenty/pull/23758)) by @blockgroot
- Standardize dragged element feedback ([#23772](https://github.com/twentyhq/twenty/pull/23772)) by @Bonapara
- feat(workflow): dispatch automated triggers from core behind a flag ([#23775](https://github.com/twentyhq/twenty/pull/23775)) by @thomtrp
- feat(server): instrument the local metadata cache and cap heavy providers by entry count ([#23778](https://github.com/twentyhq/twenty/pull/23778)) by @charlesBochet
- Proxy API routes through the vite dev server to keep local dev same-origin ([#23779](https://github.com/twentyhq/twenty/pull/23779)) by @prastoin
- Restrict which workspace fields can be updated before activation ([#23781](https://github.com/twentyhq/twenty/pull/23781)) by @prastoin
- Refactor outbound email content compilation ([#23782](https://github.com/twentyhq/twenty/pull/23782)) by @FelixMalfait
- fix(twenty-front): stop field widget layout dropdown from crashing th… ([#23784](https://github.com/twentyhq/twenty/pull/23784)) by @FelixMalfait
- Make the call recorder transcript provider an application variable ([#23789](https://github.com/twentyhq/twenty/pull/23789)) by @ehconitin
- fix(twenty-server): compose email from the caller's own connected account ([#23793](https://github.com/twentyhq/twenty/pull/23793)) by @charlesBochet
- i18n - translations ([#23794](https://github.com/twentyhq/twenty/pull/23794)) by @github-actions
- i18n - docs translations ([#23796](https://github.com/twentyhq/twenty/pull/23796)) by @github-actions
- Add OpenTelemetry metrics to workspace migration build and run ([#23797](https://github.com/twentyhq/twenty/pull/23797)) by @prastoin
- Fix stray bracket after AI chat chips ([#23798](https://github.com/twentyhq/twenty/pull/23798)) by @bosiraphael
- i18n - translations ([#23800](https://github.com/twentyhq/twenty/pull/23800)) by @github-actions
- i18n - translations ([#23803](https://github.com/twentyhq/twenty/pull/23803)) by @github-actions
- i18n - translations ([#23806](https://github.com/twentyhq/twenty/pull/23806)) by @github-actions
- fix(workflow): make core-consistency drift check trustworthy for rollout ([#23807](https://github.com/twentyhq/twenty/pull/23807)) by @thomtrp
- Fix workflow email body overflowing into the attachments section ([#23810](https://github.com/twentyhq/twenty/pull/23810)) by @ijreilly
- Fix AI campaign editing: tool auth context in workers and live editor resync ([#23811](https://github.com/twentyhq/twenty/pull/23811)) by @FelixMalfait
- Stop classifying Recall bot-detection timeouts as NOT_RECORDED in call-recorder ([#23812](https://github.com/twentyhq/twenty/pull/23812)) by @ehconitin
- Bump vulnerable dependencies flagged by ECR image scanning ([#23813](https://github.com/twentyhq/twenty/pull/23813)) by @charlesBochet
- Fix widget view save paths dropping relationTargetFieldMetadataId ([#23814](https://github.com/twentyhq/twenty/pull/23814)) by @FelixMalfait
- Add nested relation Field widgets on record page layouts ([#23815](https://github.com/twentyhq/twenty/pull/23815)) by @FelixMalfait
- Cancel drag activation when the drag source unmounts mid-gesture ([#23816](https://github.com/twentyhq/twenty/pull/23816)) by @FelixMalfait
- Report a sending domain as pending while SES waits for the DKIM records ([#23818](https://github.com/twentyhq/twenty/pull/23818)) by @ijreilly
- fix(front): apply advanced filter value and operand edits after a fresh page load ([#23819](https://github.com/twentyhq/twenty/pull/23819)) by @charlesBochet
- Extend live update coverage: workflow draft updates and side-panel records ([#23830](https://github.com/twentyhq/twenty/pull/23830)) by @FelixMalfait
- Make AI chat streaming render cost independent of message length ([#23831](https://github.com/twentyhq/twenty/pull/23831)) by @FelixMalfait
- Fix client-side record matching for nested relation filters ([#23832](https://github.com/twentyhq/twenty/pull/23832)) by @FelixMalfait
- i18n - translations ([#23834](https://github.com/twentyhq/twenty/pull/23834)) by @github-actions
- chore: sync AI model catalog from models.dev ([#23839](https://github.com/twentyhq/twenty/pull/23839)) by @github-actions
- Rename credits "Increase" button to "Manage" ([#23840](https://github.com/twentyhq/twenty/pull/23840)) by @FelixMalfait
- refactor(front): move workflow run step logs into workflow-actions ([#23841](https://github.com/twentyhq/twenty/pull/23841)) by @thomtrp
- Scope sessions and application authorizations to the workspace ([#23843](https://github.com/twentyhq/twenty/pull/23843)) by @FelixMalfait
- i18n - translations ([#23844](https://github.com/twentyhq/twenty/pull/23844)) by @github-actions
- i18n - translations ([#23845](https://github.com/twentyhq/twenty/pull/23845)) by @github-actions
- Fix missing border below the last record table row ([#23846](https://github.com/twentyhq/twenty/pull/23846)) by @FelixMalfait
- i18n - docs translations ([#23851](https://github.com/twentyhq/twenty/pull/23851)) by @github-actions
- Revert AI chat chips to the [[kind:...:label]] syntax ([#23852](https://github.com/twentyhq/twenty/pull/23852)) by @bosiraphael
- i18n - translations ([#23853](https://github.com/twentyhq/twenty/pull/23853)) by @github-actions
- ci(pr-review): stop a skipped label dispatch from cancelling the open dispatch ([#23856](https://github.com/twentyhq/twenty/pull/23856)) by @charlesBochet
- i18n - translations ([#23860](https://github.com/twentyhq/twenty/pull/23860)) by @github-actions

</details>

**Full Changelog**: https://github.com/twentyhq/twenty/compare/twenty/v2.27.0...twenty/v2.28.0