⚠️ Breaking changes
- Remove the IS_MESSAGE_CAMPAIGN_ENABLED feature flag (#28929) by @neo773
- Round-trip workflows built in the workflow builder through the manifest (#29053) by @FelixMalfait
- [BREAKING_CHANGE] Replace vetted apps with marketplace listing (#29187) by @martmull
✨ New features
- feat(view): let workspaces declare per-locale view name translations (#29095) by @ijreilly
- feat(ai): collapse long user messages in the chat thread (#29191) by @etiennejouan
- feat(cli): pull application dependency files (#29197) by @Weiko
- feat(billing): show what each seat includes and where workspace credits come from (#29202) by @etiennejouan
- feat(cli): pull existing apps or initialize the workspace custom app (#29207) by @Weiko
💅 Improvements & UX
- Compile AI component previews with Workspace app dependencies (#28468) by @Weiko
- Track unresolved mentions per member (#28719) by @bosiraphael
- Show app READMEs on marketplace app pages (#28842) by @abdulrahmancodes
- Add ordering scenarios for the fair worker queue (#28848) by @martmull
- Cover the queue mechanics the fair worker ordering must respect (#28851) by @martmull
- Add a Campaigns folder with Campaigns and Lists to the navigation menu (#28931) by @neo773
- Fix front component dropdown dismissal and reopening (#28982) by @bosiraphael
- Order worker jobs by tenant virtual clocks behind IS_WORKER_FAIRNESS_ENABLED (#28990) by @martmull
- Keep priority 1 ahead of the fair tickets for the platform's time-critical jobs (#28991) by @martmull
- Advance the queue's virtual time when a fair job is dispatched (#28992) by @martmull
- Rebase the fair tickets in bounded chunks once the virtual time passes 2^20 (#28994) by @martmull
- Build frontend shared dependencies from app lockfiles (#29018) by @Weiko
- Use existing drivers for AI component preview builds (#29019) by @Weiko
- Type every queued job as a workspace job or a system job (#29025) by @martmull
- Show the Teams assistant progress while it answers (#29059) by @abdulrahmancodes
- Name dependency layers per application and move functions onto them on their next run (#29085) by @prastoin
- Let apps attach records to inbox conversations (#29090) by @bosiraphael
- Add LinkedIn app (read-only, via Unipile v2) (#29116) by @martmull
- Pin the current workspace in admin and unify avatars (#29117) by @Bonapara
- Stop using the dead deletedAt column on agent (#29121) by @FelixMalfait
- Open record creation forms from relation pickers (#29129) by @Bonapara
- Reject server route triggers on ad-hoc logic functions (#29145) by @charlesBochet
- Declare the connected account shape for workflow step resolution once (#29148) by @FelixMalfait
- Add a Merge with command to record pages (#29155) by @FelixMalfait
- Show inbox conversations in record panels (#29156) by @bosiraphael
- Teach the crm-hygiene skill to merge duplicates (#29157) by @FelixMalfait
- Let applications declare MCP servers in their manifest (#29158) by @martmull
- i18n - translations (#29159) by @twenty-pr
- i18n - translations (#29161) by @twenty-pr
- Scope the upgrade command down rule to instance commands (#29162) by @prastoin
- Ignore isSystemSideEffect divergences when syncing manifests (#29169) by @prastoin
- Add a Salesfarce parody theme to appearance settings (#29171) by @Bonapara
- Show app logo on function options in log console filter (#29178) by @martmull
- Make log console table columns resizable (#29179) by @martmull
- Make the session cookie opt-in so front components can pass auth proxies (#29180) by @FelixMalfait
- Reuse downloadFile for the SAML metadata download (#29182) by @FelixMalfait
- i18n - translations (#29188) by @twenty-pr
- Hide isCustom from entities once the 2.54 drop command has run (#29189) by @charlesBochet
- Show app icon on every function in log console filter (#29190) by @martmull
- Move inbox filters into the list header (#29192) by @bosiraphael
- Show conversation status in thread details (#29195) by @bosiraphael
- Store Cloudflare country, region and city on user sessions (#29196) by @FelixMalfait
- i18n - translations (#29199) by @twenty-pr
- Fix avatars overlapping selected chat cards (#29203) by @bosiraphael
- Route server webhooks by application registration and function universalIdentifier (#29204) by @charlesBochet
- Store workspace Ada modes and conversation types (#29206) by @bosiraphael
- i18n - website translations (#29208) by @twenty-pr
- Reserve the TWENTY_ prefix for app variable names (#29210) by @prastoin
- Order chat participant writes (#29212) by @bosiraphael
- Deliver app inbox messages without a mention (#29213) by @bosiraphael
- i18n - translations (#29222) by @twenty-pr
- Extend Salesfarce to workflows, settings, chat and icons (#29223) by @Bonapara
- i18n - website translations (#29224) by @twenty-pr
- Show app banner and logo on built-in account app preferences (#29225) by @ehconitin
- Show a connect card for installed apps without connections (#29227) by @ehconitin
- Show app status instead of type on the workspace installed apps table (#29228) by @ehconitin
- Add the related record path metadata entity (#29229) by @charlesBochet
- Leave reserved variable names out of the app runtime env (#29230) by @prastoin
- Cover shared chat boundaries with integration tests (#29231) by @bosiraphael
- Forward enterprise licensing routes to twenty-connect (#29237) by @FelixMalfait
- Validate updateTimelineActivityType input (#29238) by @ijreilly
- Restore light description color on menu items (#29239) by @Bonapara
- Retry npm publish when the provenance entry conflicts in Rekor (#29240) by @charlesBochet
- Put the workspace app detail page on the shared app detail layout (#29253) by @ehconitin
- Move app preferences to /settings/app-preferences behind the flag (#29255) by @ehconitin
- Restore an isolated enterprise signing key for development (#29266) by @FelixMalfait
- Cap HTML nesting depth before converting email bodies to text (#29269) by @Tanguy-Magnaudet
- i18n - translations (#29270) by @twenty-pr
- Use disabled object permission actions in the Fathom, Slack and Teams apps (#29271) by @charlesBochet
- i18n - translations (#29272) by @twenty-pr
- Bound code interpreter output streamed to chat and read from the sandbox (#29274) by @charlesBochet
- Restore light join word in keyboard shortcuts (#29275) by @Bonapara
- Search the apps table by the name and description each row shows (#29277) by @ehconitin
- i18n - translations (#29282) by @twenty-pr
- i18n - translations (#29284) by @twenty-pr
🐛 Bug fixes
- fix(rich-text): keep nested task item content out of markdown code blocks (#28821) by @UditSinghChauhan
- fix(front): let the task and note rich text body scroll to the bottom (#29134) by @etiennejouan
- fix(accounts): trim whitespace in IMAP/SMTP/CalDAV server and username fields (#29091) (#29163) by @ghazy2001
- fix(server): refresh app connection access tokens using provider expires_in (#28446) (#29173) by @apoorv-xs
- fix(merge): reject non-UUID ids and a missing conflict priority index (#29183) by @etiennejouan
- fix(permissions): validate row-level predicate operands against the field type (#29185) by @etiennejouan
- fix(server): rebuild ORM table shapes after a field rename (#29244) by @etiennejouan
⚡ Performance
- perf(server): scope workspace migration cache invalidation to mutated maps (#29167) by @etiennejouan
🔧 Developer & API
- Self-host Extra Smart: xAI fallback grok-4.6@high → grok-4.7 (#29181) by @twenty-pr-author
- Name the User Apps and Workspace Apps permission flags USER_APPS and WORKSPACE_APPS in the SDK (#29194) by @ehconitin
- Add the related record path metadata API (#29243) by @charlesBochet
- Regenerate the SDK metadata client (#29264) by @ehconitin
🎉 New contributors
- @apoorv-xs made their first contribution in #29173
- @Tanguy-Magnaudet made their first contribution in #29269
Full changelog (97 PRs)
- Compile AI component previews with Workspace app dependencies (#28468) by @Weiko
- Track unresolved mentions per member (#28719) by @bosiraphael
- fix(rich-text): keep nested task item content out of markdown code blocks (#28821) by @UditSinghChauhan
- Show app READMEs on marketplace app pages (#28842) by @abdulrahmancodes
- Add ordering scenarios for the fair worker queue (#28848) by @martmull
- Cover the queue mechanics the fair worker ordering must respect (#28851) by @martmull
- Remove the IS_MESSAGE_CAMPAIGN_ENABLED feature flag (#28929) by @neo773
- Add a Campaigns folder with Campaigns and Lists to the navigation menu (#28931) by @neo773
- Fix front component dropdown dismissal and reopening (#28982) by @bosiraphael
- Order worker jobs by tenant virtual clocks behind IS_WORKER_FAIRNESS_ENABLED (#28990) by @martmull
- Keep priority 1 ahead of the fair tickets for the platform's time-critical jobs (#28991) by @martmull
- Advance the queue's virtual time when a fair job is dispatched (#28992) by @martmull
- Rebase the fair tickets in bounded chunks once the virtual time passes 2^20 (#28994) by @martmull
- Build frontend shared dependencies from app lockfiles (#29018) by @Weiko
- Use existing drivers for AI component preview builds (#29019) by @Weiko
- Type every queued job as a workspace job or a system job (#29025) by @martmull
- Round-trip workflows built in the workflow builder through the manifest (#29053) by @FelixMalfait
- Show the Teams assistant progress while it answers (#29059) by @abdulrahmancodes
- Name dependency layers per application and move functions onto them on their next run (#29085) by @prastoin
- Let apps attach records to inbox conversations (#29090) by @bosiraphael
- feat(view): let workspaces declare per-locale view name translations (#29095) by @ijreilly
- Add LinkedIn app (read-only, via Unipile v2) (#29116) by @martmull
- Pin the current workspace in admin and unify avatars (#29117) by @Bonapara
- Stop using the dead deletedAt column on agent (#29121) by @FelixMalfait
- Open record creation forms from relation pickers (#29129) by @Bonapara
- fix(front): let the task and note rich text body scroll to the bottom (#29134) by @etiennejouan
- Reject server route triggers on ad-hoc logic functions (#29145) by @charlesBochet
- Declare the connected account shape for workflow step resolution once (#29148) by @FelixMalfait
- Add a Merge with command to record pages (#29155) by @FelixMalfait
- Show inbox conversations in record panels (#29156) by @bosiraphael
- Teach the crm-hygiene skill to merge duplicates (#29157) by @FelixMalfait
- Let applications declare MCP servers in their manifest (#29158) by @martmull
- i18n - translations (#29159) by @twenty-pr
- i18n - translations (#29161) by @twenty-pr
- Scope the upgrade command down rule to instance commands (#29162) by @prastoin
- fix(accounts): trim whitespace in IMAP/SMTP/CalDAV server and username fields (#29091) (#29163) by @ghazy2001
- perf(server): scope workspace migration cache invalidation to mutated maps (#29167) by @etiennejouan
- Ignore isSystemSideEffect divergences when syncing manifests (#29169) by @prastoin
- Add a Salesfarce parody theme to appearance settings (#29171) by @Bonapara
- fix(server): refresh app connection access tokens using provider expires_in (#28446) (#29173) by @apoorv-xs
- Show app logo on function options in log console filter (#29178) by @martmull
- Make log console table columns resizable (#29179) by @martmull
- Make the session cookie opt-in so front components can pass auth proxies (#29180) by @FelixMalfait
- Self-host Extra Smart: xAI fallback grok-4.6@high → grok-4.7 (#29181) by @twenty-pr-author
- Reuse downloadFile for the SAML metadata download (#29182) by @FelixMalfait
- fix(merge): reject non-UUID ids and a missing conflict priority index (#29183) by @etiennejouan
- fix(permissions): validate row-level predicate operands against the field type (#29185) by @etiennejouan
- chore: bump version to 2.54.0 (#29186) by @twenty-pr
- [BREAKING_CHANGE] Replace vetted apps with marketplace listing (#29187) by @martmull
- i18n - translations (#29188) by @twenty-pr
- Hide isCustom from entities once the 2.54 drop command has run (#29189) by @charlesBochet
- Show app icon on every function in log console filter (#29190) by @martmull
- feat(ai): collapse long user messages in the chat thread (#29191) by @etiennejouan
- Move inbox filters into the list header (#29192) by @bosiraphael
- Name the User Apps and Workspace Apps permission flags USER_APPS and WORKSPACE_APPS in the SDK (#29194) by @ehconitin
- Show conversation status in thread details (#29195) by @bosiraphael
- Store Cloudflare country, region and city on user sessions (#29196) by @FelixMalfait
- feat(cli): pull application dependency files (#29197) by @Weiko
- i18n - translations (#29199) by @twenty-pr
- feat(billing): show what each seat includes and where workspace credits come from (#29202) by @etiennejouan
- Fix avatars overlapping selected chat cards (#29203) by @bosiraphael
- Route server webhooks by application registration and function universalIdentifier (#29204) by @charlesBochet
- Store workspace Ada modes and conversation types (#29206) by @bosiraphael
- feat(cli): pull existing apps or initialize the workspace custom app (#29207) by @Weiko
- i18n - website translations (#29208) by @twenty-pr
- Reserve the TWENTY_ prefix for app variable names (#29210) by @prastoin
- Order chat participant writes (#29212) by @bosiraphael
- Deliver app inbox messages without a mention (#29213) by @bosiraphael
- i18n - translations (#29222) by @twenty-pr
- Extend Salesfarce to workflows, settings, chat and icons (#29223) by @Bonapara
- i18n - website translations (#29224) by @twenty-pr
- Show app banner and logo on built-in account app preferences (#29225) by @ehconitin
- Show a connect card for installed apps without connections (#29227) by @ehconitin
- Show app status instead of type on the workspace installed apps table (#29228) by @ehconitin
- Add the related record path metadata entity (#29229) by @charlesBochet
- Leave reserved variable names out of the app runtime env (#29230) by @prastoin
- Cover shared chat boundaries with integration tests (#29231) by @bosiraphael
- Forward enterprise licensing routes to twenty-connect (#29237) by @FelixMalfait
- Validate updateTimelineActivityType input (#29238) by @ijreilly
- Restore light description color on menu items (#29239) by @Bonapara
- Retry npm publish when the provenance entry conflicts in Rekor (#29240) by @charlesBochet
- Add the related record path metadata API (#29243) by @charlesBochet
- fix(server): rebuild ORM table shapes after a field rename (#29244) by @etiennejouan
- chore(ci): stop publishing retired create-twenty-app (#29245) by @Weiko
- Put the workspace app detail page on the shared app detail layout (#29253) by @ehconitin
- Move app preferences to /settings/app-preferences behind the flag (#29255) by @ehconitin
- Regenerate the SDK metadata client (#29264) by @ehconitin
- Restore an isolated enterprise signing key for development (#29266) by @FelixMalfait
- Cap HTML nesting depth before converting email bodies to text (#29269) by @Tanguy-Magnaudet
- i18n - translations (#29270) by @twenty-pr
- Use disabled object permission actions in the Fathom, Slack and Teams apps (#29271) by @charlesBochet
- i18n - translations (#29272) by @twenty-pr
- Bound code interpreter output streamed to chat and read from the sandbox (#29274) by @charlesBochet
- Restore light join word in keyboard shortcuts (#29275) by @Bonapara
- Search the apps table by the name and description each row shows (#29277) by @ehconitin
- i18n - translations (#29282) by @twenty-pr
- i18n - translations (#29284) by @twenty-pr
Full Changelog: twenty/v2.53.1...twenty/v2.54.0