⚠️ Breaking changes
- System record page layout (#23651) by @prastoin
- feat(front): expand button and record actions in the side panel footer (#23965) by @FelixMalfait
✨ New features
- feat(twenty-slack): pass Slack conversation history to runAgent as messages (#23821) by @abdulrahmancodes
- feat(slack): native agent replies, thinking status everywhere (#23886) by @abdulrahmancodes
- feat(slack): give the assistant a concrete reply anatomy (#23887) by @abdulrahmancodes
- feat(campaign): move the campaign envelope fields above the body (#23959) by @FelixMalfait
- feat(billing): replace the credit balance column with a credit grant ledger (#23973) by @FelixMalfait
- 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
- feat(server): ORM v2, a TypeORM-free workspace read path behind a flag (#23991) by @charlesBochet
- feat(twenty-slack): stop Slack unfurling the record links in assistant replies (#24054) by @abdulrahmancodes
- feat(server): route findOne through the ORM v2 read path (#24077) 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
- feat(twenty-slack): release the Slack team claim when the install is revoked on the Slack side (#24097) by @abdulrahmancodes
- feat(server): route nested relation loading through the ORM v2 read path (#24101) by @charlesBochet
- feat(twenty-slack): interactivity endpoint + native feedback buttons on assistant answers (#24107) by @abdulrahmancodes
- feat(server): load mutation nested relations through the ORM v2 read path (#24113) by @charlesBochet
- feat: support gt/lt comparisons on select and rating filters (#24116) by @thomtrp
- feat(server): add the ORM v2 mutation statement layer (update/delete/soft-delete/restore) (#24118) by @charlesBochet
- feat(server): route delete, destroy and restore through the ORM v2 write path (#24131) by @charlesBochet
- feat(server): route update through the ORM v2 write path (#24140) by @charlesBochet
- feat(server): route create, upsert and merge through the ORM v2 write path (#24145) by @charlesBochet
- feat(server): ORM v2 workspace repository read-family methods (#24170) by @charlesBochet
- feat(server): route module workspace repositories through ORM v2 and drop the EntityMetadata build (Stage B + C) (#24179) by @charlesBochet
- feat(server): eliminate v1 ORM from workspace write transactions on the flag (#24182) by @charlesBochet
- feat(metadata): writability levels on object and field metadata (#24208) by @abdulrahmancodes
- feat(sdk): let apps set writability on objects and fields (#24255) by @abdulrahmancodes
- feat(front): delete a workflow step from the diagram node (#24292) by @thomtrp
💅 Improvements & UX
- Twenty-front: Record Calendar multi drag functionality (#23316) by @git-init-priyanshu
- Implement MutationObserver in the front component worker sandbox (#23489) by @bosiraphael
- Remove the frontend's remaining view.openRecordIn plumbing (#23627) by @FelixMalfait
- 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
- Add a deprecated attribute to app manifest variables (#23868) by @bosiraphael
- Redirect to companies and collapse the chat when workspace setup ends (#23904) by @bosiraphael
- Add native call recording transcript tab to the calendar event record page (#23909) by @ehconitin
- Split metadata loader and filter responsibilities (#23954) by @FelixMalfait
- Handle Microsoft calendar token refresh failures gracefully (#23958) by @neo773
- Enrich the onboarding chat kickoff with person and workspace context (#23970) by @bosiraphael
- Stop retrying the SSE event stream once the client is signed out (#23979) by @FelixMalfait
- Add native call recording summary tab to the calendar event record page (#23992) by @ehconitin
- Disable jest coverage locally and cap twenty-server test workers (#24008) by @bosiraphael
- Ask about CRM migration at the start of the workspace setup chat (#24013) by @bosiraphael
- Send file attachments when answering an AI chat question (#24017) by @bosiraphael
- Fix record-page reconcile self-collision on user-added FIELDS widgets (#24022) by @prastoin
- Align DPA entity roles and signatures (#24026) by @FelixMalfait
- Remove the send Slack message front component (#24031) by @abdulrahmancodes
- Make server-served front same-origin by default and surface CORS misconfig (#24041) by @FelixMalfait
- Remove alpha sufix to npm packages (#24059) by @prastoin
- Reorganize twenty-front-component-renderer into feature folders (#24132) by @bosiraphael
- 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
- Skip contact creation when the connected account owner is gone (#24151) by @thomtrp
- Fix duplicate key errors during message import (#24154) by @thomtrp
- Show pinned command menu actions as icons on mobile headers (#24156) by @FelixMalfait
- Refresh the front component limitations doc (#24157) by @bosiraphael
- Make the mobile navigation menu a real home page (#24168) by @FelixMalfait
- Remove selection checkboxes and the aggregate footer on mobile (#24172) by @FelixMalfait
- AI chat: never fail silently on exhausted credits (#24175) by @FelixMalfait
- Give the mobile settings header its page title (#24176) by @FelixMalfait
- 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
- Surface the real ClickHouse error when an insert fails (#24189) by @thomtrp
- 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
- Abstract inbound email retrieval behind message sources (#24201) by @FelixMalfait
- Sample AI traces at 100% in Sentry and attribute AI calls (#24207) by @bosiraphael
- Interface scale preference via root CSS zoom (#24209) by @FelixMalfait
- Ask the onboarding CRM migration question with the ask_questions tool (#24214) by @bosiraphael
- Remove the dedicated media-notes example app workflow (#24216) by @FelixMalfait
- Fix orphaned mirrored field permission blocking relation field updates (#24220) by @FelixMalfait
- Merge language and scale into one Interface settings section (#24222) by @FelixMalfait
- ORM v2: TypeORM parity for joins / andSelect / distinctOn (#24225) by @charlesBochet
- 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
- Restore primary pinned actions with footer-owned width measurement (#24235) by @FelixMalfait
- Give the mobile record header a proper title treatment (#24251) by @FelixMalfait
- Make cookie sessions the only web auth path (#24257) by @FelixMalfait
- Make deactivated objects editable from settings (#24258) 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
- Float the mobile bottom bar again and reserve its footprint in page content (#24267) by @FelixMalfait
- Stop fetching unused morph targets in the timeline query (#24269) by @FelixMalfait
- Skip relation queries for unset to-one join columns (#24270) 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
- 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
🐛 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)
- chore(slack): bump app version to 0.3.0 (#23996) by @abdulrahmancodes
- chore: set npm packages to 2.31.0-alpha.1 (#24011) by @prastoin
- test(server): delete service unit specs (#24094) by @charlesBochet
- refactor(server): extract pure service logic into utils (#24100) by @charlesBochet
- 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
- 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
- chore: remove low-value short comments (#24117) by @charlesBochet
- chore: remove low-value long comments (#24125) 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
- ci: serialize the i18n workflows per branch (#24148) by @charlesBochet
- docs: keep JSX tags out of translatable prose so Crowdin can rebuild (#24158) by @charlesBochet
- test(server): cover outbound messaging and calendar providers (#24164) by @neo773
- test(server): cover workflow email and calendar actions across providers (#24181) by @neo773
- test(twenty-slack): cover the app end to end against a mocked Slack workspace (#24192) by @abdulrahmancodes
- refactor(front): support multiple widget header actions (#24204) by @ehconitin
- refactor(twenty-orm): replace scoped repository save() with insert/update (#24294) by @FelixMalfait
🎉 New contributors
- @DebadityaHait made their first contribution in #23945
- @unchainedio made their first contribution in #23976
- @atharv-sys32 made their first contribution in #23320
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