github twentyhq/twenty twenty/v2.43.0

latest releases: sdk/v2.42.0, sdk/v2.43.0
2 hours ago

⚠️ Breaking changes

  • feat(record-form): make the record creation form the default path (#25907) by @thomtrp
  • [2/5 workflows] Improve workflow classifier configuration (#26291) by @Bonapara
  • feat(application): deprecate uploadApplicationFile and drop the CLI multipart fallback (#26379) by @martmull
  • feat(files): upload workspace logos and profile pictures with direct upload (#26382) by @martmull
  • [BREAKING_CHANGE] refactor(server): compute the application-scoped core schema server-side (#26439) by @prastoin
  • chore(workflow): match the core workflow show page header to the workspace one (#26552) by @thomtrp
  • Group Card parts under one component (#26654) by @bosiraphael

✨ New features

  • feat(twenty-front): show secondary links in workflow action (#24486) by @Amit91848
  • feat(view): land on the initial object view and hide the index view behind the flag (#25682) by @thomtrp
  • feat(slack): per-channel rules for the assistant (#26016) by @abdulrahmancodes
  • feat(usage-limit): cap workspace file storage with a stock limit kind (#26042) by @etiennejouan
  • feat(workflow): core-id native workflow API — reads and writes (#26068) by @thomtrp
  • feat: add serviceAccount support to Helm chart (#26097) by @mdminhazulhaque
  • feat(workflow): core-only workflow execution and background processing (#26098) by @thomtrp
  • feat: migrate workflow editor and actions to core IDs (#26116) by @thomtrp
  • feat(auth): refuse API access for suspended workspaces (#26127) by @etiennejouan
  • feat(ai): click the chat title in the page header to rename the thread (#26146) by @FelixMalfait
  • feat(usage-limit): cap workspace records with a stock limit (#26147) by @etiennejouan
  • feat(server): give the message object a standard record page layout (#26153) by @FelixMalfait
  • feat: expose queue job progress (#26157) by @Weiko
  • feat(workflow): make core workflow and workflow version syncable so definition changes broadcast (#26158) by @thomtrp
  • feat(workflow): consume core workflow events on the core workflow surfaces (#26159) by @thomtrp
  • feat(apps): run application lifecycle hooks on a dedicated queue (#26166) by @martmull
  • feat(teams): scaffold the Microsoft Teams app package (#26185) by @abdulrahmancodes
  • feat(teams): add the Bot Connector client and inbound activity verification (#26186) by @abdulrahmancodes
  • feat(workflow): migrate MCP tools and bundled app consumers to core workflow IDs (#26189) by @thomtrp
  • feat(ai): add evaluation models and a Classify workflow node (#26225) by @FelixMalfait
  • feat: private workflows on the core schema (#26243) by @FelixMalfait
  • feat(usage-limit): gate workflow node runs and logic function executions (#26283) by @etiennejouan
  • feat(client-sdk): upload files straight to storage from uploadFile (#26305) by @martmull
  • feat(application): deploy app tarballs straight to file storage (#26314) by @martmull
  • feat(teams): add feature settings foundation (#26345) by @ehconitin
  • feat(sharing): unify record access and enable multiplayer chats (#26348) by @FelixMalfait
  • feat(view): land on the kanban for opportunities and a list for campaigns (#26360) by @thomtrp
  • feat(teams): consolidate transcript OAuth into Teams (#26362) by @ehconitin
  • feat(ai): execute chat turns as their persisted sender (#26369) by @FelixMalfait
  • feat(usage-limit): cap email sends with a quota limit (#26378) by @etiennejouan
  • feat(object-metadata): allow updating readability through the metadata API (#26427) by @martmull
  • feat(server): require a user session on the calendar timeline (#26440) by @prastoin
  • feat(server): require a user session on account-level operations (#26441) by @prastoin
  • feat(teams): require a Teams endorsement on the activity signing key (#26444) by @abdulrahmancodes
  • feat(workflow): require a core parent on every workflow version (2.43) (#26451) by @thomtrp
  • feat(usage-limit): consume quota on app charges (#26461) by @etiennejouan
  • feat(usage-limit): let only an operator replace an instance default (#26476) by @etiennejouan
  • feat(front-components): share one application token pair per application (#26525) by @prastoin
  • feat(last-contact): add a health check and run the backfill synchronously (1.6.0) (#26526) by @martmull
  • feat(usage-limit): ship a default daily email quota per workspace (#26535) by @etiennejouan
  • feat(event-logs): log record restores and permanent deletes (#26538) by @martmull
  • feat(ai): link chat threads to workspace members (expand step) (#26564) by @FelixMalfait
  • feat(ai): make chat threads an attachment target (#26565) by @FelixMalfait
  • feat(ai): separate chat sharing UI from backend rollout (#26581) by @FelixMalfait
  • feat(docker): add ClickHouse to twenty-app-dev image (#26598) by @martmull
  • feat(workflow): toggle core workflow visibility from the command menu (#26651) by @thomtrp
  • feat(usage): meter common API calls in complexity points (#26671) by @etiennejouan

💅 Improvements & UX

🐛 Bug fixes

  • fix(server): normalize deprecated IANA timezone aliases before they reach SQL (#23787) by @M3BIONIX
  • fix(twenty-server): honor the identity provider's advertised id_token signing algorithm (#24165) by @suparikoli
  • fix: respect RLS predicate groups for select options (#24327) by @alamin284
  • fix(view-permissions): recognize application principal in view access checks (#24349) by @longshaww
  • fix: ignore inherited Object keys when validating locales and normalize the x-locale header (#24919) by @guillaume-flambard
  • fix(front): keep legacy null phone subfields from being dropped (#25420) by @abhinavapasok
  • fix(view): keep view sorts in creation order in the flat view cache (#25448) by @sagarithm
  • fix(twenty-shared): honor underscore wildcard in string like and ilike filters (#25489) by @hktitof
  • fix(twenty-shared): honor wildcard parity in rich text ilike filter (#25505) by @hktitof
  • fix(twenty-shared): honor SQL percent wildcards in array containsIlike (#25247) (#25551) by @claxman
  • fix(security): enforce object-level role permissions on system object writes (#24309) (#25809) by @mini0n-ai
  • fix(workflow): match select filter options by exact value, not substring (#25828) by @breken-ai
  • fix(tool): make help center search resilient and its failures readable (#25989) by @Atharva0222
  • fix(workflow): never freeze a null core workflow link on version mirror (#26076) by @thomtrp
  • fix(last-contact): batch API writes so a mailbox sync stays inside the rate limit (#26110) by @martmull
  • fix(front): reorder view fields from the rendered list instead of shifted indices (#26112) by @charlesBochet
  • fix(billing): wrap modal action buttons in flex slots instead of a child selector (#26136) by @etiennejouan
  • fix(call-recording): show terminal empty transcript states (#26140) by @ehconitin
  • fix(rich-text): normalize tiptap rich text written by workflow record steps (#26156) by @thomtrp
  • fix(ai): degrade unsupported runAgent attachments instead of failing the run (#26177) by @abdulrahmancodes
  • fix(server): correct misclassified structural exemptions in prefer-workspace-scoped-repository (#26202) by @prastoin
  • fix(docker): copy twenty-oxlint-rules manifest into server-deps stage (#26231) by @charlesBochet
  • fix(client-sdk): externalize all Node builtins in Vite lib build (#26234) by @AyeshaWaseemAhmad
  • fix(workflow): keep runs alive for if/else and skip edges across the continuation boundary (#26271) by @thomtrp
  • fix(usage-limit): key stock counters by their limit value (#26275) by @etiennejouan
  • fix(workflow): evict the cron trigger cache when a workflow version is deleted (#26280) by @thomtrp
  • fix(workflow): dispatch an iterator loop body listed in the iterator nextStepIds (#26301) by @thomtrp
  • fix: filter Firefox iOS YouTube script errors from Sentry (#26324) by @charlesBochet
  • fix: wait for workflow version before refreshing content (#26340) by @charlesBochet
  • fix(server): stop workspace commands retaining every visited workspace in memory (#26342) by @martmull
  • fix: separate connected account disconnect from deletion (#26347) by @neo773
  • fix(ai-chat): stop Bedrock cache points from stacking across AI SDK steps (#26355) by @etiennejouan
  • fix: classify logic function rate limits as expected errors (#26365) by @charlesBochet
  • fix(oauth): provision the Twenty CLI OAuth client on non-seeded servers (#26389) by @martmull
  • fix(server): clarify email domain ownership conflict (#26393) by @neo773
  • fix(server): allow transactional email without unsubscribe hostname (#26395) by @neo773
  • fix(shared): reject scheme-relative backslash urls in isSafeUrl (#26397) by @Belkouche
  • fix(shared): escape regex metacharacters in raw json like filters (#26398) by @Belkouche
  • fix(front): keep additional phones and country code when importing a phone without calling code (#26399) by @Belkouche
  • fix(front): import a single multi-select value that parses as a JSON scalar (#26400) by @Belkouche
  • fix(front): strip float noise from percentage draft values (#26401) by @Belkouche
  • fix(server): compare gmail sync cursors numerically (#26402) by @Belkouche
  • fix(server): match blocklist entries case-insensitively (#26403) by @Belkouche
  • fix(server): evaluate workflow number and array filters on empty and JSON-like values (#26404) by @Belkouche
  • fix(server): keep a workflow run alive when resuming a leaf step while another branch is pending (#26405) by @Belkouche
  • fix(server): merge every readable field regardless of the mutation selection (#26406) by @Belkouche
  • fix(front): keep the record currency when a currency cell edit starts by typing (#26407) by @Belkouche
  • fix(server): lowercase calendar participant handles on import (#26408) by @Belkouche
  • fix(server): mint auto-login tokens with the caller's auth provider (#26409) by @Belkouche
  • fix(front): keep the calendar day when importing a date without time (#26410) by @Belkouche
  • fix(slack): honour silent channel rules outside the assistant path (#26417) by @abdulrahmancodes
  • fix(billing): serialize stripe subscription webhook per customer (#26431) by @etiennejouan
  • fix(workflow): unblock 2.42 workflow execution backfill on legacy workspaces (#26435) by @thomtrp
  • fix(workflow): delete orphan core workflows left by deleted workflows (#26437) by @thomtrp
  • fix(server): resolve server routes by primary key, fall back to the legacy identifier (#26438) by @prastoin
  • fix(server): intersect the calling application role in every settings permission check (#26442) by @prastoin
  • fix(upgrade): tolerate missing fields when creating message record pages (#26447) by @FelixMalfait
  • fix: display app permission flags and reset saved role changes (#26450) by @Weiko
  • fix(workflow): skip orphan core workflows in the 2.42 published pointer check (#26458) by @thomtrp
  • fix: fill scaffolded app page viewport (#26464) by @Weiko
  • fix(workflow): show remote edits on the open workflow canvas (#26471) by @thomtrp
  • fix(workflow): fall back to the last published version before the newest one (#26474) by @thomtrp
  • fix(usage-limit): register the quota filter on the logic function resolver (#26478) by @etiennejouan
  • fix(ai): keep message writes compatible during workspace upgrades (#26487) by @FelixMalfait
  • fix(metadata): guard view field group mutations with VIEWS and LAYOUTS permissions (#26490) by @Mateidslx
  • fix(workflow): create missing core workflows in the 2.42 execution backfill (#26511) by @thomtrp
  • fix(workflow): resolve the workspace version when a core version has no alias yet (#26515) by @thomtrp
  • fix(sharing): enforce upgraded metadata before sharing rollout (#26520) by @FelixMalfait
  • fix(command-menu-item): require LAYOUTS permission for command menu item mutations (#26523) by @addyCooks
  • fix(event-logs): don't skip rows that share a millisecond when paginating (#26537) by @martmull
  • fix(application): throttle failed application token renewals by session (#26544) by @prastoin
  • fix(ai): stop creating per-workspace foreign keys to core tables for agent history (#26547) by @FelixMalfait
  • fix(sdk): write the CLI config file with owner-only permissions (#26548) by @Weiko
  • fix(logic-function): backfill missing file rows of logic function files (#26554) by @martmull
  • fix(email): keep line breaks when opening a synced draft in the composer (#26556) by @ijreilly
  • fix(mcp): make the discovery guidance consistent across every surface (#26558) by @etiennejouan
  • fix: download CSV exports on the authenticated API origin (#26567) by @Weiko
  • fix: preserve API path prefixes in CSV export downloads (#26568) by @Weiko
  • fix(sharing): correct activation upgrade ordering (#26579) by @FelixMalfait
  • fix(file-storage): create the missing file row when copying a file by path (#26582) by @martmull
  • fix: drain metadata notifications before command shutdown (#26585) by @FelixMalfait
  • fix(apps): do not fan out auto upgrades to workspaces behind the app's required server version (#26608) by @charlesBochet
  • fix(docker): add AUTH_GOOGLE_ENABLED to docker-compose example (#26610) by @Taldres
  • fix(docker): force libexpat 2.8.5-r0 to clear CVE-2026-93990 (#26615) by @charlesBochet
  • fix(server): call makeMetadataApiRequest in the application view access test (#26618) by @martmull
  • fix(sso): insert SAML identity providers instead of saving on a client-supplied id (#26623) by @prastoin
  • fix(server): call makeMetadataApiRequest in the command menu item update test (#26634) by @charlesBochet
  • fix(workflow): stop reconciling workflows to core on the created event (#26648) by @thomtrp
  • fix(metrics): count directly executed GraphQL operations (#26653) by @charlesBochet
  • fix(workflow): repair core version parents and skip runs of deleted versions in the 2.42 execution backfill (#26661) by @thomtrp

⚡ Performance

🔧 Developer & API

  • Skip webhook and trigger fan-out jobs when nothing listens to the event (#26184) by @neo773
  • Report workspace command failures through the CLI exit status (#26263) by @FelixMalfait
  • chore(log) - log one line per API request with actor, endpoint and trace ids (#26269) by @etiennejouan
  • Fix API ALLCAPS case to Pascal case in server tests (#26411) by @BOHEUS
  • Consolidate the public theme API (#26482) by @bosiraphael
  • Stop webhook subscriptions when transferring connected account ownership (#26571) by @neo773
  • Let disconnect succeed when stopping webhook subscriptions fails (#26572) by @neo773
  • Only create missing webhook subscriptions for syncing channels (#26573) by @neo773
  • Prefer claude-opus-5-5 for the self-host Extra Smart rung (#26590) by @twenty-pr-author
🏗️ Internal changes (13)
  • docs(apps): declare both sides of a relation to a standard object (#26113) by @charlesBochet
  • chore(usage-limit): remove the API rate limit v2 feature flag (#26169) by @etiennejouan
  • chore(usage-limit): remove the quota engine credit bound feature flag (#26174) by @etiennejouan
  • chore: remove IS_APP_CLAIMING_ENABLED feature flag (#26205) by @martmull
  • test(apps): cover owner-workspace scope on application registration variables (#26208) by @prastoin
  • chore(people-data-labs): remove the workflow seeding that never ran (#26262) by @thomtrp
  • docs: correct the AI FAQ on using your own models when self-hosting (#26306) by @ijreilly
  • docs(billing): document usage limits (#26457) by @etiennejouan
  • docs: correct Delay workflow credit cost (#26467) by @FelixMalfait
  • chore: prepare twenty CLI package placeholder (#26473) by @Weiko
  • chore(billing): clean up the leftovers of the credit allowance migration (#26475) by @etiennejouan
  • refactor(file-storage): make copy private and drop dead copy/folder code (#26593) by @etiennejouan
  • refactor: return API-relative paths for CSV export downloads (#26603) by @Weiko

🎉 New contributors

Full changelog (392 PRs)
  • fix(server): normalize deprecated IANA timezone aliases before they reach SQL (#23787) by @M3BIONIX
  • fix(twenty-server): honor the identity provider's advertised id_token signing algorithm (#24165) by @suparikoli
  • fix: respect RLS predicate groups for select options (#24327) by @alamin284
  • fix(view-permissions): recognize application principal in view access checks (#24349) by @longshaww
  • feat(twenty-front): show secondary links in workflow action (#24486) by @Amit91848
  • fix: ignore inherited Object keys when validating locales and normalize the x-locale header (#24919) by @guillaume-flambard
  • Allow configuring the SMTP EHLO hostname (#24932) by @rollecode
  • fix(front): keep legacy null phone subfields from being dropped (#25420) by @abhinavapasok
  • fix(view): keep view sorts in creation order in the flat view cache (#25448) by @sagarithm
  • fix(twenty-shared): honor underscore wildcard in string like and ilike filters (#25489) by @hktitof
  • fix(twenty-shared): honor wildcard parity in rich text ilike filter (#25505) by @hktitof
  • Fix horizontal bar chart left axis labels always truncated to 10 characters (#25544) by @Thomas4390
  • fix(twenty-shared): honor SQL percent wildcards in array containsIlike (#25247) (#25551) by @claxman
  • Granola 8/8: Add Granola listing copy and setup documentation (#25577) by @ehconitin
  • feat(view): land on the initial object view and hide the index view behind the flag (#25682) by @thomtrp
  • Settle call recordings whose Recall media expired (#25795) by @ehconitin
  • fix(security): enforce object-level role permissions on system object writes (#24309) (#25809) by @mini0n-ai
  • fix(workflow): match select filter options by exact value, not substring (#25828) by @breken-ai
  • Slide the side panel with transform instead of animating its width (#25844) by @LouisDelbosc
  • feat(record-form): make the record creation form the default path (#25907) by @thomtrp
  • Enable async CSV export progress behind a workspace flag (#25968) by @Weiko
  • Add async CSV export server behind a workspace flag (#25987) by @Weiko
  • fix(tool): make help center search resilient and its failures readable (#25989) by @Atharva0222
  • feat localized legal links (#25991) by @minnibaevB
  • Hard-delete row-level permission predicates instead of soft-deleting them (#25992) by @Weiko
  • Hard-delete views and their children instead of soft-deleting them (#26002) by @Weiko
  • feat(slack): per-channel rules for the assistant (#26016) by @abdulrahmancodes
  • [forms 2/3] Improve record form field presentation (#26031) by @Bonapara
  • [2/2 Sidebar] New customization experience (#26037) by @Bonapara
  • feat(usage-limit): cap workspace file storage with a stock limit kind (#26042) by @etiennejouan
  • Bind CSV export downloads to their requesting session (#26052) by @Weiko
  • [forms 3/4] Submit record creation forms with Command or Control Enter (#26064) by @Bonapara
  • Split installed app detail page into settings tabs (#26065) by @martmull
  • feat(workflow): core-id native workflow API — reads and writes (#26068) by @thomtrp
  • Unify Twenty UI icon buttons (#26071) by @bosiraphael
  • Unpin creation commands while records are selected (#26075) by @Bonapara
  • fix(workflow): never freeze a null core workflow link on version mirror (#26076) by @thomtrp
  • Make call recorder imports resumable with deterministic jobs (#26080) by @ehconitin
  • Migrate Twenty UI headings (#26085) by @bosiraphael
  • Replace Twenty UI Modal with Dialog (#26087) by @bosiraphael
  • Migrate tooltips to Base UI (#26088) by @bosiraphael
  • feat: add serviceAccount support to Helm chart (#26097) by @mdminhazulhaque
  • feat(workflow): core-only workflow execution and background processing (#26098) by @thomtrp
  • chore: bump version to 2.42.0 (#26100) by @twenty-pr
  • [forms 4/4] Name the record creation callback arguments (#26101) by @Bonapara
  • [3/3 Sidebar] Bulk object metadata updates (#26105) by @Bonapara
  • Send Slack files to the assistant agent as attachments (#26106) by @abdulrahmancodes
  • Skip missing Microsoft messages instead of resetting the mailbox sync (#26107) by @neo773
  • Tidy navigation typing and remove dead drag state (#26109) by @Bonapara
  • fix(last-contact): batch API writes so a mailbox sync stays inside the rate limit (#26110) by @martmull
  • fix(front): reorder view fields from the rendered list instead of shifted indices (#26112) by @charlesBochet
  • docs(apps): declare both sides of a relation to a standard object (#26113) by @charlesBochet
  • feat: migrate workflow editor and actions to core IDs (#26116) by @thomtrp
  • Follow Graph pagination when discovering Microsoft mail folders (#26118) by @Maharsh17
  • chore: sync AI model catalog (#26121) by @github-actions
  • Match the floating text editor width to its field on record pages (#26124) by @charlesBochet
  • Fail a record export when a page fetch fails instead of truncating it (#26125) by @charlesBochet
  • Hide native spinner on number inputs (#26126) by @etiennejouan
  • feat(auth): refuse API access for suspended workspaces (#26127) by @etiennejouan
  • fix(billing) - update billing plan CTAs from the plan and interval grid (#26129) by @etiennejouan
  • Group the command menu into sections (#26130) by @Bonapara
  • Move the unpin creation commands upgrade command to 2.42 and use the legacy path (#26132) by @prastoin
  • Import missing dependency in create-twenty-app (#26133) by @martmull
  • Fix UI builds without Monaco (#26134) by @bosiraphael
  • Restore banner button colors (#26135) by @bosiraphael
  • fix(billing): wrap modal action buttons in flex slots instead of a child selector (#26136) by @etiennejouan
  • Treat the current upgrade version directory as previous once its tag exists (#26137) by @prastoin
  • Differentiate impromptu Fathom recording titles (#26138) by @ehconitin
  • fix(call-recording): show terminal empty transcript states (#26140) by @ehconitin
  • Declare navigation menu items as children of object, view and page layout so their cache follows deletions (#26141) by @prastoin
  • Migrate Twenty UI tab navigation (#26142) by @bosiraphael
  • v1.8.4 — Partners app: keep the company name out of marketplace brief names (#26143) by @ijreilly
  • Migrate light icon buttons and groups (#26144) by @bosiraphael
  • feat(ai): click the chat title in the page header to rename the thread (#26146) by @FelixMalfait
  • feat(usage-limit): cap workspace records with a stock limit (#26147) by @etiennejouan
  • Backfill when switching from 1.4.0 to =1.4.0 (#26149) by @martmull
  • Call recorder: Pause recording when the workspace has no credits (#26151) by @ehconitin
  • feat(server): give the message object a standard record page layout (#26153) by @FelixMalfait
  • Show email thread messages when participants are missing (#26155) by @neo773
  • fix(rich-text): normalize tiptap rich text written by workflow record steps (#26156) by @thomtrp
  • feat: expose queue job progress (#26157) by @Weiko
  • feat(workflow): make core workflow and workflow version syncable so definition changes broadcast (#26158) by @thomtrp
  • feat(workflow): consume core workflow events on the core workflow surfaces (#26159) by @thomtrp
  • Move twenty-partners app to twentyhq/twenty-eng (#26161) by @ijreilly
  • feat(apps): run application lifecycle hooks on a dedicated queue (#26166) by @martmull
  • Report PDL enrichment failures and stop batches on rejected keys (#26168) by @bosiraphael
  • chore(usage-limit): remove the API rate limit v2 feature flag (#26169) by @etiennejouan
  • Align the Granola settings with Twenty's native settings design (#26172) by @ehconitin
  • Declare call recorder billing: usage label and marketplace pricing (#26173) by @ehconitin
  • chore(usage-limit): remove the quota engine credit bound feature flag (#26174) by @etiennejouan
  • Backfill the missing index of app-owned system relation legs (#26175) by @charlesBochet
  • Add Base Adresse Nationale as an address autocomplete driver (#26176) by @fcporto-nature
  • fix(ai): degrade unsupported runAgent attachments instead of failing the run (#26177) by @abdulrahmancodes
  • AI chat: tool calls render as widgets named by the tool (#26179) by @FelixMalfait
  • Sync message channels from webhooks without the cron hand-off (#26180) by @neo773
  • Load sync cron channels with one query per tick (#26181) by @neo773
  • Only write audit log events for workspaces entitled to audit logs (#26182) by @neo773
  • Keep ClickHouse stalls from freezing the timeline queue (#26183) by @neo773
  • Skip webhook and trigger fan-out jobs when nothing listens to the event (#26184) by @neo773
  • feat(teams): scaffold the Microsoft Teams app package (#26185) by @abdulrahmancodes
  • feat(teams): add the Bot Connector client and inbound activity verification (#26186) by @abdulrahmancodes
  • chore: sync AI model catalog (#26187) by @github-actions
  • feat(workflow): migrate MCP tools and bundled app consumers to core workflow IDs (#26189) by @thomtrp
  • Reduce subscription quantity sync delay from 24h to 6h (#26190) by @etiennejouan
  • Restrict front component token pair and renewal to sessions (#26191) by @prastoin
  • Scope application variable reads and updates to the calling application and workspace (#26192) by @prastoin
  • Add default likelihood settings for PDL enrichment (#26195) by @bosiraphael
  • Add last contact backfill button (#26197) by @martmull
  • Only fetch visible junction relations on record index queries (#26198) by @charlesBochet
  • Add SettingsRow and migrate legacy rows (#26200) by @bosiraphael
  • fix(server): correct misclassified structural exemptions in prefer-workspace-scoped-repository (#26202) by @prastoin
  • Update doc (#26204) by @martmull
  • chore: remove IS_APP_CLAIMING_ENABLED feature flag (#26205) by @martmull
  • Separate Twenty UI primitives and components (#26207) by @bosiraphael
  • test(apps): cover owner-workspace scope on application registration variables (#26208) by @prastoin
  • Point Fathom website to fathom.ai and bump to 1.1.0 (#26209) by @ehconitin
  • Migrate picker rows to ListItem (#26211) by @bosiraphael
  • Unify icon buttons with elevated styling (#26213) by @bosiraphael
  • Bind the application claim OAuth state to the browser that started it (#26214) by @martmull
  • chore: sync AI model catalog (#26221) by @github-actions
  • Defer slow workspace migration actions to a worker job (#26222) by @charlesBochet
  • feat(ai): add evaluation models and a Classify workflow node (#26225) by @FelixMalfait
  • fix(docker): copy twenty-oxlint-rules manifest into server-deps stage (#26231) by @charlesBochet
  • Upgrade react-router to 7.18.4 (#26232) by @charlesBochet
  • fix(client-sdk): externalize all Node builtins in Vite lib build (#26234) by @AyeshaWaseemAhmad
  • chore: sync AI model catalog (#26237) by @github-actions
  • feat: private workflows on the core schema (#26243) by @FelixMalfait
  • [1/5] Enforce SYSTEM record visibility for event delivery (#26244) by @FelixMalfait
  • [2/5] Register five protected agent history workspace objects (#26245) by @FelixMalfait
  • [3/5] Route agent history through workspace-aware persistence (#26246) by @FelixMalfait
  • [4/5] Add verified, resumable agent-history migration (#26247) by @FelixMalfait
  • [5/5] Activate agent-history workspace storage through versioned upgrades (#26248) by @FelixMalfait
  • Fix blank record panels caused by tab stylesheet order (#26254) by @FelixMalfait
  • chore: sync AI model catalog (#26256) by @github-actions
  • Fix workspace AI history reads and stream coordination (#26259) by @FelixMalfait
  • Stop the default domain from bouncing users back to their last workspace (#26260) by @Bonapara
  • chore(people-data-labs): remove the workflow seeding that never ran (#26262) by @thomtrp
  • Report workspace command failures through the CLI exit status (#26263) by @FelixMalfait
  • Scaffold Teams Transcripts app (#26264) by @ehconitin
  • Show app url setting only in advanced mode (#26265) by @martmull
  • Add Microsoft Teams OAuth connection (#26266) by @ehconitin
  • chore(log) - log one line per API request with actor, endpoint and trace ids (#26269) by @etiennejouan
  • Flag missing required application variables on the app settings page (#26270) by @martmull
  • fix(workflow): keep runs alive for if/else and skip edges across the continuation boundary (#26271) by @thomtrp
  • Call recorder: resume bot-less recordings when the event payload carries an empty bot id (#26272) by @ehconitin
  • Always show the add step button on the last workflow node (#26273) by @Bonapara
  • Add Granola app gallery covers (#26274) by @ehconitin
  • fix(usage-limit): key stock counters by their limit value (#26275) by @etiennejouan
  • Consolidate animated buttons (#26276) by @bosiraphael
  • Let apps report their own configuration state with defineHealthCheck (#26277) by @martmull
  • Set Granola to 1.0.0 for its first release (#26278) by @ehconitin
  • Fix Kanban queries with many fields (#26279) by @bosiraphael
  • fix(workflow): evict the cron trigger cache when a workflow version is deleted (#26280) by @thomtrp
  • Build a strict schema for agent structured output (#26281) by @ehconitin
  • feat(usage-limit): gate workflow node runs and logic function executions (#26283) by @etiennejouan
  • Print export reasons in the pull report (#26288) by @Weiko
  • Export vertical-list widgets without the deprecated position form (#26290) by @Weiko
  • [2/5 workflows] Improve workflow classifier configuration (#26291) by @Bonapara
  • Remove unused Twenty UI buttons (#26293) by @bosiraphael
  • Migrate dropdown menu rows to ListItem (#26297) by @bosiraphael
  • Fix Kanban group-by queries with a record field or long column names (#26300) by @bosiraphael
  • fix(workflow): dispatch an iterator loop body listed in the iterator nextStepIds (#26301) by @thomtrp
  • Let apps declare several settings menu items with defineSettingsMenuItem (#26302) by @martmull
  • Secure front component media capture (#26303) by @bosiraphael
  • feat(client-sdk): upload files straight to storage from uploadFile (#26305) by @martmull
  • docs: correct the AI FAQ on using your own models when self-hosting (#26306) by @ijreilly
  • Keep preferences-page unsubscribes scoped to the unticked topics (#26308) by @neo773
  • Keep table rows still on focus (#26309) by @bosiraphael
  • Update website app mockup to the current product design (#26313) by @Bonapara
  • feat(application): deploy app tarballs straight to file storage (#26314) by @martmull
  • Mention apps in the credit limit banner (#26316) by @ehconitin
  • Rename recording tabs to Transcript (#26318) by @ehconitin
  • Fix live-query date filters throwing on DATE_TIME record values (#26321) by @thomtrp
  • Hide workflows from side panel search and favorites when the core index flag is on (#26323) by @thomtrp
  • fix: filter Firefox iOS YouTube script errors from Sentry (#26324) by @charlesBochet
  • [1/4] Register agentChatThreadTarget as a standard workspace object (#26328) by @FelixMalfait
  • [2/4] Provision agentChatThreadTarget into existing workspaces (#26329) by @FelixMalfait
  • [3/4] Attach and detach conversations on a record (#26330) by @FelixMalfait
  • Give message campaigns their own send rate limit counters (#26331) by @neo773
  • Price campaign emails at $0.90 per 1,000 (#26333) by @neo773
  • Add actor field to any filter (#26334) by @BOHEUS
  • chore: sync AI model catalog (#26335) by @github-actions
  • Fix permissions issue with search any field (#26339) by @BOHEUS
  • fix: wait for workflow version before refreshing content (#26340) by @charlesBochet
  • Run application upgrades as per-workspace jobs on a dedicated queue (#26341) by @martmull
  • fix(server): stop workspace commands retaining every visited workspace in memory (#26342) by @martmull
  • Fix dark mode dropdown scrollbars (#26344) by @bosiraphael
  • feat(teams): add feature settings foundation (#26345) by @ehconitin
  • fix: separate connected account disconnect from deletion (#26347) by @neo773
  • feat(sharing): unify record access and enable multiplayer chats (#26348) by @FelixMalfait
  • Load limits on view groups (#26349) by @Bonapara
  • fix(workspace cleaning) - Enqueue suspended workspace destruction instead of running it inside the cron (#26354) by @etiennejouan
  • fix(ai-chat): stop Bedrock cache points from stacking across AI SDK steps (#26355) by @etiennejouan
  • Add REDIS_QUEUE_PREFIX so BullMQ works on clustered Redis (hash-tagged keys) (#26357) by @thisispr
  • feat(view): land on the kanban for opportunities and a list for campaigns (#26360) by @thomtrp
  • feat(teams): consolidate transcript OAuth into Teams (#26362) by @ehconitin
  • Rename workflow AI Agent to Agent and align node presentation (#26363) by @thomtrp
  • fix: classify logic function rate limits as expected errors (#26365) by @charlesBochet
  • feat(ai): execute chat turns as their persisted sender (#26369) by @FelixMalfait
  • Recover and retry deferred workspace migration actions (#26371) by @charlesBochet
  • perf(clickhouse) - partition objectEvent by month in ClickHouse (#26372) by @etiennejouan
  • Standardize twenty-front module filename (#26373) by @BOHEUS
  • Fix the language switcher on docs.twenty.com (#26374) by @Bonapara
  • Standardize twenty-server module filename (#26375) by @BOHEUS
  • Add standardized rule (#26376) by @BOHEUS
  • feat(usage-limit): cap email sends with a quota limit (#26378) by @etiennejouan
  • feat(application): deprecate uploadApplicationFile and drop the CLI multipart fallback (#26379) by @martmull
  • feat(files): upload workspace logos and profile pictures with direct upload (#26382) by @martmull
  • Add the shared Dropdown foundation (#26383) by @bosiraphael
  • fix(oauth): provision the Twenty CLI OAuth client on non-seeded servers (#26389) by @martmull
  • Add AI-assisted DNS setup for email group domains (#26392) by @neo773
  • fix(server): clarify email domain ownership conflict (#26393) by @neo773
  • fix(server): allow transactional email without unsubscribe hostname (#26395) by @neo773
  • fix(shared): reject scheme-relative backslash urls in isSafeUrl (#26397) by @Belkouche
  • fix(shared): escape regex metacharacters in raw json like filters (#26398) by @Belkouche
  • fix(front): keep additional phones and country code when importing a phone without calling code (#26399) by @Belkouche
  • fix(front): import a single multi-select value that parses as a JSON scalar (#26400) by @Belkouche
  • fix(front): strip float noise from percentage draft values (#26401) by @Belkouche
  • fix(server): compare gmail sync cursors numerically (#26402) by @Belkouche
  • fix(server): match blocklist entries case-insensitively (#26403) by @Belkouche
  • fix(server): evaluate workflow number and array filters on empty and JSON-like values (#26404) by @Belkouche
  • fix(server): keep a workflow run alive when resuming a leaf step while another branch is pending (#26405) by @Belkouche
  • fix(server): merge every readable field regardless of the mutation selection (#26406) by @Belkouche
  • fix(front): keep the record currency when a currency cell edit starts by typing (#26407) by @Belkouche
  • fix(server): lowercase calendar participant handles on import (#26408) by @Belkouche
  • fix(server): mint auto-login tokens with the caller's auth provider (#26409) by @Belkouche
  • fix(front): keep the calendar day when importing a date without time (#26410) by @Belkouche
  • Fix API ALLCAPS case to Pascal case in server tests (#26411) by @BOHEUS
  • chore: sync AI model catalog (#26416) by @github-actions
  • fix(slack): honour silent channel rules outside the assistant path (#26417) by @abdulrahmancodes
  • Pace call recorder recovery jobs to stay under Recall's rate limit (#26418) by @ehconitin
  • [Forms 1/5] Rename record creation from New to Create and keep it pinned (#26419) by @Bonapara
  • [Forms 2/5] Keep the record creation form open when creation fails (#26422) by @Bonapara
  • [Forms 3/5] Take currency amounts in units in record forms (#26423) by @Bonapara
  • [Forms 4/5] Let Tab move through form text inputs (#26425) by @Bonapara
  • feat(object-metadata): allow updating readability through the metadata API (#26427) by @martmull
  • fix(billing): serialize stripe subscription webhook per customer (#26431) by @etiennejouan
  • Migrate independent Dropdown action menus (#26432) by @bosiraphael
  • Mark the Marketplace tab as beta in Applications settings (#26433) by @Bonapara
  • Trigger backfill when publishing 1.5.0 (#26434) by @martmull
  • fix(workflow): unblock 2.42 workflow execution backfill on legacy workspaces (#26435) by @thomtrp
  • Fix app-scoped schema generation for relations targeting another application's object (#26436) by @prastoin
  • fix(workflow): delete orphan core workflows left by deleted workflows (#26437) by @thomtrp
  • fix(server): resolve server routes by primary key, fall back to the legacy identifier (#26438) by @prastoin
  • [BREAKING_CHANGE] refactor(server): compute the application-scoped core schema server-side (#26439) by @prastoin
  • feat(server): require a user session on the calendar timeline (#26440) by @prastoin
  • feat(server): require a user session on account-level operations (#26441) by @prastoin
  • fix(server): intersect the calling application role in every settings permission check (#26442) by @prastoin
  • perf(server): read the OTLP metrics export interval from OTEL_METRIC_EXPORT_INTERVAL, default 30s (#26443) by @etiennejouan
  • feat(teams): require a Teams endorsement on the activity signing key (#26444) by @abdulrahmancodes
  • Refuse schema migrations while deferred index builds are in flight (#26446) by @charlesBochet
  • fix(upgrade): tolerate missing fields when creating message record pages (#26447) by @FelixMalfait
  • Reload the enterprise validity token in the server process (#26449) by @ijreilly
  • fix: display app permission flags and reset saved role changes (#26450) by @Weiko
  • feat(workflow): require a core parent on every workflow version (2.43) (#26451) by @thomtrp
  • Skip AI catalog entries the server cannot read instead of serving none (#26452) by @FelixMalfait
  • Make email group sends free for paying customers, with rate limits (#26455) by @neo773
  • Bump version to 1.1.0 (#26456) by @martmull
  • docs(billing): document usage limits (#26457) by @etiennejouan
  • fix(workflow): skip orphan core workflows in the 2.42 published pointer check (#26458) by @thomtrp
  • Serve backend HTML with startup config and workspace iframe settings (#26459) by @FelixMalfait
  • Fix the useToast import in RecordCreationFormProvider (#26460) by @thomtrp
  • feat(usage-limit): consume quota on app charges (#26461) by @etiennejouan
  • Consolidate resize handle interactions (#26463) by @bosiraphael
  • fix: fill scaffolded app page viewport (#26464) by @Weiko
  • Use radio groups for segmented settings (#26465) by @bosiraphael
  • docs: correct Delay workflow credit cost (#26467) by @FelixMalfait
  • chore: bump version to 2.43.0 (#26468) by @twenty-pr
  • Stop provisioning navigation commands for SYSTEM-readable objects (#26469) by @martmull
  • fix(workflow): show remote edits on the open workflow canvas (#26471) by @thomtrp
  • Put the record creation form back behind a feature flag (#26472) by @thomtrp
  • chore: prepare twenty CLI package placeholder (#26473) by @Weiko
  • fix(workflow): fall back to the last published version before the newest one (#26474) by @thomtrp
  • chore(billing): clean up the leftovers of the credit allowance migration (#26475) by @etiennejouan
  • feat(usage-limit): let only an operator replace an instance default (#26476) by @etiennejouan
  • Remove react-router dependency from twenty-ui (#26477) by @bosiraphael
  • fix(usage-limit): register the quota filter on the logic function resolver (#26478) by @etiennejouan
  • Move ObjectMetadata and FieldMetadata onto the workspace-scoped repository (#26479) by @prastoin
  • Consolidate the public theme API (#26482) by @bosiraphael
  • Migrate Select, pickers and filter menus to the shared Dropdown (#26483) by @bosiraphael
  • perf(server): resolve workspace default role from flat entity cache (#26484) by @charlesBochet
  • Only let paying customers send or schedule campaigns (#26486) by @neo773
  • fix(ai): keep message writes compatible during workspace upgrades (#26487) by @FelixMalfait
  • Command menu sections (#26488) by @Bonapara
  • fix(metadata): guard view field group mutations with VIEWS and LAYOUTS permissions (#26490) by @Mateidslx
  • Move campaign deliveries and suppressions into the workspace schema (#26491) by @neo773
  • perf(slack): cache the installed Slack team id (#26494) by @abdulrahmancodes
  • chore: sync AI model catalog (#26508) by @github-actions
  • Stop a Slack content-type mismatch claiming a missing files:read scope (#26509) by @abdulrahmancodes
  • fix(workflow): create missing core workflows in the 2.42 execution backfill (#26511) by @thomtrp
  • Make People Data Labs likelihood settings user configurable (#26512) by @bosiraphael
  • Add a static cache version query param to the client-config request (#26513) by @prastoin
  • fix(workflow): resolve the workspace version when a core version has no alias yet (#26515) by @thomtrp
  • fix(sharing): enforce upgraded metadata before sharing rollout (#26520) by @FelixMalfait
  • Surface the deferred action conflict as a conflict error (#26521) by @charlesBochet
  • i18n - translations (#26522) by @github-actions
  • fix(command-menu-item): require LAYOUTS permission for command menu item mutations (#26523) by @addyCooks
  • feat(front-components): share one application token pair per application (#26525) by @prastoin
  • feat(last-contact): add a health check and run the backfill synchronously (1.6.0) (#26526) by @martmull
  • i18n - translations (#26527) by @github-actions
  • Allow raw HTML blocks in workflow email bodies (#26528) by @neo773
  • i18n - translations (#26529) by @github-actions
  • i18n - translations (#26531) by @github-actions
  • Replace responsive hooks with native media queries (#26532) by @bosiraphael
  • Defer foreign key validation for join columns (#26534) by @charlesBochet
  • feat(usage-limit): ship a default daily email quota per workspace (#26535) by @etiennejouan
  • Preserve record access before chat metadata is provisioned (#26536) by @FelixMalfait
  • fix(event-logs): don't skip rows that share a millisecond when paginating (#26537) by @martmull
  • feat(event-logs): log record restores and permanent deletes (#26538) by @martmull
  • Let Escape close the side panel from form fields (#26540) by @thomtrp
  • i18n - translations (#26541) by @github-actions
  • perf(server): mark per-pod metrics with a pod attribute (#26542) by @etiennejouan
  • fix(application): throttle failed application token renewals by session (#26544) by @prastoin
  • i18n - translations (#26545) by @github-actions
  • fix(ai): stop creating per-workspace foreign keys to core tables for agent history (#26547) by @FelixMalfait
  • fix(sdk): write the CLI config file with owner-only permissions (#26548) by @Weiko
  • Rename attachment target column to "Attached to" and add an attachment record page with inline preview (#26549) by @FelixMalfait
  • Center icon buttons on Kanban and calendar cards (#26550) by @Bonapara
  • perf(search): read search results from the replica database (#26551) by @ijreilly
  • chore(workflow): match the core workflow show page header to the workspace one (#26552) by @thomtrp
  • fix(logic-function): backfill missing file rows of logic function files (#26554) by @martmull
  • fix(email): keep line breaks when opening a synced draft in the composer (#26556) by @ijreilly
  • i18n - translations (#26557) by @github-actions
  • fix(mcp): make the discovery guidance consistent across every surface (#26558) by @etiennejouan
  • Retire EmailingDomain and MessageFolder from the workspace-scoped exemption list (#26563) by @prastoin
  • feat(ai): link chat threads to workspace members (expand step) (#26564) by @FelixMalfait
  • feat(ai): make chat threads an attachment target (#26565) by @FelixMalfait
  • fix: download CSV exports on the authenticated API origin (#26567) by @Weiko
  • fix: preserve API path prefixes in CSV export downloads (#26568) by @Weiko
  • Subscribe to created Outlook mail notifications only (#26569) by @neo773
  • Stop webhook subscriptions when transferring connected account ownership (#26571) by @neo773
  • Let disconnect succeed when stopping webhook subscriptions fails (#26572) by @neo773
  • Only create missing webhook subscriptions for syncing channels (#26573) by @neo773
  • fix(sharing): correct activation upgrade ordering (#26579) by @FelixMalfait
  • feat(ai): separate chat sharing UI from backend rollout (#26581) by @FelixMalfait
  • fix(file-storage): create the missing file row when copying a file by path (#26582) by @martmull
  • chore: sync AI model catalog (#26584) by @github-actions
  • fix: drain metadata notifications before command shutdown (#26585) by @FelixMalfait
  • Prefer claude-opus-5-5 for the self-host Extra Smart rung (#26590) by @twenty-pr-author
  • Remove the deferred workspace migration actions design doc (#26591) by @charlesBochet
  • Revert "Slide the side panel with transform instead of animating its width" (#26592) by @charlesBochet
  • refactor(file-storage): make copy private and drop dead copy/folder code (#26593) by @etiennejouan
  • Move ApplicationEntity onto the workspace-scoped repository (#26595) by @prastoin
  • Expose selected object metadata and keep unchanged context values stable (#26596) by @bosiraphael
  • feat(docker): add ClickHouse to twenty-app-dev image (#26598) by @martmull
  • Migrate sort and editor toolbar dropdowns (#26599) by @bosiraphael
  • refactor: return API-relative paths for CSV export downloads (#26603) by @Weiko
  • Move translations to a settings page with one row per language (#26605) by @Bonapara
  • i18n - translations (#26606) by @github-actions
  • fix(apps): do not fan out auto upgrades to workspaces behind the app's required server version (#26608) by @charlesBochet
  • fix(docker): add AUTH_GOOGLE_ENABLED to docker-compose example (#26610) by @Taldres
  • Fix activity targets after initial company assignment (#26613) by @FelixMalfait
  • fix(docker): force libexpat 2.8.5-r0 to clear CVE-2026-93990 (#26615) by @charlesBochet
  • fix(server): call makeMetadataApiRequest in the application view access test (#26618) by @martmull
  • i18n - translations (#26619) by @github-actions
  • fix(sso): insert SAML identity providers instead of saving on a client-supplied id (#26623) by @prastoin
  • Remove message and calendar target read rollout flag (#26625) by @FelixMalfait
  • Repair missing company activity history during the 2.43 upgrade (#26631) by @FelixMalfait
  • Fix view permission integration test helper references (#26633) by @FelixMalfait
  • fix(server): call makeMetadataApiRequest in the command menu item update test (#26634) by @charlesBochet
  • i18n - translations (#26642) by @github-actions
  • Stop hidden advanced settings from adding space between sections (#26647) by @Bonapara
  • fix(workflow): stop reconciling workflows to core on the created event (#26648) by @thomtrp
  • Document remaining Twenty UI primitives (#26649) by @bosiraphael
  • feat(workflow): toggle core workflow visibility from the command menu (#26651) by @thomtrp
  • i18n - translations (#26652) by @github-actions
  • fix(metrics): count directly executed GraphQL operations (#26653) by @charlesBochet
  • Group Card parts under one component (#26654) by @bosiraphael
  • perf(server): index core foreign keys that cascade from workspace and application deletes (#26655) by @charlesBochet
  • Restore columns when resetting view grouping (#26656) by @bosiraphael
  • fix(workflow): repair core version parents and skip runs of deleted versions in the 2.42 execution backfill (#26661) by @thomtrp
  • i18n - translations (#26664) by @github-actions
  • Use default domain for marketplace app share link (#26666) by @martmull
  • i18n - translations (#26669) by @github-actions
  • Restore tab and menu icon stroke weight (#26670) by @Bonapara
  • feat(usage): meter common API calls in complexity points (#26671) by @etiennejouan
  • Keep upgrade command code in its version folder (#26672) by @FelixMalfait
  • Remove the per-campaign recipient cap (#26675) by @neo773
  • Remove the unused sendEmailViaEmailingDomain mutation (#26676) by @neo773
  • i18n - translations (#26677) by @github-actions
  • Serve agent history from workspace storage only (#26678) by @FelixMalfait
  • i18n - translations (#26679) by @github-actions
  • i18n - translations (#26680) by @github-actions
  • Scope application tokens to their own application (#26681) by @prastoin
  • i18n - translations (#26683) by @github-actions
  • Require a user session to change application registration ownership (#26684) by @prastoin
  • Truncate ClickHouse tables on database reset (#26687) by @martmull
  • i18n - translations (#26692) by @github-actions
  • i18n - translations (#26694) by @github-actions
  • chore: sync AI model catalog (#26705) by @github-actions
  • Fix frontend routing for dotted navigation paths (#26711) by @FelixMalfait
  • Fix invitation E2E revoking the shared login session (#26712) by @FelixMalfait

Full Changelog: twenty/v2.41.0...twenty/v2.43.0

Don't miss a new twenty release

NewReleases is sending notifications on new releases.