⚠️ 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
- Allow configuring the SMTP EHLO hostname (#24932) by @rollecode
- Fix horizontal bar chart left axis labels always truncated to 10 characters (#25544) by @Thomas4390
- Granola 8/8: Add Granola listing copy and setup documentation (#25577) by @ehconitin
- Settle call recordings whose Recall media expired (#25795) by @ehconitin
- Slide the side panel with transform instead of animating its width (#25844) by @LouisDelbosc
- Enable async CSV export progress behind a workspace flag (#25968) by @Weiko
- Add async CSV export server behind a workspace flag (#25987) by @Weiko
- 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
- [forms 2/3] Improve record form field presentation (#26031) by @Bonapara
- [2/2 Sidebar] New customization experience (#26037) by @Bonapara
- 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
- Unify Twenty UI icon buttons (#26071) by @bosiraphael
- Unpin creation commands while records are selected (#26075) by @Bonapara
- 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
- [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
- Follow Graph pagination when discovering Microsoft mail folders (#26118) by @Maharsh17
- 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
- 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
- Treat the current upgrade version directory as previous once its tag exists (#26137) by @prastoin
- Differentiate impromptu Fathom recording titles (#26138) 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
- 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
- Show email thread messages when participants are missing (#26155) by @neo773
- Move twenty-partners app to twentyhq/twenty-eng (#26161) by @ijreilly
- Report PDL enrichment failures and stop batches on rejected keys (#26168) by @bosiraphael
- 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
- 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
- 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
- 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
- Update doc (#26204) by @martmull
- Separate Twenty UI primitives and components (#26207) by @bosiraphael
- 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
- Defer slow workspace migration actions to a worker job (#26222) by @charlesBochet
- Upgrade react-router to 7.18.4 (#26232) by @charlesBochet
- [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
- 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
- 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
- Flag missing required application variables on the app settings page (#26270) by @martmull
- 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
- 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
- Build a strict schema for agent structured output (#26281) by @ehconitin
- Print export reasons in the pull report (#26288) by @Weiko
- Export vertical-list widgets without the deprecated position form (#26290) by @Weiko
- 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
- Let apps declare several settings menu items with defineSettingsMenuItem (#26302) by @martmull
- Secure front component media capture (#26303) by @bosiraphael
- 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
- 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
- [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
- Fix permissions issue with search any field (#26339) by @BOHEUS
- Run application upgrades as per-workspace jobs on a dedicated queue (#26341) by @martmull
- Fix dark mode dropdown scrollbars (#26344) by @bosiraphael
- 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
- Add REDIS_QUEUE_PREFIX so BullMQ works on clustered Redis (hash-tagged keys) (#26357) by @thisispr
- Rename workflow AI Agent to Agent and align node presentation (#26363) by @thomtrp
- Recover and retry deferred workspace migration actions (#26371) by @charlesBochet
- perf(clickhouse) - partition objectEvent by month in ClickHouse (#26372) by @etiennejouan
- Standardize
twenty-frontmodule filename (#26373) by @BOHEUS - Fix the language switcher on docs.twenty.com (#26374) by @Bonapara
- Standardize
twenty-servermodule filename (#26375) by @BOHEUS - Add standardized rule (#26376) by @BOHEUS
- Add the shared Dropdown foundation (#26383) by @bosiraphael
- Add AI-assisted DNS setup for email group domains (#26392) by @neo773
- 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
- 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 app-scoped schema generation for relations targeting another application's object (#26436) by @prastoin
- Refuse schema migrations while deferred index builds are in flight (#26446) by @charlesBochet
- Reload the enterprise validity token in the server process (#26449) by @ijreilly
- 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
- Serve backend HTML with startup config and workspace iframe settings (#26459) by @FelixMalfait
- Fix the useToast import in RecordCreationFormProvider (#26460) by @thomtrp
- Consolidate resize handle interactions (#26463) by @bosiraphael
- Use radio groups for segmented settings (#26465) by @bosiraphael
- Stop provisioning navigation commands for SYSTEM-readable objects (#26469) by @martmull
- Put the record creation form back behind a feature flag (#26472) by @thomtrp
- Remove react-router dependency from twenty-ui (#26477) by @bosiraphael
- Move ObjectMetadata and FieldMetadata onto the workspace-scoped repository (#26479) by @prastoin
- Migrate Select, pickers and filter menus to the shared Dropdown (#26483) by @bosiraphael
- Only let paying customers send or schedule campaigns (#26486) by @neo773
- Command menu sections (#26488) by @Bonapara
- Move campaign deliveries and suppressions into the workspace schema (#26491) by @neo773
- Stop a Slack content-type mismatch claiming a missing files:read scope (#26509) by @abdulrahmancodes
- 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
- Surface the deferred action conflict as a conflict error (#26521) by @charlesBochet
- Allow raw HTML blocks in workflow email bodies (#26528) by @neo773
- Replace responsive hooks with native media queries (#26532) by @bosiraphael
- Defer foreign key validation for join columns (#26534) by @charlesBochet
- Preserve record access before chat metadata is provisioned (#26536) by @FelixMalfait
- Let Escape close the side panel from form fields (#26540) by @thomtrp
- 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
- Retire EmailingDomain and MessageFolder from the workspace-scoped exemption list (#26563) by @prastoin
- Subscribe to created Outlook mail notifications only (#26569) by @neo773
- 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
- Move ApplicationEntity onto the workspace-scoped repository (#26595) by @prastoin
- Expose selected object metadata and keep unchanged context values stable (#26596) by @bosiraphael
- Migrate sort and editor toolbar dropdowns (#26599) by @bosiraphael
- Move translations to a settings page with one row per language (#26605) by @Bonapara
- Fix activity targets after initial company assignment (#26613) by @FelixMalfait
- 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
- Stop hidden advanced settings from adding space between sections (#26647) by @Bonapara
- Document remaining Twenty UI primitives (#26649) by @bosiraphael
- Restore columns when resetting view grouping (#26656) by @bosiraphael
- Use default domain for marketplace app share link (#26666) by @martmull
- Restore tab and menu icon stroke weight (#26670) by @Bonapara
- 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
- Serve agent history from workspace storage only (#26678) by @FelixMalfait
- Scope application tokens to their own application (#26681) by @prastoin
- Require a user session to change application registration ownership (#26684) by @prastoin
- Truncate ClickHouse tables on database reset (#26687) by @martmull
- Fix frontend routing for dotted navigation paths (#26711) by @FelixMalfait
- Fix invitation E2E revoking the shared login session (#26712) by @FelixMalfait
🐛 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
- perf(server): read the OTLP metrics export interval from OTEL_METRIC_EXPORT_INTERVAL, default 30s (#26443) by @etiennejouan
- perf(server): resolve workspace default role from flat entity cache (#26484) by @charlesBochet
- perf(slack): cache the installed Slack team id (#26494) by @abdulrahmancodes
- perf(server): mark per-pod metrics with a pod attribute (#26542) by @etiennejouan
- perf(search): read search results from the replica database (#26551) by @ijreilly
- perf(server): index core foreign keys that cascade from workspace and application deletes (#26655) by @charlesBochet
🔧 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
- @Maharsh17 made their first contribution in #26118
- @mdminhazulhaque made their first contribution in #26097
- @Atharva0222 made their first contribution in #25989
- @minnibaevB made their first contribution in #25991
- @alamin284 made their first contribution in #24327
- @longshaww made their first contribution in #24349
- @mini0n-ai made their first contribution in #25809
- @Belkouche made their first contribution in #26397
- @thisispr made their first contribution in #26357
- @rollecode made their first contribution in #24932
- @M3BIONIX made their first contribution in #23787
- @suparikoli made their first contribution in #24165
- @Thomas4390 made their first contribution in #25544
- @sagarithm made their first contribution in #25448
- @LouisDelbosc made their first contribution in #25844
- @fcporto-nature made their first contribution in #26176
- @Mateidslx made their first contribution in #26490
- @Taldres made their first contribution in #26610
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-frontmodule filename (#26373) by @BOHEUS - Fix the language switcher on docs.twenty.com (#26374) by @Bonapara
- Standardize
twenty-servermodule 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