twenty/v2.20.0
elizaOS/elizatwenty/v2.20.0Jul 10, 2026by prastoin
AI Summary
A comprehensive update focusing on the app marketplace, AI chat enhancements, workflow improvements, and billing infrastructure refinements.
Key Highlights
- Merged Public URL and Public Domains settings into a single App URL section
- Introduced a public marketplace resolver for vetted apps
- Added AI chat instrumentation for metrics and Sentry correlation
- Implemented in-app credit card collection for billing
New Features
- Public marketplace resolver for vetted app catalog
- AI chat turn instrumentation (metrics + Sentry correlation)
- Billing credit card collection in-app
- Email composer rebuild with structured chip input
- Workflow cache implementation (phase 0)
Full Release Notes
## What's Changed * chore: bump version to 2.20.0 by @twenty-pr[bot] in https://github.com/twentyhq/twenty/pull/22639 * Unify featured/vetted app terminology to featured by @martmull in https://github.com/twentyhq/twenty/pull/22648 * 2.20 `fieldMetadata` and `objectMetadata` standardOverrides deprecation by @prastoin in https://github.com/twentyhq/twenty/pull/22650 * Fix root domain /authorize rendering workspace-scoped consent page by @ehconitin in https://github.com/twentyhq/twenty/pull/22641 * Fireflies: port app to the CallRecording standard object by @ehconitin in https://github.com/twentyhq/twenty/pull/22642 * Suppress Claude session URL in generated PR bodies and commits by @martmull in https://github.com/twentyhq/twenty/pull/22651 * feat(server): support server-scoped files via nullable workspaceId on file table by @martmull in https://github.com/twentyhq/twenty/pull/22587 * fix(rls): prefill RLS predicate fields when creating related records by @Aressand in https://github.com/twentyhq/twenty/pull/22620 * fix: corrected grammar in approved domain message by @brahmlower in https://github.com/twentyhq/twenty/pull/22646 * fix(workflow): handle IS/IS_NOT operand in text and array filters by @thomtrp in https://github.com/twentyhq/twenty/pull/22640 * fix(workflow): batch staled run reset to avoid Postgres param limit by @thomtrp in https://github.com/twentyhq/twenty/pull/22654 * fix: add workspace command to backfill missing AGENT source enum values by @etiennejouan in https://github.com/twentyhq/twenty/pull/22593 * fix: dropping favorites to the last position in a open folder by @parshipcy in https://github.com/twentyhq/twenty/pull/22360 * feat(workflow): scaffold core workflowVersion entity + trigger cache (phase 0) by @thomtrp in https://github.com/twentyhq/twenty/pull/21674 * fix(call-recorder): stream Recall media to storage to fix OOM by @ehconitin in https://github.com/twentyhq/twenty/pull/22652 * Make onboarding steps responsive on mobile by @bosiraphael in https://github.com/twentyhq/twenty/pull/22659 * feat(sdk): validate graph page-layout widgets at build time by @charlesBochet in https://github.com/twentyhq/twenty/pull/22559 * Merge app Public URL and Public Domains settings into one App URL section by @FelixMalfait in https://github.com/twentyhq/twenty/pull/22666 * fix(messaging): add sender name to IMAP/SMTP From headers by @PratikMahajan in https://github.com/twentyhq/twenty/pull/22603 * Fix email validation for over-length inline edits by @deep231w in https://github.com/twentyhq/twenty/pull/22426 * fix(docker): pin node base back to 24.16.0 to stop premature-close fetch failures by @charlesBochet in https://github.com/twentyhq/twenty/pull/22673 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22676 * feat(server): add public marketplace resolver for vetted app catalog by @martmull in https://github.com/twentyhq/twenty/pull/22647 * fix(docker): bump node base to 24.18.0 (all 24.17.0 CVE fixes + http.Agent premature-close fix) by @charlesBochet in https://github.com/twentyhq/twenty/pull/22677 * [Billing for self hosts] Add info in description by @ijreilly in https://github.com/twentyhq/twenty/pull/22660 * feat(messaging): message campaign delivery stats + views by @neo773 in https://github.com/twentyhq/twenty/pull/22661 * Chore/remove messaging mock specs by @neo773 in https://github.com/twentyhq/twenty/pull/22665 * Validate range version app dev sync by @prastoin in https://github.com/twentyhq/twenty/pull/22625 * refactor(app-marketplace): rename featured to vetted by @martmull in https://github.com/twentyhq/twenty/pull/22674 * feat(workflow): backfill workspace workflowVersion into core (phase A) by @thomtrp in https://github.com/twentyhq/twenty/pull/22663 * fix(front): page header title overlap, Cmd+K on page layout pages & stable tooltip id by @ijreilly in https://github.com/twentyhq/twenty/pull/22678 * feat(website): add public apps marketplace with one-click install by @martmull in https://github.com/twentyhq/twenty/pull/22611 * [Twenty Fireflies] Add calendar event summary and transcript UI components by @ehconitin in https://github.com/twentyhq/twenty/pull/22667 * feat(call-recorder): type application and server variables, make summary prompt rich text by @ehconitin in https://github.com/twentyhq/twenty/pull/22685 * feat(ai): optionally preselect fast or smart model when opening Ask AI by @Weiko in https://github.com/twentyhq/twenty/pull/22679 * chore: remove IS_MESSAGING_CALENDAR_WEBHOOK_ENABLED flag by @neo773 in https://github.com/twentyhq/twenty/pull/22680 * feat(ai-chat): inject current date & per-message timestamps into agent context by @etiennejouan in https://github.com/twentyhq/twenty/pull/22632 * chore: sync AI model catalog from models.dev by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22710 * fix(billing) - skip paying upgrade invoices already settled at finalization by @FelixMalfait in https://github.com/twentyhq/twenty/pull/22705 * i18n - website translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22683 * fix(billing): only reactivate suspended workspaces when subscription is in good standing by @etiennejouan in https://github.com/twentyhq/twenty/pull/22687 * feat(ai) - add light AI chat turn instrumentation (metrics + Sentry correlation) by @etiennejouan in https://github.com/twentyhq/twenty/pull/22692 * fix(sdk): report the connected server's real version in dev version check by @ijreilly in https://github.com/twentyhq/twenty/pull/22670 * docs(apps): fix stale CLI commands in getting-started and operations pages by @martmull in https://github.com/twentyhq/twenty/pull/22688 * docs(apps): fix nonexistent SDK import paths and unsupported config in layout pages by @martmull in https://github.com/twentyhq/twenty/pull/22689 * docs(apps): align project structure and testing pages with the actual scaffold by @martmull in https://github.com/twentyhq/twenty/pull/22690 * docs(apps): document missing enum values and complete entity references by @martmull in https://github.com/twentyhq/twenty/pull/22691 * docs(apps): rewrite install hooks page — real client API, one explanation per concept by @martmull in https://github.com/twentyhq/twenty/pull/22694 * fix(create-twenty-app): working docs URL in final message, complete dev:add table in AGENTS.md by @martmull in https://github.com/twentyhq/twenty/pull/22695 * docs(apps): make the workspace functions URL the primary route-serving story by @martmull in https://github.com/twentyhq/twenty/pull/22693 * Welcome animation when a workspace is set up by @bosiraphael in https://github.com/twentyhq/twenty/pull/22622 * Fix flaky webhook delivery integration test (fixed sleep -> poll) by @martmull in https://github.com/twentyhq/twenty/pull/22699 * Fix flaky e2e tests: CI-realistic timeouts + retry-safe kanban field label by @martmull in https://github.com/twentyhq/twenty/pull/22701 * Fix flaky "read EINVAL" in integration tests: bump msw to 2.12.14 by @martmull in https://github.com/twentyhq/twenty/pull/22702 * ci: add app-docs drift check agent by @martmull in https://github.com/twentyhq/twenty/pull/22696 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22714 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22715 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22716 * feat(billing): collect credit card in-app when starting subscription from billing page by @FelixMalfait in https://github.com/twentyhq/twenty/pull/22706 * Rebuild email composer recipient fields as a structured chip input with person resolution and autocomplete by @FelixMalfait in https://github.com/twentyhq/twenty/pull/22668 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22723 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22725 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22726 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22728 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22729 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22730 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22731 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22732 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22733 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22735 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22738 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22741 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22743 * Fix onboarding entry animations not triggering on first load by @bosiraphael in https://github.com/twentyhq/twenty/pull/22724 * Fail App docs drift check ci if doc drift detected by @martmull in https://github.com/twentyhq/twenty/pull/22713 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22744 * perf(upsert) - tighten createMany upsert candidate lookup to avoid broad OR scans by @etiennejouan in https://github.com/twentyhq/twenty/pull/22721 * fix: prevent duplicate junction rows from double-fired checkbox clicks in multi-select menu items by @thomtrp in https://github.com/twentyhq/twenty/pull/22737 * Fix onboarding locale reverting to English after signup by @bosiraphael in https://github.com/twentyhq/twenty/pull/22675 * docs: surface the self-serve partner marketplace on high-intent pages by @rashad in https://github.com/twentyhq/twenty/pull/22719 * Centralize system field side effects + search field metadata by @prastoin in https://github.com/twentyhq/twenty/pull/22594 * fix(server): allow relabelling onto a field introduced in the same manifest sync by @prastoin in https://github.com/twentyhq/twenty/pull/22727 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22752 * Only propose configured apps during onboarding install step by @bosiraphael in https://github.com/twentyhq/twenty/pull/22712 * feat(workflow): add core workflow entity (syncable) + create-table by @thomtrp in https://github.com/twentyhq/twenty/pull/22746 * Add Last contact on Companies and Opportunities to last-contact app by @martmull in https://github.com/twentyhq/twenty/pull/22720 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22759 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22762 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22764 * chore: sync AI model catalog from models.dev by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22770 * Fix shard 12 integration test failure: regenerate stale object metadata snapshot from #22594 by @martmull in https://github.com/twentyhq/twenty/pull/22768 * fix(twenty-sdk): restore require/__filename/__dirname in rolldown ESM CLI bundle by @martmull in https://github.com/twentyhq/twenty/pull/22711 * Seed CHANGELOG.md and SETUP.md in create-twenty-app scaffold by @martmull in https://github.com/twentyhq/twenty/pull/22769 * feat(workflow): add universalIdentifier + applicationId to core workflowVersion by @thomtrp in https://github.com/twentyhq/twenty/pull/22747 * Fix integration test hang on unmocked requests + de-flake object metadata suite by @neo773 in https://github.com/twentyhq/twenty/pull/22758 * Improve application asset management by @martmull in https://github.com/twentyhq/twenty/pull/22564 * migrate 10 modules off NestjsQueryTypeOrmModule wiring by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/22763 * Gate connected-account webhook subscriptions behind config by @neo773 in https://github.com/twentyhq/twenty/pull/22761 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22777 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22745 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22779 * Allow CLI dev mode on catalog-synced apps without mutating the shared registration by @martmull in https://github.com/twentyhq/twenty/pull/22756 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22781 * Fix front-component serving on Safari, kill stale presigned caching, and cache built bundles client-side by @prastoin in https://github.com/twentyhq/twenty/pull/22672 * remove nestjs-query from app-token and drop unused createOneAppToken mutation by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/22765 * Fix front-component cache read rejection bypassing network fallback by @prastoin in https://github.com/twentyhq/twenty/pull/22785 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22784 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22787 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22788 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22789 * fix(front): render +N button for right-edge-clipped chips in expandable list by @thomtrp in https://github.com/twentyhq/twenty/pull/22748 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22793 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22794 * fix(twenty-partners): align createdAt view field with 2.19 deterministic ids and bump to 1.2.10 by @prastoin in https://github.com/twentyhq/twenty/pull/22782 * remove nestjs-query from user and workspace resolvers by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/22766 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22796 * Catch Cursor's "Made with" attribution footer in blocked contributors check by @prastoin in https://github.com/twentyhq/twenty/pull/22791 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22798 * remove nestjs-query auto-resolver from index-metadata by @abdulrahmancodes in https://github.com/twentyhq/twenty/pull/22775 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22799 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22802 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22804 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22806 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22807 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22809 * docs: partner CTAs on high-traffic pages (workflows, data-model, docker-compose) by @rashad in https://github.com/twentyhq/twenty/pull/22808 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22810 * fix(workflow): scope one-active-per-workflow index to workspace by @thomtrp in https://github.com/twentyhq/twenty/pull/22795 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22812 * fix(front): clean stale morph relations from metadata store on object deletion by @ijreilly in https://github.com/twentyhq/twenty/pull/22681 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22813 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22814 * Run front components in a sandboxed opaque-origin iframe by @bosiraphael in https://github.com/twentyhq/twenty/pull/22588 * Fix SDK plan on non installed apps by @Weiko in https://github.com/twentyhq/twenty/pull/22805 * accepts any valid expression, not just an identifier by @martmull in https://github.com/twentyhq/twenty/pull/22778 * fix(emails): deterministic i18n catalog order to stop recurring i18n PR conflicts by @charlesBochet in https://github.com/twentyhq/twenty/pull/22803 * i18n - docs translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22816 * i18n - translations by @github-actions[bot] in https://github.com/twentyhq/twenty/pull/22815 * Fix Cloudflare rate limiting during last-contact backfill by @martmull in https://github.com/twentyhq/twenty/pull/22811 ## New Contributors * @Aressand made their first contribution in https://github.com/twentyhq/twenty/pull/22620 * @brahmlower made their first contribution in https://github.com/twentyhq/twenty/pull/22646 * @PratikMahajan made their first contribution in https://github.com/twentyhq/twenty/pull/22603 * @deep231w made their first contribution in https://github.com/twentyhq/twenty/pull/22426 **Full Changelog**: https://github.com/twentyhq/twenty/compare/twenty/v2.19.0...twenty/v2.20.0