What's Changed
- fix(page-layout): render relation field widgets in table display mode by @ehconitin in #22220
- chore: bump version to 2.19.0 by @twenty-pr[bot] in #22363
- Fix draft send: read messageChannel from core, not workspace ORM by @neo773 in #22365
- messaging remove dead workspace entities by @neo773 in #22366
- i18n - docs translations by @github-actions[bot] in #22371
[FIX_TYPECHECK_ON_MAIN]Add missing inviteTeamMaxCreditsReward to OnboardingConfig type by @prastoin in #22370- Front fallback flat object search field metadata by @prastoin in #22369
- chore: auto pre-translate untranslated docs strings before Crowdin pull by @abdulrahmancodes in #22334
[REQUIRED FOR 2.18 RELEASE]Show the upgrade-plan step at the end of V1 onboarding by @bosiraphael in #22368- feat(server): make workspace Custom application carry an applicationRegistration so custom labels are translatable by @FelixMalfait in #22378
- fix: drop domain from computed remote name when subdomain present by @martmull in #22376
- chore: sync AI model catalog from models.dev by @github-actions[bot] in #22387
- fix(workflow): stop relative date filter from crashing on empty/invalid date values by @abdulrahmancodes in #22384
- Backfill webhook subscriptions for existing connected accounts by @neo773 in #22314
- feat: show group-by context in record show breadcrumb by @parshipcy in #22247
- Handle field isNullable update by @Weiko in #22362
- fix(dpa): correct US processor entity to Twenty.com PBC by @mabdullahabaid in #22393
- Add install your first apps onboarding V2 step by @bosiraphael in #22347
- feat(twenty-sdk): terraform-style plan/apply for app metadata sync by @Weiko in #22372
- SearchVector derivation via migration-scoped index (alt to #2622 __warmedUpCache) by @prastoin in #22389
- Add smooth page transitions to onboarding v2 by @bosiraphael in #22392
- i18n - docs translations by @github-actions[bot] in #22400
- feat(last-contact): design for Last contact by + Last contact item by @martmull in #22308
- Update onboarding v2 credit reward amounts by @bosiraphael in #22399
- Let the sign-in screen scroll when its content overflows the viewport by @bosiraphael in #22397
- fix(billing): link billing emails to the workspace subdomain by @FelixMalfait in #22401
- Add installed workspaces view to application registration by @martmull in #22359
- refactor(server): unify metadata override-blob computation (step 1 of override unification) by @FelixMalfait in #22404
- Fix BlockNote placeholder alignment + paddings by @Bonapara in #22409
- Update app name by @martmull in #22410
- feat(sdk): translate front-component strings with t()/Trans/useTranslate by @FelixMalfait in #22301
- Improve billing settings UI by @Bonapara in #22377
- i18n - docs translations by @github-actions[bot] in #22413
- Add twenty-app keyword by @martmull in #22415
- Fix lint by @martmull in #22416
- chore: sync DPA sub-processors from trust center by @github-actions[bot] in #22403
- i18n - docs translations by @github-actions[bot] in #22420
- test(server): fix DPA Annex C test broken by sub-processor sync action by @FelixMalfait in #22422
- feat(shared): require defaultValue on non-nullable field manifests by @martmull in #22419
- feat(twenty-sdk): include app readme in published package by @martmull in #22431
- fix(billing) - invalidate activationStatus after billing event by @etiennejouan in #22414
- fix(website): tighten product-feature spotlight height and align bento spacing by @mabdullahabaid in #22428
- feat(website): add Product to menu + footer nav, move Why into Resources dropdown by @mabdullahabaid in #22429
- i18n - website translations by @github-actions[bot] in #22436
- Add Last contact app to onboarding v2 installable apps by @bosiraphael in #22433
- fix: bump json-2-csv 5.5.10 -> 5.5.11 (Dependabot) by @mabdullahabaid in #22438
- refactor(schema): reorganize IndexField and related types by @abdulrahmancodes in #22439
- fix(website): center the User Guide nav preview image by @mabdullahabaid in #22445
- refactor(server): unify the two metadata override mechanisms into one by @FelixMalfait in #22417
- fix(ai) - Fix date stripped from agent tool output by @etiennejouan in #22443
- feat(ai) - add delete_workflow tool by @etiennejouan in #22432
- chore(server): ship the 2.20 standardOverrides drop as a dormant command by @FelixMalfait in #22448
- fix(website): restore footer CTA buttons on the light card inside the dark stage by @mabdullahabaid in #22447
- fix(server): apply row-level security predicates to API key and application principals by @FelixMalfait in #22456
- fix(front): render pinned command-menu buttons inline in page header by @Weiko in #22446
- fix(front): hide sub-item tree connector in navigation drag preview by @Weiko in #22442
- feat(server): improve traceability of flat-entity map mutation errors by @prastoin in #22396
- feat(ai): surface AI chat stream failures through one typed error channel by @FelixMalfait in #22434
- fix(twenty-sdk): stop dev-mode OOM by caching compiled manifest modules by @martmull in #22435
- Fix front component crash on unknown elements by @bosiraphael in #22455
- feat(emailing): forward SES events to Tatami Monitor by @neo773 in #22407
- feat(ai): add ask_questions interactive clarifying-question tool by @FelixMalfait in #22346
- feat(emailing): local unsubscribe URL + full-content log driver by @neo773 in #22412
- [Breaking change] fix: make pageLayout type field required by @etiennejouan in #22450
- Drop unsafe props from front component elements by @bosiraphael in #22458
- perf(front): query only rendered fields in application settings pages by @martmull in #22454
- feat(server): workspace opt-out of root-domain directory listing by @FelixMalfait in #22423
- Gate and meter email group: enterprise license (self-host) + credits (cloud) by @neo773 in #22390
- feat(call-recorder): cap media file size during ingestion to avoid OOM by @ehconitin in #22463
- Fire front component window error handlers by @bosiraphael in #22462
- fix(ai): offer Retry when the failed turn persisted partial assistant output by @FelixMalfait in #22478
- fix(sse): treat expected event-stream coordination errors as 403s and never crash the sync loop by @FelixMalfait in #22475
- test(ai): pin StreamAgentChatJob stream lifecycle with a reusable spec harness by @FelixMalfait in #22479
- fix(ai): delete the Redis chunk list on credits-exhausted terminal events by @FelixMalfait in #22477
- fix(ai): route missing-workspace stream failures through the standard error path by @FelixMalfait in #22480
- perf(sse): drop the per-workspace lock around atomic activeStreams set operations by @FelixMalfait in #22476
- fix(ai): tell members without billing permission why AI stopped at the usage cap by @FelixMalfait in #22487
- fix(ai): apply stream chunks in exact server seq order via a client-side sequencer by @FelixMalfait in #22484
- fix(ai): bound silent stream recovery and surface a terminal CONNECTION_LOST state by @FelixMalfait in #22486
- perf(ai): render streaming markdown as memoized blocks by @FelixMalfait in #22489
- chore(server): fix stream-agent-chat job spec formatting breaking main's lint by @FelixMalfait in #22493
- feat(ai): typed CONTEXT_WINDOW_EXCEEDED error that hides the pointless Retry by @FelixMalfait in #22488
- fix(ai): converge every tab's transcript when a stream fails with partial output by @FelixMalfait in #22494
- fix(ai): notify all tabs when a pending question is answered by @FelixMalfait in #22491
- fix(ai): fully roll back a question answer when the resume enqueue fails by @FelixMalfait in #22492
- use Temporal for date filter evaluation and fix IS operand by @abdulrahmancodes in #22408
- test(ai): pin the queue-updated event that now follows stream-error on the failure path by @FelixMalfait in #22500
- fix(upgrade): re-slot all 2-19 upgrade commands to their real merge epochs and guard timestamps in CI by @FelixMalfait in #22498
- fix: format numbers according to user preferences in settings views by @FelixMalfait in #22501
- fix: align email validation between front and server and roll back optimistic value on failed save by @abdulrahmancodes in #22490
- fix(front): skip unknown fields in SSE optimistic updates instead of dropping the event by @FelixMalfait in #22474
- Fix non-idempotent application sync for viewSorts (subFieldName undefined vs null) by @martmull in #22505
- Self-host Inter and DM Mono fonts by @FelixMalfait in #22506
- Add billing plans comparison page by @Bonapara in #22424
- fix(ai): make stream claims atomic via conditional UPDATEs with claim-or-queue send by @FelixMalfait in #22481
- fix(front): gate SSO and audit logs on enterprise validity token by @charlesBochet in #22459
- fix(ai) - sync AI agent step output schema when agent response format changes by @etiennejouan in #22466
- feat(applications): add type and options to application variables by @martmull in #22157
- Fix webhook entity dropdown layout by @Bonapara in #22497
- i18n - docs translations by @github-actions[bot] in #22511
- perf(twenty-server): browser-cache picture file responses (avatars/logos) by @clivemeister in #22166
- feat(server): first-class logo on application registration + narrowed settings queries by @martmull in #22453
- feat(server): import application logo into file storage at install by @martmull in #22437
- fix(server): resolve foreign key violation blocking application uninstall by @abdulrahmancodes in #22502
- perf(twenty-server): drive immutable file caching from fileFolderConfigs on both serving paths by @FelixMalfait in #22510
- chore(server): remove the five dead FileFolder values and their legacy serving pipeline by @FelixMalfait in #22516
- feat(logic-function): namespace shared Lambda resources per instance by @charlesBochet in #22509
- feat(ai): add a stream heartbeat and reap dead claims so a worker crash cannot brick a thread by @FelixMalfait in #22482
- feat(server): promote registration display fields to first-class columns by @martmull in #22513
- fix email alias guard with message channel availibility by @neo773 in #22521
- fix(server): tolerate metadata-physical index drift in legacy index name normalization by @prastoin in #22472
- feat(files): direct-to-storage upload endpoints with pending file lifecycle by @martmull in #22449
- feat(ai): dashboard & view building by @etiennejouan in #22411
- fix(server): restrict /webhooks/server dispatch to server-route-exposed functions by @prastoin in #22469
- perf(twenty-server): cache BuiltFrontComponent and PublicAsset responses by @FelixMalfait in #22523
- perf(front-component): fingerprint built-JS URLs by path for CDN caching by @FelixMalfait in #22530
- Support sender variable on workflow send-email action by @FelixMalfait in #22512
- Expose sent message identifiers in workflow send-email step output by @FelixMalfait in #22520
- Remove v1 onboarding and rely only on v2 by @bosiraphael in #22398
- Centralized side effects devxp basis by @prastoin in #22295
- feat(ai): persist assistant chat messages progressively during streaming by @FelixMalfait in #22524
- Add configurable call recorder summaries by @ehconitin in #22405
- feat(server): drain queue workers gracefully on SIGTERM by @FelixMalfait in #22514
- fix(ai): gate chat thread totals on stream ownership to prevent usage under-counting by @FelixMalfait in #22534
- Call recorder: skeleton loading state + port front components to twenty-ui by @ehconitin in #22473
- Squirclesssss 🟦🔵 by @Bonapara in #22535
- fix(docker): bump node base to 24.17.0 for CVE-2026-48930 (critical) by @charlesBochet in #22529
- feat(helm): parametrize liveness, readiness and startup probes for server by @mhorcajada in #22268
- feat(twenty-for-twenty): bump to SDK 2.18 with local UI components by @charlesBochet in #22542
- fix(front): don't blank record title when the title cell is untouched by @avonian in #22293
- feat(ci): detect bot signatures in PR description, comments and reviews by @charlesBochet in #22547
- Add MCP setup screen by @Bonapara in #22468
- chore(apps): remove the twenty-for-twenty app (consolidated into twenty-eng) by @charlesBochet in #22549
- fix(server): require confidential client auth in authorization_code grant by @charlesBochet in #22548
- feat(server): refresh application registration on install by @martmull in #22527
- feat: expose marketplace app detail fields explicitly and deprecate manifest blob by @martmull in #22526
- QA follow up - Polish settings billing and MCP UI by @Bonapara in #22554
- refactor(server): regroup application resolvers by resource and unify install permission flag by @martmull in #22532
- Run integration tests against the real BullMQ driver by @neo773 in #22551
- Add focus-safe side panel shortcuts by @Bonapara in #22499
- chore: sync AI model catalog from models.dev by @github-actions[bot] in #22558
- message campaign redesign by @neo773 in #22508
- feat(server): abort ai stream jobs that outlive the shutdown drain budget by @FelixMalfait in #22517
- messaging: Prefer plain text calendar event description over HTML for Microsoft calendar. by @mvanhorn in #22540
- Call recorder: parse conference links from calendar event text by @ehconitin in #22555
- chore: sync AI model catalog from models.dev by @github-actions[bot] in #22568
- feat(files): content-verify direct uploads and pin pending files to octet-stream by @martmull in #22533
- feat(files): reap stale pending direct-upload files via hourly cron by @martmull in #22531
- Reverse pinned command menu item order on record header by @bosiraphael in #22577
- refactor(server): remove nestjs-query from key-value-pair module by @abdulrahmancodes in #22575
- Don't list headless front components in the widget picker by @bosiraphael in #22578
- feat(server): add instance-level file storage layer by @martmull in #22560
- fix(server): pace lambda control-plane calls to avoid 'Rate exceeded' on release by @thomtrp in #22569
- chore(server): remove unused flat-field-metadata per-object mocks by @prastoin in #22581
- Revert "feat(server): add instance-level file storage layer" by @martmull in #22579
- Fix stale token race forcing re-login on verify pages by @bosiraphael in #22573
- Inject functions URL into logic function env by @ehconitin in #22583
- feat(front): upload files directly to storage for files-field, attachments and workflow by @martmull in #22576
- Deterministic system field universal identifier by @prastoin in #22565
- Polish onboarding v2 verify animation and step screens by @bosiraphael in #22585
- feat(ai): open Ask AI side panel with a preprompt in two modes by @Weiko in #22582
- feat: publish MCP & API discovery documents (well-known standards) by @FelixMalfait in #22589
- (Billing for self hosts) Tie enterprise key to server by @ijreilly in #22464
- feat(messaging): message campaign delivery stats + views by @neo773 in #22452
- fix(server): converge app-sync
isUniquediff for single-column unique constraints by @ijreilly in #22592 - chore: bump sdk packages to 2.19.0-alpha.1 prerelease by @prastoin in #22599
- feat(files): use direct-to-storage upload for email and AI-chat attachments by @martmull in #22610
- Remove book a call step from onboarding by @bosiraphael in #22597
- Fix side panel open/close animation glitches in the page header and panel content by @bosiraphael in #22598
- Use record pickers for People Data Labs enrichment workflow inputs by @bosiraphael in #22596
- fix(server): make all view children reparentable across a workspace migration sync by @prastoin in #22600
- feat(app): allow claiming ownership of unclaimed app registrations by @martmull in #22609
- Add Document Generator SDK app + step-by-step tutorial by @martmull in #22522
- i18n - docs translations by @github-actions[bot] in #22617
- Use SDK calendarEventRecordPageFields identifiers in call-recorder by @ehconitin in #22618
- App installation workspace version check engines constraint by @prastoin in #22613
- chore(server): remove nestjs-query from user-workspace module by @abdulrahmancodes in #22591
- chore(server): migrate 5 modules off NestjsQueryTypeOrmModule wiring by @abdulrahmancodes in #22595
- Update claude session settings for a proper PR behavior by @martmull in #22619
- Widen front component crossing attributes to aria-, data- and draggable by @bosiraphael in #22614
- fix(front): honor user-set label on LINKS/URL social links by @thomtrp in #22586
- chore(apps): bump sdk to 2.19.0-alpha.1 and require twenty server >=2.19.0 by @prastoin in #22601
- chore(apps): patch bump public apps moved to sdk 2.19.0-alpha.1 by @prastoin in #22623
- i18n - docs translations by @github-actions[bot] in #22624
- feat(index): support composite unique indexes in create-many upsert conflict resolution by @etiennejouan in #22604
- Revert "feat(messaging): message campaign delivery stats + views" (#22452) by @prastoin in #22627
- Remove logo from onboarding trust badges by @bosiraphael in #22628
- test(messaging): messaging and calendar sync integration suites by @neo773 in #22567
- Call recorder: sweep upcoming calendar events for recording bots on install by @ehconitin in #22552
- fix(ai-chat): sort message parts by orderIndex on reload by @thomtrp in #22629
- Create billing customer at signup so onboarding rewards are credited by @bosiraphael in #22633
- Display featured applications in marketplace by @martmull in #22635
Full Changelog: twenty/v2.18.0...twenty/v2.19.0