github twentyhq/twenty twenty/v2.32.0

latest release: twenty/v2.36.0
4 hours ago

⚠️ Breaking changes

✨ New features

💅 Improvements & UX

🐛 Bug fixes

  • fix: add SettingsRolesQueryEffect to invite tab (#23320) by @atharv-sys32
  • fix(server,shared): validate view filter values on app manifest sync (#23848) by @thomtrp
  • fix(twenty-server): resolve uninstall hook from application column set at sync time (#23908) by @ehconitin
  • fix: preserve morph-related records when merging people (#23945) by @DebadityaHait
  • fix(front): prevent stale timeline diff from crashing the Timeline tab (#23972) by @thomtrp
  • fix(workflow): honor defaultSettings input for CODE/LOGIC_FUNCTION step creation (#23976) by @unchainedio
  • fix(ui): render avatar image as CSS background to fix Safari Kanban repaint (#23978) by @thomtrp
  • fix(server): validate row level permission predicate values at write time (#23999) by @thomtrp
  • fix(upgrade): skip 2.20 campaign view columns whose field does not exist yet (#24003) by @neo773
  • fix(messaging): stop syncing unsubscribe requests (#24007) by @neo773
  • fix(front): select first matching option on enter in multi-select input (#24015) by @thomtrp
  • fix: validate chart filter operands and values on app manifest sync (#24027) by @thomtrp
  • fix(messaging): stop logging deleted-message 404s during Gmail import (#24030) by @neo773
  • fix(sync): only mark channels FAILED_INSUFFICIENT_PERMISSIONS on documented permanent account errors (#24035) by @neo773
  • fix(front): hide the remove icon on the last invite-team input (#24039) by @FelixMalfait
  • fix(front): stop showing No results found while command menu items are displayed (#24040) by @thomtrp
  • fix(billing): skip deleted workspaces in the credit balance backfill (#24067) by @FelixMalfait
  • fix(billing): skip the rollover for workspaces that no longer exist (#24068) by @FelixMalfait
  • fix(calendar): stop CalDAV errors falling to UNKNOWN and retrying forever (#24079) by @neo773
  • fix(front): make logout navigate once (unbreaks the invite e2e) (#24128) by @charlesBochet
  • fix(messaging): default new channels to METADATA visibility instead of SHARE_EVERYTHING (#24135) by @neo773
  • fix(workflow): keep converging steps when an if/else branch is skipped (#24136) by @thomtrp
  • fix(front): show Select dropdowns above modals and fix the rollover credits label (#24137) by @FelixMalfait
  • fix(billing): map already-subscribed checkout retry to a user error (#24150) by @thomtrp
  • fix(postcard): make the app-prod-parity postcard e2e suite pass (#24167) by @charlesBochet
  • fix(front): hide record table header when empty on mobile (#24185) by @FelixMalfait
  • fix(server): quote the alias in ORM v2 record-identifier where clauses (#24213) by @charlesBochet
  • fix(server): fail FIND_RECORDS cleanly on an uncomputable filter (#24215) by @thomtrp
  • fix(server): add findAndCount to the ORM v2 workspace repository (#24244) by @charlesBochet
  • fix(front): wrap relation card rows in RecordDetailRecordsListContainer (#24261) by @thomtrp
  • fix(front): stop sending the dormant token pair on the SSE stream under cookie auth (#24274) by @FelixMalfait
  • fix(front): recover from a session cookie the server does not accept (#24275) by @FelixMalfait
  • fix(server): report an unauthenticated GraphQL request as UNAUTHENTICATED, not FORBIDDEN (#24276) by @FelixMalfait
  • fix(twenty-slack): point the README setup link at an absolute url (#24288) by @abdulrahmancodes
  • fix(server): map ORM v2 driver errors to typed exceptions (#24290) by @thomtrp
  • fix(user-workspace): stop pretending role targets are soft deleted (#24295) by @FelixMalfait

⚡ Performance

  • perf(server): remove the compact-storage flag, slice cache demotion, use a plain LIMIT on find-many (#23980) by @charlesBochet
  • perf(server): cut Sentry instrumentation overhead and stop packing the working set (#24019) by @charlesBochet
  • perf(server): workspace-cache packing budget + class-validator fast paths (#24083) by @charlesBochet
  • perf(server): skip the ORM EntityMetadata build for ORM v2 workspaces at the cache layer (#24219) by @charlesBochet

🔧 Developer & API

  • Add GraphQL direct execution cost metrics (#23655) by @Weiko
  • Refactor CalDAV event fetching to use davRequest API (#23956) by @neo773
  • Migrate call-recorder and fireflies to twenty-sdk 2.31.0-alpha.1 (#24016) by @prastoin
  • Fireflies app settings tab with API-key-gated call history backfill (#24152) by @ehconitin
  • Extract provider-neutral webhook handlers from SES-specific services (#24200) by @FelixMalfait
  • App media recording via standard web API polyfills (compare with #24053) (#24203) by @FelixMalfait
🏗️ Internal changes (19)

🎉 New contributors

Full changelog (208 PRs)
  • Twenty-front: Record Calendar multi drag functionality (#23316) by @git-init-priyanshu
  • fix: add SettingsRolesQueryEffect to invite tab (#23320) by @atharv-sys32
  • Implement MutationObserver in the front component worker sandbox (#23489) by @bosiraphael
  • Remove the frontend's remaining view.openRecordIn plumbing (#23627) by @FelixMalfait
  • System record page layout (#23651) by @prastoin
  • Add GraphQL direct execution cost metrics (#23655) by @Weiko
  • Allow going back to the previous onboarding step (#23716) by @bosiraphael
  • Make localStorage and sessionStorage work in app front components (#23761) by @bosiraphael
  • Share front component dependencies through a per-app bundle (#23773) by @bosiraphael
  • feat(twenty-slack): pass Slack conversation history to runAgent as messages (#23821) by @abdulrahmancodes
  • fix(server,shared): validate view filter values on app manifest sync (#23848) by @thomtrp
  • Add a deprecated attribute to app manifest variables (#23868) by @bosiraphael
  • feat(slack): native agent replies, thinking status everywhere (#23886) by @abdulrahmancodes
  • feat(slack): give the assistant a concrete reply anatomy (#23887) by @abdulrahmancodes
  • Redirect to companies and collapse the chat when workspace setup ends (#23904) by @bosiraphael
  • fix(twenty-server): resolve uninstall hook from application column set at sync time (#23908) by @ehconitin
  • Add native call recording transcript tab to the calendar event record page (#23909) by @ehconitin
  • fix: preserve morph-related records when merging people (#23945) by @DebadityaHait
  • Split metadata loader and filter responsibilities (#23954) by @FelixMalfait
  • Refactor CalDAV event fetching to use davRequest API (#23956) by @neo773
  • Handle Microsoft calendar token refresh failures gracefully (#23958) by @neo773
  • feat(campaign): move the campaign envelope fields above the body (#23959) by @FelixMalfait
  • feat(front): expand button and record actions in the side panel footer (#23965) by @FelixMalfait
  • i18n - translations (#23966) by @github-actions
  • chore: bump version to 2.31.0 (#23967) by @twenty-pr
  • Enrich the onboarding chat kickoff with person and workspace context (#23970) by @bosiraphael
  • fix(front): prevent stale timeline diff from crashing the Timeline tab (#23972) by @thomtrp
  • feat(billing): replace the credit balance column with a credit grant ledger (#23973) by @FelixMalfait
  • i18n - translations (#23974) by @github-actions
  • fix(workflow): honor defaultSettings input for CODE/LOGIC_FUNCTION step creation (#23976) by @unchainedio
  • fix(ui): render avatar image as CSS background to fix Safari Kanban repaint (#23978) by @thomtrp
  • Stop retrying the SSE event stream once the client is signed out (#23979) by @FelixMalfait
  • perf(server): remove the compact-storage flag, slice cache demotion, use a plain LIMIT on find-many (#23980) by @charlesBochet
  • feat(messaging): import recent messages as soon as an account connects (#23983) by @neo773
  • feat(slack): act as the workspace member who tagged the bot (#23985) by @abdulrahmancodes
  • chore: sync AI model catalog from models.dev (#23988) by @github-actions
  • feat(server): ORM v2, a TypeORM-free workspace read path behind a flag (#23991) by @charlesBochet
  • Add native call recording summary tab to the calendar event record page (#23992) by @ehconitin
  • i18n - translations (#23993) by @github-actions
  • i18n - translations (#23995) by @github-actions
  • chore(slack): bump app version to 0.3.0 (#23996) by @abdulrahmancodes
  • fix(server): validate row level permission predicate values at write time (#23999) by @thomtrp
  • fix(upgrade): skip 2.20 campaign view columns whose field does not exist yet (#24003) by @neo773
  • i18n - translations (#24006) by @github-actions
  • fix(messaging): stop syncing unsubscribe requests (#24007) by @neo773
  • Disable jest coverage locally and cap twenty-server test workers (#24008) by @bosiraphael
  • i18n - translations (#24010) by @github-actions
  • chore: set npm packages to 2.31.0-alpha.1 (#24011) by @prastoin
  • Ask about CRM migration at the start of the workspace setup chat (#24013) by @bosiraphael
  • i18n - translations (#24014) by @github-actions
  • fix(front): select first matching option on enter in multi-select input (#24015) by @thomtrp
  • Migrate call-recorder and fireflies to twenty-sdk 2.31.0-alpha.1 (#24016) by @prastoin
  • Send file attachments when answering an AI chat question (#24017) by @bosiraphael
  • i18n - docs translations (#24018) by @github-actions
  • perf(server): cut Sentry instrumentation overhead and stop packing the working set (#24019) by @charlesBochet
  • Fix record-page reconcile self-collision on user-added FIELDS widgets (#24022) by @prastoin
  • Align DPA entity roles and signatures (#24026) by @FelixMalfait
  • fix: validate chart filter operands and values on app manifest sync (#24027) by @thomtrp
  • fix(messaging): stop logging deleted-message 404s during Gmail import (#24030) by @neo773
  • Remove the send Slack message front component (#24031) by @abdulrahmancodes
  • fix(sync): only mark channels FAILED_INSUFFICIENT_PERMISSIONS on documented permanent account errors (#24035) by @neo773
  • fix(front): hide the remove icon on the last invite-team input (#24039) by @FelixMalfait
  • fix(front): stop showing No results found while command menu items are displayed (#24040) by @thomtrp
  • Make server-served front same-origin by default and surface CORS misconfig (#24041) by @FelixMalfait
  • feat(twenty-slack): stop Slack unfurling the record links in assistant replies (#24054) by @abdulrahmancodes
  • i18n - docs translations (#24055) by @github-actions
  • i18n - translations (#24057) by @github-actions
  • i18n - translations (#24058) by @github-actions
  • Remove alpha sufix to npm packages (#24059) by @prastoin
  • chore: bump version to 2.32.0 (#24061) by @twenty-pr
  • i18n - translations (#24062) by @github-actions
  • i18n - docs translations (#24064) by @github-actions
  • fix(billing): skip deleted workspaces in the credit balance backfill (#24067) by @FelixMalfait
  • fix(billing): skip the rollover for workspaces that no longer exist (#24068) by @FelixMalfait
  • i18n - translations (#24073) by @github-actions
  • feat(server): route findOne through the ORM v2 read path (#24077) by @charlesBochet
  • fix(calendar): stop CalDAV errors falling to UNKNOWN and retrying forever (#24079) by @neo773
  • i18n - docs translations (#24080) by @github-actions
  • perf(server): workspace-cache packing budget + class-validator fast paths (#24083) by @charlesBochet
  • feat(server): observe ORM v2 read-path usage with a metric (#24086) by @charlesBochet
  • feat(server): route findDuplicates through the ORM v2 read path (#24088) by @charlesBochet
  • feat(run-agent): scope run-as to the member's role and keep the application on the context (#24089) by @abdulrahmancodes
  • feat(server): route groupBy through the ORM v2 read path (#24092) by @charlesBochet
  • test(server): delete service unit specs (#24094) by @charlesBochet
  • feat(twenty-slack): release the Slack team claim when the install is revoked on the Slack side (#24097) by @abdulrahmancodes
  • i18n - translations (#24099) by @github-actions
  • refactor(server): extract pure service logic into utils (#24100) by @charlesBochet
  • feat(server): route nested relation loading through the ORM v2 read path (#24101) by @charlesBochet
  • i18n - translations (#24102) by @github-actions
  • test(server): integration coverage for messaging and calendar sync (#24104) by @neo773
  • test(server): IMAP and CalDAV integration tests against real servers (#24105) by @neo773
  • feat(twenty-slack): interactivity endpoint + native feedback buttons on assistant answers (#24107) by @abdulrahmancodes
  • chore: sync AI model catalog from models.dev (#24110) by @github-actions
  • feat(server): load mutation nested relations through the ORM v2 read path (#24113) by @charlesBochet
  • chore: remove low-value comments (#24114) by @charlesBochet
  • ci: unbreak CI E2E Main (same-origin front + fix the specs behind the login gate) (#24115) by @charlesBochet
  • feat: support gt/lt comparisons on select and rating filters (#24116) by @thomtrp
  • chore: remove low-value short comments (#24117) by @charlesBochet
  • feat(server): add the ORM v2 mutation statement layer (update/delete/soft-delete/restore) (#24118) by @charlesBochet
  • chore: remove low-value long comments (#24125) by @charlesBochet
  • i18n - translations (#24126) by @github-actions
  • fix(front): make logout navigate once (unbreaks the invite e2e) (#24128) by @charlesBochet
  • refactor(server): name workspace-cache transforms compact/serialize/pack (#24129) by @charlesBochet
  • chore: replace JSDoc blocks on internal utils with short comments (#24130) by @charlesBochet
  • feat(server): route delete, destroy and restore through the ORM v2 write path (#24131) by @charlesBochet
  • Reorganize twenty-front-component-renderer into feature folders (#24132) by @bosiraphael
  • i18n - translations (#24133) by @github-actions
  • fix(messaging): default new channels to METADATA visibility instead of SHARE_EVERYTHING (#24135) by @neo773
  • fix(workflow): keep converging steps when an if/else branch is skipped (#24136) by @thomtrp
  • fix(front): show Select dropdowns above modals and fix the rollover credits label (#24137) by @FelixMalfait
  • i18n - docs translations (#24139) by @github-actions
  • feat(server): route update through the ORM v2 write path (#24140) by @charlesBochet
  • i18n - translations (#24142) by @github-actions
  • Install changed apps on the preview environment, document app previews for external repos (#24143) by @FelixMalfait
  • Persist admin panel chat filters across navigation (#24144) by @bosiraphael
  • feat(server): route create, upsert and merge through the ORM v2 write path (#24145) by @charlesBochet
  • i18n - translations (#24146) by @github-actions
  • i18n - translations (#24147) by @github-actions
  • ci: serialize the i18n workflows per branch (#24148) by @charlesBochet
  • fix(billing): map already-subscribed checkout retry to a user error (#24150) by @thomtrp
  • Skip contact creation when the connected account owner is gone (#24151) by @thomtrp
  • Fireflies app settings tab with API-key-gated call history backfill (#24152) by @ehconitin
  • Fix duplicate key errors during message import (#24154) by @thomtrp
  • i18n - docs translations (#24155) by @github-actions
  • Show pinned command menu actions as icons on mobile headers (#24156) by @FelixMalfait
  • Refresh the front component limitations doc (#24157) by @bosiraphael
  • docs: keep JSX tags out of translatable prose so Crowdin can rebuild (#24158) by @charlesBochet
  • i18n - translations (#24161) by @github-actions
  • i18n - translations (#24162) by @github-actions
  • test(server): cover outbound messaging and calendar providers (#24164) by @neo773
  • i18n - docs translations (#24166) by @github-actions
  • fix(postcard): make the app-prod-parity postcard e2e suite pass (#24167) by @charlesBochet
  • Make the mobile navigation menu a real home page (#24168) by @FelixMalfait
  • feat(server): ORM v2 workspace repository read-family methods (#24170) by @charlesBochet
  • Remove selection checkboxes and the aggregate footer on mobile (#24172) by @FelixMalfait
  • i18n - translations (#24174) by @github-actions
  • AI chat: never fail silently on exhausted credits (#24175) by @FelixMalfait
  • Give the mobile settings header its page title (#24176) by @FelixMalfait
  • feat(server): route module workspace repositories through ORM v2 and drop the EntityMetadata build (Stage B + C) (#24179) by @charlesBochet
  • test(server): cover workflow email and calendar actions across providers (#24181) by @neo773
  • feat(server): eliminate v1 ORM from workspace write transactions on the flag (#24182) by @charlesBochet
  • Stop the welcome title overflowing on mobile (#24183) by @FelixMalfait
  • Scroll the tab row on mobile instead of hiding tabs behind a dropdown (#24184) by @FelixMalfait
  • fix(front): hide record table header when empty on mobile (#24185) by @FelixMalfait
  • chore: sync AI model catalog from models.dev (#24186) by @github-actions
  • i18n - translations (#24187) by @github-actions
  • Surface the real ClickHouse error when an insert fails (#24189) by @thomtrp
  • test(twenty-slack): cover the app end to end against a mocked Slack workspace (#24192) by @abdulrahmancodes
  • Make Other an explicit option in the AI chat question card (#24193) by @bosiraphael
  • Polyfill navigator.clipboard.writeText for front components (#24195) by @FelixMalfait
  • Point CI dispatches at twentyhq/twenty-factory (#24196) by @FelixMalfait
  • Extract provider-neutral webhook handlers from SES-specific services (#24200) by @FelixMalfait
  • Abstract inbound email retrieval behind message sources (#24201) by @FelixMalfait
  • App media recording via standard web API polyfills (compare with #24053) (#24203) by @FelixMalfait
  • refactor(front): support multiple widget header actions (#24204) by @ehconitin
  • Sample AI traces at 100% in Sentry and attribute AI calls (#24207) by @bosiraphael
  • feat(metadata): writability levels on object and field metadata (#24208) by @abdulrahmancodes
  • Interface scale preference via root CSS zoom (#24209) by @FelixMalfait
  • i18n - docs translations (#24210) by @github-actions
  • i18n - translations (#24212) by @github-actions
  • fix(server): quote the alias in ORM v2 record-identifier where clauses (#24213) by @charlesBochet
  • Ask the onboarding CRM migration question with the ask_questions tool (#24214) by @bosiraphael
  • fix(server): fail FIND_RECORDS cleanly on an uncomputable filter (#24215) by @thomtrp
  • Remove the dedicated media-notes example app workflow (#24216) by @FelixMalfait
  • i18n - translations (#24217) by @github-actions
  • perf(server): skip the ORM EntityMetadata build for ORM v2 workspaces at the cache layer (#24219) by @charlesBochet
  • Fix orphaned mirrored field permission blocking relation field updates (#24220) by @FelixMalfait
  • Merge language and scale into one Interface settings section (#24222) by @FelixMalfait
  • i18n - docs translations (#24224) by @github-actions
  • ORM v2: TypeORM parity for joins / andSelect / distinctOn (#24225) by @charlesBochet
  • chore: sync AI model catalog from models.dev (#24228) by @github-actions
  • Float the mobile bottom bar over content with a glass style (#24229) by @FelixMalfait
  • ORM v2: relation-keyed where clauses (#24230) by @charlesBochet
  • Turn the mobile bottom bar into the home page's tab bar (#24232) by @FelixMalfait
  • i18n - translations (#24233) by @github-actions
  • Restore primary pinned actions with footer-owned width measurement (#24235) by @FelixMalfait
  • i18n - translations (#24237) by @github-actions
  • fix(server): add findAndCount to the ORM v2 workspace repository (#24244) by @charlesBochet
  • Give the mobile record header a proper title treatment (#24251) by @FelixMalfait
  • feat(sdk): let apps set writability on objects and fields (#24255) by @abdulrahmancodes
  • Make cookie sessions the only web auth path (#24257) by @FelixMalfait
  • Make deactivated objects editable from settings (#24258) by @thomtrp
  • fix(front): wrap relation card rows in RecordDetailRecordsListContainer (#24261) by @thomtrp
  • fix(billing) - void unpaid upgrade invoices so a failed charge cannot be collected later (#24264) by @etiennejouan
  • Show exact date on hover for timeline activity dates (#24265) by @FelixMalfait
  • i18n - translations (#24266) by @github-actions
  • Float the mobile bottom bar again and reserve its footprint in page content (#24267) by @FelixMalfait
  • i18n - translations (#24268) by @github-actions
  • Stop fetching unused morph targets in the timeline query (#24269) by @FelixMalfait
  • Skip relation queries for unset to-one join columns (#24270) by @FelixMalfait
  • i18n - translations (#24272) by @github-actions
  • fix(front): stop sending the dormant token pair on the SSE stream under cookie auth (#24274) by @FelixMalfait
  • fix(front): recover from a session cookie the server does not accept (#24275) by @FelixMalfait
  • fix(server): report an unauthenticated GraphQL request as UNAUTHENTICATED, not FORBIDDEN (#24276) by @FelixMalfait
  • Move presentational primitives from twenty-front to twenty-ui (#24277) by @bosiraphael
  • Fix MCP tool calls reporting structured failures as success (#24280) by @etiennejouan
  • i18n - docs translations (#24287) by @github-actions
  • fix(twenty-slack): point the README setup link at an absolute url (#24288) by @abdulrahmancodes
  • fix(server): map ORM v2 driver errors to typed exceptions (#24290) by @thomtrp
  • feat(front): delete a workflow step from the diagram node (#24292) by @thomtrp
  • i18n - translations (#24293) by @github-actions
  • refactor(twenty-orm): replace scoped repository save() with insert/update (#24294) by @FelixMalfait
  • fix(user-workspace): stop pretending role targets are soft deleted (#24295) by @FelixMalfait
  • refactor(i18n) - share the message-id hash and the translatable registry [1/6] (#24300) by @FelixMalfait
  • Fix dashboard duplication rejecting relation-traversal chart filters (#24301) by @ehconitin
  • i18n - translations (#24302) by @github-actions
  • i18n - translations (#24313) by @github-actions
  • i18n - translations (#24316) by @github-actions

Full Changelog: twenty/v2.30.0...twenty/v2.32.0

Don't miss a new twenty release

NewReleases is sending notifications on new releases.