What's Changed
- Move twenty-client-sdk to dev dep by @prastoin in #21611
- chore: bump version to 2.15.0 by @twenty-pr[bot] in #21624
- chore(server): temporary diagnostic logging for empty verification email body by @charlesBochet in #21628
- fix(front): set up Monaco workers for GraphQL playground by @charlesBochet in #21620
- fix(command-menu-item): persist overrides after save and add reset-to-default by @Weiko in #21623
- i18n - docs translations by @github-actions[bot] in #21633
- Fix relation-traversal filters showing no options on select fields by @bosiraphael in #21616
- fix(twenty-partners): reuse existing company by domain in partner-application handler by @rashad in #21615
- Add call recording scheduling backend by @ehconitin in #21629
- fix(ai) - workflow tool outputs optim + display fix by @etiennejouan in #21500
- Add single-record People Data Labs enrich functions (company & person) by @bosiraphael in #21650
- fix(front): remove runtime default-view creation fallback by @charlesBochet in #21652
- fix(docker): run twenty-server in production mode (NODE_ENV=production) by @charlesBochet in #21635
- fix(ui): default Monaco CodeEditor to scrollBeyondLastLine: false by @FelixMalfait in #21657
- fix(server): run 2-14 standard relation label/icon heal as a system build by @charlesBochet in #21658
- Add Recall webhook status handler to the meeting bot app by @ehconitin in #21659
- fix(route-trigger): return 422 instead of 500 for logic function execution errors by @charlesBochet in #21656
- fix(server): run 2-14 standard relation label/icon heal as a system build by @charlesBochet in #21667
- Enable inline field editing in calendar event details by @ehconitin in #21666
- Update GitHub banners and remove unused assets by @Bonapara in #21655
- Clean up MCP Monaco editor by @Bonapara in #21643
- Load twenty-ui global styles in twenty-front Storybook by @bosiraphael in #21665
- feat(ai-agent): suggest similar tool names when tool discovery misses by @FelixMalfait in #21654
- ci: migrate cross-repo dispatch senders to workflow_dispatch (actions:write) by @prastoin in #21648
- feat(admin-panel) - add billing/usage section by @etiennejouan in #21672
- Update Connection provider path by @martmull in #21678
- i18n - docs translations by @github-actions[bot] in #21681
- fix(cli): detect expired token on deploy and offer interactive re-auth by @Manibharadwaj in #21335
- Hide Input and Test tabs for app logic function nodes by @bosiraphael in #21671
- Show app name on workflow logic function nodes by @bosiraphael in #21675
- feat(onboarding): prefill the invite step with teammates from the connected calendar by @FelixMalfait in #21640
- feat(workflow): expand manual-trigger runtime payload with payload + _metadata by @thomtrp in #21676
- fix(messaging): honor IMAP/SMTP encryption setting instead of inferring it from the port by @neo773 in #21562
- Support variables file email attachment by @neo773 in #21613
- Stabilize flaky Argos stories in twenty-front storybook by @bosiraphael in #21691
- fix(messaging): pin Google OAuth2 client to native fetch by @neo773 in #21668
- fix(server): default timeline thread visibility to METADATA by @neo773 in #21669
- perf(onboarding): compute invite suggestions on-demand by @FelixMalfait in #21696
- fix(onboarding): show the connect step after workspace creation by @FelixMalfait in #21701
- feat(code-interpreter): reuse a warm sandbox per conversation (E2B) by @FelixMalfait in #21664
- Show app logo and name in workflow step side panel header by @bosiraphael in #21689
- Let users pick their workspace subdomain during sign-up by @FelixMalfait in #21641
- feat(sdk): let docker:start choose the server version by @charlesBochet in #21690
- Fix selectable list arrow focus by @Bonapara in #21679
- Remove twenty-ui-deprecated and migrate frontend to twenty-ui by @bosiraphael in #21596
- Partners app: profile picture (additive file field), derived region & deployment, scope cleanup (0.5.4) by @rashad in #21709
- fix(route-trigger): distinguish user vs platform logic function execution errors by @charlesBochet in #21715
- Added page card box-shadow by @Bonapara in #21688
- i18n - docs translations by @github-actions[bot] in #21724
- fix(front): wait for viewFields + fieldMetadataItems before opening the metadata gate by @FelixMalfait in #21713
- fix(front): home redirect honors first object of the navigation menu by @thomtrp in #21626
- docs: update calendar-email page by @neo773 in #21719
- i18n - docs translations by @github-actions[bot] in #21741
- feat(server): add isSystemSideEffect & merge createOneObject/createOneField side-effect migrations by @Weiko in #21673
- feat(workflow): use workspace member as variable sender for emails by @thomtrp in #21582
- Point New UI visual regression at the twenty-ui Argos project by @bosiraphael in #21728
- Provide custom workspace id while seeding by @prastoin in #21721
- Add limit on view widget by @martmull in #21718
- i18n - docs translations by @github-actions[bot] in #21746
- Add stale Recall bot reconciliation by @ehconitin in #21720
- fix(server): allow app-defined permission flags to be referenced by a role in the same sync by @Weiko in #21742
- feat(workflow): surface manual-trigger payload + metadata in variable picker by @thomtrp in #21692
- fix(ai): handle dynamic-tool message parts in chat persistence by @FelixMalfait in #21740
- [BREAKING CHANGE] fix chart cache collisions with key-based data plumbing by @ehconitin in #21743
- feat(billing) - facilitate top up in ai chat by @etiennejouan in #21645
- ci: remove merge queue, run e2e on push to main by @charlesBochet in #21722
- fix(server): enforce lowercase universalIdentifier in sync by @Weiko in #21754
- fix(ai): prevent chat thread bricking from tool parts with null input by @FelixMalfait in #21752
- fix(front): stop impersonation from corrupting the impersonator's profile name by @FelixMalfait in #21757
- Twenty app e2e app prod parity dispatch by @prastoin in #21750
- feat(workflow): expected output schema for runtime-output steps + validation by @etiennejouan in #21744
- fix: enforce strict rules for currency value handling by ai chatbot by @dankgarlic1 in #21470
- Add post-call recording ingestion and billing by @ehconitin in #21758
- Reorganize twenty-ui into best-practice component domains and per-component folders by @bosiraphael in #21745
- Tool execution metrics by @abdulrahmancodes in #21587
- chore(deps-dev): bump @babel/core from 7.28.0 to 7.29.7 by @dependabot[bot] in #21760
- chore(deps-dev): bump @electron-forge/maker-zip from 7.11.1 to 7.11.2 by @dependabot[bot] in #21761
- chore(deps): bump mintlify from 4.2.595 to 4.2.629 by @dependabot[bot] in #21762
- Reworked website. by @mabdullahabaid in #21763
- Centralize and standardize impersonation validation rules by @prastoin in #21717
- Fix typecheck by @bosiraphael in #21783
- fix: exclude non-groupBy date fields (deletedAt) from calendar field selection by @ehconitin in #21764
- Remove twenty-shared import from postcard app by @prastoin in #21786
- Configure Recall bot server variables by @ehconitin in #21774
- Add search input to manual record trigger object select by @bosiraphael in #21777
- feat(workflow): add update_agent tool and responseFormat-aware AI Agent step schema by @etiennejouan in #21755
- Bump call recording app version by @martmull in #21787
- Accessibility fix pass for twenty-ui input components by @bosiraphael in #21776
- Fix flaky Argos diffs by @bosiraphael in #21771
- fix(server): prevent enum migration failure for long identifier names by @thomtrp in #21748
- i18n - docs translations by @github-actions[bot] in #21789
- fix(server): type WasRemovedInUpgrade columns with WasRemovedInUpgrade<> by @Weiko in #21785
- Fix side panel command menu header controls by @Bonapara in #21747
- Converge Recall transcript artifacts on meeting start by @ehconitin in #21788
- feat(workflow): auto-layout steps on AI workflow creation via shared tidy-up by @etiennejouan in #21756
- Accessibility fix pass for remaining twenty-ui domains by @bosiraphael in #21790
- [Website] Full-bleed hero/testimonials, nav restructure, OpenNext deploy config by @mabdullahabaid in #21794
- Partner application form: required fields, skills rework, fail-fast validation by @rashad in #21710
- fix(logic-function): treat invoke timeout as a user-level error, not a platform error by @thomtrp in #21779
- i18n - website translations by @github-actions[bot] in #21795
- Disable Claude Code attribution on commits and PRs by @FelixMalfait in #21798
- feat(auth): collect the workspace logo on the sign-up creation step by @FelixMalfait in #21723
- [Website] Carry over README assets, .well-known, and an env template by @mabdullahabaid in #21803
- feat(website - self hosts billing): add internal endpoint to reissue enterprise keys by @ijreilly in #21660
- [Website] Port partner application form rework (required fields, skills, fail-fast) by @mabdullahabaid in #21802
- [Website] Straighten the footer 20 model by @mabdullahabaid in #21797
- feat(server): report enterprise instance metadata on license validation by @FelixMalfait in #21793
- fix(metadata): remove deprecated isCustom from Objects and Fields by @Weiko in #21799
- Scope empty fixture workspaces to upgrade integration tests by @neo773 in #21778
- Fix(record table): Drag select position by @git-init-priyanshu in #21579
- Fix view type label casing by @Bonapara in #21772
- fix(front): unwrap react-qr-code default export to fix 2FA crash on prod by @charlesBochet in #21804
- messaging: gmail folder backfill by @neo773 in #21753
- fix(workflow): hide empty option for non-nullable select fields by @brendanerofeev in #21075
- feat(server): derive email/calendar timelines from object relations by @neo773 in #21684
- fix(twenty-shared): derive short-number suffix from the rounded value by @yashs33244 in #21591
- fix(security): bump form-data to 4.0.6 (CRLF injection) by @mabdullahabaid in #21808
- fix(security): remove vulnerable lodash 4.17.23 (code injection + prototype pollution) by @mabdullahabaid in #21809
- fix(security): bump piscina to 4.9.3 (prototype pollution → RCE) by @mabdullahabaid in #21810
- fix(security): bump protobufjs to 7.6.4 (DoS + property shadowing) by @mabdullahabaid in #21811
- fix(security): bump http-proxy-middleware to 3.0.7 (multipart field injection) by @mabdullahabaid in #21812
- fix(security): bump tar to 7.5.16 across lockfiles (PAX file smuggling) by @mabdullahabaid in #21813
- fix(security): bump markdown-it to 14.2.0 (smartquotes ReDoS) by @mabdullahabaid in #21814
- fix(security): dedupe uuid to 11.1.1 (missing buffer bounds check) by @mabdullahabaid in #21815
- fix(security): patch yaml across both major lines (stack overflow) by @mabdullahabaid in #21817
- [Website] Add internal enterprise key reissue endpoint. by @mabdullahabaid in #21807
- Infer record pickers for record-typed logic function workflow inputs by @bosiraphael in #21494
- fix(security): bump webpack-dev-server resolution to 5.2.5 (HMR WS interception) by @mabdullahabaid in #21818
- feat(partners): add partner-application-triage and partner-meeting-recap skills by @rashad in #21819
- fix call recording bot automatic leave activate after bug by @ehconitin in #21820
- feat(onboarding): always show the Create Profile step by @FelixMalfait in #21823
- [Website] Cut over to the rebuilt site by @mabdullahabaid in #21825
- fix(front): emit error instead of completing empty on failed token renewal by @FelixMalfait in #21822
- fix(front): pass auth headers to GraphiQL fetcher for introspection by @etiennejouan in #21821
- fix: filtered view resetting to unfiltered list on navigation by @parshipcy in #21080
- i18n - website translations by @github-actions[bot] in #21827
- Create CI workflow for internal apps by @martmull in #21791
- fix: reorder table columns against visible fields only (#20940) by @singhharsh1708 in #21084
- feat(billing): embed Stripe Payment Element in onboarding by @FelixMalfait in #21759
- fix(security): bump tar to 7.5.16 in seed-dependencies (PAX file smuggling) by @mabdullahabaid in #21829
- fix(workflow): show fields for system objects in record-updated trigger by @thomtrp in #21826
- Add application to test input in workflow by @martmull in #21830
- fix(workflow): label manual trigger record output as Record/Records by @thomtrp in #21832
- fix: prevent Create Workspace redirect from being cancelled by @FelixMalfait in #21835
- docs(user-guide): remove unsupported Between operator for Number filters by @thomtrp in #21838
- fix: Edit Layout keeping the command menu open by @parshipcy in #21161
- Deprecate legacy encryption by @prastoin in #21831
- fix(front): recompute ExpandableList visible chips on resize by @dilanmelvin in #21139
- Update ci internal applications by @martmull in #21837
- fix(ai): validate AI agent output field names against schema-key constraint by @charlesBochet in #21834
- i18n - docs translations by @github-actions[bot] in #21841
- Enable getting started translations by @abdulrahmancodes in #21842
- Add Update fields select to People Data Labs enrichment functions by @bosiraphael in #21801
- fix(onboarding): refresh stale workspace in currentWorkspace field resolver by @FelixMalfait in #21839
- fix(front): allow null subfields in Phones default value so Save enables by @thomtrp in #21847
- App uninstall lambda, layers cleanup by @prastoin in #21749
- reset filter search input on field select by @abdulrahmancodes in #21850
- fix(front): keep record table footer visible below information banner by @thomtrp in #21852
- i18n - docs translations by @github-actions[bot] in #21859
- fix(website): restore deploymentId, security headers and redirects in next config by @mabdullahabaid in #21851
- Accessibility guardrails and component hardening for twenty-ui by @bosiraphael in #21848
- feat: add resizable kanban column width by @FelixMalfait in #21828
- Fix record table footer hidden when an information banner is visible by @bosiraphael in #21860
- Add standard record page layout for calendar events by @ehconitin in #21857
- fix(workflow): add tooltip explaining why the variable picker is disabled by @thomtrp in #21862
- Add twenty slack to internal application ci by @martmull in #21849
- i18n - website translations by @github-actions[bot] in #21864
- i18n - docs translations by @github-actions[bot] in #21865
- i18n - website translations by @github-actions[bot] in #21866
- Workspace migration post transaction commit side effect by @prastoin in #21845
- Fix broken CSV import grid layout by @bosiraphael in #21867
- fix(security): drop vulnerable serialize-javascript via terser-webpack-plugin bump by @mabdullahabaid in #21871
- i18n - docs translations by @github-actions[bot] in #21873
- fix(security): refresh undici across lockfiles (6.x → 6.27.0, 7.x → 7.28.0) by @mabdullahabaid in #21870
- fix(security): bump socks to clear vulnerable ip-address (XSS) by @mabdullahabaid in #21872
- Clear stale parent-view filters on front-component cross-object navigation by @bosiraphael in #21869
- Add transcript tab to calendar record page by @ehconitin in #21792
- Rename meeting bot app variables from RECALL_BOT_* to MEETING_BOT_* by @ehconitin in #21878
- Add recall io webhook endpoint by @martmull in #21879
- i18n - docs translations by @github-actions[bot] in #21884
- fix(front): respect user number format for counts and aggregates by @FelixMalfait in #21894
- test(server): make timeline integration test self-seed its data by @FelixMalfait in #21896
- fix(security): bump nodemailer to 9.0.1 (raw-option SSRF / file read) by @mabdullahabaid in #21903
- fix(security): bump dompurify to 3.4.11 (config/hook pollution) by @mabdullahabaid in #21905
- feat(website): spotlight visual on top and uniform tile background by @mabdullahabaid in #21906
- fix(twenty-website): fill feature-card visual frame on wide viewports by @mabdullahabaid in #21876
- fix: hide restricted objects and views nested in navigation folders by @abdulrahmancodes in #21914
- Fix dangling relation fields crashing records after deleting a custom object by @Weiko in #21874
- feat(workflow): condition filter on database-event triggers by @FelixMalfait in #21868
- fix: cannot create record from table view — empty morph to-many relation returns null by @charlesBochet in #21846
- fix(front): prevent AI agent output field error message from overlapping the Type field by @charlesBochet in #21921
- feat(workflow): add Pick Record action (1/3 — random selection) by @FelixMalfait in #21899
- feat(sdk): declare row-level permission predicates in the role manifest by @FelixMalfait in #21919
- feat(workflow): Pick Record round robin strategy (2/3) by @FelixMalfait in #21900
- i18n - docs translations by @github-actions[bot] in #21923
- feat(workflow): Pick Record load balanced strategy (3/3) by @FelixMalfait in #21902
- fix(twenty-server): remove uuid format from openapi pageInfo cursors by @Manibharadwaj in #21920
- fix(ai): gemini not working in ask ai by @abdulrahmancodes in #21898
- ci: block bot contributors from PR commit history by @charlesBochet in #21926
- chore(deps): bump wrangler to 4.102.0 and drop the wrangler/esbuild resolution by @mabdullahabaid in #21930
- fix(security): bump react-router to 6.30.4 via react-router-dom (open redirect) by @mabdullahabaid in #21931
- [Twenty-front]: Bunch of View Picker Fixes and improvements. by @git-init-priyanshu in #21290
- fix(security): drop vulnerable postcss via styled-components bump (XSS) by @mabdullahabaid in #21932
- Add twenty-discord on internal ci apps by @martmull in #21928
- Fix meeting bot CalendarEvent field visibility and editability by @ehconitin in #21883
- Add twenty-exa application to internal app ci by @martmull in #21882
- fix: surface proper errors for People create/delete constraint violations by @Pantkartik in #21270
- fix(workflow): serialize object variables in resolved prompts by @ijreilly in #21612
- Add twenty-fireflies on internal ci apps by @martmull in #21939
- Add self-hosting on internal ci apps by @martmull in #21940
- fix(front): isolate record table dashboard widget filters on duplicate by @ehconitin in #21936
- make mergeMany atomic and optimize relation/field-map handling by @abdulrahmancodes in #21885
- Add twenty-for-twenty on internal ci apps by @martmull in #21944
- Add twenty-linear on internal ci apps by @martmull in #21942
- fix(server): surface nested QueryFailedError detail in upgrade error formatting by @charlesBochet in #21948
- Remove jotai from twenty-ui by @bosiraphael in #21937
- Add people-data-labs on internal ci apps by @martmull in #21941
- suport non aws providers 1 by @jubinsoni in #21927
- Refactor search vector field by @prastoin in #21947
- Add gallery screenshot to People Data Labs app by @bosiraphael in #21960
- chore(twenty-server): upgrade typeorm to 0.3.29 by @mabdullahabaid in #21957
- fix(front): keep relation field record tables scoped to the host record by @rcshetty3 in #21293
- feat: real-time email & calendar tabs on record pages by @neo773 in #21953
- fix(website): render partner marketplace dynamically to stop profile 404s by @rashad in #21963
- perf(server): rate-limit the active event stream count scan by @charlesBochet in #21951
- perf(server): raise workspace local cache size and meter evictions by @charlesBochet in #21954
- Remove unused call-recording application by @martmull in #21966
- fix(server): skip callRecordings widget in calendar-event page sync when field is absent by @charlesBochet in #21967
- Improve twenty-ui packaging for standalone publishing by @bosiraphael in #21946
- fix(front): scope relation table widget via currentRecordId by @charlesBochet in #21965
- Fix field widget textarea focus reset by @Bonapara in #21959
New Contributors
- @dankgarlic1 made their first contribution in #21470
- @singhharsh1708 made their first contribution in #21084
- @dilanmelvin made their first contribution in #21139
- @jubinsoni made their first contribution in #21927
- @rcshetty3 made their first contribution in #21293
Full Changelog: twenty/v2.14.0...twenty/v2.15.0